AT89C51通过74HC595锁存器控制流水灯-------proteus仿真

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DJDN426611/article/details/82813650

先上图

如图,通过单片机P2^0,P2^1,P2^3将控制信号通过锁存器传输到LED,从而实现流水灯小程序。

主程序如下:

#include<reg51.h>
#include<intrins.h>
#include<74HC595.H>
void Delay1ms()		//@11.0592MHz  
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

void delays(unsigned t)		//delay 500ms
{
	t=500*t;
	while(t--)
		Delay1ms();
}

void main(void)
{
	unsigned int i;
	i=0x01;               
	while(1)
	{
		Ser_IN(i);            //控制信号传给锁存器
		Par_OUT();            //将控制信号传出
		delays(1);
		i=_crol_(i,1);        //循环左移一位
	}

}
                                                  

头文件如下:

//Note: 74HC595驱动

//      __                   __
//Note: MR 主复位接电源正极, OE 使能端,输出有效接电源负极


/*--------------------------------------------*/
#ifndef __74HC595_H__
#define __74HC595_H__



/*--------------------------------------------*/
sbit SD	   = P2^1;	//串行数据输入
sbit ST_CK = P2^2;	//存储寄存器时钟输入
sbit SH_CK = P2^0;	//移位寄存器时钟输入


/*--------------------------------------------*/
//函数声明
void Ser_IN(unsigned char Data);	//串行数据输入
void Par_OUT(void);					//串行数据输出
//void Ser_Par(unsigned char Data);	//串行输入,并行输出



/*--------------------------------------------*/
//串行数据输入
void Ser_IN(unsigned char Data)
{
	unsigned char i;
	for(i = 0; i < 8; i++)
	{
		SH_CK = 0;			//CLOCK_MAX=100MHz
		SD = Data & 0x80;
		Data <<= 1;
		SH_CK = 1;
	}
}



/*--------------------------------------------*/
//并行数据输出
void Par_OUT(void)
{
	ST_CK = 0;
	ST_CK = 1;
}

/*--------------------------------------------*/
#endif 

猜你喜欢

转载自blog.csdn.net/DJDN426611/article/details/82813650