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

📄 ds1302-dsy.asm

📁 DS1302-制作的电子时钟
💻 ASM
📖 第 1 页 / 共 2 页
字号:

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

;************** DS1302 端口位定义 **************
          IO_DATA  BIT  P1.1     ; 数据传送总线
          SCLK     BIT  P1.0     ; 时钟控制总线
          RST      BIT  P1.2     ; 复位总线

          K1     EQU  P1.4       ;独立键
          K2     EQU  P1.5
          K3     EQU  P1.6
          K4     EQU  P1.7

          BEEP   EQU  P3.7       ;蜂鸣器
          RELAY  EQU  P1.3       ;继电器

          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
          AJMP MAIN

          ORG  000BH
          AJMP  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

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

          MOV  7FH,#0AH         ;送熄灭符
          SETB   BEEP
          LCALL  TIME_DELAY     ;调显示延时
          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        ;键功能程序
          LCALL  COMP           ;实时时间与定时时间比较
          JB  K1,MAIN1
          CALL  BEEP_BL
MAIN2:
          LCALL  CHULI          ;日期数据处理
          MOV  R0,#DATE_DATA
          LCALL  DISP           ;显示年、月、日
          MOV  R0,#DATE_DATA
          LCALL  TIME_DISPLAY
          JB  K1,MAIN2
          CALL  BEEP_BL
MAIN3:
          LCALL  DS_CHULI        ;定时时间数据处理
          MOV  R0,#DS_DATA
          LCALL  DS_SP           ;显示定时时间
          MOV  R0,#DS_DATA
          LCALL  DS_DISPLAY
          JB  K1,MAIN3
          CALL  BEEP_BL
          AJMP  MAIN1
;--------------------------------------------
;中断服务子程序
;300MS对闪动标记取反一次
;--------------------------------------------
INT_T0:
          PUSH  ACC
          PUSH  PSW
          MOV  TL0,TIME_L
          MOV  TH0,TIME_H
          INC  T_CONU
          MOV  A,T_CONU
          CJNE  A,#06H,INT_END
          MOV  T_CONU,#00H
          CPL  0AH
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,#58H
          ;LCALL WRITE

          ;MOV  R1,#84H          ;写时寄存器
          ;MOV  R0,#80H
          ;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 子程序
;================================================
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 55H,A
          MOV 75H,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  R0,#TIME_DATA
          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  R0,#TIME_DATA      ;取得显示单元首地址
          MOV  R1,#07FH          ;从第一个数码管开始
          MOV  R2,#08H           ;共8个数码管

DISLP:    MOV  P0,@R0            ;获得当前单元数据
          MOV  A,R1
          MOV  P2,A             ;数码显示
          JB  ACC.5,DISLP1      ;第三位数码管显示 -
          MOV  P0,#0BFH
          JMP  DISLP3
DISLP1:   JB  ACC.2,DISLP2      ;第六位数码管显示 -
          MOV  P0,#0BFH
          JMP  DISLP3
DISLP2:   INC  R0
DISLP3:   MOV  A,R1              ;为下一个数准备
          RR  A                  ;下一个单元
          MOV  R1,A              ;保存
          LCALL  DELAY           ;为了保证数码管亮度,延时
          DJNZ  R2,DISLP        ;重复显示,直到全部数据刷新过
          RET                   ;返回

DELAY:
          MOV  R4,#0AH
  L15:    MOV  R5,#64H
  L16:    DJNZ  R5,L16
          DJNZ  R4,L15
          RET
;******************************************************
SET_KEY:
         SETB  K1             ;增加键
         SETB  K2             ;减少键
         SETB  K3             ;选择键
         SETB  K4             ;定时设定功能键
         NOP
         JB  K4,KEY01
         LCALL  BEEP_BL
         JMP  DS_KEY          ;进入定时值设定子程序
KEY01:   JB  K2,KEY02
         LCALL  BEEP_BL
         JMP  SET_TIME        ;进入时间设定子程序
KEY02:   JB  K3,KEY03
         LCALL  BEEP_BL
         CPL  20H.0          ;止闹标记取反
KEY03:   RET

;-----------------------------------------------------
DS_KEY:
         CALL  DS_DELAY
         JNB  K4,$          
         LCALL  DSSET
         CALL  DS_DELAY
         RET
;==============================================
;实时时间设定子程序
;K1为加键、K2为减键、K3为选择键
;==============================================
SET_TIME:
         MOV  R1,#8EH          ;写保护寄存器
         MOV  R0,#00H          ;允许写入
         LCALL WRITE

         MOV  R1,#80H          ;写秒寄存器
         MOV  R0,#80H          ;停止振荡器工作
         LCALL WRITE

         SETB  TR0

K001:    CALL TIME_DELAY       ;校时
         JNB K3,K001           ;K3为位移键
K010:
         CALL  CHULI
         JNB  0AH,KH01
         MOV  54H,7FH          ;送入熄灭符
         MOV  55H,7FH
         JMP  KH02
 KH01:   MOV  54H,74H          ;送实时值
         MOV  55H,75H          ;送实时值
 KH02:   MOV  R0,#TIME_DATA
         CALL  DISP
         MOV  R0,#TIME_DATA
         CALL  TIME_DISPLAY
         JNB  K1,K011A
         JNB  K2,K011B
         JNB  K3,K002
         JMP  K010
K011A:
         MOV  A,42H
         ADD A,#01H
         DA A
         MOV 42H,A
         XRL  A,#24H
         JNZ K012A
         MOV  42H,#00H
K012A:   MOV  R1,#84H           ;写时寄存器
         MOV  R0,42H
         LCALL WRITE
         CALL  TIME_DELAY
         JMP  K010

K011B:
         MOV  A,42H
         XRL  A,#00H
         JZ  K012B
         SETB  C              ;求补运算
         CLR  A
         ADDC  A,#99H         ;加99
         SUBB  A,#01H         ;减去减数
         ADD   A,42H          ;加被减数
         DA A                 ;十进制调整
         MOV 42H,A            ;
         XRL  A,#00H
         JNZ K012C
K012B:   MOV  42H,#23H
K012C:   MOV  R1,#84H           ;写时寄存器
         MOV  R0,42H
         LCALL WRITE
         CALL  TIME_DELAY
         JMP  K010
;-------------------------------------------------
K002:    CALL TIME_DELAY       ;校分
         JNB K3,K002            ;K3为位移键

K020:    CALL  CHULI
         JNB  0AH,KM01

         MOV  52H,7FH          ;送入熄灭符
         MOV  53H,7FH
         JMP  KM02

 KM01:   MOV  52H,72H          ;送实时值
         MOV  53H,73H          ;送实时值
 KM02:   MOV  R0,#TIME_DATA
         CALL  DISP
         MOV  R0,#TIME_DATA
         CALL  TIME_DISPLAY

         JNB  K1,K021A
         JNB  K2,K021B
         JNB  K3,K003
         JMP  K020

K021A:
         MOV  A,41H
         ADD  A,#01H
         DA A

⌨️ 快捷键说明

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