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

seo网站优化培训怎么做怎么做黑彩黑彩网站

seo网站优化培训怎么做,怎么做黑彩黑彩网站,地方门户网站域名,百度下载app安装之前学习过用定时器做的时钟#xff0c;但是那样不仅误差大还费CPU#xff0c;接下来利用DS1302时钟模块做一个可调实时时钟 这一次直接编写DS1302模块#xff0c;首先要在DS1392.c 中根据下面的模块原理图进行位声明#xff1a; sbit DS1302_SCLK P3^6; sbit DS1302_IO …之前学习过用定时器做的时钟但是那样不仅误差大还费CPU接下来利用DS1302时钟模块做一个可调实时时钟 这一次直接编写DS1302模块首先要在DS1392.c 中根据下面的模块原理图进行位声明 sbit DS1302_SCLK P3^6; sbit DS1302_IO P3^4; sbit DS1302_CE P3^5;命令字 命令字确定了是要写还是要读以及操作的是时还是分还是秒 首先需要一个初始化函数 void DS1302_Init(void) {DS1302_CE 0;DS1302_SCLK 0; }工作时CE必须置1上升沿的时候可以读 下降沿的时候可以写 可以理解为0是写入模式1是读取模式 IO口从左往右是由低位到高位 要注意时序图中Read比Write少一个脉冲因为它上升到1完成了最后一个命令行位的写入之后马上要回到0开始进行读取功能了 单字节写入函数 按照时序图进行模拟Command命令行Data写入的数据 void DS1302_WriteByte(unsigned char Command, Data) {unsigned char i;DS1302_CE 1;for(i 0; i 8; i ) {DS1302_IO Command (0x01 i); //IO非0即1从低到高每次取出一位DS1302_SCLK 1;Delay(10);DS1302_SCLK 0;}for(i 0; i 8; i ) {DS1302_IO Data (0x01 i); //IO非0即1从低到高每次取出一位DS1302_SCLK 1;Delay(10);DS1302_SCLK 0;}DS1302_CE 0; }单字节读出函数 unsigned char DS1302_ReadByte(unsigned char Command) {unsigned char i, Data 0x00;DS1302_CE 1;for(i 0; i 8; i ) {DS1302_IO Command (0x01 i); //IO非0即1从低到高每次取出一位DS1302_SCLK 0; //写入Delay(10);DS1302_SCLK 1; //这样在不改变写入时序的同时还能保证最后是1}Delay(10);//接下来要读的数据已经在IO口上了已经可以读了for(i 0; i 8; i ) {DS1302_SCLK 1; //读入Delay(10);DS1302_SCLK 0;if(DS1302_IO) {Data | (0x01 i);} //把IO口的数据由低位到高位复现在Data上}DS1302_IO 0;DS1302_CE 0;return Data; }要注意在main.c中使用时需要在DS1302初始化后调用DS1302_WriteByte(0x8E, 0x00); //关闭写入保护 再进行正常的写入 但其实在DS1302模块的寄存器存储的数据都是BCD码 所以时钟的秒会从1 2 ····9然后直接跳到16 9 0000 1001 根据BCD的进位原则四位二进制数达到10就要清零进位了下一个BCD码是 0001 0000 这个数以十进制显示在LCD上就是16 此时只要把ShowNum改成ShowHexNum即可正常显示10 11 12····· 也可以利用公式来用十进制显示 LCD_ShowNum(2, 1, Sec / 16 * 10 Sec % 16, 3 );接下来就可以编写一个完整的时钟模块了 #include REGX52.H #include Delay.hsbit DS1302_SCLK P3^6; sbit DS1302_IO P3^4; sbit DS1302_CE P3^5;//其实写的地址 或上 0x01 就是读的地址了 //所以下面只要重定义写的地址就行了 #define DS1302_SECOND 0x80 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_DATE 0x86 #define DS1302_MONTH 0x88 #define DS1302_DAY 0x8A #define DS1302_YEAR 0x8C #define DS1302_WP 0x8E //写入保护的地址unsigned char DS1302_Time[] {23, 8, 2, 10, 28, 50, 3};void DS1302_Init(void) {DS1302_CE 0;DS1302_SCLK 0; }void DS1302_WriteByte(unsigned char Command, Data) {unsigned char i;DS1302_CE 1;for(i 0; i 8; i ) {DS1302_IO Command (0x01 i); //IO非0即1从低到高每次取出一位DS1302_SCLK 1;Delay(10);DS1302_SCLK 0;}for(i 0; i 8; i ) {DS1302_IO Data (0x01 i); //IO非0即1从低到高每次取出一位DS1302_SCLK 1;Delay(10);DS1302_SCLK 0;}DS1302_CE 0; }unsigned char DS1302_ReadByte(unsigned char Command) {unsigned char i, Data 0x00;DS1302_CE 1;for(i 0; i 8; i ) {DS1302_IO Command (0x01 i); //IO非0即1从低到高每次取出一位DS1302_SCLK 0; //写入Delay(10);DS1302_SCLK 1; //这样在不改变写入时序的同时还能保证最后是1}Delay(10);//接下来要读的数据已经在IO口上了已经可以读了for(i 0; i 8; i ) {DS1302_SCLK 1; //读入Delay(10);DS1302_SCLK 0;if(DS1302_IO) {Data | (0x01 i);} //把IO口的数据由低位到高位复现在Data上}DS1302_IO 0;DS1302_CE 0;return Data; }void DS1302_SetTime(void) //将数组中的时间写入芯片 {DS1302_WriteByte(DS1302_WP, 0x00); //关闭写保护DS1302_WriteByte(DS1302_YEAR, DS1302_Time[0]/10*16DS1302_Time[0]%10);DS1302_WriteByte(DS1302_MONTH, DS1302_Time[1]/10*16DS1302_Time[1]%10);DS1302_WriteByte(DS1302_DATE, DS1302_Time[2]/10*16DS1302_Time[2]%10);DS1302_WriteByte(DS1302_HOUR, DS1302_Time[3]/10*16DS1302_Time[3]%10);DS1302_WriteByte(DS1302_MINUTE, DS1302_Time[4]/10*16DS1302_Time[4]%10);DS1302_WriteByte(DS1302_SECOND, DS1302_Time[5]/10*16DS1302_Time[5]%10);DS1302_WriteByte(DS1302_DAY, DS1302_Time[6]/10*16DS1302_Time[6]%10);DS1302_WriteByte(DS1302_WP, 0x80); //打开写保护 }void DS1302_ReadTime(void) //把芯片中的时间读到数组中 {unsigned char temp;temp DS1302_ReadByte(DS1302_YEAR | 0x01); //写的地址或上0x01就是读的地址DS1302_Time[0] temp/16*10temp%16;temp DS1302_ReadByte(DS1302_MONTH | 0x01);DS1302_Time[1] temp/16*10temp%16;temp DS1302_ReadByte(DS1302_DATE | 0x01);DS1302_Time[2] temp/16*10temp%16;temp DS1302_ReadByte(DS1302_HOUR | 0x01);DS1302_Time[3] temp/16*10temp%16;temp DS1302_ReadByte(DS1302_MINUTE | 0x01);DS1302_Time[4] temp/16*10temp%16;temp DS1302_ReadByte(DS1302_SECOND | 0x01);DS1302_Time[5] temp/16*10temp%16;temp DS1302_ReadByte(DS1302_DAY | 0x01);DS1302_Time[6] temp/16*10temp%16; }其实如果把BCD码与十进制相互转化的部分写成函数来处理会大大减少代码量 要注意这个封装好的DS1302.c要拿到外部调用的话其中的DS1302_Time数组也需要在头文件中声明外部可调用的变量要加上关键字extern #ifndef __DS1302_H__ #define __DS1302_H__extern unsigned char DS1302_Time[]; //外部可调用的变量也需要声明void DS1302_Init(void); void DS1302_WriteByte(unsigned char Command, Data); unsigned char DS1302_ReadByte(unsigned char Command); void DS1302_SetTime(void); void DS1302_ReadTime(void);#endif最后给出main.c代码 #include REGX52.H #include LCD1602.h #include DS1302.hunsigned char Sec;void main() {LCD_Init();DS1302_Init();DS1302_WriteByte(0x8E, 0x00); //关闭写入保护LCD_ShowString(1, 1, - - );LCD_ShowString(2, 1, : : );DS1302_SetTime();while(1){DS1302_ReadTime();LCD_ShowNum(1, 1, DS1302_Time[0], 2);LCD_ShowNum(1, 4, DS1302_Time[1], 2);LCD_ShowNum(1, 7, DS1302_Time[2], 2);LCD_ShowNum(2, 1, DS1302_Time[3], 2);LCD_ShowNum(2, 4, DS1302_Time[4], 2);LCD_ShowNum(2, 7, DS1302_Time[5], 2);LCD_ShowNum(2, 10, DS1302_Time[6], 2);} }但是一个好的时钟远不止显示时间这么简单还需要具有可调的功能。。 于是需要加入按键模块实现修改时间和定时器模块来实现光标闪烁效果 #include REGX52.H #include LCD1602.h #include DS1302.h #include Key.h #include Timer0.hunsigned char MODE, KeyNum, TimeSetSelect, TimeFlash;void Time_Show(void) //在LCD显示数组时间 {DS1302_ReadTime();LCD_ShowNum(1, 1, DS1302_Time[0], 2);LCD_ShowNum(1, 4, DS1302_Time[1], 2);LCD_ShowNum(1, 7, DS1302_Time[2], 2);LCD_ShowNum(2, 1, DS1302_Time[3], 2);LCD_ShowNum(2, 4, DS1302_Time[4], 2);LCD_ShowNum(2, 7, DS1302_Time[5], 2);LCD_ShowNum(2, 10, DS1302_Time[6], 2); }void Time_Set(void) //利用按键修改数组并重新读取数组显示在LCD {if(KeyNum 2) //选择修改的位置{TimeSetSelect ;TimeSetSelect % 7;}if(KeyNum 3) //增加时间{DS1302_Time[TimeSetSelect] ;}if(KeyNum 4) //减少时间{DS1302_Time[TimeSetSelect] --;}//接下来更新显示 if(TimeFlash 0 TimeSetSelect 0) LCD_ShowString(1, 1, );//熄灭的时候用空格覆盖else LCD_ShowNum(1, 1, DS1302_Time[0], 2);if(TimeFlash 0 TimeSetSelect 1) LCD_ShowString(1, 4, );else LCD_ShowNum(1, 4, DS1302_Time[1], 2);if(TimeFlash 0 TimeSetSelect 2) LCD_ShowString(1, 7, );else LCD_ShowNum(1, 7, DS1302_Time[2], 2);if(TimeFlash 0 TimeSetSelect 3) LCD_ShowString(2, 1, );else LCD_ShowNum(2, 1, DS1302_Time[3], 2);if(TimeFlash 0 TimeSetSelect 4) LCD_ShowString(2, 4, );else LCD_ShowNum(2, 4, DS1302_Time[4], 2);if(TimeFlash 0 TimeSetSelect 5) LCD_ShowString(2, 7, );else LCD_ShowNum(2, 7, DS1302_Time[5], 2);if(TimeFlash 0 TimeSetSelect 6) LCD_ShowString(2, 10, );else LCD_ShowNum(2, 10, DS1302_Time[6], 2); }void Timer0_Routine() interrupt 1 {static unsigned int T0Count;TL0 0x66; //设置定时初值TH0 0xFC; //设置定时初值T0Count ;if(T0Count 1000) //1s执行一次{T0Count 0;TimeFlash !TimeFlash; //1的时候显示数字0的时候熄灭达成闪烁} }void main() {LCD_Init();DS1302_Init();Timer0_Init();DS1302_WriteByte(0x8E, 0x00); //关闭写入保护LCD_ShowString(1, 1, - - );LCD_ShowString(2, 1, : : );DS1302_SetTime(); //先从数组中读取时间到芯片里while(1){KeyNum Key(); //读取按键if(KeyNum 1) //按下按键1切换时钟模式{if(MODE 1) {MODE 0; DS1302_SetTime();} //回到显示模式要重新读取数组到芯片里else MODE 1;}switch(MODE){case 0: Time_Show(); break;case 1: Time_Set(); break;}} }但是这个程序有个bug就是修改时间的部分没有进行越界判断可能会出现13月32日这样的数据这个修改起来就是逻辑上的事情在Time或者–的时候特判一下就行比较容易这里偷个懒就不改了
http://www.hkea.cn/news/14552970/

