单片机如何产生PWM信号让三基色led渐变?

单片机如何产生PWM信号让三基色led渐变?,第1张

#include<reg52.h>//包含头文件,一埋让般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit LED0=P1^0// 用sbit 关键字 定义 LED到P1.0端口,LED是自己任意定义且容易记忆的符号

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

/*------------------------------------------------

主函数

------------------------------------------------*/

void main (void)

{

unsigned int CYCLE=600,PWM_LOW=0//定义周期并赋值

while (1) //主循环

{

P1=0xff

Delay(60000) //特意加延时,可以看到熄灭的过程

for(PWM_LOW=1PWM_LOW<CYCLEPWM_LOW++){ //PWM_LOW表示低

//电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次

P1=0x00 //点亮LED

Delay(PWM_LOW)//延时长携尘度,600次循环中从1加至599

P1=0xff //熄灭LED

Delay(CYCLE-PWM_LOW)//延时长度,600次循环中从599减至1

}

P1=0x00

for(PWM_LOW=CYCLE-1PWM_LOW>0PWM_LOW--){ //与逐渐变亮相反的过程辩液禅

P1=0x00

Delay(PWM_LOW)//变小

P1=0xff

Delay(CYCLE-PWM_LOW)//变大

}

//主循环中添加其他需要一直工作的程序

}

}

/*------------------------------------------------

延时函数,含有输入参数 unsigned int t,无返回值

unsigned int 是定义无符号整形变量,其值的范围是

0~65535

------------------------------------------------*/

void Delay(unsigned int t)

{

while(--t)

}

#include <iom16.h>

#include <avr_macros.h>

void Init_IO(void)

 {

   DDRA = 0xFF

   PORTA = 0x00

 }

 /*以上代码51忽略*/

void LED1 (unsigned char x,unsigned char LEDx)

{

  unsigned char Count = 0

  Count = LEDx * 36    //最小0,最大 7 * 36 = 252,char型最大不能超耐察洞过255;

  Count = Count + 1    // 加1的目的是针对LED0不亮

   if(x <= Count)  // <= 昌枯是针对LED0不亮

     PORTA |= (1 << LEDx)  //51怎么改?。 P0 |= (1 << LEDx) PWM正占空

    else

     if(x > Count)

       PORTA &= ~(1 << LEDx) //51怎么改?。 P0 &= ~(1 << LEDx) PWM负占空 

}

void main( void )

{

  unsigned char delay = 0

  unsigned char LEDx = 0

  Init_IO()

  while (1)

   {

      delay ++

      if(delay == 250)

       {

         delay = 0

         LEDx ++

         if(LEDx > 7)

 没空          LEDx = 0

       }

      LED1(delay,LEDx)

   }

}

这个要用到软件的pwm,因为51的没有硬件的pwm所以只好自己写软件的了。首先,要做一个软件三角波发生器子程序,频率自己定辩罩,就是变亮变暗的周期。此函数的携卖闹返回值作为pwm的输入值。再做一个pwm的模拟程序,占空比(0-100)是三角波发生器的输出,pwm模拟程序控制某个端口输出1和0的占空比来控制灯 的明暗。pwm的思路是:检查设置值是否不等于0,是则端口置1,程序开始加1计数,计数后检查计数值是否等于设置值,如果等于则跳转,不等则继续加一,如果到100或者计数值等于设置值则使端口置0,一个pwm周期结束,如此重复就可以了。pwm周期自己看实际情况定义。如果要控制电灯泡的话,频率不用太高,50hz可配橡以了。关键是要做隔离,用光电隔离加双向可控硅来控制。

呵呵,声明两点:1 源程序网上应该有的,或者自己买本书就什么也有了。2 不鼓励直接给别人源程序,给你思路再动手就应该很好弄了,总看别人的,不自己思考永远都是别人的。

http://www.programsalon.com/downloads88/sourcecode/embed/detail337156.html


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12410791.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存