流水灯实验
题目要求:
间隔300ms第一次一个管亮流动一次,第二个管亮流动,依次到第八个管亮,然后重复整个过程。
使用器材:
74HC573,80C52,LED-YELLOW,RESPACK-8。
实验接线图:
接线分析:
- 发光二极管有共阳、共阴两种接线方式,本实验采用用了共阳接线。使用排阻将8个发光二极管连接,并接入VCC。
- 使用了74HC573来提高驱动能力,其一共20脚,为Q0~Q7,D0 ~D7,LE,
O
E
‾
\overline{OE}
OE,VCC,GND。其中D为输入,Q为输出,LE为高电压激活,.
O
E
‾
\overline{OE}
OE为低电压激活。下面请看原理图
从图中可以看出74HC573有8个D触发器构成,下面是D触发器的结构图:
当LE为1,D为1时,G1输入为0,G2输入为1,Q输出为1
当LE为1,D为0时,G1输入为1,G2输入为0,Q输出为0
当LE为0,D为0时,G1输入为1,G2输入为1,Q输出不变
当LE为0,D为1时,G1输入为1,G2输入为1,Q输出不变
由此可见,当LE为低电平的时候,芯片是处于锁存状态,这不是我们想要的,我们需要Q和D保持相同的状态,故LE要接高电平。
再看
O
E
‾
\overline{OE}
OE连接三态门的使能端,当
O
E
‾
\overline{OE}
OE为高电平时,三态门使能,无论D端输入为什么,Q端都不会有输出,这也不是我们想要的,所以
O
E
‾
\overline{OE}
OE需要接低电平。
实验代码:
#include <reg52.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
uint num = 0;
void init();
void led();
void T0_time();
void main()
{
init();
led();
}
void init()
{
TMOD = 0x01;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void led()
{
uint i, j, n;
n = 0;
while(1)
{
P1 = 0xFF;
n = ((n + 1)%9) > 0 ? ((n + 1)%9) : 1;
j = pow(2, n) - 1;
i = 8;
do
{
P1 -= j;
while(num != 6);
num = 0;
P1 = 0xFF;
j <<= 1;
i --;
}
while(i > 0);
}
}
void T0_time() interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
num ++;
}
代码分析:
- 本实验使用位操作来实现灯的流动。80C52上电后P1口为高电平,D口的电平与Q口相同也为高电平,所以一开始二极管都处于截止状态。为了使第一个灯亮起来,首先要使P1^0为低电平,此时二极管亮变压降大于0.7V,二极管导通,小灯变亮起来了。那么怎么让小灯流动呢?只需要将P1 ^0恢复高电平,将P1 ^1设置为高电平,这样子依次设置下去,小灯就流动起来了。
- 延时函数使用的内部定时器T0的方式一来完成的。