急 基于单片机的数字时钟
发布网友
发布时间:2022-04-30 08:22
我来回答
共1个回答
热心网友
时间:2022-06-19 17:51
SECOND EQU 30H ;存储妙
MINITE EQU 31H ;存储分
HOUR EQU 32H ;存储时
SPEAKER BIT P3.7
HOURK BIT P3.2 ;时键
MINITEK BIT P3.3 ;分键
SECONDK BIT P3.0 ;妙键
FLAG BIT 00H
FLAG1S BIT 01H ;1S到标志位.
DISPBUF EQU 40H ; 段选标志
DISPBIT EQU 48H ; 位选通标志
T2SCNTA EQU 49H ; 中断次数
T2SCNTB EQU 4AH ; 中断次数
TEMP EQU 4BH ; 初始化位
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:主程序
;功能描述;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0 ;T0中断入口
START: MOV SECOND,#00H ;妙初始化0
MOV MINITE,#00H ;分初始化0
MOV HOUR,#12 ;时始化送12
MOV DISPBIT,#00H ;位选通标志
MOV T2SCNTA,#00H ;标志
MOV T2SCNTB,#00H ;标志
CLR FLAG
CLR FLAG1S
SETB SPEAKER
MOV TEMP,#07FH ;初始位,让第一个位选通
LCALL DISP ;调用显示处理程序
MOV TMOD,#01H ;方式1
MOV TH0,#0F8H ;赋值20MS
MOV TL0,#030H
SETB TR0 ;开中断启动
SETB ET0
SETB EA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:按键程序
;功能描述;调整分,时
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WT: JNB FLAG,CC
LCALL SPEAKING
CC: JB SECONDK,NK1 ;妙末按下,转去判断分键
LCALL DELY10MS ;按下,延时,消抖动
JB SECONDK,NK1 ;再次判断是否按下?
INC SECOND ;按下,按下一次加1
MOV A,SECOND ;送A判断
CJNE A,#60,NS60 ;妙末到60转分
MOV SECOND,#00H ;到了,回0
NS60: LCALL DISP
JNB SECONDK,$ ;等待妙键释放
NK1: JB MINITEK,NK2 ;跟妙键分析相似
LCALL DELY10MS
JB MINITEK,NK2
INC MINITE
MOV A,MINITE
CJNE A,#60,NM60
MOV MINITE,#00H
NM60: LCALL DISP
JNB MINITEK,$
NK2: JB HOURK,NK3 ;时键
LCALL DELY10MS
JB HOURK,NK3
INC HOUR
MOV A,HOUR
CJNE A,#24,NH24
MOV HOUR,#00H
NH24: LCALL DISP
JNB HOURK,$ ;等待时键释放
NK3: LJMP WT ;返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:显示处理程序
;功能描述;,该程序实现时,分,秒计时转换为BCD码并存储在以47H起始地址的显示
;输出数据存储单元里,即显示缓冲区47H至40H单元
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP:
MOV A,#DISPBUF ;送40H
ADD A,#7 ;加8
;DEC A
MOV R1,A ;送47H
MOV A,HOUR ;送时
MOV B,#10
DIV AB
MOV @R1,A ;存储时十位
DEC R1 ;指向时个位
MOV A,B ;送时个位
MOV @R1,A ;存储时个位
DEC R1
MOV A,#10
MOV @R1,A
DEC R1
MOV A,MINITE ; 送分,处理与时处理类似
MOV B,#10
DIV AB
MOV @R1,A
DEC R1
MOV A,B
MOV @R1,A
DEC R1
MOV A,#10
MOV @R1,A
DEC R1
MOV A,SECOND ;送秒
MOV B,#10
DIV AB
MOV @R1,A
DEC R1
MOV A,B
MOV @R1,A
DEC R1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:显示程序
;功能描述;在LED上显示为12-12-12显示模式.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INT_T0:
MOV TH0,#0F8H ;重赋值
MOV TL0,#030H
MOV A,#DISPBUF ;段偏移存储
ADD A,DISPBIT ;位偏移量
MOV R0,A ;段偏移存储
MOV A,@R0 ;段偏移量
MOV DPTR,#TABLE ;指向字形表
MOVC A,@A+DPTR ;取字形
MOV P0,#0 ;防闪烁
MOV P0,A ; 字形选P1口显示
MOV A,DISPBIT ;位移偏量
MOV DPTR,#TAB ;指向位选
MOVC A,@A+DPTR ;取位选通
MOV P2,A ;位送P3口选通
INC DISPBIT ;位偏移加1
MOV A,DISPBIT ;位偏移送A
CJNE A,#08H,KNA ;八个数管码扫描完不?
MOV DISPBIT,#00H ;描完重新开始
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:1秒计时程序
;功能描述;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KNA: INC T2SCNTA
MOV A,T2SCNTA
CJNE A,#100,DONE
MOV T2SCNTA,#00H
INC T2SCNTB
MOV A,T2SCNTB
CJNE A,#05H,DONE
SETB FLAG1S
MOV T2SCNTB,#00H
INC SECOND ;秒加1
MOV A,SECOND
CJNE A,#50,BB ;50S到.
MOV A,MINITE
CJNE A,#59,BB ;59分
SETB FLAG ;打开正点响标志.
BB: MOV A,SECOND
CJNE A,#60,NEXT ;秒超过60了没有? 没有,调用显示处理程序
MOV SECOND,#00H
INC MINITE ;分加1
MOV A,MINITE
CJNE A,#60,NEXT
MOV MINITE,#00H ;分超过60,清0
INC HOUR ;并时加1
MOV A,HOUR
CJNE A,#24,NEXT ;是否超过24小时?不是,则跳至NEXT
MOV HOUR,#00H
NEXT: LCALL DISP ; 调用显示处理程序
DONE: RETI ;中断返回
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H ;0到9字形(40表示横扛)
TAB: DB 07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:正点报时子程序
;功能描述; 前十秒报第一声,每隔一秒报一声.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SPEAKING:MOV R5,#6
AA: CLR SPEAKER
JNB FLAG1S,$ ;延时1S.
CLR FLAG1S
SETB SPEAKER
JNB FLAG1S,$
CLR FLAG1S
DJNZ R5,AA
CLR FLAG
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序名称:延时子程序
;功能描述;按键消抖调用.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELY10MS:MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET