任务要求
利用C8051F310单片机设计一个倒计时定时器,功能要求及主要技术指标要求如下:
1. 定时时间为9秒,定时精度为1秒 。
2. 在LED数码管上显示剩余时间。
3. 时间到0时,蜂鸣器鸣响1次(0.5秒钟)。
4. 通过KINT键实现启动和暂停功能,暂停时D9灯亮。
5. 利用单片机内部定时器定时,KINT键输入和定时器控制均要求采用中断方式。
以1秒定时器及相关循环构成的倒计时模块为整个程序的核心,再根据其他要求设计分支模块实现目标。1秒定时器以0.125s延时中断为基础,执行8次循环构成1s定时器,同时对1s定时器进行9次循环,完成倒计时定时器的基本内容。
分支模块包括:段码转换输出、KINT启动/暂停、蜂鸣器定时鸣响以及D9灯控制。
段码转换输出:不需要多余逻辑,通过计算得出0~9对应段码,然后直接通过MOV指令进行转换输出即可。
KINT启动/暂停:已知KINT键按下为低电平,则选择任意位置输入电平,利用JB指令进行判断,同时设置外部中断0,并将其设为最高优先级。最后添加15ms消抖。
蜂鸣器定时鸣响:不需要多余逻辑,已知蜂鸣器高电平下鸣响,则在MAIN函数中首先通过CLR P3.0使其关闭,再在倒计时结束后使其鸣响,并添加一个0.5s定时器使其延时0.5s。
D9灯控制:不需要多余逻辑,已知D9独立指示灯低电平点亮,则将其与KINT联系,KINT键按下时点亮D9,再次按下KINT即关闭,相当于D9作为暂停指示灯,D9点亮则程序中断,D9熄灭则正常运行。
;------------------------------------
;- Generated Initialization File --
;------------------------------------
$include (C8051F310.inc)
public Init_Device
TH EQU 06H
TL EQU 0C6H
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP KINT
ORG 000BH
LJMP CLOCK
ORG 001BH
LJMP CLOCK1
ORG 0100H
MAIN: LCALL Init_Device
SETB EA
SETB ET0
SETB ET1
SETB EX0
SETB PX0
SETB IT0
CLR P0.6
CLR P0.7 ;点亮数码管0
MOV TH0,#TH
MOV TL0,#TL
MOV TH1,#TH
MOV TL1,#TL
MOV R1,#9
MOV R2,#8
MOV DPTR, #TAB ;确保9以段码输出.
MOV A, R1
MOVC A, @A+DPTR
MOV P1, A
MOV 50H,#0
CLR P0.0
CLR P3.1
SJMP $
CLOCK: CJNE R2,#0,LOOP
MOV R2,#8
DEC R1
MOV DPTR, #TAB ;段码表地址.
MOV A, R1
MOVC A, @A+DPTR ;查表.
MOV P1, A ;送到P1去显示.
CJNE R1,#0,LOOP ;判断是否为0
MOV 50H,#0
CLR P0.0 ;点亮D9
SETB P3.1 ;鸣响蜂鸣器
CLR TR0
SETB TR1
MOV R1,#10
LOOP: MOV TH0,#TH
MOV TL0,#TL
DEC R2
RETI
KINT: MOV A,50H
INC 50H
MOV R6,#250 ;KINT消抖延时
L4: MOV R7,#30
L5: DJNZ R7,L5
DJNZ R6,L4
JB ACC.0,STOP
SETB P0.0
SETB TR0
RETI
STOP: CLR P0.0
CLR TR0
RETI
CLOCK1: CJNE R0,#0,LOOP1
MOV R0,#4 ;0.5s定时器1
CLR P3.1 ;停止蜂鸣器
CLR TR1 ;关闭定时器
LOOP1: MOV TH1,#TH
MOV TL1,#TL
DEC R0
RETI
TAB: DB 0xfc,0x60,0xda,0xf2,0x66 ;共阴极段码 0~4
DB 0xb6,0xbe,0xe0,0xfe,0xf6 ;共阴极段码 5~9
INIT SEGMENT CODE
rseg INIT
; Peripheral specific initialization functions,
; Called from the Init_Device label
PCA_Init:
anl PCA0MD, #0BFh
mov PCA0MD, #000h
ret
Timer_Init:
mov TMOD, #001h
mov CKCON, #002h
ret
Oscillator_Init:
mov OSCICN, #083h
ret
Port_IO_Init:
; P0.0 - Unassigned, Open-Drain, Digital
; P0.1 - Unassigned, Open-Drain, Digital
; P0.2 - Unassigned, Open-Drain, Digital
; P0.3 - Unassigned, Open-Drain, Digital
; P0.4 - Unassigned, Open-Drain, Digital
; P0.5 - Unassigned, Open-Drain, Digital
; P0.6 - Unassigned, Open-Drain, Digital
; P0.7 - Unassigned, Open-Drain, Digital
; P1.0 - Unassigned, Open-Drain, Digital
; P1.1 - Unassigned, Open-Drain, Digital
; P1.2 - Unassigned, Open-Drain, Digital
; P1.3 - Unassigned, Open-Drain, Digital
; P1.4 - Unassigned, Open-Drain, Digital
; P1.5 - Unassigned, Open-Drain, Digital
; P1.6 - Unassigned, Open-Drain, Digital
; P1.7 - Unassigned, Open-Drain, Digital
; P2.0 - Unassigned, Open-Drain, Digital
; P2.1 - Unassigned, Open-Drain, Digital
; P2.2 - Unassigned, Open-Drain, Digital
; P2.3 - Unassigned, Open-Drain, Digital
mov XBR1, #040h
ret
; Initialization function for device,
; Call Init_Device from your main program
Init_Device:
lcall PCA_Init
lcall Timer_Init
lcall Port_IO_Init
lcall Oscillator_Init
ret
end
|