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

怎么做网站挣钱软文代写是什么

怎么做网站挣钱,软文代写是什么,免费个人网站,成都网站建设优化推广27. AT24C02(I2C总线) 27.1. 存储器介绍 27.2. 存储器简化模型介绍#xff0c;存储原理 27.3. AT24C02介绍 •AT24C02是一种可以实现掉电不丢失的存储器#xff0c;可用于保存单片机运行时想要永久保存的数据信息 •存储介质#xff1a;E2PROM •通讯接口#xff1a;I2…27. AT24C02(I2C总线) 27.1. 存储器介绍 27.2. 存储器简化模型介绍存储原理 27.3. AT24C02介绍 •AT24C02是一种可以实现掉电不丢失的存储器可用于保存单片机运行时想要永久保存的数据信息 •存储介质E2PROM •通讯接口I2C总线 •容量256字节 27.4. AT24C02引脚及应用电路VCC接电源A0~A2和GND接地WP写保护接地上拉电阻在单片机接口位置已经接好开发板原理图中就不需要接了 27.5. AT24C02内部结构框图EEPROM为存储单元网格DEC译码器RECOVERY数据擦除 27.6. I2C总线介绍 •I2C总线Inter IC BUS是由Philips公司开发的一种通用数据总线通信协议实现多设备通信并标准规范化数据通信 •两根通信线SCLSerial Clock、SDASerial Data •同步、半双工带数据应答 •通用的I2C总线可以使各种设备的通信标准统一对于厂家来说使用成熟的方案可以缩短芯片设计周期、提高稳定性对于应用者来说使用通用的通信协议可以避免学习各种各样的自定义协议降低了学习和应用的难度。标准和专利付费下面是I2C相关的附件设备左边第一个12864的小屏幕中间是DS3231的时钟芯片精度更高右侧是陀螺仪。 27.7. I2C电路规范 •所有I2C设备的SCL连在一起SDA连在一起 •设备的SCL和SDA均要配置成开漏输出模式单片机IO口为弱上拉模式可以想象成输出口带上拉电阻输出电流受限开漏模式则是在上述基础上取消上拉电阻无输出的时候IO口容易受外界干扰电压不稳定 •SCL和SDA各添加一个上拉电阻阻值一般为4.7KΩ左右有标准规定什么速率接什么电阻 •开漏输出和上拉电阻的共同作用实现了“线与”的功能此设计主要是为了解决多机通信互相干扰的问题可以实现与一个设备通信的时候其他设备处于“断开”的状态防止通信干扰 27.8. I2C时序结构六块拼图 •起始条件SCL高电平期间SDA从高电平切换到低电平S蓝色开始 •终止条件SCL高电平期间SDA从低电平切换到高电平P红色结束 27.9. I2C时序结构_发送一个字节_绿色S byte •发送一个字节SCL低电平期间主机将数据位依次放到SDA线上高位在前然后拉高SCL从机将在SCL高电平期间读取数据位所以SCL高电平期间SDA不允许有数据变化依次循环上述过程8次即可发送一个字节下面SDA是连根线麻花的状态的意思是SDA初始情况不确定是0还是1在SCL高电平固定SDA的0或1状态红色框是基本结构SDA的最终状态看数据发送完毕后的状态如果是0就是低电平1就是高电平 27.10. I2C时序结构_接收一个字节_紫色byte •接收一个字节SCL低电平期间从机将数据位依次放到SDA线上高位在前然后拉高SCL主机将在SCL高电平期间读取数据位所以SCL高电平期间SDA不允许有数据变化依次循环上述过程8次即可接收一个字节主机在接收之前需要释放SDA 27.11. I2C时序结构 •发送应答在接收完一个字节之后主机在下一个时钟发送一位数据数据0表示应答数据1表示非应答 •接收应答在发送完一个字节之后主机在下一个时钟接收一位数据判断从机是否应答数据0表示应答数据1表示非应答主机在接收之前需要释放SDA 27.12. I2C数据帧 •发送一帧数据S为开始S:SLAVEADDRESSW写,1读0写地址前4位固定24C02为101024C02芯片引脚A2,A1,A0接地0RA接收应答从机应该发0S byte数据(结束) •完成任务上述完成向谁发什么 27.13. I2C数据帧 •接收一帧数据S开始发送地址R读RA应答0数据读主机发送应答。。。最后可发应答或非应答结束 •完成任务上述完成向谁收什么 27.14. I2C数据帧 •先发送再接收数据帧复合格式上述两个拼接取消了一个P •完成任务向谁收指定的什么 27.15. AT24C02数据帧 •字节写在WORD ADDRESS处写入数据DATA发送一帧数据的变形 •随机读读出在WORD ADDRESS处的数据DATA复合格式 •AT24C02的固定地址为1010可配置地址本开发板上为000 所以SLAVE ADDRESSW写为0xA01010 0000SLAVE ADDRESSR读为0xA11010 0001 27.16. AT24C02数据帧 •字节写在“字地址”处写入“数据” •随机读读出在“字地址”处的“数据” 27.17. 24C02手册介绍24C04地址8位不够8位256 28. AT24C02数据存储秒表 28.1. 程序设计思路 分为2个模块I2C.c 和AT24C02.cI2C.c模块包括6个模块开始结束发送字节接受字节发送应答接受应答AT24C02写2个数据帧第一个数据帧在地址下写入数据第二个在某个地址下读出main中只需要调用AT24C02函数即可 28.2. Proteus测试环境搭建 在Proteus中搜索 24C02找到24C02C并插入 笔者的例子中的接线方式如图 28.3. 按照编程思路先做好I2C.c模块程序如下 #include REGX52.Hsbit I2C_SCLP2^1; sbit I2C_SDAP2^0;/*** brief I2C开始 * param 无* retval 无*/void I2C_Start(void) {I2C_SDA1; //不清楚SDA 的初始状态所以都置1I2C_SCL1;I2C_SDA0;I2C_SCL0; }/*** brief I2C停止* param * retval */void I2C_Stop(void) {I2C_SDA0; //不清楚SDA 的初始状态所以都置1I2C_SCL1;I2C_SDA1; }/*** brief I2C发送一个字节* param Byte要发送的字节* retval 无*/void I2C_SendByte(unsigned char Byte) {unsigned char i;for(i0;i8;i){I2C_SDAByte(0x80i);I2C_SCL1; //复核芯片手册关于高低切换时间的限制I2C_SCL0; //所以此处无需delay} }/*** brief I2C接收一个字节* param 无* retval 接收到的一个字节数据*/unsigned char I2C_ReceiveByte() {unsigned char i,Byte;I2C_SDA1;for(i0;i8;i){I2C_SCL1;if(I2C_SDA){Byte|(0x80i);}I2C_SCL0;}return Byte; }/*** brief I2C发送应答* param AckBit应答位0为应答1为非应答* retval 无*/void I2C_SendAck(unsigned char AckBit) {I2C_SDAAckBit;I2C_SCL1;I2C_SCL0; }/*** brief I2C接收应答位* param 无 * retval 接收到的应答位0为应答1为非应答*/unsigned char I2C_ReceiveAck(void) {unsigned char AckBit;I2C_SDA1;I2C_SCL1;AckBitI2C_SDA;I2C_SCL0;return AckBit; } 28.4. I2C.h程序如下 #ifndef _I2C_H_ #define _I2C_H_ void I2C_Start(void);void I2C_Stop(void);void I2C_SendByte(unsigned char Byte);unsigned char I2C_ReceiveByte();void I2C_SendAck(unsigned char AckBit);unsigned char I2C_ReceiveAck(void);#endif28.5. AT24C02.c的程序如下 #include REGX52.h #include I2C.h#define AT24C02_ADDRESS 0xa0/*** brief AT24C02 写入一个字节* param WordAddress字节要写入的地址0~255Data要写入的数据* retval 无*/void AT24C02_WriteByte(unsigned char WordAddress, Data) {I2C_Start();I2C_SendByte(AT24C02_ADDRESS);I2C_ReceiveAck();I2C_SendByte(WordAddress);I2C_ReceiveAck();I2C_SendByte(Data);I2C_ReceiveAck();I2C_Stop(); }/*** brief AT24C02读取一个字节* param WordAddress 要读出的字节的地址* retval 读出的数据*/unsigned char AT24C02_ReadByte(unsigned char WordAddress) {unsigned char Data;I2C_Start();I2C_SendByte(AT24C02_ADDRESS);I2C_ReceiveAck();I2C_SendByte(WordAddress);I2C_ReceiveAck();I2C_Start();I2C_SendByte(AT24C02_ADDRESS|0x01);I2C_ReceiveAck();DataI2C_ReceiveByte(); I2C_SendAck(1);I2C_Stop(); return Data; } 28.6. AT24C02.h的程序如下 #ifndef _AT24C02_H_ #define _AT24C02_H_ void AT24C02_WriteByte(unsigned char WordAddress, Data); unsigned char AT24C02_ReadByte(unsigned char WordAddress);#endif28.7. 主程序如下在独立按键1按下的时候增加数字最大65535独立按键2按下的时候减小数字最小0按键3按下的时候将对应的数字写入AT24C02按键4按下的时候读出并显示之前写入的数字 #include REGX52.h #include Four_Key.h #include LCD1602.h #include AT24C02.h #include delay_xms.hunsigned char KeyNum; unsigned int Num;void main() {LCD_Init(); //LCD1602初始化LCD_ShowString(1,1,Hello);//不按按键显示Hello // AT24C02_WriteByte(0,123); // delay_xms(5); // AT24C02_WriteByte(1,234); // delay_xms(5); // AT24C02_WriteByte(2,345); // delay_xms(5); // DataAT24C02_ReadByte(1); // LCD_ShowNum(2,1,Data,3);while(1){KeyNumFour_Key();if(KeyNum1){Num;LCD_ShowNum(1,1,Num,5);//数字随按键1按下释放后增加}if(KeyNum2){Num--;LCD_ShowNum(1,1,Num,5);//数字随按键2按下释放后减小}if(KeyNum3){AT24C02_WriteByte(0,Num%256);delay_xms(5);AT24C02_WriteByte(1,Num/256);delay_xms(5);LCD_ShowString(2,1,Write OK);delay_xms(1000);LCD_ShowString(2,1, );//将数字拆分高低8位写入写入后延时5ms} if(KeyNum4){NumAT24C02_ReadByte(0);Num|AT24C02_ReadByte(1)8;LCD_ShowNum(1,1,Num,5);LCD_ShowString(2,1,Read OK);delay_xms(1000); //读出并显示之前写入的数字} }}28.8. Proteus仿真和开发板测试无误 28.9. 新建工程AT24C02数据存储秒表-定时器扫描按键数码管 工程的编程思路主函数main直接引用三个模块定时器模块独立按键模块和数码管模块但是数码管和按键扫描需用用到定时器中断如果独立按键模块和数码管模块直接一起调用定时器模块会出错所以需要改变写法main中写定时器中断按键模块中写一个函数是中断函数的调用数码管一样的思路称为驱动函数或调用函数让主函数每隔一段时间调用一下反之如果将独立按键模块与数码管显示都放在定时器模块中则程序耦合性较高太混乱不利于代码管理之前的独立按键模块是用延时函数为了消抖在按键按下后延时20ms松开后依旧延时20ms如果按键不松手按键模块在while1中一直循环等待之后考虑修改为每隔20ms对按键进行扫描同时过滤了抖动看按键的状态同时设立一个标志位对比按键按下前后的状态每隔20ms进行前后标志位对比如果标志位没有变化说明按键没有按下否则为按下按键不卡程序 28.10. 新建工程程序需要实现的功能为按下按键1松开后秒表开始计时再按一下1松开秒表计时停止按下按键2计数清零按下按键3存储数据到AT24C02按下按键4将之前存储的数据显示在数码管上面新建的工程中的数码管显示的模块程序为 nixietube.c #include REGX52.H #include delay_xms.h unsigned char Nixie_Buf[9]{0,10,10,10,10,10,10,10,10,};unsigned char NixieTable[]{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};void Nixie_SetBuf(unsigned char Location,Number) {Nixie_Buf[Location]Number; }void Nixie_Scan(unsigned char Location,Number) {P00x00;//清零switch(Location){case 1:P2_41;P2_31;P2_21;break;case 2:P2_41;P2_31;P2_20;break;case 3:P2_41;P2_30;P2_21;break;case 4:P2_41;P2_30;P2_20;break;case 5:P2_40;P2_31;P2_21;break;case 6:P2_40;P2_31;P2_20;break;case 7:P2_40;P2_30;P2_21;break;case 8:P2_40;P2_30;P2_20;break;}P0NixieTable[Number];//数码管消影因为位选-段选-位选-段选段选数据与位选穿位导致 }void Nixie_Loop(void) {static unsigned char i;//计次Nixie_Scan(i,Nixie_Buf[i]);i;if(i9){i1;}}nixietube.h的程序为 #ifndef _NIXIETUBE_H_ #define _NIXIETUBE_H_void Nixie_SetBuf(unsigned char Location,Number); void Nixie_Scan(unsigned char Location,Number); void Nixie_Loop(void);#endif独立按键的模块程序Key.c程序为 #include REGX52.h #include delay_xms.hunsigned char Key_KeyNumber;unsigned char Key(void) {unsigned char Temp0; //加入中间变量对Key_KeyNumber进行清0TempKey_KeyNumber;Key_KeyNumber0;return Temp; }unsigned char Key_GetStatus() {unsigned char KeyNum0;if(P3_10){KeyNum1;}if(P3_00){KeyNum2;}if(P3_20){KeyNum3;}if(P3_30){KeyNum4;}return KeyNum; }void Key_Loop(void) {static unsigned char Now_Status,Last_Status;Last_StatusNow_Status;Now_StatusKey_GetStatus();if(Last_Status1 Now_Status0){Key_KeyNumber1;}if(Last_Status2 Now_Status0){Key_KeyNumber2;}if(Last_Status3 Now_Status0){Key_KeyNumber3;}if(Last_Status4 Now_Status0){Key_KeyNumber4;} } Key.h的程序为 #ifndef _KEY_H_ #define _KEY_H_ unsigned char Key();void Key_Loop();#endifmain.c主函数程序为 #include REGX52.h #include TimeR0.h #include Key.h #include nixietube.h #include delay_xms.h #include AT24C02.hunsigned char KeyNum; unsigned char Min,Sec,mSec; unsigned char RunFlag;void main() {TimeR0_Init();while(1){KeyNumKey();if(KeyNum1){RunFlag!RunFlag;}if(KeyNum2){Min0;Sec0;mSec0;} if(KeyNum3){AT24C02_WriteByte(0,Min);delay_xms(5);AT24C02_WriteByte(1,Sec);delay_xms(5);AT24C02_WriteByte(2,mSec);delay_xms(5); }if(KeyNum4){MinAT24C02_ReadByte(0);SecAT24C02_ReadByte(1);mSecAT24C02_ReadByte(2); }Nixie_SetBuf(1,Min/10);Nixie_SetBuf(2,Min%10);Nixie_SetBuf(3,11);Nixie_SetBuf(4,Sec/10);Nixie_SetBuf(5,Sec%10);Nixie_SetBuf(6,11);Nixie_SetBuf(7,mSec/10);Nixie_SetBuf(8,mSec%10);} }void Sec_Loop(void) {mSec;if(mSec100){mSec0;Sec;if(Sec60){Sec0;Min;if(Min60){Min0;}}} }void TimeR0_Routine() interrupt 1 //中断子函数 {static unsigned int T0Count1,T0Count2,T0Count3; //设置静态子函数用T0Count防止T0Count丢失TL00x18; //设置定时初始值TH00xFC; //设置定时初始值T0Count1;if(T0Count11000){T0Count10;Key_Loop();}T0Count2;if(T0Count22){T0Count20;Nixie_Loop();}T0Count3;if(T0Count310){T0Count30;Sec_Loop();} }Proteus仿真
http://www.dnsts.com.cn/news/38108.html

