⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302-dsy.asm

📁 基于时钟芯片DS1302电子时钟完整代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:

;8位数码管显示
;P0 为段码口、P2 为位码口
;晶振 12M
;时钟芯片:DS1302

;************** DS1302 端口位定义 **************
          
          SCLK     BIT  P1.0     ; 时钟控制总线
		  IO_DATA  BIT  P1.1     ; 数据传送总线
          RST      BIT  P1.2     ; 复位总线
		  LED      BIT  P2.0
		  
          K3       EQU  P3.2     ;调整、移位
          K1       EQU  P3.3	 ;加一、显示日期																	                                   
          K2       EQU  P3.4	 ;减一、显示闹钟
          BEEP     EQU  P2.7     ;蜂鸣器
																															                        
          T_CONU   EQU  22H      ;中断计数
          TIME_L   EQU  23H      ;定时初值
          TIME_H   EQU  24H

          TIME_DATA   EQU  50H   ;显示时间单元首地址
          DATE_DATA   EQU  60H   ;显示日期单元首地址													                          
          DS_DATA     EQU  58H   ;显示定时时间单元首地址
;------------------------------------------------
          ORG  0000H
		  JMP  MAIN
          ORG  000BH
          LJMP  INT_T0
          ORG  0100H
;------------------------------------------------
MAIN:
          MOV  TMOD,#01H        ;T0,方式1
          MOV  TIME_L,#00H      ;50MS定时值
          MOV  TIME_H,#4CH
          MOV  T_CONU,#00H      ;中断次数
          MOV  IE,#82H          ;EA=1,ET0=1
		  SETB TR0

          MOV  A,#00H
          MOV  R0,#40H          ;从40H单元开始
          MOV  R1,#40H          ;清64个单元
M_CLEAR:  MOV  @R0,A
          INC  R0
          DJNZ  R1,M_CLEAR
          CLR   BEEP

          LCALL  PROSET         ;DS1302初始化

MAIN1:	  LCALL  GET_TIME       ;从DS1302读数据程序
          LCALL  CHULI          ;实时时间数据处理
          MOV  R0,#TIME_DATA    ;显示时、分、秒
          LCALL  DISP
          MOV  R0,#TIME_DATA
          LCALL  TIME_DISPLAY
          LCALL  SET_KEY        ;键功能程序
          JB  K1,MAIN1


          CALL  BEEP_BL
MAIN2:	  CLR   TR0
		  CLR   LED
          LCALL  CHULI          ;日期数据处理
          MOV  R0,#DATE_DATA
          LCALL  DISP           ;显示年、月、日
          MOV  R0,#DATE_DATA
          LCALL  TIME_DISPLAY
          JB  K1,MAIN2
          CALL  BEEP_BL
		  SETB  TR0
		  JMP  MAIN1
;--------------------------------------------
;中断服务子程序
;500MS对闪动标记取反一次
;--------------------------------------------
INT_T0:
          PUSH  ACC
          PUSH  PSW
          MOV  TL0,TIME_L
          MOV  TH0,TIME_H
          INC  T_CONU
          MOV  A,T_CONU
          CJNE  A,#0AH,INT_END
          MOV  T_CONU,#00H
          CPL  LED
INT_END:
          POP  PSW
          POP  ACC
          RETI
;--------------------------------------------
;DS1302 初始化子程序
; (R0)=数据  (R1)=地址
;--------------------------------------------
PROSET:
           CLR   RST            ;DS1302复位
           CLR   SCLK
           NOP
           NOP
           SETB  RST

          MOV  R1,#80H          ;写秒寄存器
          MOV  R0,#00H          ;启动振荡器
          LCALL WRITE

          MOV  R1,#82H          ;写分寄存器
          MOV  R0,#53H
          LCALL WRITE

          MOV  R1,#84H          ;写时寄存器
          MOV  R0,#22H
          LCALL WRITE

          MOV  R1,#90H          ;写充电寄存器
          MOV  R0,#0ABH
          LCALL WRITE

          RET
;===============================================
;读时间、日期数据子程序
;存放单元 40H - 46H
;===============================================
GET_TIME:
          MOV  R1,#81H          ;读秒
          LCALL  READ
          MOV 40H,R0

          MOV  R1,#83H          ;读分
          LCALL  READ
          MOV 41H,R0

          MOV  R1,#85H          ;读时
          LCALL  READ
          MOV 42H,R0

          MOV  R1,#87H          ;读出日期
          LCALL  READ
          MOV 43H,R0

          MOV  R1,#89H          ;读出月份
          LCALL  READ
          MOV 44H,R0

          MOV  R1,#8BH          ;读出星期
          LCALL  READ
          MOV 46H,R0

          MOV  R1,#8DH          ;读出年
          LCALL  READ
          MOV 45H,R0

          RET
;================================================
;写 DS1302 子程序  R0=数据,R1=地址
;================================================
WRITE:
          CLR  SCLK
          NOP
          NOP
          SETB  RST
          NOP
          MOV  A,R1
          MOV  R2,#08H
