標題: 基于C8051F310單片機的LED燈控制器匯編語言程序調(diào)試 [打印本頁]
作者: 0QAQ0 時間: 2020-11-25 16:55
標題: 基于C8051F310單片機的LED燈控制器匯編語言程序調(diào)試
加深對51單片機及其接口電路的理解,掌握定時/計數(shù)器、中斷的應用編程技術(shù)及程序的調(diào)試方法。
2.實驗內(nèi)容利用C8051F310單片機設(shè)計一個倒計時定時器,功能要求如下:
模式1:基本功能
主要技術(shù)指標要求如下:
1. 定時時間為9秒,定時精度為1秒 。
2. 在LED數(shù)碼管上顯示剩余時間。
3. 時間到0時,蜂鳴器鳴響1次(0.5秒鐘)。
4. 通過KINT鍵實現(xiàn)啟動和暫停功能,暫停時D9燈亮。
5. 利用單片機內(nèi)部定時器定時,KINT鍵輸入和定時器控制均要求采用中斷方式。
模式2:提高要求
1. 定時時間可通過鍵盤設(shè)定,最大為200秒。
2. 其它個性化設(shè)計。
二、設(shè)計思路1.給主程序,T0、T1中斷和外部KINT鍵中斷設(shè)置入口地址;
2.初始化,將所要用到的寄存器都清零,將T0,T1的中斷都開啟,都設(shè)為方式1模式,并裝填各自的TH和TL,設(shè)好定時時間;
3.采用數(shù)據(jù)指針,指向TABLE表,TABLE表中存取數(shù)碼管中0-9的轉(zhuǎn)換值;
4.進行鍵盤掃描程序,若無鍵盤按下,則繼續(xù)主程序;若有鍵盤按下,進入按鍵識別程序,識別出具體哪個按鍵按下。若為數(shù)字鍵,則將相應的數(shù)字暫存人R6;若為功能鍵,則轉(zhuǎn)入相應的功能程序。當有鍵盤按下時,R5自加1,當R5=2時,將其清零;
5.當為數(shù)字鍵時,將按下的鍵值,根據(jù)R5的大小,將R6轉(zhuǎn)存入R2、R3、R4即百、十、個位。當R5=0,R6值轉(zhuǎn)存入R2;當R5=1,R6值轉(zhuǎn)存入R3;當R5=2,R6值轉(zhuǎn)存入R4;
6.控制P0.6,P0.7的0/1值,根據(jù)需求點亮數(shù)碼管;
7.當KINT鍵按下時,開啟T0計時控制位,T0開始計時。計時1秒后,秒數(shù)減一。數(shù)碼管上顯示的數(shù)字相應的減一;
8.當KINT鍵再次按下,計時停止,關(guān)閉T0計時控制位,T0停止計時,數(shù)碼管顯示的數(shù)字不變。
9.當計時到達000時,關(guān)閉T0計時,開啟T1計時,開啟蜂鳴器,蜂鳴0.5秒后,關(guān)閉T1計時和蜂鳴器。
10.當為功能鍵時,轉(zhuǎn)入功能子程序,完成相應的功能。
三、資源分配R0: 用于300ms延遲循環(huán)
R1: 用于10ms消抖循環(huán)
R2:存取數(shù)碼管百位
R3:存取數(shù)碼管十位
R4:存取數(shù)碼管個位
R5:用于控制暫存值R5的轉(zhuǎn)存到R2或R3或R4
R6:用于鍵盤輸入值暫存
R7:用于個性化設(shè)計延時
000BH:T0中斷入口地址
0013H:外部中斷KINT鍵入口地址
001BH:T1中斷入口地址
P0.0:控制LED燈D9的開關(guān)
P0.1:控制外部中斷KINT鍵
P0.6:數(shù)碼管位位控
P0.7:數(shù)碼管位位控
P1:控制數(shù)碼管段的開關(guān)
P2:P0.0-P0.3行掃描,P0.4-P0.7列掃描
P3.1:控制蜂鳴器
TABLE:數(shù)碼管0-9數(shù)字轉(zhuǎn)換表
四、流程圖主程序:
判斷有無按鍵按下子程序掃描子程序
百十個賦值子程序鍵盤釋放子程序
10ms消抖子程序蜂鳴子程序外部KINT鍵中斷
T0中斷T1中斷
五、源代碼 (含文件頭說明、語句行注釋)
- ;Filename: F310_frame.asm
- ;Designed by: 賀森濤
- ;Date: 2019/05/28
- ;P1:ABCDEFG,dp P0.7和P0.6控制哪個數(shù)碼管亮
- ;P2.0-P2.7行輸入4,列輸入4
- ;K0-K9數(shù)字鍵,K10鍵轉(zhuǎn)個性化設(shè)計程序
- ;-------------------------------------------------------------------------------
-
- $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 ;設(shè)備初始化
- LCALL INIT0 ;定時器初始化
- MOV R0,#0 ;延遲循環(huán)
- MOV R1,#0 ;消抖循環(huán)
- MOV R2,#0 ;百位
- MOV R3,#0 ;十位
- MOV R4,#0 ;個位
- MOV R5,#0 ;位選信號
- MOV R6,#0 ;鍵盤輸入數(shù)值
- MOV R7,#0 ;個性化設(shè)計用
-
- MOV DPTR,#TABLE ;0-9轉(zhuǎn)換表
- CLR BEEP
- CLR LED
-
-
- LOOP: ;LED數(shù)碼管不停顯示
- 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設(shè)置為下降沿觸發(fā)
- SETB PT0 ;外部中斷為高優(yōu)先級
- MOV IT01CF,#10H ;
- MOV TMOD,#11H ;定時器0和1都設(shè)為定時方式1
- MOV TH0,#06H ;轉(zhuǎn)載定時器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
-
-
- ;-------------顯示倒計時的百十個數(shù)字-------------------------------------------------------------------------
- SHOW:
- MOV A,R5
- CJNE A,#1,SHOW0 ;R=0時,轉(zhuǎn)百位,R=1時,轉(zhuǎn)十位
- LCALL LED10
- MOV A,R6 ;十位
- MOV R3,A
- INC R5
- LJMP RELEASE
-
- SHOW0:
- JNC SHOW1 ;R5=(10)_B時,轉(zhuǎn)個位
- 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
-
-
-
-
- ;---------------數(shù)字表-----------------------------------------------
-
-
- ORG 1000H
- TABLE: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H ;數(shù)字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
-
- 六、程序測試方法與結(jié)果
- 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實現(xiàn)所需功能,其效果如圖。
啟動:

