当前位置: 首页 > news >正文

php做网站的支付功能兼职网站项目建设报告

php做网站的支付功能,兼职网站项目建设报告,墨刀网站开发原型图教程,做网站现在什么最赚钱吗目录硬知识IO 扩展芯片 TCA6416ATAC6416A 的寄存器IO 输入寄存器IO 输出寄存器IO 反相寄存器IO 方向寄存器TCA6416A 的操作TCA6416A 写数据TCA6416A 读数据TCA6416A 的 IO 输入寄存器硬件布局示例程序TCA6416A.cTCA6416A.h测试程序main.c实验现象普中51-单核-A2 STC89C52 MSP43… 目录硬知识IO 扩展芯片 TCA6416ATAC6416A 的寄存器IO 输入寄存器IO 输出寄存器IO 反相寄存器IO 方向寄存器TCA6416A 的操作TCA6416A 写数据TCA6416A 读数据TCA6416A 的 IO 输入寄存器硬件布局示例程序TCA6416A.cTCA6416A.h测试程序main.c实验现象普中51-单核-A2 STC89C52 MSP430G2553 Launchpad 扩展板 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机Vofa 1.3.10 摘自《Launchpad口袋实验平台指导书》、《AY-G2PL KIT_用户手册》 硬知识 对于低速的 IO可以通过串行转并行的方法扩展。1 片 I2C 接口控制的 IO 扩展芯片 TCA6416A可为 单片机额外扩展出 16 个双向 IO。        扩展输出口的方法其实就是将串行数据转为并行数据输出串入并出移位寄存器加一个锁存器就可以将串行转并行输出也就是扩展了 IO 口比如 74 系列通用数字逻辑器件74HC595可以任意级联扩展输出口。        串行转并行的代价就是速度会变慢理论上1 串转 16 并输出速度至少要降 16 倍。假如普通 IO 翻转电平的速度是 1MHz转 16 并输出后速度将降为 62.5kHz。这个速度对于很多应用已绰绰有余比如和人有关的输入输出设备键盘、段式 LCD/LED 驱动、点阵LCD/LED 驱动等。        扩展输入口的方法类似只不过使用的是并入串出的移位寄存器。 IO 扩展芯片 TCA6416A 类似 74HC595 的串并转换芯片虽然廉价但是它只能扩展输出口不能同时扩展出双向IO 口。而TCA6416A则是基于 I2C 控制的双向 IO 扩展芯片。 TCA6416A 可以扩展出 16 个双向 IO 口为了与单片机原生的 IO 区别图中TCA6416A 扩展出的 IO 标注为 IO00-IO07IO10-IO17。ADDR 引脚是 I2C 设备的地址引脚通过接地或 VCC 可设置为两个不同的地址换句话说1 组 I2C 总线上可挂两片 TCA6416AADDR 引脚分别接地和接 VCC。/INT 引脚是专门为扩展输入引脚设计的相当于单片机的外部中断。当扩展 IO 设为输入模式且输入电平变化时/INT 引脚便会触发下降沿中断单片机的 IO 再去检测/INT 的下降沿触发真正的单片机中断。单片机通过 I2C 协议查看 TCA6416A 的相关寄存器便知晓是哪个 IO 被按下。/RESET 引脚地位相当于单片机的复位引脚为了节约单片机为数不多的 IO口这里仿照单片机的上电复位电路用 R2 和 C6 给 TCA6416 也设计了上电复位电路。SDA、SCL 和/INT 引脚必须外接上拉电阻R31/32/33。电源 VCC 和地 GND 之间接电容 C5100nF标柱为 104进行去耦起到“有病治病无病强身”的作用。 TAC6416A 的寄存器 首先我们把 TCA6416A 扩展出的 16 个普通 IO 口理解为成单片机的 P0 和 P1 口CPU对 IO 口的读写实际上都是通过寄存器这个中介进行的。其次参考图 12.3 的移位寄存器原理扩展出的 IO 也是无法位操作的读写都必须多位同时进行。TAC6416A 的寄存器设计其实很好理解共 4 组寄存器我们不妨先分析一下需要哪 4 组。 需要 16 位的 Input Port Registers 来存储 16 个 IO 的输入状态相当于单片机中的PxIN。需要 16 位的 Output Port Registers 来存储 16 个 IO 的输入状态相当于单片机中的PxOUT。需要 16 位的 Configuration Registers 来存储 IO 的输入输出方向相当于单片机中的PxDIR。需要 16 位的 Polarity Inversion Registers 来存储是否对 IO1/0 取反操作这个功能在单片机中没有。 CPU 对于 IO 口的操作有置 1置 0 和取反三种单片机可以通过先读出 IO 状态再做异或逻辑的办法实现取反。但是在 TCA6416A 中就必须先用 I2C 协议读 Input Port Registers CPU 运算后再用 I2C 写 Output Port Registers 这个时间非常长。所以TCA6416A 直接就集成了硬件 IO 电平翻转电路相当于“复杂指令集”了一回。        实际的 TCA6416A 寄存器使用 TCA6416A 的过程就是配置这几个寄存器。 IO 输入寄存器 IO 输出寄存器 IO 反相寄存器 IO 方向寄存器 TCA6416A 的操作 TCA6416A 写数据 对 TCA6416A 来说可能要写 3 种数据IO 输出电平寄存器IO 方向寄存器IO 电平极性翻转寄存器3 个寄存器都影响实际的 IO 输出所以这 3 者的地位是完全平等的写的方法也一样。        如图 12.9 所示为 TCA6416A 的写寄存器操作时序图。原说明书中将写 IO 与写寄存器分开画图其实这完全没有必要写 IO 的本质还是写寄存器。一次完整的写寄存器分 4 部分 从机地址从机地址的前 6 位固定为 010000为什么不定成 000000 呢这是因为如果每种类型的 I2C 从机设备都从 000000 起始的话那地址就区分不开了所以每种 I2C 设备都会跳开一段地址赋值。第 7 位是真正的地址只有两种可能。第 8 位用于表示读操作还是写操作。命令字这 8 位实际就是选择写哪个寄存器。高 5 位固定用低 3 位表示 8 种寄存器。寄存器 0先写寄存器 0高位在前低位在后。寄存器 1后写寄存器 1。 TCA6416A 读数据 单片机在真正读 TCA6416A 数据前需要写命令告诉 TCA6416A 是操作哪个寄存器。然后才是真正的读数据。写命令需要 2 字节从机地址命令。读数据需要 3 个字节从机地址低位数据高位数据。 TCA6416A 的 IO 输入寄存器 如图 12.11 所示为读 IO 输入寄存器的“读数据”操作时序图部分即为图 12.10 的后半部分不包括写命令部分。为了把个各种异常情况下的现象都描述清楚图 12.11 做的非常复杂。        只需注意图中 IO 电平共变化了 5 次而实际被单片机读到的却是两次锁存 IO 电平时刻对应的数据 Data1 和数据 Data4。        为了模拟普通 IO 的输入中断TAC6416A 启用了一个类似的/INT 中断来提示输入 IO 有变化。但是由于 IO 输入的变化速度可能远高于读 IO 输入寄存器的速度所以TAC6416A的中断和单片机的 IO 外部中断还不太一样。输入 IO 的变化可以触发/INT 产生下降沿变成低电平但是/INT 要等 I2C 的应答位才能恢复高电平重新具备中断能力。也就是说TCA6416A 的/INT 中断无法响应快速变化的输入信号当然我们也可以不用中断的方法判断IO 输入定时扫描的方法同样适用于 TCA6416A。 硬件布局 如图所示扩展出 16 个 IO 口中8 个作为输出口用于控制 8 个 LED4 个作为输 出口用于控制 LCD 驱动器这个另行介绍4 个作为输入口用于识别 4 个机械按键。 下图所示为 8 个 LED 以及 4 个机械按键在扩展板中的位置 示例程序 stdint.h见【51单片机快速入门指南】1基础知识和工程创建        软件I2C程序见【51单片机快速入门指南】4 软件 I2C TCA6416A.c /** TCA6416A.c** Created on: 2013-4-6* Author: Administrator*/ #include ./Software_I2C/Software_I2C.h#define TCA6416A_ADDR 0x20 /*从机TCA6416A的7位地址*///-----控制寄存器定义----- #define In_CMD0 0x00 //读取管脚输入状态寄存器只读 #define In_CMD1 0x01 #define Out_CMD0 0x02 //控制管脚输出状态寄存器R/W #define Out_CMD1 0x03 #define PIVS_CMD0 0x04 //反向控制管脚输出状态寄存器R/W #define PIVS_CMD1 0x05 #define CFG_CMD0 0x06 //管脚方向控制1In0:Out。 #define CFG_CMD1 0x07volatile unsigned int TCA6416A_InputBuffer0; unsigned char pinW0 0xff; //用于缓存已写入相应管脚的状态信息此操作避免读回TCA6416A中当前寄存器的值 unsigned char pinW1 0xff; //用于缓存已写入相应管脚的状态信息此操作避免读回TCA6416A中当前寄存器的值void Delay_ms(int i);/******************************************************************************************************* 名 称TCA6416A_Init()******************************************************************************************************/ void TCA6416A_Init(void) {unsigned char conf;Delay_ms(5); //TCA6416的复位时间比单片机长延迟确保可靠复位//----根据扩展板的引脚使用将按键所在管脚初始化为输入其余管脚初始化为输出conf 0x00; // 0 0 0 0_0 0 0 0 LED0~LED7i2c_mem_write(TCA6416A_ADDR, CFG_CMD0, conf, 1); conf 0x0f; // 0 0 0 0_1 1 1 1 (按键)i2c_mem_write(TCA6416A_ADDR, CFG_CMD1, conf, 1); //----上电先将管脚输出为高此操作对输入管脚无效conf 0xff; // 某位置1输出为高0为低i2c_mem_write(TCA6416A_ADDR, Out_CMD0, conf, 1);conf 0xff; i2c_mem_write(TCA6416A_ADDR, Out_CMD1, conf, 1); }/******************************************************************************************************* 名 称PinOUT()******************************************************************************************************/ void PinOUT(unsigned char pin,unsigned char status) {if(pin7) //所选管脚为pin0~pin7 刷新所要操作的输出缓存pinW0 状态{if(status 0)pinW0 ~(1pin);elsepinW0 | 1pin; i2c_mem_write(TCA6416A_ADDR, Out_CMD0, pinW0, 1); // 将更新后的数据包写入芯片寄存器}else if(pin10 pin17) //所选管脚为pin10~pin17 刷新所要操作的输出缓存pinW1 状态{if(status 0)pinW1 ~(1(pin%10));elsepinW1 | 1(pin%10);i2c_mem_write(TCA6416A_ADDR, Out_CMD1, pinW1, 1); // 将更新后的数据包写入芯片寄存器} }/******************************************************************************************************* 名 称PinIN()******************************************************************************************************/ unsigned char PinIN(unsigned char pin) {unsigned char temp[2];i2c_mem_read(TCA6416A_ADDR, In_CMD0, temp, 2); // 读取按键所在管脚信息TCA6416A_InputBuffer (((unsigned int)temp[1])8)|temp[0];if(pin7) {if(temp[0] (1pin))return 1;elsereturn 0;}else if(pin10 pin17) {if(temp[1] (1(pin%10)))return 1;elsereturn 0;} }/******************************************************************************************************* 名 称PinToggle()******************************************************************************************************/ void PinToggle(unsigned char pin) {unsigned char status;if(pin7) //所选管脚为pin0~pin7 刷新所要操作的输出缓存pinW0 状态{status !(pinW0 (1pin));if(status)pinW0 | 1pin;elsepinW0 ~(1pin);i2c_mem_write(TCA6416A_ADDR, Out_CMD0, pinW0, 1); // 将更新后的数据包写入芯片寄存器}else if(pin10 pin17) //所选管脚为pin10~pin17 刷新所要操作的输出缓存pinW1 状态{status !(pinW1 (1(pin%10)));if(status)pinW1 | 1(pin%10);elsepinW1 ~(1(pin%10));i2c_mem_write(TCA6416A_ADDR, Out_CMD1, pinW1, 1); // 将更新后的数据包写入芯片寄存器} }TCA6416A.h /** TCA6416A.h** Created on: 2013-4-6* Author: Administrator*/#ifndef TCA6416A_H_ #define TCA6416A_H_extern unsigned char PinIN(unsigned char pin); extern void PinOUT(unsigned char pin,unsigned char status); extern void PinToggle(unsigned char pin); extern void TCA6416A_Init(); extern volatile unsigned int TCA6416A_InputBuffer;#endif /* TCA6416A_H_ */ 测试程序 一个LED闪烁另一个LED由KEY控制翻转。 main.c #include STC89C5xRC.H #include intrins.h #include stdint.h #include TCA6416A.hvoid Delay1ms() //11.0592MHz {unsigned char i, j;_nop_();i 2;j 199;do{while (--j);} while (--i); }void Delay_ms(int i) {while(i--)Delay1ms(); }void main(void) {uint16_t delay_count 0;TCA6416A_Init();while(1){ if(!PinIN(10)){Delay_ms(20);if(!PinIN(10)){PinToggle(1);while(!PinIN(10));}}if(delay_count 500){PinToggle(7);delay_count 0;}Delay_ms(1);} } 实验现象
http://www.yutouwan.com/news/74526/

