《2022年调试时钟芯片DS有感[转] .pdf》由会员分享,可在线阅读,更多相关《2022年调试时钟芯片DS有感[转] .pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、调试时钟芯片 DS1302有感 转 经过几天的劳累终于可以把时间显示出来啦!真是好兴奋。总结一下吧!由于本人手中和网上的源程序实在是太多,“ 看上去 ” 也挺完美,就是因为这个“ 看上去完美 ” 让我花费了好长时间。来读别人的代码,程序怎么条就是不通,后来看了一位网友的文章写的是关于DS1302 调试过程中应注意的事项,指出了ds1302的 datasheet中的一些错误,这才使我恍然大悟,原来读数据的时间要求是非常严格的。要求在命令字之后的第一个下降沿就要读数据,否则读出的数据就是错误的,也不能说完全错误,那就必须作必要的调整。本来读数据手册时已经注意到这个问题,但就是再看别人的程序时没引起
2、注意。害得我浪费了几天的时间。下次一定要注意:别人程序很可能有缺陷,能参考,但不能够完全照抄,数据手册一定要细读。时间是浪费了,但也值,这几天告诉我,自己的c 语言功夫还不够,具体地说差得好远。 提醒自己要努力。一定要学会应用汇编,汇编与c 的相互调用 。下面是我的原程序,写得不好,如果有哪位高手看见了一定要指教,小弟不胜感激。其中最想改的就是write()和 read()函数, 每个函数大概编译后都是63 字节 ,肯定能再少,就是不用ACC 而用变量移位来完成。试了几次调不通呀!/*/ /* 文件名: DS1302.c /* 库名: DS1302.h /* 功能:此文件中的函数可用于对DS1
3、302 的时间进行设置和读取DS1302 内部的时间/* 缺点:此文件中的函数没有用到DS1302 的所有功能,如:连续的读写操作、RAM 的应用,充电部分的应用,写保护、抗干扰等/* 但是可以根据DS1302 的 datasheet和此文件中的部分函数组合可以实现上述功能/*/ #include #define uchar unsigned char /*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - uchar code
4、 time_set7=0 x15,0 x30,0 x13,0 x04,0 x12,0 x07,0 x05; file:/ 设置时间初始值数组/ 秒分时号月份星期年uchar data timercur7; file:/ 用于存放从DS1302 读回的时间数据uchar data timerint14; file:/ 用于存放将BCD 码型数据转换成INT 型后的数据uchar data *pTimerInt; file:/ 指向存放转换后时间数据的指针/*/ sbit CLK=P10; file:/与硬件相关的连线clk 为 DS1302 的时钟信号线sbit DAT=P11; file:/D
5、AT为 DS1302 的 I/O 数据线sbit RST=P12; file:/RST 为 DS1302 的 RST 信号线sbit ACC0=ACC0; sbit ACC1=ACC1; sbit ACC2=ACC2; sbit ACC3=ACC3; sbit ACC4=ACC4; sbit ACC5=ACC5; sbit ACC6=ACC6; sbit ACC7=ACC7; /*函数定义 */ /*/ /* 函数名: write (address);/* 参数:地址 /数据字节/* 功能:用于向DS1302 输入地址或数据信息/*/ void write(uchar address) ACC
6、=address; CLK=0; DAT=ACC0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - CLK=1;CLK=0; DAT=ACC1; CLK=1;CLK=0; DAT=ACC2; CLK=1;CLK=0; DAT=ACC3; CLK=1;CLK=0; DAT=ACC4; CLK=1;CLK=0; DAT=ACC5; CLK=1;CLK=0; DAT=ACC6; CLK=1;CLK=0; DAT=ACC7; CLK=
7、1; /*/ /* 函数名: read();/* 参数:无/* 功能:用于从DS1302 读出时间数据信息/*/ void read() / DAT=1; /* 注意在进行读操作之前DAT 应置 1*/ CLK=0; ACC0=DAT; CLK=1;CLK=0; ACC1=DAT; CLK=1;CLK=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - ACC2=DAT; CLK=1;CLK=0; ACC3=DAT; CLK=
8、1;CLK=0; ACC4=DAT; CLK=1;CLK=0; ACC5=DAT; CLK=1;CLK=0; ACC6=DAT; CLK=1;CLK=0; ACC7=DAT; CLK=1 return(ACC); /*/ /* 函数名: W_Byte(address, byte) ;/* 参数:地址,数据/* 功能:用于向DS1302 指定的地址address输入数据byte /*/ void W_Byte(uchar address,uchar byte) RST=0; CLK=0; RST=1; write(address); write(byte); RST=0; 名师资料总结 - -
9、-精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - /*/ /* 函数名: R_Byte(address);/* 参数:地址/* 功能:用于从DS1302 指定地址address处读出数据,并将数据存放到ACC 中/*/ uchar R_Byte(uchar address) RST=0; CLK=0; RST=1; write(address); DAT=1; read(); RST=0; return(ACC); /*/ /* 函数名: timese
10、t() ;/* 参数:无/* 功能:用于设置DS1302 的时间,具体时间值存放在time_set7 数组中/*/ void timeset() uchar i; W_Byte(0 x8e,0 x00); for(i=0;i7;i+) W_Byte(0 x80+i+i,time_seti); /*/ /* 函数名: readtime() ;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - /* 参数:无/* 功能:用于读取DS13
11、02 的当前时间,具体时间值存放在timecur7 数组中/*/ void readtime() uchar i; for(i=0;i4; *(pTimerInt+)= j&0 x0f; return(*pTimerInt); /*/ /* 函数名: BCD_to_INT() ;/* 参数:无/* 功能:用于将时间BCD 码转换为十进制码/*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - void BCD_to_INT() uchar i; for(i=0;i7;i+) bcd_int(timercuri); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -