您的当前位置:首页实验四 LED数码管显示实验报告

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

2023-01-02 来源:乌哈旅游
 《微机实验》报告

实验名称 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

因篇幅问题不能全部显示,请点此查看更多更全内容