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