STM32实现呼吸灯和流水灯

一. 呼吸灯

呼吸灯:是指灯由亮逐渐变暗,再从亮逐渐变暗的一个过程。就好像人在呼吸一样。
单片机可以通过输出可调占空比的pwm波来实现
占空比:高电平时间与整个周期的比值
(通过调节频率调节灯的呼吸时间,通过调节占空比来调节亮度)

简易的呼吸灯代码;

#include "led.h"
#include "delay.h"
#include "sys.h"

void ledbreath(u16 t,u16 i)
{
   PAout(8)=0;
   PAout(8)=1;//电平先拉低,在拉高
   delay_us(i);//高电平的时间
   PAout(8)=1;
   PAout(8)=0;//电平先拉高,再拉低
   delay_us(t-i);//低电平的时间
  
}  //形成一个基本的pwm波,但占空比在变,

 int main(void)
 { 
     int i=0;
     delay_init();       //延时函数初始化   
     LED_Init();     //初始化与LED连接的硬件接口
     while(1)
     {  
          for(i=1;i<25000;i+=250)//25000,250,这两个参数随便调,只要效果明显就行了,先开始i增加占空比在增大
          {
           ledbreath(25000,i);   
          }  
          for(i=25000;i>1;i-=250)//后占空比开始减小
         {
          ledbreath(25001,i);   
         }
     }
 }

正点原子源码中的pwm波实验源码使用定时器pwm波做的其实是个呼吸灯实验,效果挺好的

流水灯

流水灯:顾名思义就是像灯像水一样流过
32上只有两个led灯,这里就用51单片机举个例子吧

知识点:移位操作
‘<<’:每执行一次指令,被操作的二进制数向左移动,低位补0。
'>>’: 用法类似。
代码

#include
#define uchar unsigned char
void delay_ms(int);
uchar k;
    void main()
    {
        k=0xfe;
        while(1)
        {
                 P1=k; //赋初值11111110
                 delay_ms(500);
                 k=k<<1;//左移1位后再付给k
                 //若要循环左移可改位k=_crol_(k,1)
                 //若要循环右移可改位k=_cror_(k,1)
        }
    }
    void delay_ms(int x)
    {
           int i,j
           for(i=x;i>0,i--)
           for(j=110;j>0;j--);
    }





 这只是单纯左移,但要做大循环左移,这需要通过逻辑计算配合左移,但在51单片机中C51库中的函数:_crol_实现

你可能感兴趣的:(单片机)