WRI_01:
          RRC  A                ;传输地址到DS1302
          NOP
          NOP
          CLR  SCLK
          NOP
          NOP          
          MOV  IO_DATA,C
          NOP
          NOP         
          SETB  SCLK
          NOP
          NOP
          DJNZ  R2,WRI_01
          CLR  SCLK
          NOP
          NOP
          MOV  A,R0
          MOV  R2,#08H
WRI_02:
          RRC  A           ;传输数据到DS1302
          NOP
          CLR  SCLK
          NOP
          NOP
          MOV  IO_DATA,C
          NOP
          NOP
          SETB  SCLK
          NOP
          NOP
          DJNZ  R2,WRI_02
          CLR  SCLK
          NOP
          NOP
          CLR  RST
          NOP
          NOP
          RET
;=================================================
;读 DS1302 子程序
;=================================================
READ:
          CLR   SCLK
          NOP
          NOP
          SETB  RST
          NOP
          NOP
          MOV  A,R1         ;取地址
          MOV  R2,#08H      ;字节数
READ_01:
          RRC  A
          NOP               ;先传输地址到DS1302
          MOV  IO_DATA,C
          NOP
          NOP
          SETB  SCLK
          NOP
          NOP
          CLR  SCLK
          NOP
          NOP
          DJNZ  R2,READ_01
          NOP
          NOP
          SETB  IO_DATA
          CLR  A
          CLR  C
          MOV  R2,#08H
READ_02:
          CLR  SCLK
          NOP
          NOP         
          MOV  C,IO_DATA
          NOP
          NOP         
          RRC  A                ;再从DS1302接收数据
          NOP
          NOP          
          SETB  SCLK
          NOP
          NOP          
          DJNZ  R2,READ_02
          MOV  R0,A
          CLR  RST
          RET
;==============================================
;实时时间、日期数据处理子程序
;==============================================
 CHULI:
          MOV A,40H               ;处理秒数据
          ANL A,#0FH
          MOV 50H,A
          MOV 70H,A
          MOV A,40H
          ANL A,#11110000B
          SWAP A
          MOV 51H,A
          MOV 71H,A
;---------------------------------------------
          MOV A,41H               ;处理分数据
          ANL A,#0FH
          MOV 52H,A
          MOV 72H,A
          MOV A,41H
          ANL A,#11110000B
          SWAP A
          MOV 53H,A
          MOV 73H,A
;---------------------------------------------
          MOV A,42H               ;处理时数据
          ANL A,#0FH
          MOV 54H,A
          MOV 74H,A
          MOV A,42H
          ANL A,#11110000B
          SWAP A
          MOV 75H,A
		  JNZ Z1				   ;十位灭零
		  MOV A,#0AH
	   Z1:MOV 55H,A
;----------------------------------------------
          MOV A,43H               ;处理日数据
          ANL A,#0FH
          MOV 60H,A
          MOV 76H,A
          MOV A,43H
          ANL A,#11110000B
          SWAP A
          MOV 61H,A
          MOV 77H,A
;---------------------------------------------
          MOV A,44H               ;处理月数据
          ANL A,#0FH
          MOV 62H,A
          MOV 78H,A
          MOV A,44H
          ANL A,#11110000B
          SWAP A
          MOV 63H,A
          MOV 79H,A
;---------------------------------------------																				    
          MOV A,45H               ;处理年数据
          ANL A,#0FH
          MOV 64H,A
          MOV  7AH,A
          MOV A,45H
          ANL A,#11110000B
          SWAP A
          MOV 65H,A
          MOV 7BH,A
;----------------------------------------------
          MOV A,46H               ;处理周数据
          MOV 66H,A
          MOV 7CH,A
          RET
;=============================================
;实时时间、日期查表取数子程序
;=============================================
DISP:     MOV R3,#06H
DISP1:    MOV A,@R0
          MOV DPTR,#TAB_NU
          MOVC A,@A+DPTR
          MOV @R0,A
          INC R0
          DJNZ R3,DISP1
          RET
;====================================================
;时间、日期显示子程序
;====================================================
TIME_DISPLAY:
	      MOV      P0,@R0          ;显示秒个位
		  CLR      P2.1
		  INC      R0
		  CALL     DELAY
		  SETB     P2.1

		  MOV      P0,@R0		   ;显示秒十位
		  CLR      P2.2
		  INC      R0
		  CALL     DELAY
		  SETB     P2.2

		  MOV      P0,@R0		   ;显示分个位
		  CLR      P2.3
		  INC      R0
		  CALL     DELAY
		  SETB     P2.3

		  MOV      P0,@R0			;显示分十位
		  CLR      P2.4
		  INC      R0
		  CALL     DELAY
		  SETB     P2.4

		  MOV      P0,@R0			;显示时个位
		  CLR      P2.5
		  INC      R0
		  CALL     DELAY
		  SETB     P2.5

		  MOV      P0,@R0			;显示时个位
		  CLR      P2.6
		  CALL     DELAY
		  SETB     P2.6

DELAY:
          MOV  R4,#0AH

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -