实验四-LED数码管显示实验报告

《微机实验》报告

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.提高部分

通过验收答辩。程序按要求正常运行。

本人承诺:

本人承诺:

本报告内容真实,无伪造数据,无抄袭他人成果。本人完全了解学校相关规定,如若违反,愿意承担其后果。

签字:

年 月 日