实验名称 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
《微机实验》报告
三、资源分配
1.基础部分
P0.6: 位选信号端口 P0.7: 位选信号端口 P1: 输出段码数据 R0: 存放显示数据
DPTR: 指向段码数据表首 2.提高部分
P0.6: 位选信号端口 P0.7: 位选信号端口 R0: 存放个位显示数据 R5: 存放十位显示数据 R6: 存放百位显示数据 P1: 输出段码数据 DPTR: 指向段码数据表首
2
《微机实验》报告
四、流程图
1.基础部分
2.提高部分
3
《微机实验》报告
4
《微机实验》报告
五、源代码 (含文件头说明、语句行注释)
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 ; MOV TH0, #06H
; MOV TL0, #0C6H CLR P0.6
; CLR P0.7
START: MOV R0, #00H
MOV A, R0
;
设备初始化 合理设置堆栈位置 指向段码数据表首 定时器T0工作方式1 赋计数初值,定时1s
位选信号,选定末位数码管亮
取显示数据
5
MOVC A, @A+DPTR MOV P1, A SETB TR0
《微机实验》报告
;查表取段码数据 ;送显示数据 ;启动定时器
HERE: JNB TF0, HERE ;等待定时 CLR TR0
CHANGE: INC R0
;取下一个显示数据
CLR TF0
;停止定时
;溢出位清零 ;重装计数初值
MOV TH0, #06H MOV TL0, #0C6H
CJNE R0, #0FH, CHANGE ;判断数据是否显示完毕,未完则跳转至CHANGE SJMP START
;显示完毕,重新开始
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,
6
《微机实验》报告
; 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
7
《微机实验》报告
; 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: 陈敬人
8
《微机实验》报告
;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 ;开启定时器
9
《微机实验》报告
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
10
《微机实验》报告
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
;段码
11
《微机实验》报告
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端口输出波形(如下图)
12
《微机实验》报告
由图可知,LED数码管切换频率为1HZ,跑完一轮经过16s,满足定时要求。且按要求输出0~F。
2.基础部分 硬件调试
程序在C8051F310单片机上按要求运行,即第一位数码管从0到F依次显示。硬件调试成功。
3.提高部分
通过验收答辩。程序按要求正常运行。
本人承诺: 本报告内容真实,无伪造数据,无抄袭他人成果。本人完全了解学校相关规定,如若违反,愿意承担其后果。 签字: 年 月 日 13
因篇幅问题不能全部显示,请点此查看更多更全内容