天天看點

流水燈控制

流水燈控制

2021-01-09,51單片機學習筆記

功能:
           

8位流水燈 由上至下由下至上來回流動,間隔1s流動,其中每個LED亮500ms,滅500ms,燈亮時蜂鳴器響,燈滅時關閉蜂鳴器,一直循環下去。

代碼:
           
/*****************************************************************
8位流水燈 由上至下由下至上來回流動,
間隔1s流動,其中每個LED亮500ms,滅500ms,
燈亮時蜂鳴器響,燈滅時關閉蜂鳴器,一直循環下去。
*****************************************************************/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int       //宏定義,使用uint代指unsigned int
#define uchar unsigned char
uint ms;                        //延時子函數參數,用于控制延時時長
uchar temp;                     //定義無符号字元型變量temp
sbit beep=P2^3;                 //聲明蜂鳴器I/O口
void delayms(uint ms);          //聲明延時函數
void main()
{
	temp=0xfe;                  //0xfe=1111 1110
	while(1)
	{	
		uint i;                 //計數變量
		for(i=0;i<7;i++)        //正序流水燈
		{
			beep=0;             //蜂鳴器打開
			P1=temp;            //将變量temp初始值指派給8位寄存器P1,點亮led
			delayms(502);       //延遲500ms
			
			beep=1;             //蜂鳴器關閉
			P1=0xff;            //led全部滅掉
			delayms(502);
			
			temp=_crol_(temp,1);//按位循環左移一位,1111 1110-->1111 1101-->1111 1011
			P1=temp;            //将按位左移一位後的變量指派給寄存器P1,點亮下一個led
		}
		
		for(i=0;i<7;i++)        //倒序流水燈
		{
			beep=0;
			P1=temp;
			delayms(502);
			
			beep=1;
			P1=0xff;
			delayms(502);
			
			temp=_cror_(temp,1);
			P1=temp;            //将按位右移一位後的變量指派給寄存器P1,點亮下一個led
		}
	}	
}
void delayms(uint ms)           //延時函數,參數ms=100時,單次延時約100ms
{ 
   uchar k; 
   while(ms--) 
   { 
      for(k = 0; k < 90; k++); 
   } 
}