有关DS1302的应用问题

[复制链接]
 楼主| lzfact 发表于 2007-2-5 10:17 | 显示全部楼层 |阅读模式
ov, TE, hm, mt, RS
<br />&nbsp;请各位前辈帮忙&nbsp;<br /><br />我设计DS1302进行计时,晶振是正常的,可它就是不计时,请个位分析一下有那些原因,先谢谢了!程序如下:<br /><br />BitCnt&nbsp;data&nbsp;20h&nbsp;;&nbsp;数据位计数器<br />ByteCnt&nbsp;data&nbsp;21h&nbsp;;&nbsp;数据字节计数器<br />Command&nbsp;data&nbsp;22h&nbsp;;&nbsp;命令字节地址<br />RcvDat&nbsp;DATA&nbsp;40H&nbsp;;&nbsp;接收数据缓冲区<br />XmtDat&nbsp;DATA&nbsp;10H&nbsp;;&nbsp;发送数据缓冲区<br />;端口位定义<br />IO_DATA&nbsp;bit&nbsp;P1.5&nbsp;;&nbsp;数据传送总线<br />SCLK&nbsp;bit&nbsp;P1.4;&nbsp;时钟控制总线<br />RST&nbsp;bit&nbsp;P1.6&nbsp;;&nbsp;复位总线<br />ORG&nbsp;&nbsp;&nbsp;0000H<br /><br />START:<br />;------------------------------------初始化1302-------------------------<br /><br />SET1302:<br />clr&nbsp;sclk<br />&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RST<br />MOV&nbsp;&nbsp;SP,#50H<br /><br />LCALL&nbsp;Write_Enable;写允许<br />LCALL&nbsp;Osc_Enable<br />LCALL&nbsp;Write_Multiplebyte;初始化1302,将我们要设定的数据写入<br />LCALL&nbsp;Write_Disable<br /><br />START:LCALL&nbsp;Read_Multiplebyte;将我们设定的数据读出来<br /><br /><br />lcall&nbsp;exchange<br />lcall&nbsp;disp<br /><br />AJMP&nbsp;START<br />;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />;********************************************************************************************<br />;发送数据程序<br />;名称:Send_Byte<br />;描述:发送ByteCnt&nbsp;个字节给被控器DS1302<br />;命令字节地址在Command&nbsp;中<br />;所发送数据的字节数在ByteCnt&nbsp;中发送的数据在XmtDat&nbsp;缓冲区中<br />;********************************************************************************************<br />Send_Byte:<br />CLR&nbsp;RST&nbsp;;复位引脚为低电平所有数据传送终止<br />NOP<br />CLR&nbsp;SCLK;&nbsp;清时钟总线<br />NOP<br />SETB&nbsp;RST&nbsp;;复位引脚为高电平逻辑控制有效<br />NOP<br />MOV&nbsp;A,Command;&nbsp;准备发送命令字节<br />MOV&nbsp;BitCnt,#08h&nbsp;;传送位数为8<br />S_Byte0:<br />RRC&nbsp;A&nbsp;;将最低位传送给进位位C<br />MOV&nbsp;IO_DATA,C&nbsp;;位传送至数据总线<br />NOP<br />SETB&nbsp;SCLK&nbsp;;时钟上升沿发送数据有效<br />NOP<br />CLR&nbsp;SCLK&nbsp;;清时钟总线<br />DJNZ&nbsp;BitCnt,S_Byte0&nbsp;;位传送未完毕则继续<br />NOP<br />S_Byte1:&nbsp;;准备发送数据<br />MOV&nbsp;A,@R0&nbsp;;传送数据过程与传送命令相同<br />MOV&nbsp;BitCnt,#08h<br />S_Byte2:<br />RRC&nbsp;A<br />MOV&nbsp;IO_DATA,C<br />NOP<br />SETB&nbsp;SCLK<br />NOP<br />CLR&nbsp;SCLK<br />DJNZ&nbsp;BitCnt,S_Byte2<br />INC&nbsp;R0&nbsp;;发送数据的内存地址加1<br />DJNZ&nbsp;ByteCnt,S_Byte1&nbsp;;字节传送未完毕则继续<br />NOP<br />CLR&nbsp;RST&nbsp;;逻辑操作完毕清RST<br />RET<br />;***************************************************************************************<br />;接收数据程序;<br />;名称:Receive_Byte<br />;描述:从被控器DS1302&nbsp;接收ByteCnt&nbsp;个字节数据<br />;命令字节地址在Command&nbsp;中<br />;所接收数据的字节数在ByteCnt&nbsp;中接收的数据在RcvDat&nbsp;缓冲区中<br />;***********************************************************************************<br />Receive_Byte:<br />CLR&nbsp;RST&nbsp;;复位引脚为低电平所有数据传送终止<br />NOP<br />CLR&nbsp;SCLK&nbsp;;清时钟总线<br />NOP<br />SETB&nbsp;RST&nbsp;;复位引脚为高电平逻辑控制有效<br />MOV&nbsp;A,Command&nbsp;;准备发送命令字节<br />MOV&nbsp;BitCnt,#08h&nbsp;;传送位数为8<br />R_Byte0:<br />RRC&nbsp;A&nbsp;;将最低位传送给进位位C<br />MOV&nbsp;IO_DATA,C&nbsp;;位传送至数据总线<br />NOP<br />SETB&nbsp;SCLK&nbsp;;时钟上升沿发送数据有效<br />NOP<br />CLR&nbsp;SCLK&nbsp;;清时钟总线<br />DJNZ&nbsp;BitCnt,R_Byte0&nbsp;;位传送未完毕则继续<br />NOP<br />R_Byte1:&nbsp;;准备接收数据<br />CLR&nbsp;A&nbsp;;清类加器<br />CLR&nbsp;C&nbsp;;清进位位C<br />MOV&nbsp;BitCnt,#08h&nbsp;;接收位数为8<br />R_Byte2:<br />NOP<br />MOV&nbsp;C,IO_DATA&nbsp;;数据总线上的数据传送给C<br />RRC&nbsp;A&nbsp;;从最低位接收数据<br />SETB&nbsp;SCLK&nbsp;;时钟总线置高<br />NOP<br />CLR&nbsp;SCLK&nbsp;;时钟下降沿接收数据有效<br />DJNZ&nbsp;BitCnt,R_Byte2&nbsp;;位接收未完毕则继续<br />MOV&nbsp;@R1,A&nbsp;;接收到的完整数据字节放入接收内存缓冲区<br />INC&nbsp;R1&nbsp;;接收数据的内存地址加1<br />DJNZ&nbsp;ByteCnt,R_Byte1&nbsp;;字节接收未完毕则继续<br />NOP<br />CLR&nbsp;RST&nbsp;;逻辑操作完毕清RST<br />RET<br /><br />;--写保护寄存器操作------------------------------------------<br />Write_Enable:<br />MOV&nbsp;Command,#8Eh&nbsp;;命令字节为8E<br />MOV&nbsp;ByteCnt,#1&nbsp;;单字节传送模式<br />MOV&nbsp;R0,#XmtDat&nbsp;;数据地址覆给R0<br />MOV&nbsp;XmtDat,#00h&nbsp;;数据内容为0&nbsp;写入允许<br />ACALL&nbsp;Send_Byte&nbsp;;调用写入数据子程序<br />RET<br /><br />;当写保护寄存器的最高位为1&nbsp;时禁止数据写入寄存器---------------<br />Write_Disable:<br />MOV&nbsp;Command,#8Eh&nbsp;;命令字节为8E<br />MOV&nbsp;ByteCnt,#1&nbsp;;单字节传送模式<br />MOV&nbsp;R0,#XmtDat&nbsp;;数据地址覆给R0<br />MOV&nbsp;XmtDat,#80h&nbsp;;数据内容为80h&nbsp;禁止写入<br />ACALL&nbsp;Send_Byte&nbsp;;调用写入数据子程序<br />RET&nbsp;;返回调用本子程序处<br /><br /><br />;当把秒寄存器的第7&nbsp;位时钟停止位设置为0&nbsp;时起动时钟开始---------<br />Osc_Enable:<br />MOV&nbsp;Command,#80h&nbsp;;&nbsp;命令字节为80<br />MOV&nbsp;ByteCnt,#1&nbsp;;&nbsp;单字节传送模式<br />MOV&nbsp;R0,#XmtDat&nbsp;;数据地址覆给R0<br />MOV&nbsp;XmtDat,#00h&nbsp;;数据内容为0&nbsp;振荡器工作允许<br />ACALL&nbsp;Send_Byte&nbsp;;调用写入数据子程序<br />RET&nbsp;;返回调用本子程序处<br /><br /><br />;当把秒寄存器的第7&nbsp;位时钟停止位设置为1&nbsp;时时钟振荡器停止HT1380&nbsp;进入低功耗方式---------------<br />Osc_Disable:<br />MOV&nbsp;Command,#80h&nbsp;;命令字节为80<br />MOV&nbsp;ByteCnt,#1&nbsp;;单字节传送模式<br />MOV&nbsp;R0,#XmtDat&nbsp;;数据地址覆给R0<br />MOV&nbsp;XmtDat,#80h&nbsp;;数据内容为80h&nbsp;振荡器停止<br />ACALL&nbsp;Send_Byte&nbsp;;调用写入数据子程序<br />RET&nbsp;;返回调用本子程序处<br /><br /><br />;写入00&nbsp;年6&nbsp;月21&nbsp;日星期三13&nbsp;时59&nbsp;分59---------------------<br />Write_Multiplebyte:<br />MOV&nbsp;Command,#0BEh&nbsp;;命令字节为BEh<br />MOV&nbsp;ByteCnt,#8&nbsp;;多字节写入模式此模块为8&nbsp;个<br />MOV&nbsp;R0,XmtDat;数据地址覆给R0<br />MOV&nbsp;XmtDat,#55h&nbsp;;秒单元内容为59h<br />MOV&nbsp;XmtDat+1&nbsp;,#55h&nbsp;;分单元内容为59h<br />MOV&nbsp;XmtDat+2,#55h&nbsp;;时单元内容为13h<br />MOV&nbsp;XmtDat+3,#55h&nbsp;;日期单元内容为21h<br />MOV&nbsp;XmtDat+4,#55h&nbsp;;月单元内容为06h<br />MOV&nbsp;XmtDat+5,#55h&nbsp;;星期单元内容为03h<br />;MOV&nbsp;46h,#0&nbsp;;年单元内容为00h<br />MOV&nbsp;XmtDat+6,#55h&nbsp;;写保护单元内容为00h<br />ACALL&nbsp;Send_Byte&nbsp;;调用写入数据子程序<br />RET&nbsp;;返回调用本子程序处<br /><br /><br />;读出寄存器0-7&nbsp;的内容程序设置如下<br />Read_Multiplebyte:<br />MOV&nbsp;Command,#0BFh&nbsp;;命令字节为BFh<br />MOV&nbsp;ByteCnt,#8&nbsp;;多字节读出模式此模块为8&nbsp;个<br />MOV&nbsp;R1,#RcvDat&nbsp;;数据地址覆给R1<br />ACALL&nbsp;Receive_Byte;&nbsp;调用读出数据子程序<br />RET;&nbsp;返回调用本子程序处<br /><br /><br />;写入8&nbsp;时12&nbsp;小时模式程序设置如下<br />Write_Singlebyte:<br />MOV&nbsp;Command,#84h&nbsp;;&nbsp;命令字节为84h<br />MOV&nbsp;ByteCnt,#1&nbsp;;&nbsp;单字节传送模式<br />MOV&nbsp;R0,#XmtDat&nbsp;;数据地址覆给R0<br />MOV&nbsp;XmtDat,#88h&nbsp;;数据内容为88h<br />ACALL&nbsp;Send_Byte&nbsp;;调用写入数据子程序<br />RET&nbsp;;返回调用本子程序处<br /><br />;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br /><br />exchange:<br /><br />mov&nbsp;a,46h<br />mov&nbsp;b,#10H<br />div&nbsp;ab&nbsp;;把40H高低4位分开<br />mov&nbsp;3Dh,a&nbsp;;高4位存入31H单元<br />mov&nbsp;a,b<br />mov&nbsp;3Ch,a&nbsp;;低4位存入30H单元<br /><br />mov&nbsp;a,45h<br />mov&nbsp;b,#10H<br />div&nbsp;ab&nbsp;;把40H高低4位分开<br />mov&nbsp;3Bh,a&nbsp;;高4位存入31H单元<br />mov&nbsp;a,b<br />mov&nbsp;3Ah,a&nbsp;;低4位存入30H单元<br /><br />mov&nbsp;a,44h<br />mov&nbsp;b,#10H<br />div&nbsp;ab&nbsp;;把40H高低4位分开<br />mov&nbsp;39h,a&nbsp;;高4位存入31H单元<br />mov&nbsp;a,b<br />mov&nbsp;38h,a&nbsp;;低4位存入30H单元<br /><br />mov&nbsp;a,43h<br />mov&nbsp;b,#10H<br />div&nbsp;ab&nbsp;;把40H高低4位分开<br />mov&nbsp;37h,a&nbsp;;高4位存入31H单元<br />mov&nbsp;a,b<br />mov&nbsp;36h,a&nbsp;;低4位存入30H单元<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;;;;;;<br />mov&nbsp;a,42h<br />mov&nbsp;b,#10H<br />div&nbsp;ab&nbsp;;把41H高低4位分开<br />mov&nbsp;35h,a&nbsp;;高4位存入33H单元<br />mov&nbsp;a,b<br />mov&nbsp;34h,a&nbsp;;低4位存入32H单元<br /><br />mov&nbsp;a,41h<br />mov&nbsp;b,#10H<br />div&nbsp;ab&nbsp;;把41H高低4位分开<br />mov&nbsp;33h,a&nbsp;;高4位存入33H单元<br />mov&nbsp;a,b<br />mov&nbsp;32h,a&nbsp;;低4位存入32H单元<br /><br />mov&nbsp;a,40h<br />mov&nbsp;b,#10H<br />div&nbsp;ab&nbsp;;把40H高低4位分开<br />mov&nbsp;31h,a&nbsp;;高4位存入31H单元<br />mov&nbsp;a,b<br />mov&nbsp;30h,a&nbsp;;低4位存入30H单元<br />;ajmp&nbsp;exchange<br />ret<br />NOP<br />NOP<br />;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />&nbsp;&nbsp;DISP:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;p2,#12h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;A,30H<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;DPTR,#TAB2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVC&nbsp;A,@A+DPTR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;P0,A<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;delay1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;p2,#52h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;A,31H<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;DPTR,#TAB2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVC&nbsp;A,@A+DPTR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;P0,A<br />&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;delay1<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;p2,#22h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;A,32H<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;DPTR,#TAB1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVC&nbsp;A,@A+DPTR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;P0,A<br />&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;delay1<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;p2,#0a2h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;A,33H<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;DPTR,#TAB1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVC&nbsp;A,@A+DPTR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;P0,A<br />&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;delay1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;p2,#62h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;A,34H<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;DPTR,#TAB1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVC&nbsp;A,@A+DPTR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;P0,A<br />&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;delay1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;p2,#0E2h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;A,35H<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;DPTR,#TAB1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVC&nbsp;A,@A+DPTR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;P0,A<br />&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;delay1<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;p2,#02h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;A,36H<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;DPTR,#TAB1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVC&nbsp;A,@A+DPTR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;P0,A<br />&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;delay1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;p2,#82h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;A,37H<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;DPTR,#TAB1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVC&nbsp;A,@A+DPTR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;P0,A<br />&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;delay1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;p2,#42h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;A,38H<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;DPTR,#TAB1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVC&nbsp;A,@A+DPTR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;P0,A<br />&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;delay1<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;p2,#0C2h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;A,39H<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;DPTR,#TAB1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVC&nbsp;A,@A+DPTR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;P0,A<br />&nbsp;&nbsp;&nbsp;&nbsp;ACALL&nbsp;&nbsp;delay1<br /><br /><br />&nbsp;&nbsp;AJMP&nbsp;DISP<br /><br />delay1:&nbsp;MOV&nbsp;r2,#2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D11:&nbsp;MOV&nbsp;r3,#50<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D12:MOV&nbsp;r4,#10<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D13:DJNZ&nbsp;r4,D13<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DJNZ&nbsp;r3,D12<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DJNZ&nbsp;r2,D11<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RET<br /><br /><br />TAB1:&nbsp;DB&nbsp;14H&nbsp;,77H,&nbsp;4CH&nbsp;,45H,&nbsp;27H&nbsp;&nbsp;,85H&nbsp;&nbsp;,84H&nbsp;,57H&nbsp;,04H&nbsp;,05H<br />TAB2:&nbsp;DB&nbsp;03H,&nbsp;3FH,&nbsp;4AH,&nbsp;2AH&nbsp;,36H,&nbsp;0A2H,82H&nbsp;,3BH,&nbsp;02H&nbsp;,22H<br />end<br /><br /><br />&nbsp;<br />&nbsp;<br />
szzhengjin 发表于 2007-2-5 15:04 | 显示全部楼层

