前言
通过前面的学习,已经初步认识了单片机的内部结构和部分指令,接下来就得进行实操,通过编程对单片机的LED灯进行控制,从而实现流水灯的效果。
一、LED是什么?
发光二极管(英语:Light-Emitting Diode,简称LED) 是一种能将电能转化为光能的半导体电子元件,是单片机等计算机控制系统最常用的输出设备。发光二极管有亮、灭两种状态,多用于信号或状态显示,发光二极管与单片机的硬件接口有两种连接方式,如图1所示。LED流水灯控制是单片机应用系统设计中最简单也是最经典的控制实例。
图 1 LED与单片机I/O口连接方式
其中共阴极二极管的亮灭控制为:1(高电平)亮,0(接地)灭; 共阳极二极管的亮灭控制为:0(接地)亮,1(高电平)灭。本次实验实验使用的开发板为普中A3开发板,该开发板的LED灯为共阳极二极管,它的引脚分布图如图2所示:
图 2 LED灯的引脚分布图
二、实验内容
单片机集成了4个8位并行I/O接口,LED流水灯控制需要选择其中的1个I/O口连接8个LED灯(LED1~LED8),通过程序控制将发光二极管LED1~LED8依次点亮、熄灭,单片机上电后8个LED灯便会显示出一亮一暗的流水状态,直到单片机断电。在此需要注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,在控制二极管亮灭的时候应该延时一段时间,否则就看不到“流水”效果,这里每个二极管点亮的时间是1秒钟。具体控制要求如图3所示的时序图。
图 3 LED流水灯控制时序图
三、实验分析
3.1 LED灯的点亮
由于本次实验实验使用的开发板为普中A3开发板,该开发板的LED灯为共阳极二极管,0(接地)亮,1(高电平)灭。下面实现点亮一个LED灯,代码如下:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV P2,#11111110B ;共阳极LED灯,0亮,1灭,一共8个灯
END
利用keil5仿真,结果如下:
而流水灯是一个接着一个点亮的,需要进行位移操作,这时需要借助累加器A,延迟1s,A内的数值进行位移,然后传值给P2口,点亮不同位置的一个LED灯。实现过程如下:
MOV A,#0FEH
MOV P2,A ;先亮1个灯
LIGHT:
ACLL DELAT ;软件调用延迟1s
RL A ;左移A
MOV P2,A
SJMP LIGHT
DELAY: ;延迟1s子程序
3.2 延迟程序的实现
在12HZ晶振的情况下,1个机器周期为1微秒,实现1s延迟,需要250*200*10*2微秒,这里用到的多重循环,代码如下(示例):
MOV R3,#10
RF: MOV R4,#200
LF: MOV R5,#250
DJNZ R5,$
DJNZ R4,LF
DJNZ R3,RF
四、代码实现
代码如下:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV P2,#11111111B
MOV A,#0FEH
MOV P2,A
LIGHT:
ACALL DELAY
MOV P2,A
SJMP LIGHT
DELAY:
RL A
MOV R3,#10
RF: MOV R4,#200
LF: MOV R5,#250
DJNZ R5,$
DJNZ R4,LF
DJNZ R3,RF
RET
END