|
加深對51單片機及其接口電路的理解,掌握定時/計數器、中斷的應用編程技術及程序的調試方法。 2.實驗內容利用C8051F310單片機設計一個倒計時定時器,功能要求如下: 模式1:基本功能 主要技術指標要求如下: 1. 定時時間為9秒,定時精度為1秒 。 2. 在LED數碼管上顯示剩余時間。 3. 時間到0時,蜂鳴器鳴響1次(0.5秒鐘)。 4. 通過KINT鍵實現啟動和暫停功能,暫停時D9燈亮。 5. 利用單片機內部定時器定時,KINT鍵輸入和定時器控制均要求采用中斷方式。 模式2:提高要求 1. 定時時間可通過鍵盤設定,最大為200秒。 2. 其它個性化設計。
二、設計思路1.給主程序,T0、T1中斷和外部KINT鍵中斷設置入口地址; 2.初始化,將所要用到的寄存器都清零,將T0,T1的中斷都開啟,都設為方式1模式,并裝填各自的TH和TL,設好定時時間; 3.采用數據指針,指向TABLE表,TABLE表中存取數碼管中0-9的轉換值; 4.進行鍵盤掃描程序,若無鍵盤按下,則繼續主程序;若有鍵盤按下,進入按鍵識別程序,識別出具體哪個按鍵按下。若為數字鍵,則將相應的數字暫存人R6;若為功能鍵,則轉入相應的功能程序。當有鍵盤按下時,R5自加1,當R5=2時,將其清零; 5.當為數字鍵時,將按下的鍵值,根據R5的大小,將R6轉存入R2、R3、R4即百、十、個位。當R5=0,R6值轉存入R2;當R5=1,R6值轉存入R3;當R5=2,R6值轉存入R4; 6.控制P0.6,P0.7的0/1值,根據需求點亮數碼管; 7.當KINT鍵按下時,開啟T0計時控制位,T0開始計時。計時1秒后,秒數減一。數碼管上顯示的數字相應的減一; 8.當KINT鍵再次按下,計時停止,關閉T0計時控制位,T0停止計時,數碼管顯示的數字不變。 9.當計時到達000時,關閉T0計時,開啟T1計時,開啟蜂鳴器,蜂鳴0.5秒后,關閉T1計時和蜂鳴器。 10.當為功能鍵時,轉入功能子程序,完成相應的功能。 三、資源分配R0: 用于300ms延遲循環 R1: 用于10ms消抖循環 R2:存取數碼管百位 R3:存取數碼管十位 R4:存取數碼管個位 R5:用于控制暫存值R5的轉存到R2或R3或R4 R6:用于鍵盤輸入值暫存 R7:用于個性化設計延時 000BH:T0中斷入口地址 0013H:外部中斷KINT鍵入口地址 001BH:T1中斷入口地址 P0.0:控制LED燈D9的開關 P0.1:控制外部中斷KINT鍵 P0.6:數碼管位位控 P0.7:數碼管位位控 P1:控制數碼管段的開關 P2:P0.0-P0.3行掃描,P0.4-P0.7列掃描 P3.1:控制蜂鳴器 TABLE:數碼管0-9數字轉換表
四、流程圖主程序:
判斷有無按鍵按下子程序掃描子程序
百十個賦值子程序鍵盤釋放子程序
10ms消抖子程序蜂鳴子程序外部KINT鍵中斷
T0中斷T1中斷
五、源代碼 (含文件頭說明、語句行注釋)
- ;Filename: F310_frame.asm
- ;Designed by: 賀森濤
- ;Date: 2019/05/28
- ;P1:ABCDEFG,dp P0.7和P0.6控制哪個數碼管亮
- ;P2.0-P2.7行輸入4,列輸入4
- ;K0-K9數字鍵,K10鍵轉個性化設計程序
- ;-------------------------------------------------------------------------------
-
- $include(C8051F310.inc)
- LED BIT P0.0
- BEEP BIT P3.1
- KINT BIT P0.1
- INIT SEGMENT CODE
- rseg INIT
- ORG 0000H
- LJMP MAIN
- ORG 000BH
- LJMP T0INT
- ORG 0013H
- LJMP KINT0
- ORG 001BH
- LJMP T1INT
-
- ORG 0100H
- MAIN:
- LCALL Init_Device ;設備初始化
- LCALL INIT0 ;定時器初始化
- MOV R0,#0 ;延遲循環
- MOV R1,#0 ;消抖循環
- MOV R2,#0 ;百位
- MOV R3,#0 ;十位
- MOV R4,#0 ;個位
- MOV R5,#0 ;位選信號
- MOV R6,#0 ;鍵盤輸入數值
- MOV R7,#0 ;個性化設計用
-
- MOV DPTR,#TABLE ;0-9轉換表
- CLR BEEP
- CLR LED
-
-
- LOOP: ;LED數碼管不停顯示
- ACALL LED100
- MOV A,R2
- MOVC A,@A+DPTR ;百位
- MOV P1,A
- ACALL DELAY_300ms
-
- ACALL LED10
- MOV A,R3
- MOVC A,@A+DPTR ;十位
- MOV P1,A
- ACALL DELAY_300ms
-
- ACALL LED1
- MOV A,R4
- MOVC A,@A+DPTR ;個位
- MOV P1,A
- ACALL DELAY_300ms
-
- JB LED,LOOP ;等待鍵盤
-
- LCALL KKEY
- AJMP LOOP
-
- ;-----------------定時器初始化子程序--------------------------------------------
- INIT0:
- SETB EX1 ;開外部中斷允許
- SETB IT1 ;外部中斷1設置為下降沿觸發
- SETB PT0 ;外部中斷為高優先級
- MOV IT01CF,#10H ;
- MOV TMOD,#11H ;定時器0和1都設為定時方式1
- MOV TH0,#06H ;轉載定時器T0初始值
- MOV TL0,#0C5H
- SETB EA ;開總中斷
- SETB ET0 ;開定時器0中斷
- SETB ET1 ;開定時器1中斷
- RET
-
-
- ;------------蜂鳴子程序---------------------------------------
- ENDD:
- CLR TR0
- SETB BEEP
- MOV TH1,#83H
- MOV TL1,#63H
- SETB TR1
- RET
-
-
- ;---------------選LED子程序-----------------------------------
- LED100: ;位選信號賦值(百位)
- CLR P0.6
- SETB P0.7
- RET
- LED10: ;位選信號幅值(十位)
- SETB P0.6
- CLR P0.7
- RET
- LED1: ;位選信號幅值(個位)
- CLR P0.7
- CLR P0.6
- RET
-
- ;--------------300ms延時子程序------------------------------------------
- DELAY_300ms:
- MOV R0, #200
- DJNZ R0,$
- MOV R0, #200
- DJNZ R0,$
- MOV R0, #200
- DJNZ R0,$
- RET
-
-
- ;------------10ms延時消抖子程序-----------------------------------------------------------
- DELAY_10ms:
- MOV R1,#20
- DJNZ R1,$
- RET
-
- ;-----------------判斷是否有鍵按下子程序---------------------------------------------------------
-
- KKEY: ; 低4位置零,高4位如果有一個為0,有鍵按下
- MOV P2, #0F0H
- MOV A, P2
- ORL A, #0FH
- CPL A
- JNZ YES_KEY
- RET
-
- YES_KEY:
- LCALL DELAY_10ms ;10ms消抖程序
- MOV P2, #0F0H
- MOV A, P2
- ORL A, #0FH
- CPL A
- JNZ key
- RET
-
- ;---------------按鍵掃描子程序--------------------------------------------------------
-
-
- ROW1: CLR P2.0
- SETB P2.1
- SETB P2.2
- SETB P2.3
- RET
-
- ROW2: CLR P2.1
- SETB P2.0
- SETB P2.2
- SETB P2.3
- RET
-
- ROW3: CLR P2.2
- SETB P2.0
- SETB P2.1
- SETB P2.3
- RET
-
- ROW4: CLR P2.3
- SETB P2.0
- SETB P2.1
- SETB P2.2
- RET
- key:
- LCALL ROW1
- JNB P2.4, K0 ;ROW1, SCAN LINES
- JNB P2.5, K4
- JNB P2.6, K8
- JNB P2.7, K12
-
- LCALL ROW2
- JNB P2.4, K1 ;ROW2, SCAN LINES
- JNB P2.5, K5
- JNB P2.6, K9
- JNB P2.7, K13
-
- LCALL ROW3
- JNB P2.4, K2 ;ROW3, SCAN LINES
- JNB P2.5, K6
- JNB P2.6, K10
- JNB P2.7, K14
-
- LCALL ROW4
- JNB P2.4, K3 ;ROW4, SCAN LINES
- JNB P2.5, K7
- JNB P2.6, K11
- JNB P2.7, K15
- RET
-
- K0:
- MOV R6,#0
- LJMP SHOW
- K1:
- MOV R6,#1
- LJMP SHOW
- K2:
- MOV R6,#2
- LJMP SHOW
- K3:
- MOV R6,#3
- LJMP SHOW
- K4:
- MOV R6,#4
- LJMP SHOW
- K5:
- MOV R6,#5
- LJMP SHOW
- K6:
- MOV R6,#6
- LJMP SHOW
- K7:
- MOV R6,#7
- LJMP SHOW
- K8:
- MOV R6,#8
- LJMP SHOW
- K9:
- MOV R6,#9
- LJMP SHOW
-
- K10: LCALL DISUP
- LJMP RELEASE
- K11: LJMP RELEASE
- K12: LJMP RELEASE
- K13: LJMP RELEASE
- K14: LJMP RELEASE
- K15: LJMP RELEASE
- ;---------------------判斷按鍵是否松開子程序--------------------------------------------------------------
- RELEASE: LCALL DELAY_10ms ;判斷按鍵是否松開
- MOV P2, #0F0H
- MOV A, P2
- ORL A, #0FH
- CPL A
- JNZ RELEASE
- RET
-
-
- ;-------------顯示倒計時的百十個數字-------------------------------------------------------------------------
- SHOW:
- MOV A,R5
- CJNE A,#1,SHOW0 ;R=0時,轉百位,R=1時,轉十位
- LCALL LED10
- MOV A,R6 ;十位
- MOV R3,A
- INC R5
- LJMP RELEASE
-
- SHOW0:
- JNC SHOW1 ;R5=(10)_B時,轉個位
- LCALL LED100
- MOV A,R6 ;百位
- MOV R2,A
- INC R5
- LJMP RELEASE
-
- SHOW1:
- LCALL LED1
- MOV A,R6 ;個位
- MOV R4,A
- MOV R5,#0
- LJMP RELEASE
-
-
-
- ;---------------T1中斷--------------------------------------
- T1INT:
- CLR BEEP
- CLR TR1
- MOV TH0,#06H
- MOV TL0,#0C5H
- MOV TH1,#83H
- MOV TL1,#63H
- RETI
- ;------------T0中斷和倒計時-----------------------------------------
- T0INT:
- CJNE R4,#0,DEC1
- CJNE R3,#0,DEC2
- CJNE R2,#0,DEC3
- LCALL ENDD
- RETI
- DEC1:
- DEC R4
- MOV TH0,#06H
- MOV TL0,#0C5H
- RETI
- DEC2:
- DEC R3
- MOV R4,#9
- MOV TH0,#06H
- MOV TL0,#0C5H
- RETI
- DEC3:
- DEC R2
- MOV R3,#9
- MOV R4,#9
- MOV TH0,#06H
- MOV TL0,#0C5H
- RETI
-
- ;---------------外部KINT中斷-------------------------------------------
- KINT0:
-
- ;kint外部中斷程序
- LOOP1: LCALL DELAY_10ms ;消抖10ms
- JNB KINT, LOOP2
- LJMP LOOP1
-
- LOOP2: LCALL DELAY_10ms ;消抖10ms
- JNB KINT, LOOP2 ;檢測按鍵是否松開
-
- CPL TR0 ;中斷操作
- CPL P0.0
-
- RETI
-
-
-
-
- ;---------------數字表-----------------------------------------------
-
-
- ORG 1000H
- TABLE: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H ;數字0-9
-
- ;--------------------------------------------------------------------------
- DISUP:
- MOV R7,#255
- Y: SETB P0.7;
- CLR P0.6;
- MOV P1,#01110110B
- LCALL DELAY_300ms
-
- O: SETB P0.6;
- CLR P0.7;
- MOV P1,#00111010B;
- LCALL DELAY_300ms;
-
- U: CLR P0.6;
- CLR P0.7;
- MOV P1,#00111000B;
- LCALL DELAY_300ms;
-
- DJNZ R7,Y
- ;-----------------------------------------------------------
-
-
- MOV R7,#255
- A1: SETB P0.7;
- CLR P0.6;
- MOV P1,#11101110B;
- LCALL DELAY_300ms;
-
- R: SETB P0.6;
- CLR P0.7;
- MOV P1,#00001110B;
- LCALL DELAY_300ms;
-
- E: CLR P0.6;
- CLR P0.7;
- MOV P1,#11011110B;
- LCALL DELAY_300ms;
-
-
- DJNZ R7,A1
-
- ;-----------------------------------------------------
-
- MOV R7,#255
- G: SETB P0.7;
- SETB P0.6;
- MOV P1,#10111100B;
- LCALL DELAY_300ms;
-
- O1: SETB P0.7;
- CLR P0.6;
- MOV P1,#00111010B;
- LCALL DELAY_300ms;
-
- O2: SETB P0.6;
- CLR P0.7;
- MOV P1,#00111010B;
- LCALL DELAY_300ms;
-
- D: CLR P0.6;
- CLR P0.7;
- MOV P1,#01111010B;
- LCALL DELAY_300ms;
- DJNZ R7,G
-
- LJMP DISUP
- ;--------------------------------------------------------------
-
-
- ;-------end of your code-------------------------------------------------
-
-
- ;------------------------------------------------------------------------
- ;- Generated Initialization File --
- ;------------------------------------------------------------------------
-
- ; 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
-
- Port_IO_Init:
- ; P0.0 - Unassigned, Push-Pull, 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 P0MDOUT, #001h
- mov P3MDOUT, #002h
- 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
- ret
- END
-
- 六、程序測試方法與結果
- 1.外部KINT中斷
- KINT0: ;kint外部中斷程序
- LOOP1: LCALL DELAY_10ms ;消抖10ms
- JNB KINT, LOOP2
- LJMP LOOP1
- LOOP2: LCALL DELAY_10ms ;消抖10ms
- JNB KINT, LOOP2 ;檢測按鍵是否松開
- CPL TR0 ;中斷操作
- CPL P0.0
- RETI
復制代碼
KINT鍵控制啟動和暫停,暫停時D9燈亮,采用 CPL TR0 CPL P0.0實現所需功能,其效果如圖。 啟動: 
暫停,D9燈亮: 
2.T0中斷和倒計時T0INT:
CJNE R4,#0,DEC1
CJNE R3,#0,DEC2
CJNE R2,#0,DEC3
LCALL ENDD
RETI
DEC1:
DEC R4
MOV TH0,#06H
MOV TL0,#0C5H
RETI
DEC2:
DEC R3
MOV R4,#9
MOV TH0,#06H
MOV TL0,#0C5H
RETI
DEC3:
DEC R2
MOV R3,#9
MOV R4,#9
MOV TH0,#06H
MOV TL0,#0C5H
RETI
設置T0的TH和TL來實現1秒計時,同時使數碼管上的數字減一,效果如圖。

