最近在做一个东西,要利用单片机实现23盏led不同时间的渐变。我写了一个程序,由于初学,写的比较冗长,大家能否帮我修改下,给点意见。还有就是程序基本功能是实现了,渐变也没什么问题,就是变化的时候有些灯会出现亮度跳变一下,但总体还是按着自动由亮到灭再由灭到亮的循环反复。希望大家多给意见,感激不尽!
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define time 100
sbit p0=P1^0;
sbit p1=P1^1;
sbit p2=P1^2;
sbit p3=P1^3;
sbit p4=P1^4;
sbit p5=P1^5;
sbit p6=P1^6;
sbit p7=P1^7;
sbit p8=P2^0;
sbit p9=P2^1;
sbit p10=P2^2;
sbit p11=P2^3;
sbit p12=P2^4;
sbit p13=P2^5;
sbit p14=P2^6;
sbit p15=P2^7;
sbit p16=P0^0;
sbit p17=P0^1;
sbit p18=P0^2;
sbit p19=P0^3;
sbit p20=P0^4;
sbit p21=P0^5;
sbit p22=P0^6;
uchar cycle;
uchar pwm0,pwm1,pwm2,pwm3,pwm4,pwm5,pwm6,pwm7;
uchar pwm8,pwm9,pwm10,pwm11,pwm12,pwm13,pwm14,pwm15;
uchar pwm16,pwm17,pwm18,pwm19,pwm20,pwm21,pwm22;
void t0()interrupt 1
{
static uchar count0,count1,count2,count3,count4,count5,count6,count7;
static uchar count8,count9,count10,count11,count12,count13,count14,count15;
static uchar count16,count17,count18,count19,count20,count21,count22;
TH0=(65536-350)/256;
TL0=(65536-350)%256;
if(count0==pwm0) {p0=0;}
//////////////////////////////////////////////
if(count1==pwm1) {p1=0;}
//////////////////////////////////////////////
if(count2==pwm2) {p2=0;}
//////////////////////////////////////////////
if(count3==pwm3) {p3=0;}
//////////////////////////////////////////////
if(count4==pwm4) {p4=0;}
//////////////////////////////////////////////
if(count5==pwm5) {p5=0;}
//////////////////////////////////////////////
if(count6==pwm6) {p6=0;}
//////////////////////////////////////////////
if(count7==pwm7) {p7=0;}
//////////////////////////////////////////////
if(count8==pwm8) {p8=0;}
//////////////////////////////////////////////
if(count9==pwm9) {p9=0;}
//////////////////////////////////////////////
if(count10==pwm10) {p10=0;}
//////////////////////////////////////////////
if(count11==pwm11) {p11=0;}
//////////////////////////////////////////////
if(count12==pwm12) {p12=0;}
//////////////////////////////////////////////
if(count13==pwm13) {p13=0;}
//////////////////////////////////////////////
if(count14==pwm14) {p14=0;}
//////////////////////////////////////////////
if(count15==pwm15) {p15=0;}
//////////////////////////////////////////////
if(count16==pwm16) {p16=0;}
//////////////////////////////////////////////
if(count17==pwm17) {p17=0;}
//////////////////////////////////////////////
if(count18==pwm18) {p18=0;}
//////////////////////////////////////////////
if(count19==pwm19) {p19=0;}
//////////////////////////////////////////////
if(count20==pwm20) {p20=0;}
//////////////////////////////////////////////
if(count21==pwm21) {p21=0;}
//////////////////////////////////////////////
if(count22==pwm22) {p22=0;}
//////////////////////////////////////////////
count0++;count1++;count2++;count3++;count4++;count5++;count6++;count7++;
count8++;count9++;count10++;count11++;count12++;count13++;count14++;count15++;
count16++;count17++;count18++;count19++;count20++;count21++;count22++;
//////////////////////////////////////////////
if(count0==cycle)
{
count0=0;
if(pwm0!=0) {p0=1;}
}
//////////////////////////////////////////////
if(count1==cycle)
{
count1=0;
if(pwm1!=0) {p1=1;}
}
//////////////////////////////////////////////
if(count2==cycle)
{
count2=0;
if(pwm2!=0) {p2=1;}
}
//////////////////////////////////////////////
if(count3==cycle)
{
count3=0;
if(pwm3!=0) {p3=1;}
}
//////////////////////////////////////////////
if(count4==cycle)
{
count4=0;
if(pwm4!=0) {p4=1;}
}
//////////////////////////////////////////////
if(count5==cycle)
{
count5=0;
if(pwm5!=0) {p5=1;}
}
//////////////////////////////////////////////
if(count6==cycle)
{
count6=0;
if(pwm6!=0) {p6=1;}
}
//////////////////////////////////////////////
if(count7==cycle)
{
count7=0;
if(pwm7!=0) {p7=1;}
}
//////////////////////////////////////////////
if(count8==cycle)
{
count8=0;
if(pwm8!=0) {p8=1;}
}
//////////////////////////////////////////////
if(count9==cycle)
{
count9=0;
if(pwm9!=0) {p9=1;}
}
//////////////////////////////////////////////
if(count10==cycle)
{
count10=0;
if(pwm10!=0) {p10=1;}
}
//////////////////////////////////////////////
if(count11==cycle)
{
count11=0;
if(pwm11!=0) {p11=1;}
}
//////////////////////////////////////////////
if(count12==cycle)
{
count12=0;
if(pwm12!=0) {p12=1;}
}
//////////////////////////////////////////////
if(count13==cycle)
{
count13=0;
if(pwm13!=0) {p13=1;}
}
//////////////////////////////////////////////
if(count14==cycle)
{
count14=0;
if(pwm14!=0) {p14=1;}
}
//////////////////////////////////////////////
if(count15==cycle)
{
count15=0;
if(pwm15!=0) {p15=1;}
}
//////////////////////////////////////////////
if(count16==cycle)
{
count16=0;
if(pwm16!=0) {p16=1;}
}
//////////////////////////////////////////////
if(count17==cycle)
{
count17=0;
if(pwm17!=0) {p17=1;}
}
//////////////////////////////////////////////
if(count18==cycle)
{
count18=0;
if(pwm18!=0) {p18=1;}
}
//////////////////////////////////////////////
if(count19==cycle)
{
count19=0;
if(pwm19!=0) {p19=1;}
}
//////////////////////////////////////////////
if(count20==cycle)
{
count20=0;
if(pwm20!=0) {p20=1;}
}
//////////////////////////////////////////////
if(count21==cycle)
{
count21=0;
if(pwm21!=0) {p21=1;}
}
//////////////////////////////////////////////
if(count22==cycle)
{
count22=0;
if(pwm22!=0) {p22=1;}
}
//////////////////////////////////////////////
}
void delay(uint cnt)
{
while(--cnt);
}
void main()
{
bit flag0,flag1,flag2,flag3,flag4,flag5,flag6,flag7;
bit flag8,flag9,flag10,flag11,flag12,flag13,flag14,flag15;
bit flag16,flag17,flag18,flag19,flag20,flag21,flag22;
TMOD=0x01;
TH0=(65536-350)/256;
TL0=(65536-350)%256;
EA=1;
ET0=1;
TR0=1;
p0=0;p1=0;p2=0;p3=0;p4=0;p5=0;p6=0;p7=0;
p8=0;p9=0;p10=0;p11=0;p12=0;p13=0;p14=0;p15=0;
p16=0;p17=0;p18=0;p19=0;p20=0;p21=0;p22=0;
cycle=50; //控制渐变等级数
pwm0=0;pwm1=4;pwm2=8;pwm3=12;pwm4=16;pwm5=20;pwm6=24;pwm7=28;
pwm8=32;pwm9=36;pwm10=40;pwm11=44;pwm12=48;pwm13=2;pwm14=6;pwm15=10;
pwm16=14;pwm17=18;pwm18=22;pwm19=26;pwm20=30;pwm21=34;pwm22=38;
while(1)
{
if(flag0==0)
{
delay(time);//控制渐变时间间隔
pwm0++;
if(pwm0==cycle) {flag0=1;}// delay(2000);
}
else if(flag0==1)
{
delay(time);
pwm0--;
if(pwm0==0) {flag0=0;}
}
///////////////////////////////////////////////////////////
if(flag1==0)
{
delay(time);//控制渐变时间间隔
pwm1++;
if(pwm1==cycle) {flag1=1;}// delay(2000);
}
else if(flag1==1)
{
delay(time);
pwm1--;
if(pwm1==0) {flag1=0;}
}
///////////////////////////////////////////////////////////
if(flag2==0)
{
delay(time);//控制渐变时间间隔
pwm2++;
if(pwm2==cycle) {flag2=1;}// delay(2000);
}
else if(flag2==1)
{
delay(time);
pwm2--;
if(pwm2==0) {flag2=0;}
}
///////////////////////////////////////////////////////////
if(flag3==0)
{
delay(time);//控制渐变时间间隔
pwm3++;
if(pwm3==cycle) {flag3=1;}// delay(2000);
}
else if(flag3==1)
{
delay(time);
pwm3--;
if(pwm3==0) {flag3=0;}
}
///////////////////////////////////////////////////////////
if(flag4==0)
{
delay(time);//控制渐变时间间隔
pwm4++;
if(pwm4==cycle) {flag4=1;}// delay(2000);
}
else if(flag4==1)
{
delay(time);
pwm4--;
if(pwm4==0) {flag4=0;}
}
///////////////////////////////////////////////////////////
if(flag5==0)
{
delay(time);//控制渐变时间间隔
pwm5++;
if(pwm5==cycle) {flag5=1;}// delay(2000);
}
else if(flag5==1)
{
delay(time);
pwm5--;
if(pwm5==0) {flag5=0;}
}
///////////////////////////////////////////////////////////
if(flag6==0)
{
delay(time);//控制渐变时间间隔
pwm6++;
if(pwm6==cycle) {flag6=1;}// delay(2000);
}
else if(flag6==1)
{
delay(time);
pwm6--;
if(pwm6==0) {flag6=0;}
}
///////////////////////////////////////////////////////////
if(flag7==0)
{
delay(time);//控制渐变时间间隔
pwm7++;
if(pwm7==cycle) {flag7=1;}// delay(2000);
}
else if(flag7==1)
{
delay(time);
pwm7--;
if(pwm7==0) {flag7=0;}
}
///////////////////////////////////////////////////////////
if(flag8==0)
{
delay(time);//控制渐变时间间隔
pwm8++;
if(pwm8==cycle) {flag8=1;}// delay(2000);
}
else if(flag8==1)
{
delay(time);
pwm8--;
if(pwm8==0) {flag8=0;}
}
///////////////////////////////////////////////////////////
if(flag9==0)
{
delay(time);//控制渐变时间间隔
pwm9++;
if(pwm9==cycle) {flag9=1;}// delay(2000);
}
else if(flag9==1)
{
delay(time);
pwm9--;
if(pwm9==0) {flag9=0;}
}
///////////////////////////////////////////////////////////
if(flag10==0)
{
delay(time);//控制渐变时间间隔
pwm10++;
if(pwm10==cycle) {flag10=1;}// delay(2000);
}
else if(flag10==1)
{
delay(time);
pwm10--;
if(pwm10==0) {flag10=0;}
}
///////////////////////////////////////////////////////////
if(flag11==0)
{
delay(time);//控制渐变时间间隔
pwm11++;
if(pwm11==cycle) {flag11=1;}// delay(2000);
}
else if(flag11==1)
{
delay(time);
pwm11--;
if(pwm11==0) {flag11=0;}
}
///////////////////////////////////////////////////////////
if(flag12==0)
{
delay(time);//控制渐变时间间隔
pwm12++;
if(pwm12==cycle) {flag12=1;}// delay(2000);
}
else if(flag12==1)
{
delay(time);
pwm12--;
if(pwm12==0) {flag12=0;}
}
///////////////////////////////////////////////////////////
if(flag13==0)
{
delay(time);//控制渐变时间间隔
pwm13++;
if(pwm13==cycle) {flag13=1;}// delay(2000);
}
else if(flag13==1)
{
delay(time);
pwm13--;
if(pwm13==0) {flag13=0;}
}
///////////////////////////////////////////////////////////
if(flag14==0)
{
delay(time);//控制渐变时间间隔
pwm14++;
if(pwm14==cycle) {flag14=1;}// delay(2000);
}
else if(flag14==1)
{
delay(time);
pwm14--;
if(pwm14==0) {flag14=0;}
}
///////////////////////////////////////////////////////////
if(flag15==0)
{
delay(time);//控制渐变时间间隔
pwm15++;
if(pwm15==cycle) {flag15=1;}// delay(2000);
}
else if(flag15==1)
{
delay(time);
pwm15--;
if(pwm15==0) {flag15=0;}
}
///////////////////////////////////////////////////////////
if(flag16==0)
{
delay(time);//控制渐变时间间隔
pwm16++;
if(pwm16==cycle) {flag16=1;}// delay(2000);
}
else if(flag16==1)
{
delay(time);
pwm16--;
if(pwm16==0) {flag16=0;}
}
///////////////////////////////////////////////////////////
if(flag17==0)
{
delay(time);//控制渐变时间间隔
pwm17++;
if(pwm17==cycle) {flag17=1;}// delay(2000);
}
else if(flag17==1)
{
delay(time);
pwm17--;
if(pwm17==0) {flag17=0;}
}
///////////////////////////////////////////////////////////
if(flag18==0)
{
delay(time);//控制渐变时间间隔
pwm18++;
if(pwm18==cycle) {flag18=1;}// delay(2000);
}
else if(flag18==1)
{
delay(time);
pwm18--;
if(pwm18==0) {flag18=0;}
}
///////////////////////////////////////////////////////////
if(flag19==0)
{
delay(time);//控制渐变时间间隔
pwm19++;
if(pwm19==cycle) {flag19=1;}// delay(2000);
}
else if(flag19==1)
{
delay(time);
pwm19--;
if(pwm19==0) {flag19=0;}
}
///////////////////////////////////////////////////////////
if(flag20==0)
{
delay(time);//控制渐变时间间隔
pwm20++;
if(pwm20==cycle) {flag20=1;}// delay(2000);
}
else if(flag20==1)
{
delay(time);
pwm20--;
if(pwm20==0) {flag20=0;}
}
///////////////////////////////////////////////////////////
if(flag21==0)
{
delay(time);//控制渐变时间间隔
pwm21++;
if(pwm21==cycle) {flag21=1;}// delay(2000);
}
else if(flag21==1)
{
delay(time);
pwm21--;
if(pwm21==0) {flag21=0;}
}
///////////////////////////////////////////////////////////
if(flag22==0)
{
delay(time);//控制渐变时间间隔
pwm22++;
if(pwm22==cycle) {flag22=1;}// delay(2000);
}
else if(flag22==1)
{
delay(time);
pwm22--;
if(pwm22==0) {flag22=0;}
}
///////////////////////////////////////////////////////////
}
}
wPwmCount,
wRedLum,
wGreenLum,
wBlueLum,
wWhiteLum,
wRedTempLum,
wGreenTempLum,
wBlueTempLum,
wWhiteTempLum;
sbit Red = P0^0;
sbit Green = P0^1;
sbit Blue = P0^2;
sbit White = P0^3;
void Timer0_IRQHandler(void) interrupt 1 // 10US中断一次,1000步的PWM调光灰度
{
if ((-- wPwmCount) == 0)
{
Red = 0;
Green = 0;
Blue = 0;
White = 0;
wPwmCount = 1000;
wRedTempLum = wRedLum;
wGreenTempLum = wGreenLum;
wBlueTempLum = wBlueLum;
wWhiteTempLum = wWhiteLum;
}
else
{
if (wPwmCount < wRedTempLum)
{
Red = 1;
}
if (wPwmCount < wGreenTempLum)
{
Green = 1;
}
if (wPwmCount < wBlueTempLum)
{
Blue = 1;
}
if (wPwmCount < wWhiteTempLum)
{
White = 1;
}
}
}
只要你把各路的值分别赋给wRedLum,wGreenLum,wBlueLum,wWhiteLum,就可以了,如果四路还不够的话可以按照我的 程序架构再扩展更多的路数出来,但是请注意:中断我是用10US一次的,所以中断处理要保证有足够的时间才不会出错。
wRedTempLum,
wGreenTempLum,
wBlueTempLum,
wWhiteTempLum;
这四个缓冲变量,不然调光时偶尔会有闪烁现象,以我的经验来说这种现象应该是PWM要有对称性才不会有闪烁。我看别人模拟的都是直接与基时比较,而不用一个缓冲变量,这样是不行的。以上是我个人的经验,错误之处还请指教!!!
一周热门 更多>