相关文章:

  • 番禺建设局网站巨量引擎广告投放
  • 广州品牌型网站怎样进行网络推广效果更好
  • 如何建设网站济南兴田德润简介电话网站分辨率兼容怎么做
  • 泰州网站优化公司网站模板的使用
  • 郑州做网站公司msgg网站安全漏洞扫描工具
  • 常州网站建设方案优化wordpress注册模板下载地址
  • 做一名网络写手去那个网站好十堰网站建设是什么
  • 企业网站源码进一品资源网网站正在建设中yuss
  • 网站开发难不难学爱链接
  • 企业级网站内容管理系统煤棚网架加工厂
  • 移动端网站如何做导出功能吗企业网站开发php
  • 郑州做网站推广电话中国空间站最新进展
  • 网站内做动图网站中的公司地址怎么做
  • 外国人做的篆字网站长沙哪个公司做网站好
  • 做网站如何购买服务器吗广告设计基础知识
  • 病理学系列教材的建设与实践 教学成果奖申报网站公司网站二维码生成器
  • 泉州网站优化排名推广网站建好怎么发布
  • 做淘宝网站怎么弄自己创建网站怎么赚钱
  • 重庆忠县网站建设公司哪家好手工折纸
  • 如何把网站放在主机上河南网站制作价格
  • 国内网站不备案广州创建网站
  • dedecms网站安装郑州百姓网征婚
  • 群晖 做网站服务器地板网站模板免费下载
  • 网站拥有者查询搜索引擎广告名词解释
  • 网站被黑怎么恢复免费ppt模板素材网站有哪些
  • 江苏中星建设集团网站seo与网络推广的区别和联系
  • 郑州手机网站推广公司诸暨网站建设公司
  • 公司做分享网站好吗营销型网站需要注意
  • 珠宝类企业网站(手机端)万州医院网站建设
  • 网站运营培训网站模板d一品资源网