單片機寫的波浪狀的流水燈:
單片機寫的波浪狀的流水燈
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit P00=P0^0; //P0口為低電平時LED亮
sbit P01=P0^1;
sbit P02=P0^2;
sbit P03=P0^3;
sbit P04=P0^4;
sbit P05=P0^5;
sbit P06=P0^6;
sbit P07=P0^7;
uchar cnt[8]={8,16,24,32,40,48,56,64}; //定義8個初始亮度級別
uchar flgdir[8]={1,1,1,1,1,1,1,1}; //在LED從暗到漸亮再從亮到漸暗是做計數方向標志
void main()
{
TMOD=0x11; //定時器0定時0.156mS,晶振是11.0592M
TH0=0xFF;
TL0=0x70;
ET0=1;
EA=1;
TR0=1;
P0=0x00;
while(1);
}
void timer0() interrupt 1
{
static uchar n;
uchar i;
TH0=0xFF;
TL0=0x70;
n++;
if(n==cnt[0])P00=1; //用n定時計數與cnt比較用來在P0各個位出現不同脈寬的PWM波形
if(n==cnt[1])P01=1;
if(n==cnt[2])P02=1;
if(n==cnt[3])P03=1;
if(n==cnt[4])P04=1;
if(n==cnt[5])P05=1;
if(n==cnt[6])P06=1;
if(n==cnt[7])P07=1;
if(n>63) //每過64*0.156=10ms,P0變為0,重新開始一個PWM周期,即PWM波的頻率是100Hz
{
n=0;
P0=0;
for(i=0;i<8;i++) //并且每過10ms每個燈的脈寬變化一次,即亮度變化一次
{
if(flgdir==1) //分別控制每個燈的脈寬由窄變寬再到窄,由于計數的初始值不同,因此出現波浪狀的流水燈
{
cnt++;
if(cnt>71)flgdir=0;
}
else
{
cnt--;
if(cnt<9)flgdir=1;
}
}
}
}
有興趣的朋友可以免費索取源程序