S9S12G128运用内部晶振,利用定时器,实现呼吸灯,例程
时间: 2024-03-15 20:46:59 浏览: 62
好的,以下是一个简单的例程,可以帮助您实现S9S12G128利用内部晶振,通过定时器和PWM模块实现呼吸灯的效果。
```c
#include <hidef.h> /* common defines and macros */
#include <mc9s12g128.h> /* derivative information */
#define PWM_FREQ 20000 // PWM输出频率
#define PWM_PERIOD 400 // PWM周期,即计数器最大值
#define PWM_DUTY_CYCLE 200 // PWM占空比,即计数器初值
unsigned int brightness = 0; // 当前亮度值
unsigned char step = 1; // 步进值,控制亮度变化速率和方向
void init_PWM(void)
{
PWMCLK = 0x00; // 选择时钟源为内部总线时钟
PWMPRCLK = 0x00; // 不分频
PWMSCLA = 0x00; // 不分频
PWMSCLB = 0x00; // 不分频
PWMCTL = 0x00; // 选择边沿对齐模式
PWMPER0 = PWM_PERIOD & 0xFF; // 设置计数器最大值的低8位
PWMPER1 = PWM_PERIOD >> 8; // 设置计数器最大值的高8位
PWMDTY0 = PWM_DUTY_CYCLE & 0xFF; // 设置计数器初值的低8位
PWMDTY1 = PWM_DUTY_CYCLE >> 8; // 设置计数器初值的高8位
PWME = 0x01; // 使能PWM0输出
}
void init_timer(void)
{
TSCR1 = 0x80; // 使能定时器
TSCR2 = 0x00; // 不分频
TIOS = 0x01; // 选择输出比较模式
TC0 = TCNT + 100; // 设置比较值,即定时100ms
TIE_C0I = 1; // 使能比较中断
}
void interrupt VectorNumber_Vtimch0 timer_isr(void)
{
TC0 += 100; // 设置下一次比较值,即下一次定时100ms
brightness += step; // 更新亮度值
if (brightness >= PWM_PERIOD) { // 达到最大亮度
brightness = PWM_PERIOD;
step = -1; // 反转步进值,向下调整亮度
} else if (brightness <= 0) { // 达到最小亮度
brightness = 0;
step = 1; // 反转步进值,向上调整亮度
}
PWMDTY0 = brightness & 0xFF; // 设置计数器初值的低8位,即PWM输出占空比
PWMDTY1 = brightness >> 8; // 设置计数器初值的高8位
}
void main(void)
{
init_PWM(); // 初始化PWM模块
init_timer(); // 初始化定时器
EnableInterrupts; // 使能全局中断
for (;;) {} // 无限循环
}
```
这个例程中,我们使用了PWM模块和定时器模块,其中PWM模块用于控制LED灯的亮度,定时器模块用于控制亮度的变化速率和方向。在定时器中断函数中,我们实现了对亮度值的控制,根据需要调整步进值和亮度范围,使得LED灯呼吸效果更加平滑和自然。
希望这个例程能够帮到您,如果还有其他问题,请随时提出。
阅读全文
相关推荐


















