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

📄 ds1302.txt

📁 ds1302时钟电路的汇编语言程序
💻 TXT
字号:
基于DS1302的数码管时钟电路设计源程序


时钟电路设计的程序清单:
;****************************************
;* 基于DS1302的时钟电路设计 *
;****************************************

T_CLK EQU P3.3 ; 时钟线引脚
T_IO EQU P3.4 ; 数据线引脚
T_RST EQU P3.2 ; 复位线引脚
SECOND EQU 30H ;秒数据存储单元
CMIN EQU 31H ;分数据
CHR EQU 32H ;小时数据
CDATE EQU 33H ;日数据
CMONTH EQU 34H ;月数据
CDAY EQU 35H ;星期数据
CYEAR EQU 36H ;年数据低2位
ORG 0000H ;程序执行开始地址
LJMP START ;跳至START执行
ORG 0003H ;外中断0中断入口地址
RETI ;中断返回(不开中断)
ORG 000BH ;定时器T0中断入口地址
RETI ;中断返回(不开中断)
ORG 0013H ;外中断1中断入口地址
RETI ;中断返回(不开中断)
ORG 001BH ;定时器T1中断入口地址
LJMP INTT1 ;进入定时器中断程序
ORG 0023H ;串行口中断入口地址
RETI ;中断返回(不开中断)
ORG 002BH ;定时器T2中断入口地址
RETI ;中断返回(不开中断)
ORG 0100H
;****************************************
; 主程序 *
;****************************************
START: MOV TL1,#0B0H ;初始化定时器T1
MOV TH1,#3CH
CLR 13H ;分钟、小时闪动标志位初始化
CLR 14H
START1: LCALL set1302 ;调用DS1302初始化之程序
NOP
START2: LCALL DELAY ;调用显示子程序
JNB P3.5,KEY ;判断是否有键按下,若有,则调用键盘程序
LCALL get1302 ;调用DS1302读时间程序
JNB P3.5,KEY ;再次判断是否有键按下,若有,则调用键盘程序
AJMP START2
;****************************************
; 键盘程序 *
;****************************************
KEY: MOV R6,#07H ;
MOV 22H,#00H ;标志位置零
LCALL DELAY ;显示并延时,判断是否为抖动抖动
JNB P3.5 ,KEY1 ;的确有键按下,进入时间调整程序
AJMP START2 ;否则跳出调时程序
KEY1: LCALL DELAY ;调显示
JNB P3.5 ,KEY1 ;等待键释放
SETB TR1 ;定时器开始计时,开放中断
SETB ET1
SETB EA
CHMIN: LCALL DELAY ;分钟调整入口
JNB P3.5,CHHR ;
JNB P3.6 ,ADDMIN ;
AJMP CHMIN
ADDMIN: LCALL DELAY
JB P3.6,CHMIN ;
INC CMIN ;
SETB 10H ;
CLR 11H ;
TIAOMIN: PUSH A ;分钟加1调整,并保护现场
MOV A,CMIN
ANL A,#0FH
CLR C
CJNE A,#0AH ,PPA
ANL CMIN,#0F0H
MOV A,CMIN
ADD A,#10H
MOV CMIN,A
CJNE A,#60H,PPA
ANL CMIN,#00H
PPA: POP A ;恢复现场
LCALL DELAY ;显示
LCALL DELAY
LCALL DELAY
LCALL DELAY
JB P3.6, CHMIN ;若键释放,则返回到分钟调整入口程序
LCALL DELAY ;显示并延时
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
JNB P3.6,ADD2 ;若键一直按下,则进入快速调分状态
AJMP CHMIN ;否则进入分钟调整入口程序
ADD2: PUSH A ;快速调分程序
MOV A,CMIN
ADD A,#01H
MOV CMIN,A
POP A
AJMP TIAOMIN
CHHR: LCALL DELAY ;等待键释放
JNB P3.5, CHHR
CLR 10H
SETB 11H
CHHR1: LCALL DELAY ;小时调整程序入口
JNB P3.5,OUT ;
JNB P3.6 ,ADDH
AJMP CHHR1
ADDH: LCALL DELAY ;延时去抖动
JB P3.6,CHHR1
INC CHR
TIAOSHI: PUSH A ;小时加1调整程序
MOV A,CHR
CJNE A,#24H,HH0
ANL CHR,#00H
AJMP OUT11
HH0: ANL A,#0FH
CLR C
CJNE A,#0AH,OUT11
ANL CHR,#0F0H
MOV A,CHR
ADD A,#10H
MOV CHR,A
OUT11: POP A ;显示并延时
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
JB P3.6 ,CHHR1 ;判断键释放 ,则返回到小时调整入口程序
LCALL DELAY ;否则显示并延时
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
JNB P3.6 ,ADDH2 ;若键一直按下,则进入快速调时状态
AJMP CHHR1 ;否则进入小时调整入口程序
ADDH2: PUSH A ;快速调时程序
MOV A ,CHR
ADD A,#01H
MOV CHR,A
POP A
AJMP TIAOSHI
OUT: LCALL DELAY ;调时结束,置零标志位,关定时器
JNB P3.5,OUT
CLR 13H
CLR 14H
CLR TR1
CLR ET1
CLR EA
LJMP START ; 返回
set1302: CLR T_RST ;DS1302初始化之程序 ,将分钟,小时等数据送入到DS1302中
CLR T_CLK
SETB T_RST
MOV B,#8EH ;控制寄存器
LCALL RTInputByte
MOV B,#00H ;写操作前WP置零
LCALL RTInputByte
SETB T_CLK
CLR T_RST
MOV R0,#Second
MOV R7,#7 ;秒、分、时、日、月、星期、年共7个数据
MOV R1,#80H ;秒写地址
set13021: CLR T_RST
CLR T_CLK
SETB T_RST
MOV B,R1 ;写秒、分、时、日、月、星期、年地址
LCALL RTInputByte
MOV A,@R0 ;写秒数据
MOV B,A
LCALL RTinputByte
INC R0
INC R1
INC R1
SETB T_CLK
CLR T_RST
DJNZ R7,Set13021
CLR T_RST
CLR T_CLK
SETB T_RST
MOV B,#8EH ;控制寄存器
LCALL RTInputByte
MOV B,#80H ;控制WP为1,进入写保护状态
LCALL RTInputByte
SETB T_CLK
CLR T_RST
RET
;;
;;
get1302: MOV R0,#Second ;DS1302读时间程序
MOV R7,#7
MOV R1,#81H ;秒地址
get13021: CLR T_RST
CLR T_CLK
SETB T_RST
MOV B,R1 ;秒、分、时、日、月、星期、年地址
LCALL RTInpuTByte
LCALL RT0utputByte
MOV @R0,A ;
INC R0
INC R1
INC R1
SETB T_CLK
CLR T_RST
DJNZ R7,Get13021
RET
;;
;;;写1302 1 B 子程序
RTInputByte: MOV R4,#8
Inbit1: MOV A,B
RRC A
MOV B,A
MOV T_IO,C
SETB T_CLK
CLR T_CLK
DJNZ R4,Inbit1
RET
;;读1302 1B子程序
RT0utputByte: MOV R4,#8
Outbit1: MOV C,T_IO
RRC A
SETB T_CLK
CLR T_CLK
DJNZ R4,Outbit1
RET
;****************************************
; 显示程序 *
;****************************************
DELAY: MOV R5 ,#0FFH ;显示程序
DEL: MOV R3,Second
ACALL CHAG ;调用字符转换程序,使压缩BCD变为非压缩BCD码
MOV P2,#00H
MOV P1,R2
SETB P2.0 ;秒显示
NOP
CLR P2.0
MOV P1,R3
SETB P2.1
NOP
CLR P2.1
MOV R3,CMIN
ACALL CHAG
MOV P2,#00H
MOV P1,R2
CLR P1.7
JB 13H , MINOFF ;分钟闪动调时标志
SETB P2.2 ;分显示
NOP
CLR P2.2
MOV P1,R3
SETB P2.3
NOP
CLR P2.3
AJMP MINOUT
MINOFF: CLR P2.2
CLR P2.3
MINOUT: MOV R3, CHR
ACALL CHAG
MOV P2,#00H
MOV P1,R2
CLR P1.7
JB 14H , HROFF ;小时闪动调时标志
SETB P2.4 ;小时显示
NOP
CLR P2.4
MOV P1,R3
SETB P2.5
NOP
AJMP HOUT
HROFF: CLR P2.4
CLR P2.5
HOUT: DJNZ R5 ,DEL
RET
CHAG: PUSH A ;字符转换程序,使压缩BCD变为非压缩BCD码
MOV P2,#00H ;把转换后BCD码的低字节放到R2中,
MOV A,R3 ;高字节放到R3中,数据R3传入
ANL A,#00FH
MOV R2,A
MOV A,R3
SWAP A
ANL A,#00FH
MOV R3,A
MOV DPTR,#TAB
MOV A,R2
MOVC A,@A+DPTR
MOV R2,A
MOV A,R3
MOVC A,@A+DPTR
MOV R3,A
POP A
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;****************************************
; T1中断服务程序, 用于闪动调时程序 *
;****************************************
INTT1: PUSH ACC ;中断现场保护
PUSH PSW ;
MOV TL1,#0B0H ;装定时器T1定时初值
MOV TH1, #3CH
DJNZ R6,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)
MOV R6,#07H ;重装0.3秒定时用初值
SETB 12H ;0.3秒定时到对闪烁标志取反
JB 12H,FLASH1 ;02H位为1时显示单元"熄灭"
CLR 13H
CLR 14H
INTT1OUT: POP PSW ;恢复现场
POP ACC ;
RETI ;中断退出
FLASH1: JB 11H,FLASH2 ;01H位为1时,转小时熄灭控制
CPL 13H
AJMP INTT1OUT ;转中断退出
FLASH2: CLR 13H
CPL 14H
AJMP INTT1OUT ;转中断退出

⌨️ 快捷键说明

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