写一个单片机程序,调用上面的方法实现呼吸灯效果
时间: 2024-03-14 12:44:44 浏览: 172
呼吸灯单片机程序.pdf
以下是一个基于定时器1的呼吸灯程序,使用了上面的函数 TIM1_PwmInit() 来初始化定时器1:
```
#include "hal_defs.h"
#include "hal_cc8051.h"
#include "hal_mcu.h"
void TIM1_PwmInit(uint16 period, uint8 ratio);
void main(void)
{
uint16 period = 1000; // 周期为 1000ms
uint8 step = 5; // PWM 占空比步长为 5%
uint8 ratio = 0; // 初始占空比为 0%
uint8 dir = 1; // 占空比增加或减少的方向
TIM1_PwmInit(period, ratio);
while(1)
{
if(ratio == 0 || ratio == 100) // 占空比达到上下限时,改变方向
{
dir = !dir;
}
if(dir) // 增加占空比
{
ratio += step;
}
else // 减少占空比
{
ratio -= step;
}
TIM1_PwmInit(period, ratio); // 更新 PWM 信号的占空比
HAL_DELAY_US(1000); // 延时 1ms
}
}
void TIM1_PwmInit(uint16 period, uint8 ratio)
{
uint16 TimPeriod = 0;
uint16 TimComp = 0;
CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHz 晶振
while(CLKCONSTA & 0x40);
CLKCONCMD &= ~0x07; // 设置系统主时钟频率为 32MHz
CLKCONCMD |= 0x38; // 定时器标记输出为 250KHz
P1SEL |= 0x01; // 定时器1通道2映射至 P1_0,功能选择
PERCFG |= 0x40; // 备用位置2,说明信息
P2SEL &= ~0x10; // 相对于 Timer4,定时器1 优先
P2DIR |= 0xC0; // 定时器通道2-3 具有第一优先级
P1DIR |= 0x01; // 定时器模式设置
T1CTL = 0x02; // 250KHz 不分频,PWM 模式
TimPeriod = period * 250; // 周期 TimPeriod 毫秒,单位:ms
T1CC0H = (uint8)(TimPeriod >> 8);
T1CC0L = (uint8)TimPeriod;
TimComp = ratio * TimPeriod / 100; // 由占空比生成比较值
T1CC2H = (uint8)(TimComp >> 8);
T1CC2L = (uint8)TimComp;
T1CCTL2 = 0x24; // 在向上比较清除输出。在 0 设置,到达比较值时清除输出
}
```
该程序实现了一个简单的呼吸灯效果:每隔 1ms,PWM 信号的占空比按照一定的步长增加或减少,当占空比达到 0% 或 100% 时,改变方向。具体步长和周期可以根据实际需要进行调整。
阅读全文