今天我们看下点亮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,会更加方便,更加好用。这节就先到这了。一起学习,一起进步。