资源描述
四位电子钟设计与制作
电路原理图:
此作品为四位电子钟,主要由单片机编程实现其功能,所以分有两部分一个硬件,一个是软件,硬件方面的电路图如上图,单片机采用ATMEL公司生产的芯片AT89C2051里面有2K字节的可反复擦写的Flash程序存储器和128字节的随机存取数据存储器。显示部分为0.56共阳极四位数码管,在电路中P1口输出段码数据送入四位数码管,P3口做扫描控制,控制数码管的显示。Q1、Q2、Q3为8550三极管,信号经过放大送入P1、P2、P3、P4也就是数码管显示部分,AN1调整小时,AN2为调整分钟它们都接10脚然后接地.10脚接地,20脚接正电源,它们由3-6V电源供电,可以用两节1.5V的电池供电,也可以接USB接口5V供电.
软件方面,程序里先定义两个中断定时器T0和T1,一个作为秒记数用,另一个作为调整时闪烁用,编程时先将P1和P3口数据清零,然后P1和P3作为动态扫描显示,由于人的眼睛有延迟性,当扫描频率非常高时人就感觉数码管一直亮着,而同时计数器在遵循时间的变化方式执行着分到了60分钟加1,时间为24小时制,就是到了24小时后自动为00:00.
元件清单:
名称
型号
数量
单片机
AT89C2051
1
数码管
0.56四位共阳极
1
三极管
8550
4
电阻
4.7K
4
10K
1
220
8
电容
30PF
2
10uf
1
104
1
石英晶体振荡器
12M
1
电子钟源程序(汇编):
MIAO BIT P2.0 ;秒点位
HOU_S BIT P3.0 ;时十位
HOU_G BIT P3.1 ;时个位
MIN_S BIT P3.2 ;分十位
MIN_G BIT P3.3 ;分个位
H_KEY BIT P3.4 ;时调整键
M_KEY BIT P3.5 ;分调整键
SHAN BIT 0 ;秒点闪烁
LEDBUS EQU P1 ;显示数据总线
SECOND EQU 30H ;秒寄存器
MINUTE EQU 31H ;分寄存器
HOUR EQU 32H ;时寄存器
TIM_1 EQU 33H ;定时器0中断次数
TIM_2 EQU 34H ;定时器0中断次数
;********************************
ORG 0000H ;程序开始
LJMP INIT
ORG 000BH ;定时器0中断入口地址
LJMP TIMER0
ORG 0030H ;程序从30H开始
;********************************
; 单片机初始化
INIT:
MOV SECOND, #0 ;秒置0
MOV MINUTE, #0 ;分置0
MOV HOUR, #0 ;开机后显示0点
MOV TIM_1, #10 ;中断10次为0.5秒
MOV TIM_2, #2 ;0.5*2=1秒
MOV SP, #60H ;堆栈指针指向60H
MOV TMOD, #01H ;定时器0为模式1(16位)
MOV TH0, #03CH
MOV TL0, #0B0H ;50毫秒初值(晶振12M)
SETB ET0 ;定时器0中断允许
SETB TR0 ;启动定时器0
SETB EA ;开总中断
;********************************
; 主程序
MAIN:
JNB H_KEY, HT ;时调整键按下转到HT
JNB M_KEY, MT ;分调整键按下转到MT
ACALL DISP ;调用显示子程序
AJMP MAIN ;转LOOP继续检测按键状态
;********************************
; 时间调整
;----- 分调整 -----------------
MT: ACALL DISP ;调用显示子程序
JNB M_KEY, MT ;判断按键是否松开
INC MINUTE ;分加一
MOV A, MINUTE
CJNE A,#60, MAIN ;判断分是否加到60
MOV MINUTE, #0 ;分到60变为0
MOV SECOND, #0 ;秒置0
AJMP MAIN
;----- 时调整 -----------------
HT: ACALL DISP ;调用显示子程序
JNB H_KEY, HT ;判断按键是否松开
INC HOUR ;时加1
MOV A, HOUR
CJNE A,#24, MAIN
MOV HOUR, #0 ;判断时是否到24,时到24变0
AJMP MAIN
;********************************
; 显示子程序
DISP:
MOV DPTR, #LEDTAB ;数码管段码表首地址送DPTR
MOV A, MINUTE ;分放入ACC
MOV B, #10 ;B放入10
DIV AB ;A/B,商在A余数在B
MOVC A, @A+DPTR ;查表取分十位段码
MOV LEDBUS, A ;段码送LEDBUS口显示
MOV C, SHAN
MOV MIAO, C ;秒点闪烁
CLR MIN_S ;打开分十位显示
ACALL D1MS ;延时1毫秒
SETB MIN_S ;关闭分十位显示
MOV A, B
MOVC A, @A+DPTR ;查表取分个位段码
MOV LEDBUS, A
MOV C, SHAN
MOV MIAO, C ;秒点闪烁
CLR MIN_G ;打开分个位显示
ACALL D1MS ;延时1毫秒
SETB MIN_G ;关闭分十位显示
MOV A, HOUR
MOV B, #10
DIV AB ;拆分小时的十位和个位
JZ DISP0 ;十位为0不显示十位
MOVC A, @A+DPTR
MOV LEDBUS, A
CLR HOU_S ;打开时十位显示
DISP0:
ACALL D1MS
SETB HOU_S ;关闭时十位显示
MOV A, B
MOVC A, @A+DPTR
MOV LEDBUS, A
CLR HOU_G ;打开时个位显示
ACALL D1MS
SETB HOU_G ;关闭时个位显示
RET
;********************************
; 定时器0中断服务程序
TIMER0:
MOV A, #0B1H ;定时器0中断服务子程序
ADD A, TL0 ;同步修正(参考本人的<如何是自制的单片机电子钟走时精准>)
MOV TL0, A
MOV TH0, #03CH ;重装定时器0初值
PUSH ACC ;入栈保护ACC和PSW
PUSH PSW
DJNZ TIM_1, RETI_1
MOV TIM_1, #10 ;中断10次为0.5秒
CPL SHAN ;取反闪烁位
DJNZ TIM_2, RETI_1
MOV TIM_2, #2 ;1秒时间到
INC SECOND ;秒加1
MOV A, SECOND
CJNE A,#60, RETI_1
MOV SECOND, #0 ;秒到60变0
INC MINUTE ;分加1
MOV A, MINUTE
CJNE A,#60, RETI_1
MOV MINUTE, #0 ;分到60变0
INC HOUR ;时加1
MOV A, HOUR
CJNE A,#24, RETI_1
MOV HOUR, #0 ;时到24变0
RETI_1: POP PSW ;出栈
POP ACC
RETI
;********************************
; 延时子程序
D1MS: MOV R7, #2 ;延时1毫秒子程序
D_1: MOV R6, #250 ;延时时间估算250*2*2=1000微秒=1毫秒
DJNZ R6, $
DJNZ R7, D_1
RET
;********************************
; 数码管段码表
LEDTAB:
DB 14H,0D7H,4CH,45H,87H
; 0 1 2 3 4
DB 25H,024H,57H,04H,05H
; 5 6 7 8 9
END
展开阅读全文