倒计时器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、设计任务
利用单片机的定时器/计数器的定时和计数,用 LED数码管显示计时的时间,某键按下去时;再按一下停止计时;另一键按下去时间清零。
二、设计方案及工作原理
方案设计:
1.有复位的功能。
2.有设置的功能。
3.有定时和计时切换的功能。
4.计时范围0~99.99秒。
5.定时范围0~99分。
工作原理:
用8051芯片制作一个具用倒计时和秒表功能的器件,外接晶振。当倒计时时,送一个数,从这个数一直计到0蜂鸣器响。正计时,0.01秒计满9向0.1秒进一,0.1秒计满9向秒个位进一,秒个位计满9向秒十位进一,秒十位计满9结束运行。
目 录
第一章、 系统设计要求和解决方案
第二章、 硬件实现
第三章、 软件实现
第四章、 实现的功能
第五章、 缺点及可能的解决方法
第六章、 心得体会
附录一、参考文献
附录二、硬件原理图
附录三、程序流程图
第一章 系统设计要求和解决方案
系统设计要求:
利用单片机的定时器/计数器的定时和计数,用 LED数码显示计时的时间,某键按下去时;再按一下停止计时;另一键按下去时间清零。
解决方案:
初始化为何种状态,开关是否按下,显示是定时状态还是计时状态。若为定时状态,。用四个共阴数码管LED显示起显示时间,采用动态显示的方法,P2.4、P2.5、P2.6、P2.7作为位选信号,P0口输出选段码。键盘为独立式按键,分别接在P3.2、P3.3、P3.4、P3.5上。K1为设置/启动功能键。按下时,系统进入时间设置;再按下,系统启动。K2为倒计时时间十位数设定键,按下时十位数字在0到9的范围。K3倒计时个位数设定键,按下时,个位数字在0到9的范围。K4为复位键。K5为定时与计时的切换键,按下切换到计时状态,不按为定时状态。P3.5连接发光二极管状态指示,系统时间设为定时状态熄灭,倒计时状态闪烁。P3.6输出控制信号驱动蜂鸣器,倒计时时间到,蜂鸣器响。开始正计时,正计时结束,蜂鸣器再响,程序结束。
第二章 硬件实现
用8051芯片制作一个具用倒计时和秒表功能的器件,外接晶振。当倒计时时,送一个数,从这个数一直计到0蜂鸣器响。正计时,0.01秒计满9向0.1秒进一,0.1秒计满9向秒个位进一,秒个位计满9向秒十位进一,秒十位计满9结束运行。利用单片机8051实现计数功能,按键开关 K4按下,切换定时与计时。定时范围在0到99分,计时范围在0到99.99.秒。
第二章 软件实现
程序清单:
ORG 0000H
TMS1 EQU 33H
TMS2 EQU
32H
TM1 EQU 31H
TM2 EQU 30H
MOV 30H , #00H
MOV 31H , #00H
MOV 32H , #00H
MOV 33H , #00H
AJMP MAIN ;主程序
ORG 0003H
AJMP NT0 ;外部中断0
AJMP NT1
ORG 000BH
AJMP TCT0 ; 定时器T0
ORG 0030H
MAIN: MOV SP, #60H ;设置堆栈
CLR 00H ;工作状态标志位,0为设置,1为工作
CLR 01H ;指示灯状态标志位,0为LED不亮,1为灯亮
CLR 02H ;控制信号标志,0为P3.6 低,1为P3.6高
JNC P3.7, LOOP1
MOV 22H, #00H ;100ms计数器清零
MOV 23H, #00H ; 秒计数器清零
MOV 24H, #10 ;分计数器预置10分钟
MOV TH0, #3CH ;100毫秒计数器初值
MOV TL0, #0B0H;
MOV TMOD, #02H
SETB EA
SETB ET0 ;允许定时器T0中断
SETB EX0 ;允许外部中断0中断
SETB IT0
SETB TR0
MOV 34H, #01H ;显示缓冲器预置数(十位)
MOV 35H, #00H ;显示缓冲器预置数(个位)
MOV TH0, #3CH
MOV TL0, #0B0H
MOV TMOD, #06H
SETB EA
SETB ET0
SETB EX0
SETB IT0
SETB TR0
CLR TR0
ACALL LED
JNB 00, L
ACALL TMZ1
ACALL DIS1
L: ACALL LED ;调指示灯状态控制程序
JNB 00H, L ; 查询工作状态指示,0为等待“设置”
ACALL BINBCD ; 二进制转十进制
ACALL DIS ;显示倒计时器中的值
JB 02H,OUT ;查询控制输出位,1为P3.6的高,报警
AJMP L
OUT: CLR EX0
CLR TR0
SETB P3.6 ;P3.6的高,报警
JNB P3.4, OUT1 ;按P3.4清除输出
AJMP OUT
OUT1: JNB P3.4, $ ;消抖
CLR P3.6 ;P3.6低,清除报警输出
CLR 02H
SETB EX0
CLR 00H ;设置状态
AJMP L
状态灯指示程序:
LED: JB 01H,LED0
CLR P3.5
RET
LED0: SETB P3.5
RET
二进制转十进制程序:
入口:24H单元二进制数。
出口:30H单元BCD码十位数,31H单元BCD码个位数
BINBCD: MOV A, 24H 取二进制数
MOV B, #10
DIV AB ; A中
存十位数,B中存个位数
MOV 30H,A ;存十位数
MOV 31H,B ; B中存个位数
RET
;显示倒计时程序:
入口:30H单元BCD码十位数,31H单元BCD码个数
DIS: MOV R0, #30H
MOV DPTR, #TAB
MOV A, @R0
MOVC A, @A+DPTR
MOV P0 ,A;显示十位
CLR P2.4
ACALL DELAY10 ;延时10ms
INC R0
SETB P2.4
MOV A, @R0
MOVC A, @A+DPTR
MOV P0, A ;显示个位
CLR P2.5
ACALL ELLY10
SETB P2.5
RET
DIS1: MOV R0, #30H
MOV DPTR, #TAB
MOV A, @R0
MOVC A, @R0+DPTR
MOV P0, A
CLR P2.7
ACALL DELAY10
INC R0
SETB P2.7
MOV A, @R0
MOVC A, @A+DPTR
MOV R0, A
CLR P2.6
ACALL DELAY10
INC R0
SETB P2.6
CLR P2.5
ACALL DELAY10
INC R0
SETB P2.5
CLR P2.4
ACALL DELAY10
INC R0
SETB P2.4
RET
;延时10ms子程序:
DELAY10: MOV R7, #0AH
DL: MOV R6, #0F9H
DL1:DJNZ R6, DEL1
DJNZ R7, DL
RET
;外部中断0程序:
NT0: CLR EX0 ;关中断
PUSH ACC
PUSH PSW
CLR P3.5 ;工作状态LED灭
ACALL DIS1 ;调设定值显示
KEY: JB P3.2, RETURN
KEY0: ACALL DIS1
JNB P3.2, KEY0 ;等待键释放
KEY2: JB P3.3, KEY3 ;判K2按下?未按下,转判K3
ACALL DIS1
INC 34H ;K2键按下,十位加1
MOV A, 34H
CJNE A, #0AH, KEY22
MOV 34H, #00H
KEY22: ACALL DIS1
JNB P3.3, KEY22
AJMP KEY2
KEY3: ACALL DIS1
JB P3.4, KEY1 ;判K3键按下?未按下,转判断K1
INC 35H ;K3键按下,个位加1
MOV A, 35H
CJNE A, #0AH,KEY33
MOV 35H, #00H
KEY33: ACALL DIS1
JNB P3.4, KEY33
AJMP KEY3
KEY1: ACALL DIS1
JB P3.2,KEY2 ; K1键未按下,转去判断K2,K3
KEY10: ACALL DIS1 ; 等待键释放
JB P3.2, KEY10 ;K1键
未按下,进入工作状态
ACALL BCDBIN ; 调十进制转换成二进制程序
SETB 00H ;置位进入“工作状态”标志
RETUTN: SETB EX0
SETB TR0
POP PSW
POP ACC
RET1
TAB:DB 40H,79H,24H,30H,19H,12H,00H,78H,00H,10H,
;十进制转换成二进制:
入口:34H单元BCD码,35H单元BCD码个位数。
出口:24H单元二进制数。
BCDBIN: MOV B, #10
MOV A, 34H
MUL AB
ADD A, 35H
MOV 24H, A
RET
;定时器T0中断服务程序:
TCT0: PUSH ACC
PUSH PSW
INC 22H
MOV A, 22H
CJNE A, #10, EXIT
MOV 22H, #00H
INC 23H ;秒单元加1
CPL 01H
MOV A, 23H
CJNE A, #60,EXIT
MOV 23H, 00H
DEC 24H ;分单元减1
MOV A, 23H
CJNE A, #00H,EXIT ;分计数单元不为“0”,继续
CLR TR0 ;关定时器
SETB 02H ;置位蜂鸣器控制信号
SETB 01H ;置位LED状态灯
CLR 00H ;“设置”状态
EXIT: POP PSW
POP ACC
RETI
;秒表中断NT1:
ORG 0001H
INC TMS1
MOV TMS1, #0
CJNE TMS1, #9, RETI
CLR TMS1
INC TMS2
CJNE TMS2, #9, RETI
CLR TMS2
INC TM1
CJNE TM1, #9,RETI
INC TM2
CLR TM1
CJNE TM2, #9, RETI
END
第四章 实现的功能
利用单片机8051实现计数功能,按键开关 K4按下,切换定时与计时。定时范围在0到99分,计时范围在0到99.99.秒。
第五章 缺点及可能的解决方法
缺点:
使用键盘时感觉键盘很不好使用,并且存在误差。
解决方法:
通过编程使用外置键盘改善键盘不好使用的缺点,尽量测量较短时间。
说明:开机默认为15秒,p32启动键,p34个位调整,p35十位调整
ORG 0000H ;程序入口地址
AJMP MAIN
ORG 0003H ;外部中断INT0入口地址
AJMP PINT0 ;转中断服务子程序
ORG 000BH ;T0中断入口
AJMP WT0 ;定时器T0入口地
址
ORG 20H
MAIN: MOV SP,#40H ;设置栈指针
MOV 20H,#0H ;把定时数据单元清零
MOV 21H,#0
MOV 22H,#0
MOV 23H,#15
MOV 24H,#0
MOV TH0,#5 ;装入定时初值
MOV TL0,#5
MOV TMOD,#02H ;设T0为方式2
SETB EA ;开CPU中断
SETB ET0 ;允许T0中断
CLR TR0 ;启动T0计数
SETB IT0 ;设定INT0触发方式
SETB EX0 ;INT0请求中断
MOV 34H,#1
MOV 35H,#5
NOP ;第二位显示数据 │
M: NOP
ACALL LED
ACALL SON
JNB 00H,M
MM: NOP
ACALL ZH1
ACALL DSP
ACALL LED
AJMP M
;显示子程序
DSP: MOV R7,#0AFH
DSP0: MOV R0,#30H
MOV DPTR,#TAB
NOP
MOV A,@R0
MOVC A,@A+DPTR
RX1: MOV P0,A
CLR P2.6
DJNZ R7,RX1
MOV R7,#0afh
INC R0
MOV P0,#0FFH
SETB P2.6
MOV A,@R0
MOVC A,@A+DPTR
RX2: MOV P0,A
CLR P2.5
DJNZ R7,RX2
MOV R7,#8
SETB P2.5
; DJNZ R7,DSP0
RET
DSP1: MOV R7,#0FH
DSP01: MOV R0,#34H
MOV DPTR,#TAB
MOV A,@R0
MOVC A,@A+DPTR
RX01: MOV P0,A
CLR P2.5
DJNZ R7,$
MOV R7,#0FH
INC R0
SETB P2.5
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
CLR P2.6
DJNZ R7,$
SETB P2.6
RET
ZH1: MOV R2,#0
MOV R3,23H
ACALL BCD
MOV A,R6
ANL A,#0FH
MOV 30H,A
MOV A,R6
ANL A,#0F0H
SWAP A
MOV 31H,A
RET
;十进制转换为二进制子程序
DTOB:
MOV 32H,#0
MOV 33H,#0
MOV R0,#32H
MOV R2,#3
ACALL IDTB
MOV A,R4
MOV 23H,A
RET
IDTB: MOV R3,#0
MOV A,@R0
MOV R4,A
IDTL: MOV A,R4
MOV B,#10
MUL AB
MOV R4,A
MOV B,#10
XCH A,B
XCH A,R3
MUL AB
ADD A,R3
XCH A,R4
INC R0
ADD A,@R0
XCH A,R4
ADDC A,#0
MOV R3,A
DJNZ R2,IDTL
RET
;二进制数转换为十进制数子程序
BCD: CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#16
IBTL2: CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ R7,IBTL2
RET
;延时子程序
DL: MOV R7,#02H
DL1: MOV R6,#0FFH
DL2: DJNZ R6,DL2
DJNZ R7,DL1
RET
;外部中断服务子程序
PINT0: CLR EX0
PUSH ACC
PUSH PSW
SETB P1.0
ACALL DSP1
PK: JB P3.2,TOEXT
pk0: acall dsp1
JNB P3.2,pk0
PK2: JB P3.5,PK3 ;判K2按下否,未按则转到判K3状态
ACALL DSP1
INC 34H
MOV A,34H
CJNE A,#0AH,PK22
MOV 34H,#0
PK22: ACALL DSP1 ;K2按下,30H加1
JNB P3.5,PK22
AJMP PK2
PK3: ACALL DSP1
JB P3.4,PK1 ;判K3按下否,未按则转到判K1状态
INC 35H
MOV A,35H
CJNE A,#0AH,PK33
MOV 35H,#0
PK33: ACALL DSP1
JNB P3.4,PK33
AJMP PK3
PK1: ACALL DSP1
JB P3.2,PK2 ;K1未按则转判K2和K3
pk10: acall dsp1
JNB P3.2,pk10
ACALL DTOB
SETB 00H
TOEXT: SETB EX0 ;开中断
SETB TR0
POP PSW ;恢复现场
POP ACC
RETI
LED: JB 01H,LED0
CLR P1.0
RET
LED0: SETB P1.0
RET
SON: JB 02H,SON0
CLR P3.3 ;
RET
SON0: SETB P3.3 ;
RET
;段码表
TAB: DB 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h
;定时中断服务子程序
WT0: PUSH ACC
PUSH PSW
INC 21H ;0.5ms
MOV A,21H
CJNE A,#0C8H,TORETI ;200D=C8H
MOV 21H,#0
INC 22H ;100ms
MOV A,22H
CJNE A,#10,TORETI
MOV 22H,#0
DEC 23H
MOV A,23H
; CJNE A,#60,TORETI
; MOV 23H,#0
; DEC 24H
CPL 01H
; MOV A,24H
CJNE A,#
0,TORETI
CLR TR0
SETB 02H
CLR 01H
CLR 00H
TORETI: POP PSW
POP ACC
RETI
END