8位led呼吸程序代码
时间:08-06
来源:互联网
点击:
前几天从视频上看到一个水滴掉落的程序,看到自己笔记本上的led呼吸灯,感觉他们的算法要求差不多,于是写下一下程序,我也得瑟一下,算是原创吧。有不正之处或者是有需要优化之处欢迎大家批评指正,相互学习(代码中有138译码器的操作,已注释,kingst的单片机开发板可直接实现)
#includereg51.h>
#define uchar unsigned char
#define N 2 //定义的呼吸的速率
#define T 700 //定义PWM的周期
sbit ENLED = P1^4;//138译码器
sbit ADDR0 = P1^0;//138译码器
sbit ADDR1 = P1^1;//138译码器
sbit ADDR2 = P1^2;//138译码器
sbit ADDR3 = P1^3;//138译码器
sbit led0=P0^0;
sbit led1=P0^1;
sbit led2=P0^2;
sbit led3=P0^3;
sbit led4=P0^4;
sbit led5=P0^5;
sbit led6=P0^6;
sbit led7=P0^7;
void pwm(int x)
{
while(x--);//延时函数
}
void main()
{
int t=0,i=0;
char f=0;
ENLED = 0;ADDR3 = 1; 译码器的打开
ADDR0 = 0;ADDR1 = 1;ADDR2 = 1; 译码器的操作11111011
while(1)
{
if(i=800)
{
i++;
led0=0;
pwm(t);//Toff,亮的时间
led0=1;
pwm(T-t);//Ton,暗的时间
if(!f) t+=N+1;//亮速率较快,模拟呼吸
else t-=N;//暗速率较慢
if(t>T)
{
f=1;
t=T;
}//超过最大值时,返回最大值,此时灯灭
if(t0)
{
f=0;
t=0;
}//超过最小值时,返回最小值,此时灯亮 以后的程序不再注释。
}
if(i>=800i=1600)
{
i++;
led1=0;
pwm(t);
led1=1;
pwm(T-t);
if(!f) t+=N+1;
else t-=N;
if(t>T)
{
f=1;
t=T;
}
if(t0)
{
f=0;
t=0;
}
}
if(i>1600i2400)
{
i++;
led2=0;
pwm(t);
led2=1;
pwm(T-t);
if(!f) t+=N+1;
else t-=N;
if(t>T)
{
f=1;
t=T;
}
if(t0)
{
f=0;
t=0;
}
}
if(i>=2400i3200)
{
i++;
led3=0;
pwm(t);
led3=1;
pwm(T-t);
if(!f) t+=N+1;
else t-=N;
if(t>T) {f=1;t=T;}
if(t0) {f=0;t=0;}
}
if(i>=3200i4000)
{
i++;
led4=0;
pwm(t);
led4=1;
pwm(T-t);
if(!f) t+=N+1;
else t-=N;
if(t>T)
{
f=1;
t=T;
}
if(t0)
{
f=0;
t=0;
}
}
if(i>=4000i4800)
{
i++;
led5=0;
pwm(t);
led5=1;
pwm(T-t);
if(!f) t+=N+1;
else t-=N;
if(t>T)
{
f=1;
t=T;
}
if(t0)
{
f=0;
t=0;
}
}
if(i>=4800i5600)
{
i++;
led6=0;
pwm(t);
led6=1;
pwm(T-t);
if(tT)
{
f=1;
t=T;
}
if(t0)
{
f=0;
t=0;
}
}
if(i>=5600i6400)
{
i++;
led7=0;
pwm(t);
led7=1;
pwm(T-t);
if(!f) t+=N+1;
else t-=N;
if(t>T)
{
f=1;
t=T;
}
if(t0)
{
f=0;
t=0;
}
if(i>=6400)i=0;
}
#includereg51.h>
#define uchar unsigned char
#define N 2 //定义的呼吸的速率
#define T 700 //定义PWM的周期
sbit ENLED = P1^4;//138译码器
sbit ADDR0 = P1^0;//138译码器
sbit ADDR1 = P1^1;//138译码器
sbit ADDR2 = P1^2;//138译码器
sbit ADDR3 = P1^3;//138译码器
sbit led0=P0^0;
sbit led1=P0^1;
sbit led2=P0^2;
sbit led3=P0^3;
sbit led4=P0^4;
sbit led5=P0^5;
sbit led6=P0^6;
sbit led7=P0^7;
void pwm(int x)
{
while(x--);//延时函数
}
void main()
{
int t=0,i=0;
char f=0;
ENLED = 0;ADDR3 = 1; 译码器的打开
ADDR0 = 0;ADDR1 = 1;ADDR2 = 1; 译码器的操作11111011
while(1)
{
if(i=800)
{
i++;
led0=0;
pwm(t);//Toff,亮的时间
led0=1;
pwm(T-t);//Ton,暗的时间
if(!f) t+=N+1;//亮速率较快,模拟呼吸
else t-=N;//暗速率较慢
if(t>T)
{
f=1;
t=T;
}//超过最大值时,返回最大值,此时灯灭
if(t0)
{
f=0;
t=0;
}//超过最小值时,返回最小值,此时灯亮 以后的程序不再注释。
}
if(i>=800i=1600)
{
i++;
led1=0;
pwm(t);
led1=1;
pwm(T-t);
if(!f) t+=N+1;
else t-=N;
if(t>T)
{
f=1;
t=T;
}
if(t0)
{
f=0;
t=0;
}
}
if(i>1600i2400)
{
i++;
led2=0;
pwm(t);
led2=1;
pwm(T-t);
if(!f) t+=N+1;
else t-=N;
if(t>T)
{
f=1;
t=T;
}
if(t0)
{
f=0;
t=0;
}
}
if(i>=2400i3200)
{
i++;
led3=0;
pwm(t);
led3=1;
pwm(T-t);
if(!f) t+=N+1;
else t-=N;
if(t>T) {f=1;t=T;}
if(t0) {f=0;t=0;}
}
if(i>=3200i4000)
{
i++;
led4=0;
pwm(t);
led4=1;
pwm(T-t);
if(!f) t+=N+1;
else t-=N;
if(t>T)
{
f=1;
t=T;
}
if(t0)
{
f=0;
t=0;
}
}
if(i>=4000i4800)
{
i++;
led5=0;
pwm(t);
led5=1;
pwm(T-t);
if(!f) t+=N+1;
else t-=N;
if(t>T)
{
f=1;
t=T;
}
if(t0)
{
f=0;
t=0;
}
}
if(i>=4800i5600)
{
i++;
led6=0;
pwm(t);
led6=1;
pwm(T-t);
if(tT)
{
f=1;
t=T;
}
if(t0)
{
f=0;
t=0;
}
}
if(i>=5600i6400)
{
i++;
led7=0;
pwm(t);
led7=1;
pwm(T-t);
if(!f) t+=N+1;
else t-=N;
if(t>T)
{
f=1;
t=T;
}
if(t0)
{
f=0;
t=0;
}
if(i>=6400)i=0;
}
}
}
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)