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

就是这样的一个灯,想做成呼吸灯。有AT89S52单片机,听说用PWM可以写成。求大神帮忙啊。。。然后呼吸灯可以发出七种颜色的。。。
具体还要加多大的电阻啊。还有如果成功了我还会加分的,谢谢各位大神了

#include<reg52.h>  
//端口定义
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<set;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

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

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-12-16
#include<reg51.h>
/*-----------定义单片机引脚-----*/
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<CYCLE;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<CYCLE;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<CYCLE;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<CYCLE;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<CYCLE;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<CYCLE;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<CYCLE;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);
}
不谢本回答被提问者采纳
第2个回答  2014-04-19
#include<reg52.h> 

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<set;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);
}

第3个回答  2019-09-17
怎么都是用的delay?PWM不是用定时器的吗?

单片机制作呼吸灯的C语言程序怎样编写
Delay(150000); \/\/特意加延时,可以看到熄灭的过程 for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){ LED0=0;Delay(PWM_LOW);LED0=1;Delay(CYCLE-PWM_LOW);} for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ LED0=0;Delay(PWM_LOW);LED0=1;Delay(CYCLE-PWM_LOW);} } } void Delay(uns...

求单片机大神帮忙设计一个电路,51单片机制作led呼吸灯的
演示定时器1的快速PWM输出@利用快速PWM输出控制LED的亮度变化,达到呼吸灯的效果*\/ include<iom8a.h>#include"port_set.h"#include"delay.h"\/***@函数功能:定时器1初始化@说明:定时器初始化为快速PWM,TOP为8位(0x00FF)时钟输入为系统时钟匹配时OC1A输出0,在TOP时输出1OC1B为普通端口输入捕捉触...

谁帮忙把这个51单片机模仿PWM呼吸灯的主函数程序注释下,很乱
void main (void){ unsigned int t = 1;unsigned int i, TEMP;unsigned int TYPE = 0;bit LOOP = 0;while (1){ if (KEY == 0){ l1:Delay(10000);TYPE = (1 - TYPE);if (TYPE == 0){ t = 1;LOOP = 0;};} if (TYPE == 0){ if (LOOP == 0){ Display(t);t++;...

51单片机设计呼吸灯
include "reg51.h" \/\/包含头文件 define uchar unsigned char define uint unsigned int \/\/ \/\/延时函数 \/\/ delay(uint time) \/\/int型数据为16位,所以最大值为65535 { uint i,j; \/\/定义变量i,j,用于循环语句 for(i=0;i<time;i++) \/\/for循环,循环50*time次 for(j=0...

51单片机用汇编语言如何设计8个轮流呼吸的呼吸灯?
ACALL DELAY MOV P0,#40H;()只有第七个灯亮 ACALL DELAY MOV P0,#80H;()只有第八个灯亮 ACALL DELAY AJMP START;周而复始 DELAY: MOV R6,#40;延迟程序,晶振为3.57MHZ时大概是0.1S 0.1SL1: MOV R5,#246 0.1SL2: NOP DJNZ R5,0.1SL2 DJNZ R6,0.1SL1 RET END ...

请教51单片机利用PWM控制灯的亮度的程序
第二,PWM_ON在程序中的作用很大,它会由0--->CYCLE--->0并且一直循环下去。可以把它看成一个有规律的变化的量。第三,每进入中断一次count++,满足条件count==PWM_ON或count==CYCLE时改变LED的当前状态。作用是给小灯亮或灭的时间不同。第四,LED的亮度与其通电时间有关,也可以说成是占空比。

求大神给写一个单片机的pwm程序,,,
在编写单片机PWM(脉冲宽度调制)程序时,以下是一个参考示例,它展示了如何配置和初始化8051微控制器的PCA(可编程计数器\/振荡器)模块以产生PWM信号。请注意,此代码是为特定硬件平台(如8051微控制器)和编译器(如Keil C)编写的,可能需要根据您的具体硬件和软件环境进行调整。```c include "reg5...

求一个89c52单片机的呼吸灯程序 要边呼吸边移动的 就是相当于呼吸灯流水...
delay(10); \/\/ 这里的延时 根据灯的情况自己调整 } } } \/\/ 主程序开始 void main(){ unsigned char ledn;while(1){ for(ledn=0;ledn<8;ledn++){ off_on(ledn);on_off(ledn);} } } 这个程序我简单测试了一下,效果还好,不知道这个效果是不是您想要的?说明一下啊,我这...

51单片机用汇编语言如何编写LED灯逐渐变亮在逐渐变暗啊
这个要用到软件的pwm,因为51的没有硬件的pwm所以只好自己写软件的了。首先,要做一个软件三角波发生器子程序,频率自己定,就是变亮变暗的周期。此函数的返回值作为pwm的输入值。再做一个pwm的模拟程序,占空比(0-100)是三角波发生器的输出,pwm模拟程序控制某个端口输出1和0的占空比来控制灯 的...

51单片机中如何用C语言实现不同个灯同时进行不同频率的PWM呼吸?你现在...
在定时器中断函数中设置两个变量,其中一个每10毫秒翻转一次,另一个每50毫秒翻转一次;然后将这两个变量赋值给控制LED灯的两个I\/O口!

相似回答