3.顯示輸入的倒計時預設值SHOW:
MOV A,R5
CJNE A,#1,SHOW0 ;R=0時,轉百位,R=1時,轉十位
LCALL LED10
MOV A,R6 ;十位
MOV R3,A
INC R5
LJMP RELEASE
SHOW0:
JNC SHOW1 ;R5=(10)_B時,轉個位
LCALL LED100
MOV A,R6 ;百位
MOV R2,A
INC R5
LJMP RELEASE
SHOW1:
LCALL LED1
MOV A,R6 ;個位
MOV R4,A
MOV R5,#0
LJMP RELEASE
通過R5的大小來選擇不同的數碼管亮,將預存在R6中的數字轉存人相應的百、十、個位,達到在顯示正確輸入的時間數字,效果如下圖。
4.到零時蜂鳴器響0.5秒;------------蜂鳴子程序--------------------------------------- ENDD: CLR TR0 SETB BEEP MOV TH1,#83H MOV TL1,#63H SETB TR1 RET ;---------------T1中斷-------------------------------------- T1INT: CLR BEEP CLR TR1 MOV TH0,#06H MOV TL0,#0C5H RETI
到零時轉蜂鳴子程序,開T1計時,計時0.5秒,然后關閉蜂鳴器,效果如圖。
7.掃描鍵盤,獲取輸入鍵值程序
KKEY: ; 低4位置零,高4位如果有一個為0,有鍵按下
MOV P2, #0F0H
MOV A, P2
ORL A, #0FH
CPL A
JNZ YES_KEY
RET
YES_KEY:
LCALL DELAY_10ms ;10ms消抖程序
MOV P2, #0F0H
MOV A, P2
ORL A, #0FH
CPL A
JNZ key
RET
;---------------按鍵掃描子程序--------------------------------------------------------
ROW1: CLR P2.0
SETB P2.1
SETB P2.2
SETB P2.3
RET
ROW2: CLR P2.1
SETB P2.0
SETB P2.2
SETB P2.3
RET
ROW3: CLR P2.2
SETB P2.0
SETB P2.1
SETB P2.3
RET
ROW4: CLR P2.3
SETB P2.0
SETB P2.1
SETB P2.2
RET
key:
LCALL ROW1
JNB P2.4, K0 ;ROW1, SCAN LINES
JNB P2.5, K4
JNB P2.6, K8
JNB P2.7, K12
LCALL ROW2
JNB P2.4, K1 ;ROW2, SCAN LINES
JNB P2.5, K5
JNB P2.6, K9
JNB P2.7, K13
LCALL ROW3
JNB P2.4, K2 ;ROW3, SCAN LINES
JNB P2.5, K6
JNB P2.6, K10
JNB P2.7, K14
LCALL ROW4
JNB P2.4, K3 ;ROW4, SCAN LINES
JNB P2.5, K7
JNB P2.6, K11
JNB P2.7, K15
RET
K0:
MOV R6,#0
LJMP SHOW
K1:
MOV R6,#1
LJMP SHOW
K2:
MOV R6,#2
LJMP SHOW
K3:
MOV R6,#3
LJMP SHOW
K4:
MOV R6,#4
LJMP SHOW
K5:
MOV R6,#5
LJMP SHOW
K6:
MOV R6,#6
LJMP SHOW
K7:
MOV R6,#7
LJMP SHOW
K8:
MOV R6,#8
LJMP SHOW
K9:
MOV R6,#9
LJMP SHOW
K10: LCALL DISUP
LJMP RELEASE
K11: LJMP RELEASE
K12: LJMP RELEASE
K13: LJMP RELEASE
K14: LJMP RELEASE
K15: LJMP RELEASE
;---------------------判斷按鍵是否松開子程序--------------------------------------------------------------
RELEASE: LCALL DELAY_10ms ;判斷按鍵是否松開
MOV P2, #0F0H
MOV A, P2
ORL A, #0FH
CPL A
JNZ RELEASE
RET
首先判斷有無按鍵按下,期間進行10ms消抖。若無,則繼續主程序;若有,則掃描出具體哪個按鍵按下。若為數字鍵,則將數字值暫存如R6中;若為功能鍵,則調用功能子程序。最后判斷按鍵是否松開,返回。
6.個性化功能,顯示You Are Good
K10: LCALL DISUP
LJMP RELEASE
;-----------------------------------------------------------------------
DISUP:
MOV R7,#255
Y: SETB P0.7;
CLR P0.6;
MOV P1,#01110110B
LCALL DELAY_300ms
O: SETB P0.6;
CLR P0.7;
MOV P1,#00111010B;
LCALL DELAY_300ms;
U: CLR P0.6;
CLR P0.7;
MOV P1,#00111000B;
LCALL DELAY_300ms;
DJNZ R7,Y
;-----------------------------------------------------------
MOV R7,#255
A1: SETB P0.7;
CLR P0.6;
MOV P1,#11101110B;
LCALL DELAY_300ms;
R: SETB P0.6;
CLR P0.7;
MOV P1,#00001110B;
LCALL DELAY_300ms;
E: CLR P0.6;
CLR P0.7;
MOV P1,#11011110B;
LCALL DELAY_300ms;
DJNZ R7,A1
;-----------------------------------------------------
MOV R7,#255
G: SETB P0.7;
SETB P0.6;
MOV P1,#10111100B;
LCALL DELAY_300ms;
O1: SETB P0.7;
CLR P0.6;
MOV P1,#00111010B;
LCALL DELAY_300ms;
O2: SETB P0.6;
CLR P0.7;
MOV P1,#00111010B;
LCALL DELAY_300ms;
D: CLR P0.6;
CLR P0.7;
MOV P1,#01111010B;
LCALL DELAY_300ms;
DJNZ R7,G
LJMP DISUP
按下K10鍵,轉顯示“You Are Good”的程序,效果如圖。


完整的Word格式文檔51黑下載地址:
LED燈控制器(2019)實驗51hei.docx
(5.32 MB, 下載次數: 15)
2020-11-25 16:54 上傳
點擊文件名下載附件
基于C8051F310單片機的LED控制器 下載積分: 黑幣 -5
|