加深对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)
|