;广西经济职业学院机电工程系
;使用硬件:AT89S51、DS1302、
; 4位动态数码管显示
;读取DS1302“时”“分”
;通过7SEG四位数码管显示
;有按键,调整时数值闪动
;按P3.2进入调整模式,再按一次退出
;按P3.1切换调整项目
;按P3.0调整数值加1,长按连加1
;P3.0键也是时间和温度的切换开关
;以下程序原代码
RST BIT P2.2 ;定义引脚
SCLK BIT P2.0 ;方便使用
IO BIT P2.1 ;
HOUR EQU 078H ;小时缓冲
MIN EQU 077H ;分缓冲
SEC EQU 076H ;秒缓冲
FLASH BIT 2EH ;闪动控制位
DS01 BIT 2DH ;地址、数据选择位
TEMP0 EQU 075H ;调整时调整项标志缓冲寄存器
ORG 000H
AJMP MAIN ;转主程序
ORG 03H
LJMP BUTT ;按键中断子程序入口
MAIN: ;主程序
CLR FLASH ;清闪动控制标志位
MOV SP,#38H ;堆栈指针
MOV R7,#0 ;以下几行为准备工作
MOV R3,#0 ;
CLR RST ;使DS1302复位,关闭数据交换
CLR SCLK ;DS1302串行时钟
MOV DPTR,#TAB ;指针指向表首
MOV IE,#81H ;打开外中断0
MOV SP,#30H ;重新定义堆栈指针
MOV A,#81H ;读秒
LCALL R_1302 ;读使能
RLC A ;提取时钟运行停止位(即判断是否为初次上电)
JNB P3.1,INTI0;如果按下P3.1后,上电运行,将强行初始化,显示00.00
JNC L ;如果为0跳过初始化,如果为1则为初次上电,往下执行
INTI0: MOV A,#80H ;写秒,DS1302初次上电必须写秒,否则时钟不运行
MOV B,#00H ;秒初值
LCALL W_1302 ;写使能
MOV A,#82H ;写分
MOV B,#00H ;分初值
LCALL W_1302 ;写使能
MOV A,#84H ;写分
MOV B,#00H ;小时初值
LCALL W_1302 ;写使能
MOV A,#8EH ;写保护寄存器
MOV B,#00H ;不保护
LCALL W_1302 ;写使能
MOV A,#90H ;写涓流充电设置
MOV B,#0A1H ;涓流充电允许,不过二极管,2K电阻
LCALL W_1302 ;写使能
L:
MAIN1: CLR TR0 ;执行电子钟时,关闭定时器
SETB EA ;打开中断
ACALL RTIME ;读时间值到缓冲
LCALL DISP ;显示时间值
AJMP L
RTIME: ;读时间值到缓冲子程序
MOV A,#85H ;读小时
LCALL R_1302 ;读使能
MOV HOUR,A ;读取值送小时缓冲
MOV A,#83H ;读分
LCALL R_1302 ;读使能
MOV MIN,A ;读取值送分缓冲
RET
DISP: ;显示子程序
MOV A,MIN ;分值送A,为提取分个位做准备
ANL A,#0FH ;提取分个位(屏蔽高四位)
MOVC A,@A+DPTR ;提取与A值对应的字模
MOV p0,A ;字模送数据口
CJNE R3,#1,S18 ;R3为1时,个位闪动(在调整状态下)
JB FLASH,S19 ;闪动时频率与小数点同步
S18: CLR p2.6 ;显示个位
S19: LCALL D3MS ;延时约3毫秒
SETB P2.6 ;关闭个位
MOV A,MIN ;分值送A,为提取分十位做准备
SWAP A ;高低四位交换,方便提取十位
ANL A,#0FH ;提取十位(此时十位值已经在低四位)
MOVC A,@A+DPTR ;提取与A值对应的字模
MOV p0,A ;字模送数据口
CJNE R3,#1,S20 ;R3为1时,十位闪动
JB FLASH,S21 ;闪动时频率与小数点同步
S20: CLR P2.5 ;显示十位
S21: LCALL D3MS ;延时约3毫秒
SETB P2.5 ;关闭十位
MOV A,HOUR ;显示小时个位程序(与分个位类似)
ANL A,#0FH ;
MOVC A,@A+DPTR ;
MOV p0,A ;
CJNE R3,#2,S22
JB FLASH,S23
S22: CLR P2.4 ;
S23: DJNZ R4,A1 ;\
MOV R4,#40 ;|
CPL FLASH ; >这5行让小数点闪动
A1: JB FLASH,A2 ;| 同时也做为调整时项目的闪动控制
CLR p0.7 ;/
A2: LCALL D3MS ;
SETB P2.4
MOV A,HOUR ;显示小时十位程序(与分十位类似)
SWAP A ;
ANL A,#0FH ;
MOVC A,@A+DPTR ;
MOV p0,A ;
CJNE R3,#2,S24
JB FLASH,S25
S24: CLR P2.3 ;
S25: LCALL D3MS ;
SETB P2.3 ;
RET
R_1302: ;读DS1302子程序
SETB RST ;打开1302
MOV R7,#0
L0: RRC A ;取出一位数据送到位累加器C
MOV IO,C ;将数据送到1302数据口IO
SETB SCLK ;与下一行构成时钟脉冲
CLR SCLK ;(1302用来接收数据)
INC R7 ;计数器加1计数
CJNE R7,#8,L0 ;判断是否送完8位数据
MOV R7,#0 ;数据送完计数器归0
L1: MOV C,IO ;1302将数据送出IO口
RRC A ;接收一位数据放入位累加器C
SETB SCLK ;与下一行构成时钟脉冲
CLR SCLK ;(1302用来送出数据)
INC R7 ;计数器加1计数
CJNE R7,#8,L1 ;判断是否送出8位数据
MOV R7,#0 ;1302送出8位数据后计数器归0
CLR RST ;关闭1302
RET
W_1302: ;写DS1302子程序
SETB RST ;打开1302
MOV R7,#0
CLR DS01 ;
L2: RRC A ;取出一位数据送到位累加器C
MOV IO,C ;将数据送到1302数据口IO
SETB SCLK ;与下一行构成时钟脉冲
CLR SCLK ;(1302用来接收数据)
INC R7 ;计数器加1计数
CJNE R7,#8,L2 ;判断是否送完8位数据
MOV A,B ;将要写入1302的数据传给A
MOV R7,#0 ;指令(或数据)送完给1302后计数器归0
CPL DS01 ;标志位
JB DS01,L2 ;如果为1,返回L2,将写数据送给1302
CLR RST ;关闭1302
RET
BUTT: ;按键中断子程序
CLR EA ;进入按键程序后关闭中断
MOV R3,#1
S1: JB p3.7,S16;这4行消抖动
LCALL RTIME
LCALL DISP
JB p3.7,S1
S6: JB p3.7,S2 ;这4行等待按键释放
LCALL RTIME
LCALL DISP ;等待期间,还得显示时间
SJMP S6
S16: AJMP S11 ;S1和S7的跳板
S2: ;退出按键程序
JB p3.7,S3 ;这4行消抖动
LCALL RTIME
LCALL DISP
JB P3.7,S2
S7: JB P3.7,S16;等待P3.7释放,退出
LCALL RTIME
LCALL DISP
AJMP S7
S3: ;调整切换
JB P3.6,S4 ;这4行消抖动
LCALL RTIME
LCALL DISP
JB P3.6,S3
S12: JB P3.6,S13
LCALL DISP
AJMP S12
S13: INC R3 ;
CJNE R3,#3,S4 ;
MOV R3,#1 ;
S4: ;数值调整按键
JB P3.5,S8 ;这4行消抖动
MOV R2,#20 ;自加1速度控制量
LCALL RTIME
LCALL DISP
JB P3.5,S4
S10: JB P3.5,S9
MOV TEMP0,R3
MOV R3,#0 ;长按连加时,数值不闪动
LCALL RTIME
LCALL DISP
MOV R3,TEMP0
DJNZ R2,S10 ;长按自加1
S9: ;调分加1
CJNE R3,#1,S14 ;如果R3不为1,继续查询
MOV A,MIN
ADD A,#1
DA A
CJNE A,#60H,S5
MOV A,#0
S5: MOV B,A
MOV A,#82H
LCALL W_1302
AJMP S2
S14: ;调小时加1
;CJNE R3,#2,S17 ;如果R3不为2,继续查询
MOV A,HOUR ;
ADD A,#1 ;
DA A ;
CJNE A,#24H,S15 ;
MOV A,#0 ;
S15: MOV B,A ;
MOV A,#84H ;
LCALL W_1302 ;
AJMP S2 ;
S8: ;按键扫描期间(没键按下),还得显示时间
LCALL RTIME
LCALL DISP
AJMP S2
S11: ;退出按键程序,退出前重新打开中断
MOV R3,#0 ;清0是为,进入调整时,从分开始
SETB EA ;退出中断程序前重新打开中断
RETI
D3MS: ;延时3毫秒子程序
MOV R5,#6
D1: DJNZ R6,$
DJNZ R5,D1
RET
TAB: ;以下为标准0-9字模表
DB 0C0H,0F9H,0A4H,0B0H,099H,092H
DB 082H,0F8H,080H,090H,0BFH,0FFH
END
经职院官方公众号
办公室电话:0771-6301430
传真:0771-6301345
招生电话:0771-6306381 6306382(兼传真) 6306383