相关文章:

  • 西安建设局官方网站怎么查自己是不是备案人员
  • 百度只收录网站首页滨江网站建设公司
  • 网站怎么做翻页个旧市哪里有做网站
  • 制作只有一张图片的网站潍坊公司注册网站
  • 企业官方网站怎么做前端响应式布局几种方式
  • 网站注册免费qqwordpress oss压缩
  • 网站备案主体授权书领动网站建设
  • 网站的配置标题新网站怎么做排名
  • 网站建设吴中区基础建设基金有哪些
  • 做团购网站有什么难处做网站寄生虫需要哪些东西
  • 东莞机械建站如何门户网站建设工作管理办法
  • 四川建设网站塔吊建设银行手机银行网站用户名是什么原因
  • 企业展示网站如何建3a汽车集团公司网络营销方案
  • 网站微场景代码网站续费自己做
  • 优化网站排名方法教程网站开发 票种
  • 漳州企业网站建设制作灵山建设局网站
  • 东营市河口区建设局网站网站域名可以做端口映射吗
  • 苏州网站优化乌苏市电力建设工程公司网站
  • 建设银行官方网站网址洪泽网站建设
  • 网站建设主要包括哪些建设网站赚钱么
  • 一流的天津网站建设wordpress转义
  • 国外网站的建设全国建设工程四库一平台
  • 做百度推广需要有自己的网站吗购物网站有哪些
  • 提卡网站建设制作网页需要什么技术
  • 网站建设购买数据库的流程图企业工商信息公示系统
  • 裁剪图网站个人手机网站大全
  • 私人做网站收费企业网站托管价格
  • 郧阳网站建设wordpress 路由器
  • 网站公司倒闭网络网页设计制作公司
  • 成都网站建设 常凡云免费虚拟主机网站源码