实验四LED数码管显示程序报告.docx
《实验四LED数码管显示程序报告.docx》由会员分享,可在线阅读,更多相关《实验四LED数码管显示程序报告.docx(17页珍藏版)》请在冰点文库上搜索。
![实验四LED数码管显示程序报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/1/0879a011-7593-480d-b731-316270313891/0879a011-7593-480d-b731-3162703138911.gif)
实验四LED数码管显示程序报告
实验名称LED数码管显示程序
指导教师
专业班级姓名学号
联系电话
本人承诺:
本报告内容真实,无伪造数据,无抄袭他人成果。
本人完全了解学校相关规定,如若违反,愿意承担其后果。
签字:
年月日
一、任务要求
实验内容:
利用C8051F310单片机控制数码管显示器
基本要求:
利用末位数码管循环显示数字0-F,显示切换频率为1Hz。
提高要求:
在数码管上显示0→1999计数,计数间隔为0.5秒,KINT键可开启10倍加速。
二、设计思路
基础部分:
选中末位数码管,将对应数值输入P1显示,TO控制延时
提高部分:
通过对P0.6、P0.7赋予不同的值,进行位选管。
再将对应的数字输入显示管中,点亮。
TO控制延时。
KINT键开启加速。
三、资源分配
标准部分:
R0-数码管计数器
数据表TABLE-存储对应段码的值
提高部分:
R1-TH0初值
R2-TLO初值
R3-判断标志位,选择对应的数码管亮
R4、R5、R6、R7对应数位显示计数器
R0-数码管计数器
数据表TABLE-存储对应段码的值
KINT-加速键
四、流程图
1、基础部分
2、提高部分
3、ITOP中断部分
4、IT1P部分
5、INT0部分
五、源代码(含文件头说明、语句行注释)
1、基础部分
;------------------------------------
;-GeneratedInitializationFile--
;------------------------------------
$include(C8051F310.inc)
ORG0000H
LJMPMAIN
ORG1000H
CLRP3.1
MAIN:
LCALLInit_Device;设备初始化
CLRP3.1
MOVSP,#40H
MOVDPTR,#TABLE;赋予DPTR数据表table地址
CLRP0.6;选择最后一个数码管
CLRP0.7
MOVTMOD,#01H;设定时器TO为工作方式1
MOVTH0,#06H
MOVTL0,#0C6H
START:
MOVR0,#00H;通过R0实现0到F
SJMPDISPLAY
LOOP:
JNBTF0,LOOP;判断是否溢出
CLRTR0;;停止计时
CLRTF0;;溢出复位
CJNER0,#10H,DISPLAY;未溢出时继续显示
SJMPSTART;溢出返回执行
DISPLAY:
MOVA,R0
MOVCA,@A+DPTR
MOVP1,A
SETBTR0
INCR0
SJMPLOOP
TABLE:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH
publicInit_Device
INITSEGMENTCODE
rsegINIT
;Peripheralspecificinitializationfunctions,
;CalledfromtheInit_Devicelabel
PCA_Init:
anlPCA0MD,#0BFh
movPCA0MD,#000h
ret
Timer_Init:
movTMOD,#001h
movCKCON,#002h
ret
Port_IO_Init:
;P0.0-Unassigned,Push-Pull,Digital
;P0.1-Unassigned,Open-Drain,Digital
;P0.2-Unassigned,Push-Pull,Digital
;P0.3-Unassigned,Push-Pull,Digital
;P0.4-Unassigned,Push-Pull,Digital
;P0.5-Unassigned,Push-Pull,Digital
;P0.6-Unassigned,Push-Pull,Digital
;P0.7-Unassigned,Push-Pull,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
movP0MDOUT,#0FDh
movXBR1,#040h
ret
;Initializationfunctionfordevice,
;CallInit_Devicefromyourmainprogram
Init_Device:
lcallPCA_Init
lcallTimer_Init
lcallPort_IO_Init
ret
end
2、提高部分
;------------------------------------
;-GeneratedInitializationFile--
;------------------------------------
$include(C8051F310.inc)
publicInit_Device
INITSEGMENTCODE
rsegINIT
;Peripheralspecificinitializationfunctions,
;CalledfromtheInit_Devicelabel
ORG0000H
LJMPMAIN
ORG0003H
LJMPINT0
ORG000BH
LJMPIT0P
ORG001BH
LJMPIT1P
ORG0100H
MAIN:
LCALLInit_Device
CLRP2.0
CLRP3.1
MOVSP,#40H;配置堆栈指针
MOVDPTR,#TABLE;移动DPTR指针到表格
MOVTH1,#81H;T1初始化
MOVTL1,#81H
MOVR4,#00H
MOVR5,#00H
MOVR6,#00H
MOVR7,#00H
MOVA,#00H
MOVR1,#83H
MOVR2,#5CH
SETBTR1
LCALLINITIAL;T0初始化
MOVR0,#00H
START:
MOVA,R0;提取R0对应的段码
MOVCA,@A+DPTR
CLRP0.6
CLRP0.7
MOVP1,A;显示初始化
SETBTR0;开启计时
LJMPSTAY;等待中断
IT0P:
CLRTR0;停止计时器
CLRTF0;清零溢出位
LCALLINITIAL;给T0赋值
INCR0;段码指示器加1
JBP2.0,SKIP1
LCALLCOUNT
JMPSKIP2
SKIP1:
CJNER0,#0FH,RETURN;判断是否显示完毕
MOVR0,#00H;初始化R0重新循环
RETURN:
MOVA,R0;取当前应显示字符
MOVCA,@A+DPTR
MOVP1,A;开始显示
SKIP2:
SETBTR0;开始计时
RETI
IT1P:
CJNER3,#00H,L1
MOVR3,#04H
L1:
LJMPCHOOSE0
L2:
MOVCA,@A+DPTR
MOVP1,A
LCALLJUDGE0
SETBEX0
RETI
COUNT:
INCR4;内部计数器
CJNER4,#0AH,RETURN2
MOVR4,#00H
INCR5
CJNER5,#0AH,RETURN2
MOVR5,#00H
INCR6
CJNER6,#0AH,RETURN2
MOVR6,#00H
INCR7
RET
CJNER7,#02H,RETURN2
MOVR7,#00H
RET
RETURN2:
RET
CHOOSE0:
MOVA,R3
CJNEA,#04H,CHOOSE1
DECR3
MOVA,R4
LJMPL2
CHOOSE1:
CJNEA,#03H,CHOOSE2
DECR3
MOVA,R5
LJMPL2
CHOOSE2:
CJNEA,#02H,CHOOSE3
DECR3
MOVA,R6
LJMPL2
CHOOSE3:
DECR3
MOVA,R7
LJMPL2
JUDGE0:
CJNER3,#03H,JUDGE1
CLRP0.6
CLRP0.7
RET
JUDGE1:
CJNER3,#02H,JUDGE2
CJNER7,#00H,DENT1
CJNER6,#00H,DENT1
CJNER5,#00H,DENT1
MOVP1,#00H
RET
DENT1:
SETBP0.6
CLRP0.7
RET
JUDGE2:
CJNER3,#01H,JUDGE3
CJNER7,#00H,DENT2
CJNER6,#00H,DENT2
MOVP1,#00H
RET
DENT2:
CLRP0.6
SETBP0.7
RET
JUDGE3:
CJNER7,#00H,DENT3
MOVP1,#00H
RET
DENT3:
SETBP0.6
SETBP0.7
RET
INITIAL:
MOVTH0,R1
MOVTL0,R2
RET
INT0:
CLREX0
MOVR1,#0F3H
MOVR2,#89H
RETI
STAY:
SJMP$
TABLE:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H
;Peripheralspecificinitializationfunctions,
;CalledfromtheInit_Devicelabel
PCA_Init:
anlPCA0MD,#0BFh
movPCA0MD,#000h
ret
Timer_Init:
movTMOD,#021h
movCKCON,#002h
ret
Port_IO_Init:
;P0.0-Unassigned,Push-Pull,Digital
;P0.1-Unassigned,Open-Drain,Digital
;P0.2-Unassigned,Push-Pull,Digital
;P0.3-Unassigned,Push-Pull,Digital
;P0.4-Unassigned,Push-Pull,Digital
;P0.5-Unassigned,Push-Pull,Digital
;P0.6-Unassigned,Push-Pull,Digital
;P0.7-Unassigned,Push-Pull,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
movP0MDOUT,#0FDh
movXBR1,#040h
ret
Interrupts_Init:
movIE,#08Bh
ret
;Initializationfunctionfordevice,
;CallInit_Devicefromyourmainprogram
Init_Device:
lcallPCA_Init
lcallTimer_Init
lcallPort_IO_Init
lcallInterrupts_Init
ret
end
六、程序测试方法与结果
基础部分:
单片机按照规定频率显示0-F
提高部分:
在C8051F310单片机开发板烧录代码:
不按KINT键时,数码管以0.5s的间隔依次显示数,按下KINT键,数码管显示速率会在当前的基础上加快十倍。
七、心得体会
通过此次单片机实验编程,对于定时器中断,外部中断的使用和理解都更上了一个层次。
按键触发中断也显得更加简单。
对于单片机的结构和工作方式理解有一定提高。
也尝试使用4*4键盘,F1控制数码管暂停,F2控制数码管继续显示,F3控制数码管复位,获得成功的实验现象,对于键盘扫描控制程序有了更加深刻的认识。
在程序编程开始阶段,会出现001的情况,通过对控制数码管显示部分程序增加条件语句判断,成功修复了程序BUG,有较高的成就感。