51单片机-八段数码管显示

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一八段数码管显示

1、实验目的:

(1)了解数码管动态显示的原理。

(2)了解74LS164扩展端口的方法。

2、实验要求:

利用实验仪提供的显示电路,动态显示一行数据.

3、实验电路图

LED1LED2LED3LED4LED5LED6

4、实验器材:

(1)超想-3000TB综合实验仪 1 台

(2)超想3000仿真器 1 台

(3)计算机 1 台

5、实验连线

无 6、实验说明:

(1)本实验仪提供了8段码LED 显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。显示共有6位,用动态方式显示。8段数码管是由8155的PB0、PB1经74LS164“串转并”后输出得到。6位位码由8155的PA0口输出,经Ua2003反向驱动后,选择相应显示位。

74LS164是串行输入并行输出转换电路,串行输入的数据位由8155的PB0控制,时钟位由8155的PB1控制输出。写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据位移到74LS164中,并且实现移位。向显示位选通地址输出高电平就可以点亮相应的显示位。 本实验仪中数据位输出地址为0e102H ,时钟位输出地址为0e102H ,位选通输出地址为 0e101H 。本实验涉及到了8155 I0/RAM 扩展芯片的工作原理以及74LS164器件的工作原理。

(2)七段数码管的字型代码表

显示字形

g f e d c b a 段码 0 0 1 1 1 1 1 1 3fh 1 0 0 0 0 1 1 0 06h 2 1 0 1 1 0 1 1

6bh 3 1 0 0 1 1 1 1 4fh 4 1 1 0 0 1 1 0 66h 5 1 1 0 1 1 0 1 6dh 6 1 1 1 1 1 0 1 7dh 7 0 0 0 0 1 1 1 07h 8 1 1 1 1 1 1 1 7fh 9 1 1 0 1 1 1 1 6fh A 1 1 1 0 1 1 1 77h B 1 1 1 1 1 0 0 7ch C 0 1 1 1 0 0 1 39h D 1 0 1 1 1 1 0

5eh

E 1 1 1 1 0 0 1 79h F

1

1

1

1 71h

a

b c d

e

f g dp

7、程序框图

8、实验步骤

1.将KEIL仿真器上40芯排线一端和实验箱上51CPU板上的40芯排针连接起来,将仿

真器连接的USB或串口线与PC机对应的USB或串口连接起来,打开实验箱电源。

2.进入KEIL软件界面,点击项目/打开项目在C:\KEIL\UV2\3000TC51配套实验例程中

选实验一,内有ASM和C51两种程序,进入ASM文件夹打开LED项目文件

3.点击“调试/启动/停止调试”,进入调试界面,点击“调试/运行”可看到8段数码管交

替显示0--F

9、实验程序

;实验一八段数码管显示

OUTBIT equ 0e101h ; 位控制口

CLK164 equ 0e102h ; 段控制口(接164时钟位)

DAT164 equ 0e102h ; 段控制口(接164数据位)

IN equ 0e103h ; 键盘读入口

LEDBuf equ 60h ; 显示缓冲

Num equ 70h ; 显示的数据

DelayT equ 75h ;

org 0000h

ljmp Start

LEDMAP: ; 八段管显示码

db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h

db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h

Delay: ; 延时子程序

mov r7, #0

DelayLoop:

djnz r7, DelayLoop

djnz r6, DelayLoop

ret

DisplayLED:

mov r0, #LEDBuf

mov r1, #6 ; 共6个八段管

mov r2, #00100000b ; 从左边开始显示

Loop:

mov dptr, #OUTBIT

mov a, #00h

movx @dptr, a ; 关所有八段管

mov a, @r0

mov B, #8

; 送164,送完一个显示一个,动态显示

DLP: rlc a ; 依次取出最右边的每一位

mov r3, a ;

mov acc.0, c

ANL A, #0FDH ;将PB1置0

mov dptr, #DAT164 ;将取出的每一位数据送入164,;用一个脉冲实现(PB1)

movx @dptr, a

mov dptr, #CLK164

orl a,#02h ;将PB1置1

movx @dptr, a

anl a,#0fDh ;将PB1置0

movx @dptr, a

mov a, r3

djnz B, DLP ;判断8段是否都送完

mov dptr, #OUTBIT

mov a, r2

movx @dptr, a ; 显示一位八段管

mov r6, #1

call Delay

mov a, r2 ; 显示下一位

rr a

mov r2, a

inc r0

djnz r1, Loop

mov dptr, #OUTBIT

mov a, #0

movx @dptr, a ; 关所有八段管

ret

Start: mov dptr,#0e100h

mov a,#03h ;给8155初始化,PA PB输出 movx @dptr,a

mov sp, #40h

mov Num, #0

MLoop:

inc Num

mov a, Num

mov b, a

mov r0, #LEDBuf

FillBuf:

mov a, b

anl a, #0fh

mov dptr, #LEDMap

movc a, @a+dptr ; 数字转换成显示码

mov @r0,a ; 显示在码填入显示缓冲

inc r0

inc b

cjne r0, #LEDBuf+6, FillBuf

mov DelayT,#30

DispAgain:

call DisplayLED ; 显示

djnz DelayT,DispAgain

ljmp MLoop

END

10、问题思考

1、试着改变一下数字的变化速度。

相关文档
最新文档