pwm控制渐变led的问题

2020-01-26 13:00发布

最近在做一个东西,要利用单片机实现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;}
   }
///////////////////////////////////////////////////////////  
   }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
21条回答
chenyuqiu
1楼-- · 2020-01-26 17:46
楼主,你的程序太笨拙了点吧?
chenyuqiu
2楼-- · 2020-01-26 21:01
 精彩回答 2  元偷偷看……
titrwh
3楼-- · 2020-01-26 23:30
要用函数,不然复杂点的程序这样写下去单片机就疯了。
chenyuqiu
4楼-- · 2020-01-27 01:15
volatile unsigned short idata   
    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一次的,所以中断处理要保证有足够的时间才不会出错。
chenyuqiu
5楼-- · 2020-01-27 02:56
我的PWM程序中一定得用   
    wRedTempLum,  
    wGreenTempLum,  
    wBlueTempLum,  
    wWhiteTempLum;  
这四个缓冲变量,不然调光时偶尔会有闪烁现象,以我的经验来说这种现象应该是PWM要有对称性才不会有闪烁。我看别人模拟的都是直接与基时比较,而不用一个缓冲变量,这样是不行的。以上是我个人的经验,错误之处还请指教!!!
strange
6楼-- · 2020-01-27 06:09
学习一下

一周热门 更多>