1. 程式人生 > >AT89C51通過74HC595鎖存器控制流水燈-------proteus模擬

AT89C51通過74HC595鎖存器控制流水燈-------proteus模擬

先上圖

如圖,通過微控制器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