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