#看不懂你那#55H是做什么的

现在我都用C,很少用汇编,我给你段你自己看吧,看你那些我也说不出为什么,没细看<br /><br />#define&nbsp;RTC_OK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//操作成功<br />#define&nbsp;RTC_FAIL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//操作失败<br />#define&nbsp;SECOND_INVALID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//秒值无效<br />#define&nbsp;MINUTE_INVALID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//分钟值无效<br />#define&nbsp;HOUR_INVALID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//小时值无效<br />#define&nbsp;WEEK_INVALID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;43&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//星期值无效<br />#define&nbsp;DAY_INVALID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;44&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//日期值无效<br />#define&nbsp;MONTH_INVALID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;45&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//月份值无效<br />#define&nbsp;YEAR_INVALID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;46&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//年份值无效<br />#define&nbsp;CENTURY_INVALID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;47&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//世纪值无效<br /><br />//时钟制式参数定义(暂没开启,全用24小时制)<br />#define&nbsp;MODE_12_HOUR&nbsp;&nbsp;&nbsp;&nbsp;0x80&nbsp;&nbsp;&nbsp;&nbsp;//12小时制,即有AM/PM<br />#define&nbsp;MODE_24_HOUR&nbsp;&nbsp;&nbsp;&nbsp;0x00&nbsp;&nbsp;&nbsp;&nbsp;//24小时制<br /><br />//充电参数定义<br />#define&nbsp;CHARGE_ENABLE&nbsp;&nbsp;&nbsp;&nbsp;0xA0&nbsp;&nbsp;&nbsp;&nbsp;//开启充电,此时,若限流电阻选择SELECT_NONE,还是不能充电<br />#define&nbsp;CHARGE_DISABLE&nbsp;&nbsp;&nbsp;&nbsp;0x00&nbsp;&nbsp;&nbsp;&nbsp;//关闭充电<br />//充电二极管参数<br />#define&nbsp;SELECT_ONE_DIODE&nbsp;&nbsp;&nbsp;&nbsp;0x04&nbsp;&nbsp;&nbsp;&nbsp;//选择一个二极管<br />#define&nbsp;SELECT_TWO_DIODE&nbsp;&nbsp;&nbsp;&nbsp;0x08&nbsp;&nbsp;&nbsp;&nbsp;//选择二个二极管<br />//充电限流电阻参数<br />#define&nbsp;SELECT_NONE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00&nbsp;&nbsp;&nbsp;&nbsp;//不用连,即断开充电电路<br />#define&nbsp;SELECT_R1_2k&nbsp;&nbsp;&nbsp;&nbsp;0x01&nbsp;&nbsp;&nbsp;&nbsp;//选择电阻1,2K<br />#define&nbsp;SELECT_R2_4k&nbsp;&nbsp;&nbsp;&nbsp;0x02&nbsp;&nbsp;&nbsp;&nbsp;//选择电阻2,4K<br />#define&nbsp;SELECT_R3_8k&nbsp;&nbsp;&nbsp;&nbsp;0x03&nbsp;&nbsp;&nbsp;&nbsp;//选择电阻3,8K<br /><br /><br />#define&nbsp;RAM_MAXSIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;31&nbsp;&nbsp;&nbsp;&nbsp;//时钟内部用户可自定义的RAM最大空间<br /><br />typedef&nbsp;struct&nbsp;_DATETIME<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Century;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Year;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Month;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Day;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Hour;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Min;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Sec;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Week;<br />}sttDateTime;<br /><br />sbit&nbsp;&nbsp;&nbsp;&nbsp;RST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;P1^5;<br />sbit&nbsp;&nbsp;&nbsp;&nbsp;SCL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;P1^6;<br />sbit&nbsp;&nbsp;&nbsp;&nbsp;SDA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;P1^7;<br /><br />#define&nbsp;SEC_ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x80&nbsp;&nbsp;&nbsp;&nbsp;//1000&nbsp;0000<br />#define&nbsp;MIN_ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x82&nbsp;&nbsp;&nbsp;&nbsp;//1000&nbsp;0010<br />#define&nbsp;HOUR_ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x84&nbsp;&nbsp;&nbsp;&nbsp;//1000&nbsp;0100<br />#define&nbsp;DAY_ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x86&nbsp;&nbsp;&nbsp;&nbsp;//1000&nbsp;0110<br />#define&nbsp;MOM_ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x88&nbsp;&nbsp;&nbsp;&nbsp;//1000&nbsp;1000<br />#define&nbsp;WEEK_ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x8A&nbsp;&nbsp;&nbsp;&nbsp;//1000&nbsp;1010<br />#define&nbsp;YEAR_ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x8C&nbsp;&nbsp;&nbsp;&nbsp;//1000&nbsp;1100&nbsp;&nbsp;&nbsp;&nbsp;<br />#define&nbsp;CENTURY_ADDR&nbsp;&nbsp;&nbsp;&nbsp;0xC0&nbsp;&nbsp;&nbsp;&nbsp;//1100&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用其RTC内存一字节作为年世纪字节<br />#define&nbsp;CONTROL_ADDR&nbsp;&nbsp;&nbsp;&nbsp;0x8E&nbsp;&nbsp;&nbsp;&nbsp;//1000&nbsp;1110<br />#define&nbsp;TRCH_ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x90&nbsp;&nbsp;&nbsp;&nbsp;//1001&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />#define&nbsp;RAM_BASE_ADDR&nbsp;&nbsp;&nbsp;&nbsp;0xC0<br /><br />#define&nbsp;READ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;WRITE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br /><br />void&nbsp;DS1302_SendByte(unsigned&nbsp;char&nbsp;Data)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCL&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SDA&nbsp;=&nbsp;(bit)(Data&nbsp;&&nbsp;0x01);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCL&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data&nbsp;&gt&gt=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />}<br /><br /><br />unsigned&nbsp;char&nbsp;DS1302_ReadByte(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,Data;<br />&nbsp;&nbsp;&nbsp;&nbsp;SDA&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data&nbsp;&gt&gt=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCL&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(SDA==1)&nbsp;Data&nbsp;|=&nbsp;0x80;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCL&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return(Data);<br />}<br /><br />void&nbsp;&nbsp;DS1302WriteByte(unsigned&nbsp;char&nbsp;Addr,&nbsp;unsigned&nbsp;char&nbsp;Data)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SCL&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;RST&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302_SendByte(Addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302_SendByte(Data);<br />&nbsp;&nbsp;&nbsp;&nbsp;RST&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;;<br />}<br /><br />unsigned&nbsp;char&nbsp;DS1302ReadByte(unsigned&nbsp;char&nbsp;Addr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Data;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCL&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;RST&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302_SendByte(Addr&nbsp;|&nbsp;READ);<br />&nbsp;&nbsp;&nbsp;&nbsp;Data&nbsp;=&nbsp;DS1302_ReadByte();<br />&nbsp;&nbsp;&nbsp;&nbsp;RST&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Data;<br />}<br /><br />//初始化时钟<br />void&nbsp;InitDS1302(unsigned&nbsp;char&nbsp;ChargeMode)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCL&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;RST&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(CONTROL_ADDR,0x00);&nbsp;&nbsp;&nbsp;&nbsp;//WP=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;DS1302ReadByte(SEC_ADDR);<br />&nbsp;&nbsp;&nbsp;&nbsp;if((i&nbsp;&&nbsp;0x80)&nbsp;==&nbsp;0x80)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//若时钟丢失,即锂电池没电时,自动复位为2005-1-1&nbsp;00:00:00&nbsp;星期六<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(CENTURY_ADDR,0x20);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(YEAR_ADDR,0x06);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(MOM_ADDR,0x01);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(DAY_ADDR,0x01);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(HOUR_ADDR,0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(MIN_ADDR,0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(SEC_ADDR,0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(WEEK_ADDR,0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(TRCH_ADDR,ChargeMode);//设置充电模式<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(CONTROL_ADDR,0x80);&nbsp;&nbsp;&nbsp;&nbsp;//WP=1;<br />}<br /><br />//读时钟<br />void&nbsp;ReadClock(sttDateTime&nbsp;*pstDateTime)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//pstDateTime-&gtCentury&nbsp;=&nbsp;DS1302ReadByte(CENTURY_ADDR);<br />&nbsp;&nbsp;&nbsp;&nbsp;pstDateTime-&gtYear&nbsp;&nbsp;&nbsp;=&nbsp;DS1302ReadByte(YEAR_ADDR);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(pstDateTime-&gtYear&nbsp;&lt&nbsp;0x80)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pstDateTime-&gtCentury&nbsp;=&nbsp;0x20;<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pstDateTime-&gtCentury&nbsp;=&nbsp;0x19;<br />&nbsp;&nbsp;&nbsp;&nbsp;pstDateTime-&gtMonth&nbsp;&nbsp;=&nbsp;DS1302ReadByte(MOM_ADDR);<br />&nbsp;&nbsp;&nbsp;&nbsp;pstDateTime-&gtDay&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;DS1302ReadByte(DAY_ADDR);<br />&nbsp;&nbsp;&nbsp;&nbsp;pstDateTime-&gtHour&nbsp;&nbsp;&nbsp;=&nbsp;DS1302ReadByte(HOUR_ADDR);<br />&nbsp;&nbsp;&nbsp;&nbsp;pstDateTime-&gtMin&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;DS1302ReadByte(MIN_ADDR);<br />&nbsp;&nbsp;&nbsp;&nbsp;pstDateTime-&gtSec&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;DS1302ReadByte(SEC_ADDR);<br />&nbsp;&nbsp;&nbsp;&nbsp;pstDateTime-&gtWeek&nbsp;&nbsp;&nbsp;=&nbsp;DS1302ReadByte(WEEK_ADDR);<br />}<br /><br /><br />//写时钟<br />void&nbsp;WriteClock(sttDateTime&nbsp;*pstDateTime)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(CONTROL_ADDR,0x00);&nbsp;&nbsp;&nbsp;&nbsp;//WP=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(CENTURY_ADDR,pstDateTime-&gtCentury);<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(YEAR_ADDR,pstDateTime-&gtYear);<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(MOM_ADDR,pstDateTime-&gtMonth);<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(DAY_ADDR,pstDateTime-&gtDay);<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(HOUR_ADDR,pstDateTime-&gtHour);<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(MIN_ADDR,pstDateTime-&gtMin);<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(SEC_ADDR,pstDateTime-&gtSec);<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(WEEK_ADDR,pstDateTime-&gtWeek);<br />&nbsp;&nbsp;&nbsp;&nbsp;DS1302WriteByte(CONTROL_ADDR,0x80);&nbsp;&nbsp;&nbsp;&nbsp;//WP=1;<br />}<br />
 楼主| lzfact 发表于 2007-2-5 21:08 | 显示全部楼层

