求助,51单片机用PWM的RGB呼吸灯程序怎么写?

2025-04-07 09:58:25
推荐回答(4个)
回答1:

#include  
//端口定义
sbit RED    =    P2^0;//红光控制端,0点亮 
sbit GREEN  =    P2^1;//绿光控制端,0点亮 
sbit BLUE   =    P2^2;//蓝光控制端,0点亮
//函数声明
void Delay(unsigned int t);  
void RGB(unsigned char R ,unsigned char G ,unsigned char B); 
//主函数
void main (void)
{   
    RED = 1 ; GREEN = 1 ; BLUE = 1 ;
    //开始时先关闭LED,当然由于单片机上电就输出 1 ,所以可不写               
    while (1)         //主循环
    {
        //7色光依次逐渐变亮
        //改变调用顺序可以改变颜色先后次序
        RGB(1,1,0);
        RGB(1,0,1);
        RGB(1,0,0);
        RGB(0,1,1);
        RGB(0,1,0);
        RGB(0,0,1);
        RGB(0,0,0);
    }
}
 
void Delay(unsigned int t)
{
 while(--t);
}
//7色光依次逐渐变亮
RGB(unsigned char R ,unsigned char G ,unsigned char B)
{
    unsigned int pwm , set = 500 ;        
    for(pwm=1;pwm    { 
             RED    = 1;        //熄灭LED 
             GREEN  = 1;
             BLUE   = 1; 
             Delay(set-pwm);//延时长度,500次循环中从599减至1
             RED    = R;        
             GREEN  = G;
             BLUE   = B;        
             Delay(pwm);//延时长度,500次循环中从1加至599
    }
}
//改变set可以改变变化快慢
//同理你可以写出7色逐渐变暗的程序

这里的程序只是提供一个思路,你如果直接复制粘贴的话会出现格式错误

把每两行中间的空行删掉一般就可消除格式错误

如果再有什么小问题根据编译信息提示稍作修改就行


串电阻的话一般这样算:

R = [ U - U(LED) ] / I

U是LED和电阻总的电压,U(LED)是LED工作电压,I 是LED工作电流,一般10--20mA

电流大小取的适中就行了,再计算要串联的电阻值

回答2:

#include
/*-----------定义单片机引脚-----*/
sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;

void Delay(unsigned int t); //函数声明
unsigned int z,y;
void main (void)//主函数
{
unsigned int CYCLE=500,PWM_LOW=0;//定义周期并赋值
while (1) //主循环
{

/*--------第一颜色LED灯呼吸---------*/
LED0=1;
Delay(500);
for(PWM_LOW=1;PWM_LOW {
LED0=0;
Delay(PWM_LOW);
LED0=1;
Delay(CYCLE-PWM_LOW);
}
LED0=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
{
LED0=0;
Delay(PWM_LOW);
LED0=1;
Delay(CYCLE-PWM_LOW);
}

/*--------第二颜色LED灯呼吸----------*/
LED1=1;
Delay(500);
for(PWM_LOW=1;PWM_LOW {
LED1=0;
Delay(PWM_LOW);
LED1=1;
Delay(CYCLE-PWM_LOW);
}
LED1=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
{
LED1=0;
Delay(PWM_LOW);
LED1=1;
Delay(CYCLE-PWM_LOW);
}

/*--------第三颜色LED灯呼吸----------*/
LED2=1;
Delay(500);
for(PWM_LOW=1;PWM_LOW {
LED2=0;
Delay(PWM_LOW);
LED2=1;
Delay(CYCLE-PWM_LOW);
}
LED2=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
{
LED2=0;
Delay(PWM_LOW);
LED2=1;
Delay(CYCLE-PWM_LOW);
}
/*--------第四颜色LED灯呼吸----------*/
LED0=1;
LED1=1;
Delay(500);
for(PWM_LOW=1;PWM_LOW {
LED0=0;
LED1=0;
Delay(PWM_LOW);
LED0=1;
LED1=1;
Delay(CYCLE-PWM_LOW);
}
LED0=0;
LED1=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
{
LED0=0;
LED1=0;
Delay(PWM_LOW);
LED0=1;
LED1=1;
Delay(CYCLE-PWM_LOW);
}
/*--------第五颜色LED灯呼吸----------*/
LED0=1;
LED2=1;
Delay(500);
for(PWM_LOW=1;PWM_LOW {
LED0=0;
LED2=0;
Delay(PWM_LOW);
LED0=1;
LED2=1;
Delay(CYCLE-PWM_LOW);
}
LED0=0;
LED2=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
{
LED0=0;
LED2=0;
Delay(PWM_LOW);
LED0=1;
LED2=1;
Delay(CYCLE-PWM_LOW);
}
/*--------第六颜色LED灯呼吸----------*/
LED1=1;
LED2=1;
Delay(500);
for(PWM_LOW=1;PWM_LOW {
LED1=0;
LED2=0;
Delay(PWM_LOW);
LED1=1;
LED2=1;
Delay(CYCLE-PWM_LOW);
}
LED1=0;
LED2=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
{
LED1=0;
LED2=0;
Delay(PWM_LOW);
LED1=1;
LED2=1;
Delay(CYCLE-PWM_LOW);
}
/*--------第七颜色LED灯呼吸----------*/
LED0=1;
LED1=1;
LED2=1;
Delay(500);
for(PWM_LOW=1;PWM_LOW {
LED0=0;
LED1=0;
LED2=0;
Delay(PWM_LOW);
LED0=1;
LED1=1;
LED2=1;
Delay(CYCLE-PWM_LOW);
}
LED0=0;
LED1=0;
LED2=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
{
LED0=0;
LED1=0;
LED2=0;
Delay(PWM_LOW);
LED0=1;
LED1=1;
LED2=1;
Delay(CYCLE-PWM_LOW);
}
}
}
void Delay(unsigned int t)
{
while(--t);
}
不谢

回答3:

#include 

sbit LED0=P2^0;//译码器控制端,低有效

void Delay(unsigned int t); //函数声明


void main (void)
{
                  
unsigned int set=400,pwm=0;//定义周期并赋值

while (1)         //主循环
  {
 LED0=0;
 Delay(60000);        //延时,可以看到熄灭的过程
 for(pwm=1;pwm

    LED0=1;        //熄灭LED  
    Delay(pwm);//延时长度,600次循环中从1加至599
    LED0=1;        //点亮LED
       Delay(set-pwm);//延时长度,600次循环中从599减至1
     
   }
 LED0=1;
 for(pwm=set-1;pwm>0;pwm--){ //与逐渐变亮相反的过程

    LED0=1;
    Delay(pwm);
    LED0=0;
       Delay(set-pwm);
     
   }
                     //主循环中添加其他需要一直工作的程序
  }
}

void Delay(unsigned int t)
{
 while(--t);
}

回答4:

怎么都是用的delay?PWM不是用定时器的吗?