相关文章:

  • 网站底部备案图标商丘推广公司
  • jquery个人网站开发做纺织外贸哪个贸易网站好
  • 怎么建立一个自己的网站linux主机 安装wordpress
  • 旅游企业公司网站建设广东省政务服务网
  • 网站开发虚拟主机系统互联网推广工作好做吗
  • 自己在电脑上建文档做网站怎么做珠海市横琴新区建设环保局网站
  • 网站前端设计是什么意思网络公司排名中国
  • 南京网站建设中企动力网络平台建设及运营方案
  • 外贸seo网站制作秀洲区住房和城乡建设局网站
  • 九江集团网站建设公司做网站全自动cpa引流
  • 做模型的网站有哪些内容如何拥有一个免费的企业邮箱
  • 360元网站建设 网络服务手机网站开发看什么书
  • 织梦cms传播公司网站模板网站推广在哪好
  • 黑龙江开放网站备案官网seo优化找哪家做
  • 网站开发前调查美橙网站建设教程
  • 网站申请支付宝接口一般做个网站多少钱
  • 百度小程序对网站seo多软件网站下载安装
  • 菏泽兼职网站建设西安营销网站建设
  • 互动科技 网站建设珠海 网站建设
  • 怎么建网站数据库广西建设网证件查询电子证打印
  • 高端网站创建好三网网站
  • 燕十八html教程网站建设怎么建设网站啊
  • 创建网站多少钱微视频网站源码
  • 商会建设网站说明贸易公司网站建设
  • 下列关于网站制作的wordpress零件数据库主体
  • 网站开发过程会遇到的问题房地产开发公司注册条件
  • 域名跟网站的区别做网站推广可行吗
  • 网站根目录权限计算机网站开发毕业设计论文开题报告
  • 注册公司和建网站宣传片公司哪家好
  • 个人网站公司网站区别经营区别网页设计什么软件