暫停,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
設(shè)置T0的TH和TL來實現(xiàn)1秒計時,同時使數(shù)碼管上的數(shù)字減一,效果如圖。

3.顯示輸入的倒計時預設(shè)值SHOW:
MOV A,R5
CJNE A,#1,SHOW0 ;R=0時,轉(zhuǎn)百位,R=1時,轉(zhuǎn)十位
LCALL LED10
MOV A,R6 ;十位
MOV R3,A
INC R5
LJMP RELEASE
SHOW0:
JNC SHOW1 ;R5=(10)_B時,轉(zhuǎn)個位
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的大小來選擇不同的數(shù)碼管亮,將預存在R6中的數(shù)字轉(zhuǎn)存人相應的百、十、個位,達到在顯示正確輸入的時間數(shù)字,效果如下圖。
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
到零時轉(zhuǎn)蜂鳴子程序,開T1計時,計時0.5秒,然后關(guān)閉蜂鳴器,效果如圖。
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消抖。若無,則繼續(xù)主程序;若有,則掃描出具體哪個按鍵按下。若為數(shù)字鍵,則將數(shù)字值暫存如R6中;若為功能鍵,則調(diào)用功能子程序。最后判斷按鍵是否松開,返回。
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鍵,轉(zhuǎn)顯示“You Are Good”的程序,效果如圖。


完整的Word格式文檔51黑下載地址:
LED燈控制器(2019)實驗51hei.docx
(5.32 MB, 下載次數(shù): 15)
2020-11-25 16:54 上傳
點擊文件名下載附件
基于C8051F310單片機的LED控制器
下載積分: 黑幣 -5
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |