目的:利用“模块化单片机教学实验平台”,加深对单片机与LED数码管的接口电路设计以及程序设计的理解。
任务:完成单片机与LED数码管的接口电路设计以及程序设计。
使用AT89S52单片机的I/O口控制两个LED数码管,让两个LED数码管显示的数字每隔1秒递增一次(即从00开始,隔一秒变为01,再隔一秒变为02,……,09,10,11,……,99,00,01,……,如此反复)。显示方式为动态显示,直接片选实现。(LED数码管为共阴极数码管)
- 实验过程和结果
373电路图:
电路图
注:373锁存芯片用来增加驱动能力!
动态数码管电路图:
电路图
注意:只用到右边两个LED数码管。
硬件连线:
CPU_CORE_51 | MAIN_BOARD |
P3:P2.0-P2.1 | J15:DIG0-DIG1 |
P2:A0-A7 | J1:LED_SA-LED_DP |
注意:实验箱的AT89S52单片机的晶振频率为11.0592MHz!
实验结果图
通过实验学习对计时器的使用更加熟练,对代码的理解更加深刻,对设计程序的流程有了一个大致了解,在不停的积累知识,通过自己的练习,能够自己编写程序,再到具体方法的实现,中间的路很长,通过在不断地学习中,我不断地提高自己,丰富自己。
ORG 0013H ;主程序入口
RESET:
AJMP MAIN
ORG 000BH ;计时器T0的入口地址
AJMP IT0P
ORG 0100H
MAIN: MOV DPTR,#TABLE ;实现查表功能
MOV R0,#00H
MOV SP,#60H ;堆栈
MOV R5,#0AH ;给R5赋值为10
MOV TH0,#0D8H ;实现计数1s的初值
MOV TL0,#0F0H
MOV TMOD,#01H ;让T0工作在方式1
SETB ET0 ;开T0中断
SETB EA ;开总中断
SETB TR0 ;T0开始计数
MOV P0,#00H ;让p0管脚为零
MOV P2,#00H ;让p2管脚为零
MOV R4,#00H ;
S2:
DJNZ R4,S3 ;对R4进行判断,判断是否间隔为1s
INC R0 ;秒数加一
MOV R5,#0AH ;将R5给为10
S3:
MOV R1,#10 ;将R1赋值为10
MOV A,R0 ;将取值地址给A
MOV B,R1 ;将R1中的内容先给B保存
DIV AB ;让AB相除,其中十位在A,个位在B
MOV P2,#01H ;将P2
MOV P0,A ;将取到的第一数就是0给段选P0
LCALL DELAY ;调用延时程序
MOV A,B ;将个位数字给A
MOVC A,@ A+DPTR ;将下一个数字给A
MOV P2,#02H ;将两个位选为设置为1
MOV P0,A ;输出管脚数字
CJNE R0,#99,S2 ;判断是不是循环100次
MOV R0,#00H ;相等则归零
LJMP S2 ;跳转S2
DELAY: MOV R5,#60 ;延时子程序,延时1.2ms
DEL0: MOV R6,#1
DEL1: MOV R7,#20
DEL2:
DJNZ R7,DEL2
DJNZ R6,DEL1
DJNZ R5,DEL0
RET
IT0P: MOV TL0,#0F0H ;加载初值
MOV TH0,#0D8H
DJNZ R5,RTURN ;判断R5是否为0,循环10次计时为1s
MOV R4,#01H ;R4进行赋值
RTURN:RET ;返回子程序
TABLE:DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
END