谢谢这位仁兄

#55H是我任意输入的一个初始数值,下面的程序不是DS1302内部已经定义了吗?<br />还要定义一次?<br />我先试试,谢谢!<br /><br /><br /><br /><br />//时钟制式参数定义(暂没开启,全用24小时制)<br />#define&nbsp;MODE_12_HOUR&nbsp;&nbsp;&nbsp;&nbsp;0x80&nbsp;&nbsp;&nbsp;&nbsp;//12小时制,即有AM/PM<br />#define&nbsp;MODE_24_HOUR&nbsp;&nbsp;&nbsp;&nbsp;0x00&nbsp;&nbsp;&nbsp;&nbsp;//24小时制<br /><br />//充电参数定义<br />#define&nbsp;CHARGE_ENABLE&nbsp;&nbsp;&nbsp;&nbsp;0xA0&nbsp;&nbsp;&nbsp;&nbsp;//开启充电,此时,若限流电阻选择SELECT_NONE,还是不能充电<br />#define&nbsp;CHARGE_DISABLE&nbsp;&nbsp;&nbsp;&nbsp;0x00&nbsp;&nbsp;&nbsp;&nbsp;//关闭充电<br />//充电二极管参数<br />#define&nbsp;SELECT_ONE_DIODE&nbsp;&nbsp;&nbsp;&nbsp;0x04&nbsp;&nbsp;&nbsp;&nbsp;//选择一个二极管<br />#define&nbsp;SELECT_TWO_DIODE&nbsp;&nbsp;&nbsp;&nbsp;0x08&nbsp;&nbsp;&nbsp;&nbsp;//选择二个二极管<br />//充电限流电阻参数<br />#define&nbsp;SELECT_NONE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00&nbsp;&nbsp;&nbsp;&nbsp;//不用连,即断开充电电路<br />#define&nbsp;SELECT_R1_2k&nbsp;&nbsp;&nbsp;&nbsp;0x01&nbsp;&nbsp;&nbsp;&nbsp;//选择电阻1,2K<br />#define&nbsp;SELECT_R2_4k&nbsp;&nbsp;&nbsp;&nbsp;0x02&nbsp;&nbsp;&nbsp;&nbsp;//选择电阻2,4K<br />#define&nbsp;SELECT_R3_8k&nbsp;&nbsp;&nbsp;&nbsp;0x03&nbsp;&nbsp;&nbsp;&nbsp;//选择电阻3,8K<br /><br /><br />#define&nbsp;RAM_MAXSIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;31&nbsp;&nbsp;&nbsp;&nbsp;//时钟内部用户可自定义的RAM最大空间<br /><br />
 楼主| lzfact 发表于 2007-2-6 10:13 | 显示全部楼层

