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<reg52.h>
#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_实现
  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个简单的STM32实现呼吸流水灯的例子,使用PWM输出控制LED灯的亮度。 首先,需要在STM32的CubeMX中配置一个PWM输出通道和一个定时器,以控制LED灯的亮度。具体的配置可以参考STM32的官方文档和相关教程。 接下来,可以使用以下代码实现呼吸流水灯的效果: ``` #include "main.h" #define LED_COUNT 8 // LED灯数量 #define BREATH_PERIOD 50 // 呼吸周期,即灯亮度变化的时间间隔,单位为毫秒 // LED灯的亮度值 uint16_t led_brightness[LED_COUNT] = {0}; // 呼吸流水灯的主函数 void breath_led(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 关闭所有LED灯 // 循环呼吸流水灯的效果 while(1) { // 呼吸灯效果 for(int i = 0; i < 100; i++) { for(int j = 0; j < LED_COUNT; j++) { // 计算当前LED灯的亮度值 led_brightness[j] = i * 65535 / 100; // 设置PWM输出的占空比,控制LED灯的亮度 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, led_brightness[j]); HAL_Delay(BREATH_PERIOD / 100); } } // 流水灯效果 for(int i = 0; i < LED_COUNT; i++) { // 计算当前LED灯的亮度值 led_brightness[i] = 65535; // 设置PWM输出的占空比,控制LED灯的亮度 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, led_brightness[i]); HAL_Delay(BREATH_PERIOD); // 关闭当前LED灯 led_brightness[i] = 0; HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, led_brightness[i]); } } } int main(void) { HAL_Init(); MX_GPIO_Init(); MX_TIM2_Init(); breath_led(); return 0; } ``` 在这段代码中,我们定义了一个led_brightness数组,用于存储每个LED灯的亮度值。在呼吸流水灯的主函数中,我们使用两个for循环实现了呼吸和流水灯的效果。在呼吸灯效果中,我们循环100次,每次将led_brightness数组中的每个元素乘以当前呼吸周期的百分比,然后设置PWM输出的占空比,控制LED灯的亮度。在流水灯效果中,我们依次点亮每个LED灯,并设置PWM输出的占空比为最大值,然后在一个呼吸周期后关闭当前LED灯。 需要注意的是,在呼吸和流水灯效果中,我们使用了HAL_Delay函数来实现延时,需要根据实际的硬件情况和呼吸周期进行调整。 这是一个简单的STM32实现呼吸流水灯的例子,可以根据实际需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值