任務要求
利用C8051F310單片機設計一個倒計時定時器,功能要求及主要技術指標要求如下:
1. 定時時間為9秒,定時精度為1秒 。
2. 在LED數(shù)碼管上顯示剩余時間。
3. 時間到0時,蜂鳴器鳴響1次(0.5秒鐘)。
4. 通過KINT鍵實現(xiàn)啟動和暫停功能,暫停時D9燈亮。
5. 利用單片機內(nèi)部定時器定時,KINT鍵輸入和定時器控制均要求采用中斷方式。
以1秒定時器及相關循環(huán)構成的倒計時模塊為整個程序的核心,再根據(jù)其他要求設計分支模塊實現(xiàn)目標。1秒定時器以0.125s延時中斷為基礎,執(zhí)行8次循環(huán)構成1s定時器,同時對1s定時器進行9次循環(huán),完成倒計時定時器的基本內(nèi)容。
分支模塊包括:段碼轉換輸出、KINT啟動/暫停、蜂鳴器定時鳴響以及D9燈控制。
段碼轉換輸出:不需要多余邏輯,通過計算得出0~9對應段碼,然后直接通過MOV指令進行轉換輸出即可。
KINT啟動/暫停:已知KINT鍵按下為低電平,則選擇任意位置輸入電平,利用JB指令進行判斷,同時設置外部中斷0,并將其設為最高優(yōu)先級。最后添加15ms消抖。
蜂鳴器定時鳴響:不需要多余邏輯,已知蜂鳴器高電平下鳴響,則在MAIN函數(shù)中首先通過CLR P3.0使其關閉,再在倒計時結束后使其鳴響,并添加一個0.5s定時器使其延時0.5s。
D9燈控制:不需要多余邏輯,已知D9獨立指示燈低電平點亮,則將其與KINT聯(lián)系,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 ;點亮數(shù)碼管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
|