今天我们看下点亮LED有什么应用值得我们去学习的,为什么我们第一次写单片机都是从点亮LED开始,其实呢,点亮LED也就是把IO口拉高,以后的很多项目程序,都和IO拉高拉低有着很大的关系。咱们慢慢学,先不急着后面的。现在我们要做的是呼吸灯,该如何去实现呢。那就是用PWM的方式去实现它,通过控制占空比来控制亮度。什么叫占空比,什么叫PWM?
简单的说下,PWM就是在一个周期里,有高电平信号,也有低电平信号。很通俗易懂吧,没和你们说什么脉冲调制,脉宽的,肯定对新手来说不易懂。而占空比就是高电平占了高低电平的总和比例。PWM也就叫脉冲。详细的可以百度看看,有一大把的资料。下图就是PWM的图,不懂的再详细问我吧。
下面我就用程序来模拟一下PWM 占空比由弱到强,再由强到弱。因为时间紧张,随便写了个,非定时器产生的PWM ,由最简单的程序模拟的呼吸灯。后面讲到了定时器,再写用定时器的程序。
/**************************************/ /* CNPF科技 */ /* 蓝牙4.0开发CC2540 */ /*例程名称:点亮LED */ /*建立时间:2018/04/18 */ /*描述:非定时器方式 模拟PWM(呼吸灯)*/ /***************************************/ #include<ioCC2540.h> #define uint unsigned int #define uchar unsigned char #define LED1 P1_0 //定义LED1为P10口控制 void Delayms(uint xms); //延时函数 void InitLed(void); //初始化P1口 /**************************** //延时函数 *****************************/ void Delayms(uint xms) //i=xms 即延时i毫秒 { uint i,j; for(i=xms;i>0;i--) for(j=587;j>0;j--); } /**************************** //初始化程序 *****************************/ void InitLed(void) { P1DIR |= 0x01; //P1_0定义为输出 LED1 = 0; //LED1灯初始化熄灭 } void main(void) { uint j=0; //计数从0-18时K要+ 计数从18-37时k要- uint k=1; //k就是我们的占空比 InitLed(); //调用初始化函数 while(1) { for(int q=0;q<k;q++) //k=1时 4.5us 用示波器看的结果 { LED1 = 1; //拉高 这里K越大,占空比越大,占空比越大,灯越亮 } for(int q=0;q<20-k;q++)//为什么我要用20-k,就是因为要保证在一个周期,要不然周期不同,那就不是PWM了 { LED1 = 0; //同理 } Delayms(100); //100ms让占空比改变一次 if(j>0 && j<=18) //这里就是让占空比变换的判断程序,学会C的同志们,应该都明白这是什么意思吧。我就不教C啦 { k++; if(k>=19) { k=19; } } else if(j>18 && j<=37) { k--; if(k<=1) { k=1; } }else { j=0; } j++; } }
总结下我的博客,总体来说,这只是个模拟的PWM 信号,可以达到PWM 的效果,可以看的到灯是由亮到暗,再从暗到亮。实验通过验证是成功的。这种模拟PWM方法一般不用,只是为了拓展一下点亮LED灯的应用,以后用的更多的是定时器的PWM,会更加方便,更加好用。这节就先到这了。一起学习,一起进步。