51单片机-八段数码管显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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、试着改变一下数字的变化速度。