ORG 0000H ;定位 AJMP START ;跳转到主程序 ORG 000BH ;定位 AJMP TIME0 ORG 001BH ;定位 AJMP TIME1 ORG 0100H ;定位 START: ;内存数据定义 BitCnt data 21h ; 数据位计数器 ByteCnt data 22h ; 数据字节计数器 ;Command data 23h ; 命令字节地址 Command data 3Fh ; 命令字节地址 SSS DATA 24H ;显示用 时 SSF DATA 25H ;显示用 分 SSM DATA 2CH ;秒,自动调整时间用 XSMZT DATA 2DH ;计数用,显示秒 SSMM DATA 2EH ;秒,显示秒用 NZS DATA 26H ;闹钟用 时 NZF DATA 27H ;闹钟用 分 NZZT DATA 28H ;闹钟暂停 FHL DATA 29H ;长时间不操作返回 FHH DATA 2AH ;长时间不操作返回 KMKM DATA 2BH ;每天加减的秒数 XSP DATA 2FH ;显示屏类型(1,2) RcvDat DATA 30H ; 接收数据缓冲区 XmtDat DATA 40H ; 发送数据缓冲区 ;端口位定义 IO_DATA bit P3.0 ; 数据传送总线 SCLK bit P3.1 ; 时钟控制总线 RST bit P3.7 ; 复位总线 D1 BIT P3.0 D2 BIT P3.1 D3 BIT P3.2 D4 BIT P3.3 NZ BIT P3.4 ;闹钟 SW BIT P3.5 SWJ BIT P1.7 ZSMS EQU R6 ;进入置数模式, 01B(1)---进入置时间小时,10B(2)--进入置时间分钟,11B(3)--置闹钟小时,100B(4)--进入置闹钟分钟,101B(5)置闹钟开关,110B(6)设置时间快慢 X1302 EQU 20H.0 ;需要写1302标志,1--要写 NPS EQU 20H.1 ;扫描段时小时显示判断 1-不显示 NPF EQU 20H.2 ;扫描段时分钟时显示判断 1-不显示 MSS EQU 20H.3 ;秒闪位 0---亮秒灯 NZK EQU 20H.4 ;闹钟开 , 1--开闹钟 KMTZ EQU 20H.5 ;快慢是否调整过, 1---已调整过了 XSMWEI EQU 20H.6 ;显示秒位,1---显示秒 X1302SJ EQU 20H.7 ;1302不写当前时间(未改变时间),1---写;0--不写 ZTSJW EQU 23H.0 ;自动调整时间 + or - 0---减 1--加 ;TEMP_1 EQU 23H.1 ;临时调试1 MOV 23H,#00H ;========================= ;D1---段1(最高位),D2,D3,D4 ;R0,R1--读写1302 ;R2--延时使用 ;R3---秒闪计时 ;R4---闹钟闹计时 ;R5-供时显示闪烁用记200ms ;R6--进入置数模式, 01B(1)---进入置时间小时,10B(2)--进入置时间分钟,11B(3)--置闹钟小时,100B(4)--进入置闹钟分钟,101B(5)置闹钟开关,110B(6)设置时间快慢 ;R7--要显示的段 ;========================= MOV SP,#60H ;设置堆栈 MOV XSMZT,#0H MOV SSM,#0FFH MOV 20H,#00H MOV 2BH,#00H MOV ZSMS,#00H MOV FHL,#0FFH MOV FHH,#3 MOV R3,#80 MOV R4,#01H MOV R5,#5 MOV R7,#4 MOV P1,#0FFH MOV P3,#0FFH CLR RST MOV TMOD,#00010001B;定时/计数器0 ;工作于方式1 ;定时器1,工作于方式1 SETB EA ;中断总允许 SETB ET0 ;中断0允许 SETB ET1 MOV TH0,#0ECH MOV TL0,#07CH ;定时器0--5ms MOV TH1,#03CH MOV TL1,#0B0H ;50MS ;Write_Enable: MOV Command,#8Eh ;命令字节为8E MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat ;数据地址覆给R0 MOV XmtDat,#00h ;数据内容为0 写入允许 ACALL Send_Byte ;调用写入数据子程序 ;单字节读出cc单元的内容 MOV Command,#0CDh ; 命令字节为CDh 空DS1302判断 55h为不空 MOV ByteCnt,#1 ; 单字节传送模式 MOV R1,#RcvDat; 数据地址覆给R1 ACALL Receive_Byte; 调用读出数据子程序 MOV A,RcvDat CJNE A,#055H,N55 ;单字节读出秒单元的内容 MOV Command,#81h ; 命令字节为81h MOV ByteCnt,#1 ; 单字节传送模式 MOV R1,#RcvDat; 数据地址覆给R1 ACALL Receive_Byte; 调用读出数据子程序 MOV A,RcvDat ;判断时钟是否停止,如果停止,就写入初始值 JNB ACC.7,CC1 N55: ;多字节写 (写入20 年5 月27 日星期三14 时59 分59 秒) MOV Command,#0BEh ;命令字节为BEh MOV ByteCnt,#8 ;多字节写入模式此模块为8 个 MOV R0,#XmtDat ;数据地址覆给R0 MOV XmtDat,#59h ;秒单元 MOV XmtDat+1,#59h ;分单元 MOV XmtDat+2,#14h ;时单元 MOV XmtDat+3,#27h ;日期单元 MOV XmtDat+4,#05h ;月单元 MOV XmtDat+5,#03h ;星期单元 MOV XmtDat+6,#20H ;年单元 MOV XmtDat+7,#00H ; ACALL Send_Byte ;调用写入数据子程序 ;RAM操作 ;多字节写 MOV Command,#0FEh ;命令字节为FEh MOV ByteCnt,#31 ;多字节写入模式此模块为31 个 MOV R0,#XmtDat ;数据地址覆给R0 MOV XmtDat,#12h ;NZS MOV XmtDat+1,#00h ;NZF MOV XmtDat+2,#00h ;NZK MOV XmtDat+3,#00h ;KMKM MOV XmtDat+4,#02h ;XSP MOV XmtDat+5,#00h ;ztsjw MOV XmtDat+6,#55H ;CC单元 ACALL Send_Byte ;调用写入数据子程序 CC1: ;单字节读出分单元的内容 MOV Command,#83h ; 命令字节为83h MOV ByteCnt,#1 ; 单字节传送模式 MOV R1,#RcvDat; 数据地址覆给R1 ACALL Receive_Byte; 调用读出数据子程序 MOV SSF,RcvDat ;-------------------------------------- ;单字节读出时单元的内容 MOV Command,#85h ; 命令字节为85h MOV ByteCnt,#1 ; 单字节传送模式 MOV R1,#RcvDat; 数据地址覆给R1 ACALL Receive_Byte; 调用读出数据子程序 MOV SSS,RcvDat ;-------------------------------------- MOV Command,#0C1h ; 命令字节为C0h RAM0 MOV ByteCnt,#1 ; 单字节传送模式 MOV R1,#RcvDat; 数据地址覆给R1 ACALL Receive_Byte; 调用读出数据子程序 MOV NZS,RcvDat ;-------------------------------------- MOV Command,#0C3h ; 命令字节为C3h RAM1 MOV ByteCnt,#1 ; 单字节传送模式 MOV R1,#RcvDat; 数据地址覆给R1 ACALL Receive_Byte; 调用读出数据子程序 MOV NZF,RcvDat ;-------------------------------------- MOV Command,#0C5h ; 命令字节为C5h RAM2 MOV ByteCnt,#1 ; 单字节传送模式 MOV R1,#RcvDat; 数据地址覆给R1 ACALL Receive_Byte; 调用读出数据子程序 MOV A,RcvDat ;-------------------------------------- RRC A MOV NZK,C MOV Command,#0C7h ; 命令字节为C7h RAM3 MOV ByteCnt,#1 ; 单字节传送模式 MOV R1,#RcvDat; 数据地址覆给R1 ACALL Receive_Byte; 调用读出数据子程序 MOV KMKM,RcvDat ;-------------------------------------- MOV Command,#0C9h ; 命令字节为C9h RAM4 MOV ByteCnt,#1 ; 单字节传送模式 MOV R1,#RcvDat; 数据地址覆给R1 ACALL Receive_Byte; 调用读出数据子程序 MOV XSP,RcvDat ;-------------------------------------- MOV Command,#0CBh ; 命令字节为Cbh RAM5 MOV ByteCnt,#1 ; 单字节传送模式 MOV R1,#RcvDat; 数据地址覆给R1 ACALL Receive_Byte; 调用读出数据子程序 MOV 23H,RcvDat ;-------------------------------------- MOV A,KMKM CJNE A,#0FFH,QW11 MOV KMKM,#00H QW11: MOV A,XSP CJNE A,#0FFH,QW1 MOV XSP,#01H QW1:SETB TR0 SETB TR1 LOOP: JB SW,LQQ ;若为1,说明为干扰信号,退出 MOV R2,#24 ACALL DELAY JB SW,LQQ ;约53ms JNB SW,$ ;等待松开 ; JB ZSMS,TKS ;处理sw键 CJNE ZSMS,#0,TKS1 ;SETB ZSMS MOV ZSMS,#1 AJMP QQT TKS1: CJNE ZSMS,#1,TKS2 MOV ZSMS,#2 AJMP QQT TKS2: CJNE ZSMS,#2,TKS3 MOV ZSMS,#3 AJMP QQT TKS3: CJNE ZSMS,#3,TKS4 MOV ZSMS,#4 AJMP QQT TKS4: CJNE ZSMS,#4,TKS4a MOV ZSMS,#5 AJMP QQT TKS4a: CJNE ZSMS,#5,TKS4B MOV ZSMS,#6 AJMP QQT TKS4B: CJNE ZSMS,#6,TKS5 MOV ZSMS,#7 AJMP QQT TKS5: CJNE ZSMS,#7,TKS6 MOV ZSMS,#0 CLR NPS CLR NPF SETB X1302 TKS6: AJMP QQT LQQ: ;JNB ZSMS,QQT CJNE ZSMS,#0,TKS61 AJMP QQT TKS61:JB SWJ,TKS6 ;若为1,说明为干扰信号,退出 MOV R2,#24 ACALL DELAY ;约52ms JB SWJ,QQT1 JNB SWJ,$ ;等待松开 ;处理swj CJNE ZSMS,#1,TKSS1 SETB X1302SJ INC SSS MOV A,SSS CJNE A,#00AH,PD12 MOV SSS,#010H AJMP QQT PD12: CJNE A,#01AH,PD13 MOV SSS,#020H AJMP QQT PD13: CJNE A,#024H,PD14 MOV SSS,#00H PD14: AJMP QQT TKSS1: CJNE ZSMS,#2,TKSS2 SETB X1302SJ INC SSF MOV A,SSF ANL A,#0FH CJNE A,#0AH,PD131 MOV A,SSF ADD A,#06H MOV SSF,A PD131: CJNE A,#060H,QQT MOV SSF,#00H AJMP QQT TKSS2: CJNE ZSMS,#3,TKSS3 INC NZS MOV A,NZS CJNE A,#00AH,PD122 MOV NZS,#010H AJMP QQT PD122: CJNE A,#01AH,PD132 MOV NZS,#020H AJMP QQT PD132: CJNE A,#024H,PD142 MOV NZS,#00H PD142: QQT1: AJMP QQT TKSS3: CJNE ZSMS,#4,TKSS4 INC NZF MOV A,NZF ANL A,#0FH CJNE A,#0AH,PD1313 MOV A,NZF ADD A,#06H MOV NZF,A PD1313: CJNE A,#060H,QQT MOV NZF,#00H AJMP QQT TKSS4: CJNE ZSMS,#5,TKSS5 CPL NZK AJMP QQT TKSS5: CJNE ZSMS,#6,TKSS5A ;快慢时间调整 INC KMKM MOV A,KMKM ANL A,#0FH CJNE A,#0AH,KMKM11 MOV A,KMKM ADD A,#06H MOV KMKM,A KMKM11: JB KMKM.5,QINGLING CJNE A,#019H,QQT ;到19;每天调整的最大秒数 QINGLING: MOV KMKM,#00H CPL ZTSJW AJMP QQT TKSS5A: CJNE ZSMS,#7,QQT ;显示屏类型设置 INC XSP MOV A,XSP CJNE A,#3,QQT MOV XSP,#1 AJMP QQT QQT:AJMP LOOP TIME0: MOV TL0,#078H ;定时器0--5ms MOV TH0,#0ECH PUSH ACC PUSH PSW SETB D1 SETB D2 SETB D3 SETB D4 MOV P1,#0FFH JNB X1302,ZACA1A1 ;写入调整后的时间 MOV A,SSM CJNE A,#0FFH,YLD1 ;如果秒是ff就不写,自动调整时间用 AJMP YLD YLD1: MOV Command,#80h ; 命令字节 MOV ByteCnt,#1 ; 单字节传送模式 MOV R0,#XmtDat ;数据地址覆给R0 MOV XmtDat,SSM ;数据内容 ACALL Send_Byte ;调用写入数据子程序 MOV SSM,#0FFH AJMP YLD ZACA1A1: AJMP ZACA YLD: JNB X1302SJ,TYLD CLR X1302SJ MOV Command,#84h ; 命令字节 MOV ByteCnt,#1 ; 单字节传送模式 MOV R0,#XmtDat ;数据地址覆给R0 MOV XmtDat,SSS ;数据内容 ACALL Send_Byte ;调用写入数据子程序 MOV Command,#82h ; 命令字节 MOV ByteCnt,#1 ; 单字节传送模式 MOV R0,#XmtDat ;数据地址覆给R0 MOV XmtDat,SSF ;数据内容 ACALL Send_Byte ;调用写入数据子程序 TYLD: MOV Command,#0C0h ; 命令字节 MOV ByteCnt,#1 ; 单字节传送模式 MOV R0,#XmtDat ;数据地址覆给R0 MOV A,NZS ANL A,#03FH MOV XmtDat,A ;数据内容 ACALL Send_Byte ;调用写入数据子程序 MOV Command,#0C2h ; 命令字节为82h MOV ByteCnt,#1 ; 单字节传送模式 MOV R0,#XmtDat ;数据地址覆给R0 MOV A,NZF ANL A,#07FH MOV XmtDat,A ;数据内容 ACALL Send_Byte ;调用写入数据子程序 MOV Command,#0C4h ; 命令字节 MOV ByteCnt,#1 ; 单字节传送模式 MOV R0,#XmtDat ;数据地址覆给R0 MOV A,#00H MOV C,NZK RLC A MOV XmtDat,A ;数据内容 ACALL Send_Byte ;调用写入数据子程序 MOV Command,#0C6h ; 命令字节 MOV ByteCnt,#1 ; 单字节传送模式 MOV R0,#XmtDat ;数据地址覆给R0 MOV A,KMKM MOV XmtDat,A ;数据内容为 ACALL Send_Byte ;调用写入数据子程序 KMKM MOV Command,#0C8h ; 命令字节 MOV ByteCnt,#1 ; 单字节传送模式 MOV R0,#XmtDat ;数据地址覆给R0 ;MOV A,XSP MOV XmtDat,XSP ;数据内容为 ACALL Send_Byte ;调用写入数据子程序 XSP MOV Command,#0CAh ; 命令字节 MOV ByteCnt,#1 ; 单字节传送模式 MOV R0,#XmtDat ;数据地址覆给R0 ;MOV A,XSP MOV XmtDat,23H ;数据内容为 ACALL Send_Byte ;调用写入数据子程序 ztsjw CLR X1302 SETB D1 SETB D2 ZACA: CJNE ZSMS,#0,ZACA2 ;置时间 AJMP ZACA1 ZACA2: DJNZ R5,ZACA1 MOV R5,#40 CJNE ZSMS,#1,LAA CPL NPS CLR NPF AJMP ZACA1 LAA: CJNE ZSMS,#2,LAA1 CPL NPF CLR NPS AJMP ZACA1 LAA1: CJNE ZSMS,#3,LAA2 CPL NPS SETB NPF AJMP ZACA1 LAA2: CJNE ZSMS,#4,LAA3 CPL NPF SETB NPS AJMP ZACA1 LAA3: CLR NPF CLR NPS ;CJNE ZSMS,#5,ZACA1 ZACA1: DJNZ R3,EOE CPL MSS MOV R3,#100 ;500MS ;调整时间 时不进入下面 CJNE ZSMS,#0,EOE AJMP Q9Q EOE: AJMP XSD4 Q9Q: ;读1302 约500ms读一次 ;单字节读出分单元的内容 MOV Command,#83h ; 命令字节为83h MOV ByteCnt,#1 ; 单字节传送模式 MOV R1,#RcvDat; 数据地址覆给R1 ACALL Receive_Byte; 调用读出数据子程序 MOV SSF,RcvDat ;-------------------------------------- ANL SSF,#07FH ;单字节读出时单元的内容 MOV Command,#85h ; 命令字节为85h MOV ByteCnt,#1 ; 单字节传送模式 MOV R1,#RcvDat; 数据地址覆给R1 ACALL Receive_Byte; 调用读出数据子程序 MOV SSS,RcvDat ;-------------------------------------- ANL SSS,#03FH ;单字节读出秒单元的内容 MOV Command,#81h ; 命令字节为81h MOV ByteCnt,#1 ; 单字节传送模式 MOV R1,#RcvDat; 数据地址覆给R1 ACALL Receive_Byte; 调用读出数据子程序 MOV A,RcvDat ANL A,#07FH MOV SSMM,A ;============开始快慢调整 ZTSJW=1加时间 =0减时间 MOV A,KMKM CJNE A,#00H,KMBEG AJMP KMEND KMBEG: JB KMTZ,KMEND1 MOV A,SSS CJNE A,#03H,KMEND1 ;每天3:59: 29/30开始调整,4:0写回KMTZ的状态 MOV A,SSF CJNE A,#59H,KMEND1 MOV A,SSMM JB ZTSJW,JIAZTSJW CJNE A,#029H,KMEND1 SUBB A,KMKM AJMP X120319 JIAZTSJW: CJNE A,#030H,KMEND1 ADD A,KMKM X120319: MOV SSM,A SETB KMTZ SETB X1302 KMEND1: MOV A,SSS CJNE A,#04H,KMTZ1A MOV A,SSF CJNE A,#00H,KMTZ1A CLR KMTZ KMTZ1A: ;============结束 KMEND: SETB D1 SETB D2 JNB XSMWEI,XSD4 MOV SSS,#0DH MOV SSF,SSMM XSD4: CJNE R7,#1,XSD3 ;最高位 CJNE ZSMS,#7,BKLA MOV A,#0DH ;不显示 AJMP X4 BKLA: CJNE ZSMS,#6,AAA1 JB ZTSJW,X123191401 MOV A,#0EH AJMP X4 X123191401: MOV A,#0FH AJMP X4 AAA1:CJNE ZSMS,#5,XSSJ1 MOV A,#0AH AJMP X4 XSSJ1:CJNE ZSMS,#3,XSSJ2 MOV A,NZS AJMP XSSJJS XSSJ2:MOV A,SSS XSSJJS:ANL A,#030H SWAP A CJNE A,#00H,X4;不为0去X4,(小时高位0时不显示) MOV A,#0DH ;不显示 ;不显示 ;AJMP XSD0 X4: MOV DPTR,#TABLE MOVC A,@A+DPTR ; JB ZSMS,TA4 CJNE ZSMS,#0,TA4 ;JB MSS,TA4 ;CPL ACC.7 JNB NZK,TA4 ;闹钟开判断,(开--高位小数点灯亮) JB MSS,TA4 CLR ACC.7 TA4: JB NPS,XSD0T MOV P1,A CLR D1 XSD0T:AJMP XSD0 XSD3: CJNE R7,#2,XSD2 CJNE ZSMS,#7,BKLA1 MOV A,#0DH ;不显示 AJMP X43 BKLA1: CJNE ZSMS,#6,AAA2 MOV A,#0DH ;不显示 AJMP X43 AAA2:CJNE ZSMS,#5,XSSJ11 JB NZK,DSAS MOV A,#0BH AJMP X43 DSAS: MOV A,#0CH AJMP X43 XSSJ11:CJNE ZSMS,#3,XSSJ21 MOV A,NZS AJMP XSSJJS1 XSSJ21:MOV A,SSS XSSJJS1: ANL A,#00FH X43: MOV DPTR,#TABLE MOVC A,@A+DPTR ;JB ZSMS,TA3 CJNE ZSMS,#0,TA3 MOV R0,XSP CJNE R0,#1,TA3 ;显示屏类型判断(1---第二位为秒闪) JB MSS,TA3 CLR ACC.7 TA3: JB NPS,XSD0T1 MOV P1,A CLR D2 XSD0T1:AJMP XSD0 XSD2: CJNE R7,#3,XSD1 CJNE ZSMS,#7,BKLA2 MOV A,#0DH ;不显示 AJMP X42 BKLA2: CJNE ZSMS,#6,AAAA3 MOV A,KMKM ANL A,#0F0H SWAP A AJMP X42 AAAA3:CJNE ZSMS,#5,XSSJ12 JB NZK,DSAS2 MOV A,#0BH AJMP X42 DSAS2: MOV A,#0DH AJMP X42 XSSJ12:CJNE ZSMS,#4,XSSJ22 MOV A,NZF AJMP XSSJJS2 XSSJ22:MOV A,SSF XSSJJS2: ANL A,#070H SWAP A X42: MOV DPTR,#TABLE MOVC A,@A+DPTR ;JB ZSMS,TA2 CJNE ZSMS,#0,TA2 MOV R0,XSP CJNE R0,#2,TA2 ;;显示屏类型判断(2---第3位为秒闪) JB MSS,TA2 CLR ACC.7 TA2: JB NPF,XSD0T2 MOV P1,A CLR D3 XSD0T2:AJMP XSD0 XSD1: CJNE R7,#4,XSD0 CJNE ZSMS,#7,BKLA3 MOV A,XSP AJMP X431 BKLA3: CJNE ZSMS,#6,AAAA4 MOV A,KMKM ANL A,#0FH AJMP X431 AAAA4: CJNE ZSMS,#5,XSSJ111 MOV A,#0DH AJMP X431 XSSJ111:CJNE ZSMS,#4,XSSJ211 MOV A,NZF AJMP XSSJJS11 XSSJ211:MOV A,SSF XSSJJS11: ANL A,#00FH X431: ANL A,#00FH MOV DPTR,#TABLE MOVC A,@A+DPTR ;JB ZSMS,TA1 CJNE ZSMS,#0,TA1 MOV R0,XSP CJNE R0,#2,TA1 ;;显示屏类型判断(2---第4位为秒闪) JB MSS,TA1 CLR ACC.7 TA1: JB NPF,XSD0 MOV P1,A CLR D4 XSD0: ;CPL TEMP_1 ;JB TEMP_1,QEND DJNZ R7,QEND MOV R7,#4 QEND: POP PSW POP ACC RETI TIME1: PUSH ACC PUSH PSW MOV TH1,#015H MOV TL1,#0A0H ;65MS CJNE ZSMS,#0,QUEND11;进入时间调整离开 JNB NZK,QUEND1 ;判断闹钟开 ,1--开 MOV A,SSS CJNE A,NZS,QUEND1 MOV A,SSF CJNE A,NZF,Q3 ;判断时间 MOV A,NZZT CJNE A,NZF,Q4 AJMP QUEND1 Q4:JNB MSS,Q1 JNB SWJ,QUEND2;按下SWJ按停止闹 Q1:DJNZ R4,QUEND MOV R4,#2 CPL NZ AJMP QUEND QUEND2: MOV NZZT,NZF AJMP QUEND1 Q3: MOV NZZT,#0FFH QUEND1: JNB MSS,QUEND11 JB SWJ,ZJZJ1 INC XSMZT MOV A,XSMZT CJNE A,#3,QUEND11 DEC XSMZT SETB XSMWEI AJMP QUEND11 ZJZJ1:MOV XSMZT,#0H CLR XSMWEI QUEND11: SETB NZ MOV R4,#1 QUEND: DJNZ FHL,DE1 MOV FHL,#0FFH DJNZ FHH,DE1 MOV FHH,#3 MOV ZSMS,#00H CLR NPS CLR NPF DE1: POP PSW POP ACC RETI TABLE: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H,0C0H,08EH,0C8H,0FFH,0BFH,0B9H ;******************************************************************************************** ;发送数据程序 ;名称:Send_Byte ;描述:发送ByteCnt 个字节给被控器DS1302 ;命令字节地址在Command 中 ;所发送数据的字节数在ByteCnt 中发送的数据在XmtDat 缓冲区中 ;******************************************************************************************** Send_Byte: CLR RST ;复位引脚为低电平所有数据传送终止 NOP NOP CLR SCLK; 清时钟总线 NOP NOP SETB RST ;复位引脚为高电平逻辑控制有效 NOP NOP MOV A,Command; 准备发送命令字节 MOV BitCnt,#08h; 传送位数为8 S_Byte0: RRC A; 将最低位传送给进位位C MOV IO_DATA,C; 位传送至数据总线 NOP NOP SETB SCLK; 时钟上升沿发送数据有效 NOP CLR SCLK; 清时钟总线 DJNZ BitCnt,S_Byte0; 位传送未完毕则继续 NOP NOP S_Byte1:; 准备发送数据 MOV A,@R0; 传送数据过程与传送命令相同 MOV BitCnt,#08h S_Byte2: RRC A MOV IO_DATA,C NOP NOP SETB SCLK NOP NOP CLR SCLK DJNZ BitCnt,S_Byte2 INC R0; 发送数据的内存地址加1 DJNZ ByteCnt,S_Byte1; 字节传送未完毕则继续 NOP NOP CLR RST; 逻辑操作完毕清RST RET ;*************************************************************************************** ;接收数据程序; ;名称:Receive_Byte ;描述:从被控器DS1302 接收ByteCnt 个字节数据 ;命令字节地址在Command 中 ;所接收数据的字节数在ByteCnt 中接收的数据在RcvDat 缓冲区中 ;*********************************************************************************** Receive_Byte: CLR RST ;复位引脚为低电平所有数据传送终止 NOP NOP CLR SCLK; 清时钟总线 NOP NOP SETB RST ;复位引脚为高电平逻辑控制有效 MOV A,Command; 准备发送命令字节 MOV BitCnt,#08h; 传送位数为8 R_Byte0: RRC A; 将最低位传送给进位位C MOV IO_DATA,C; 位传送至数据总线 NOP NOP SETB SCLK; 时钟上升沿发送数据有效 NOP CLR SCLK; 清时钟总线 DJNZ BitCnt,R_Byte0; 位传送未完毕则继续 NOP NOP R_Byte1:; 准备接收数据 CLR A; 清类加器 CLR C; 清进位位C MOV BitCnt,#08h; 接收位数为8 R_Byte2: NOP NOP MOV C,IO_DATA; 数据总线上的数据传送给C RRC A; 从最低位接收数据 SETB SCLK; 时钟总线置高 NOP NOP CLR SCLK; 时钟下降沿接收数据有效 DJNZ BitCnt,R_Byte2; 位接收未完毕则继续 MOV @R1,A; 接收到的完整数据字节放入接收内存缓冲区 INC R1; 接收数据的内存地址加1 DJNZ ByteCnt,R_Byte1; 字节接收未完毕则继续 NOP NOP CLR RST; 逻辑操作完毕清RST RET ;============================================================================================= DELAY: PUSH 02H ;将R2中的值推入堆笺 LP1: PUSH 02H ;将R2中的值推入堆笺 LP2: PUSH 02H ;将R2中的值推入堆笺 LP3: DJNZ R2,LP3 ;若R2-1不为0,跳转到LP3 POP 02H ;将堆笺中值弹出到R2中 DJNZ R2,LP2 ;若R2-1不为0,跳转到LP2 POP 02H ;将堆笺中值弹出到R2中 DJNZ R2,LP1 ;若R2-1不为0,跳转到LP1 POP 02H ;将堆笺中值弹出到R2中 DJNZ R2,DELAY ;NOP ;若R2-1不为0,跳转到DELAY RET END