单片机学习(一)

流水灯实验

题目要求:
间隔300ms第一次一个管亮流动一次,第二个管亮流动,依次到第八个管亮,然后重复整个过程。

使用器材:
74HC573,80C52,LED-YELLOW,RESPACK-8。

实验接线图:
单片机学习(一)_第1张图片
接线分析:

  1. 发光二极管有共阳、共阴两种接线方式,本实验采用用了共阳接线。使用排阻将8个发光二极管连接,并接入VCC。
  2. 使用了74HC573来提高驱动能力,其一共20脚,为Q0~Q7,D0 ~D7,LE, O E ‾ \overline{OE} OE,VCC,GND。其中D为输入,Q为输出,LE为高电压激活,. O E ‾ \overline{OE} OE为低电压激活。下面请看原理图
    单片机学习(一)_第2张图片
    从图中可以看出74HC573有8个D触发器构成,下面是D触发器的结构图:
    单片机学习(一)_第3张图片
    当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 
#include 
#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 ++;
}

代码分析:

  1. 本实验使用位操作来实现灯的流动。80C52上电后P1口为高电平,D口的电平与Q口相同也为高电平,所以一开始二极管都处于截止状态。为了使第一个灯亮起来,首先要使P1^0为低电平,此时二极管亮变压降大于0.7V,二极管导通,小灯变亮起来了。那么怎么让小灯流动呢?只需要将P1 ^0恢复高电平,将P1 ^1设置为高电平,这样子依次设置下去,小灯就流动起来了。
  2. 延时函数使用的内部定时器T0的方式一来完成的。

你可能感兴趣的:(单片机学习(一))