RE;

  
szzhengjin 发表于 2007-2-6 10:19 | 显示全部楼层

那些是定义好的,只是我定义成宏,方便调用

要使程序灵活,多定义些宏,以后调用就可以了,那些宏都是头文件里的<br />这样做方便以后调用时就不用再去查datasheet了,看一下头文件便知道怎么用了
 楼主| lzfact 发表于 2007-2-6 10:23 | 显示全部楼层

RE

请问:DS1302的程序流程是怎么样的,我只要求能够设置初始值,并让其计时读出显示。我现在的流程是这样的,看行不行<br />1、写允许;2、启动时钟开始;3、写入初试时钟值;4、禁止写允许;5、读出数据显示。不断的循环第5步;<br />仅仅是这样可以吗?写初始和读数据都是用多字节方式,其它设置为单字节。<br />请指教
szzhengjin 发表于 2007-2-6 14:27 | 显示全部楼层

运用中不用每次那样

我给你的函数,启动后,执行初始化一次<br /><br />初始化时判断秒钟最高位是否为1,若为1则表示时钟已停止,时钟数据已无效,需重新设置(即校对时钟,这里没办法知道当前时钟,只能恢复成一个默认值)<br /><br />初始化完成后,就是一直取时钟就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

6

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

3

主题

6

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部