《微机实验》报告
PAGE 7
实验名称 LED数码管显示实验
指导教师 曹丹华
专业班级 光电1202班 姓名 陈敬人 学号
联系电话
一、任务要求
实验目的:理解LED七段数码管的显示控制原理,掌握数码管与MCU的接口技术,能够编写数码管显示驱动程序;熟悉接口程序调试方法。
实验内容:1.基础部分:利用C8051F310单片机控制数码管显示器。利用末位数码管循环显示数字0-F,显示切换频率为1Hz。2.提高部分:在数码管上显示0→199计数,计数间隔为0.5秒。
设计思路
1.基础部分
C8051F310单片机片上晶振为24.5MHz,采用8分频后为3.0625MHz ,输入时钟信号为48个机器周期,T1采用定时器工作方式1,单次定时最长可达1.027s,可以实现1s定时要求。
定时采用软件查询工作方式,利用JNB TF0, HERE实现。
置P0.6和P0.7端口为0,位选信号选定末位数码管。
通过MOVC A, @A+DPTR指令,利用顺序查表法取出显示段码数据。寄存器R0自增1,并赋给A以取出下一个显示段码数据。
为减短代码长度,利用CJNE指令实现循环结构。当寄存器R0增至0FH后,跳转至开头,重新开始下一轮显示。
2.提高部分
定时方式及查表方式同基础部分,由于要实现三个数码管同时显示,因此采用动态扫描显示法。
三、资源分配
1.基础部分
P0.6: 位选信号端口
P0.7: 位选信号端口
P1: 输出段码数据
R0: 存放显示数据
DPTR: 指向段码数据表首
2.提高部分
P0.6: 位选信号端口
P0.7: 位选信号端口
R0: 存放个位显示数据
R5: 存放十位显示数据
R6: 存放百位显示数据
P1: 输出段码数据
DPTR: 指向段码数据表首
四、流程图
1.基础部分
2.提高部分
五、源代码 (含文件头说明、语句行注释)
1.基础部分
;******************基础部分源代码***************************
;Filename: test.asm
;Decription: 末位数码管循环显示数字0-F,显示切换频率为1Hz。
;Designed by: 陈敬人
;Date: 2014.11.9
;
;- Generated Initialization File --
;
$include (C8051F310.inc)
ORG 0000H
LJMP MAIN
ORG 1000H
MAIN: LCALL Init_Device ;设备初始化
MOV SP, #40H ;合理设置堆栈位置
MOV DPTR, #TABLE ;DPTR指向段码数据表首
MOV TMOD, #01H ;定时器T0工作方式1
MOV TH0, #06H ;赋计数初值,定时1s
MOV TL0, #0C6H
CLR P0.6 ;位选信号,选定末位数码管亮
CLR P0.7
START: MOV R0, #00H
MOV A, R0 ;取显示数据
MOVC A, @A+DPTR ;查表取段码数据
MOV P1, A ;送显示数据
SETB TR0 ;启动定时器
HERE: JNB TF0, HERE ;等待定时
CLR TR0 ;停止定时
CLR TF0 ;溢出位清零
MOV TH0, #06H ;重装计数初值
MOV TL0, #0C6H
CJNE R0, #0FH, CHANGE ;判断数据是否显示完毕,未完则跳转至CHANGE
SJMP START ;显示完毕,重新开始
CHANGE: INC R0
MOV A, R0 ;取下一个显示数据
MOVC A, @A+DPTR ;查表取段码数据
MOV P1, A ;送输出显示数据
SETB TR0 ;重新启动定时器
SJMP HERE
TABLE: DB 0FCH, 60H, 0DAH ;段码数据表
DB 0F2H, 66H, 0B6H
DB 0BEH, 0E0H, 0FEH, 0F6H
DB 0EEH, 3EH, 1AH
DB 7AH, 9EH, 8EH
; 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, 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
Interrupts_Init:
mov IT01CF, #021h
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 Interrupts_Init
ret
END
2.提高部分
;*******************提高部分源代码************************
;Filename: 0.asm
;Decription: 三位数码管从0到199依次显示,间隔0.5秒。
;Designed by: 陈敬人
;Date: 2014.11.10
;
;- Generated Initialization File --
;
$include (C8051F310.inc)
ORG 0000H
LJMP MAIN
ORG 1000H
MAIN:
LCALL Init_Device ;调用定义语言
MOV SP,#20H ;堆栈赋初值
MOV P1,#00H ;P1口清零,所有LED管熄灭
MOV TMOD,#01H ;设置T0为定时工作方式1
MOV TH0,#85H
MOV TL0,#0EEH ;定时器T0赋初值
CLR P0.6
CLR P0.7 ;位选位清零
START1: MOV R0,#00H ;R0赋初值0 (R0存放个位数码管显示值)
MOV R5,#00H ;R5赋初值0 (R5存放十位数码管显示值)
MOV R6,#00H ;R6赋初值0 (R6存放百位数码管显示值)
SETB TR0 ;开启定时器
SJMP DIS ;跳转扫描输出子程序
HERE: JNB TF0,DIS ;判断定时是否溢出,未溢出,则执行扫描输出程序
CLR TR0
CLR TF0
MOV TH0,#85H
MOV TL0,#0EEH
CJNE R0,#09H,CHANGE ;判断R0是否达到9
SJMP START2
CHANGE:INC R0 ;R0加一
SETB TR0 ;开启定时器
SJMP DIS ; 跳转扫描输出子程序
;个位满9,十位加一
START2:MOV R0,#00H ;R0满10归0
INC R5 ;R5(十位)加一
CJNE R5,#0AH,START3 ;判断十位是否可以向百位进位
MOV R5,#00H ;R5(十位)满10归0
INC R6 ;R6(百位)加一
CJNE R6,#02H,START3 ;判断百位是否到2
SJMP START1
START3:SETB TR0
SJMP DIS
;扫描输出子程序
DIS: MOV 60H,#00H
MOV 61H,#40H
MOV 62H,#80H ;设置位选码(前三个数码管)
;MOV 63H,#0C0H ;第四个数码管
MOV R1,#60H ;位选码赋R1
DISP:MOV P1,#00H ;所有LED数码管熄灭
LD0: MOV A,@R1
ANL P0,#3FH
ORL P0,A
MOV DPTR,#TABLE0 ;将表地址赋数据指针
MOV A,R0
MOVC A,@A+DPTR ;查表
MOV P1,A ;数码管显示
LCALL DL1MS ;调用1ms延时
MOV P1,#00H ;所有LED数码管熄灭
INC R1 ;指向下一个LED数码管
MOV A,@R1
ANL P0,#3FH
ORL P0,A
SJMP SELECT ;根据十位变化特性选择不同段码表
BACK: MOV A,R5
MOVC A,@A+DPTR
MOV P1,A
LCALL DL1MS
MOV P1,#00H
INC R1
MOV A,@R1
ANL P0,#3FH
ORL P0,A
MOV DPTR,#TABLE
MOV A,R6
MOVC A,@A+DPTR
MOV P1,A
LCALL DL1MS
MOV P1,#00H
SJMP HERE
SELECT:CJNE R6,#01H,ONE ;判断百位是否为1
MOV DPTR,#TABLE0 ;当百位为1时十位应该从0开始变化
SJMP BACK
ONE:MOV DPTR,#TABLE ;当百位为0时十位应该从1开始变化
SJMP BACK
;1ms延时程序
DL1MS:
MOV R4,#4
D1:
MOV R7,#253
NOP
DJNZ R7,$
DJNZ R4,D1
RET
TABLE0: DB 0FCH, 60H, 0DAH,0F2H, 66H, 0B6H,0BEH, 0E0H, 0FEH, 0F6H
TABLE: DB 00H, 60H, 0DAH,0F2H, 66H, 0B6H,0BEH, 0E0H, 0FEH, 0F6H ;段码数据表
public Init_Device
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 CKCON, #002h
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, Push-Pull, Digital
; P0.7 - Unassigned, Push-Pull, Digital
; P1.0 - Unassigned, Push-Pull, Digital
; P1.1 - Unassigned, Push-Pull, Digital
; P1.2 - Unassigned, Push-Pull, Digital
; P1.3 - Unassigned, Push-Pull, Digital
; P1.4 - Unassigned, Push-Pull, Digital
; P1.5 - Unassigned, Push-Pull, Digital
; P1.6 - Unassigned, Push-Pull, Digital
; P1.7 - Unassigned, Push-Pull, 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, #0C0h
mov P1MDOUT, #0FFh
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. 基础部分 观察P1端口输出波形(如下图)
由图可知,LED数码管切换频率为1HZ,跑完一轮经过16s,满足定时要求。且按要求输出0~F。
2.基础部分 硬件调试
程序在C8051F310单片机上按要求运行,即第一位数码管从0到F依次显示。硬件调试成功。
3.提高部分
通过验收答辩。程序按要求正常运行。
本人承诺:
本人承诺:
本报告内容真实,无伪造数据,无抄袭他人成果。本人完全了解学校相关规定,如若违反,愿意承担其后果。
签字:
年 月 日