流水燈控制
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++);
}
}