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