单片机原理及应用|| 实验三:数码管显示

一、实验目的

1.掌握七段数码管的显示原理。

2.掌握通过AT89C51驱动七段数码管的方法。

二、实验设备

预装了keil及proteus的PC机。

三、实验内容

利用 AT89C51单片机的P0端口的P0.0-P0.7连接到一个共阴数码管的a-h的笔段上,数码管的公共端接地。在数码管上循环显示自己学号的每一位数字,每一位显示时间不少于0.5秒。电路原理图如下图所示:

四、实验要求

 根据实验任务要求,编写源程序。

五、实验源程序及关键步骤

使用keil编辑程序,生成hex文件,打开DSN文件,把hex文件加入到单片机中,运行仿真。

ORG 0000H ; 起始地址
MOV R7, #2 ; R7寄存器用于循环控制,设置循环次数为2
MOV R0, #0  ; 将学号索引存入R0寄存器
MAIN:       ; 主程序入口
MOV DPTR, #XUEHAO   ; 将学号数组的首地址存入DPTR寄存器
MOV A, R0   ; 将学号索引存入A寄存器
MOVC A, @A+DPTR    ; 间接寻址读取学号的每一位数字
MOV DPTR, #TABLE    ; 将码表的首地址存入DPTR寄存器
MOVC A, @A+DPTR     ; 通过DPTR和A间接寻址读取对应的显示码
MOV P0, A   ; 将读取到的显示码输出到P0口
LCALL DELAY ; 调用延时函数
INC R0  
DJNZ R7, MAIN   ; 循环判断,当R7不为0时跳转到主程序入口
MOV P0, #0  ; 清零P0口
LJMP $  ; 无限循环,程序停止执行
DELAY:      ; 延时函数入口
PUSH 00H    ; 保存寄存器状态
PUSH 01H
PUSH 02H
MOV R0, #24   ; 设置延时计数器初值为24,约等于0.6秒
DELAY1:     ; 外层循环
MOV R1, #100   ; 设置内层循环计数器初值为100
DELAY2:     ; 内层循环
MOV R2, #248   ; 设置内层循环计数器初值为248
DJNZ R2, $   ; 内层循环计数器减1,判断是否为0,不为0则跳转到DELAY2标签
DJNZ R1, DELAY2    ; 内层循环计数器减1,判断是否为0,不为0则跳转到DELAY2标签
DJNZ R0, DELAY1    ; 延时计数器减1,判断是否为0,不为0则跳转到DELAY1标签
POP 02H     ; 恢复寄存器状态
POP 01H
POP 00H
RET     ; 返回调用点
XUEHAO: DB 4, 2 ; 学号数组,存储学号42
TABLE: DB 3FH, 06H  ; 显示码表
END     ; 程序结束

六、运行结果

七、思考

调整程序,试让数码管所显示数字递减循环。

答:让数码管显示的数字递减循环,我通过修改程序中的循环控制部分,将学号索引初始值设为10,然后在每次循环结束后递减索引值。当索引值为0时,跳出循环停止程序执行,以此来实现了数码管显示数字的递减循环。

八、实验总结

我在这次实验中,学习了七段数码管的显示原理,并通过AT89C51驱动七段数码管的方法,我知道如何利用单片机的P0端口连接七段数码管并循环显示学号的每一位数字的操作步骤。我在实验过程中,先定义了一个学号数组和显示码表,通过循环控制将学号的每一位数字读取出来,并根据显示码表找到对应的显示码,将显示码输出到P0口,并调用延时函数进行延时等待。

我在编写代码的过程中,开始的第一次只能显示数字一个4,后面发现是采用直接寻址时,TABLE的设置出现错误,然后我将程序修改为间接寻址,TABLE表里面只存放学号,修正错误后,我成功完成了实验目标,实现了循环显示学号的每一位数字在七段数码管上。

这次数码管的显示实验让我更深入地了解了七段数码管的显示原理和单片机的驱动方法,同时,实验中的错误也提醒了我在编写代码时要仔细检查,避免类似的问题出现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值