51单片机实现LED的PWM效果

xiaoxiao2021-02-27  315

例如你要最亮的灯先点亮,隔几十微妙后点亮第二个灯,再相隔同样时间点亮第三个灯……依次类推间隔一定时间点亮八个灯。但间隔时间不要太大,超过十几毫秒就不行了。然后再间隔相同的时间一次性把灯全关了,再间隔几十微秒回到上面的状态依次点亮灯。……一直这样循环。这样的话因为人的视力有一定的滞回效果,只要间隔时间不大,你就能看到八个灯不是闪的,而是同时亮,但亮度又不一样。这是单片机设计中,PWM控制的思路。

LED PWM调光C程序

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

sbit LED1 = P2^0; sbit LED = P2^1;        //定义LED灯,通过LED显示调光效果 sbit LED2 = P2^2;

unsigned char CYCLE;       //定义周期该数字X基准定时时间如果是10 则周期是10x 0.1ms unsigned char PWM_ON ;      //定义高电平时间       /* 延时函数*/ void delay(unsigned int cnt) { while(--cnt); } 

/******************************************************************/ /* 主函数 */ /******************************************************************/ void main() { bit Flag; TMOD |=0x01;      //定时器设置 0.1ms in 12M crystal TH0=(65536-100)/256; TL0=(65536-100)%6;              //定时0.1mS IE= 0x82;                  //打开中断 TR0=1; CYCLE = 50;             // 时间可以调整这个是10调整8PWM就是256 while(!Flag) { delay(20000);           //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果 PWM_ON++;                 //这个使用较长延时,以便能看清楚变化过程 if(PWM_ON == CYCLE) {                              //这个里可以添加其他程序如到最亮时候控制设备 Flag=1; } } while(Flag)              //亮度递减同上,是个相反的过程 { delay(20000);                //延迟时间为20000*0.4=8000us PWM_ON--; if(PWM_ON == 0) { Flag=0; } } } /******************************************************************/ /* 定时器中断函数 */ /******************************************************************/ void tim(void) interrupt 1 using 1 { static unsigned char count; TH0=(65536-100)/256; TL0=(65536-100)%6;                  //定时0.1mS if (count==PWM_ON) { LED1 = 1; LED = 1;                //灯灭 LED2 = 1; } count++; if(count == CYCLE) { count=0; if(PWM_ON!=0)                //如果开启时间是0 保持原来状态 { LED1 = 0; LED = 0;                   //灯亮 LED2 = 0; } } }

转载请注明原文地址: https://www.6miu.com/read-3762.html

最新回复(0)