[蓝牙开发] CC2540新手学习之呼吸灯

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

/***************************************** ****************************************** *********** 程序名:    蓝牙灯 编写人:    莫沫  编写时间:  2017年1月31日 硬件支持:  STC12C2052AD 12MHz 接口说明:  pwm P3.7 修改日志:     NO.1- 2017年1月31日 14:56:26 完成最基本的蓝牙调光以及开关控制功能 ****************************************** ****************************************** **********/ #include sbit LED = P1^0; /***************************************** ****************************************** ********** 函数名:PWM初始化函数 调 用:PWM_init(); 参 数:无 返回值:无 结 果:将PCA初始化为PWM模式,初始占空比为0 备 注:需要更多路PWM输出直接插入CCAPnH和 CCAPnL即可 /***************************************** ****************************************** ***********/ /*void PWM_init (void){ CMOD=0x02; //设置PCA定时器 CL=0x00; CH=0x00; CCAPM0=0x42; //PWM0设置PCA工作方式 为PWM方式(0100 0010) CCAP0L=0x00; //设置PWM0初始值与 CCAP0H相同 CCAP0H=0x00; // PWM0初始时为0 CR=1; //启动PCA定时器 } /***************************************** ****************************************** ***********/ /***************************************** ****************************************** ********** 函数名:UART串口初始化函数 调 用:UART_init(); 参 数:无 返回值:无 结 果:启动UART串口接收中断,允许串口接收 ,启动T/C1产生波特率(占用) 备 注:振荡晶体为11.0592MHz,PC串口端设置 [ 19200,8,无,1,无 ] /***************************************** ****************************************** ***********/ void UART_init (void){ EA = 1; //允许总中断(如不使用中断 ,可用//屏蔽) ES = 1; //允许UART串口的中断 TMOD = 0x20; //定时器T/C1工作方 式2 SCON = 0x50; //串口工作方式1,允 许串口接收(SCON = 0x40 时禁止串口接收) TH1 = 0xFD; //定时器初值高8位设 置 TL1 = 0xFD; //定时器初值低8位设 置 // PCON = 0x80; //波特率倍频(屏蔽 本句波特率为9600) TR1 = 1; //定时器启动 } /***************************************** ****************************************** ***********/ /***************************************** ****************************************** ********** 函数名:UART串口接收中断处理函数 调 用:[SBUF收到数据后中断处理] 参 数:无 返回值:无 结 果:UART串口接收到数据时产生中断,用户 对数据进行处理(并发送回去) 备 注:过长的处理程序会影响后面数据的接收 /***************************************** ****************************************** ***********/ void UART_R (void) interrupt 4 using 1{ //切换寄存器组到1 unsigned char UART_data; //定义串口 接收数据变量 RI = 0; //令接收中 断标志位为0(软件清零) UART_data = SBUF; //将接收到 的数据送入变量 UART_data if(UART_data == '0') LED=0; if(UART_data == '1') LED=1; } /***************************************** ****************************************** ***********/ /***************************************** ****************************************** ********** 函数名:PWM0占空比设置函数 调 用:PWM0_set(); 参 数:0x00~0xFF(亦可用0~255) 返回值:无 结 果:设置PWM模式占空比,为0时全部高电平 ,为1时全部低电平 备 注:如果需要PWM1的设置函数,只要把 CCAP0L和CCAP0H中的0改为1即可 /***************************************** ****************************************** *********** void PWM0_set (unsigned char a){ CCAP0L= a; //设置值直接写入CCAP0L CCAP0H= a; //设置值直接写入CCAP0H …………限于本文篇幅 余下代码请从51黑下载附件…………
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值