STC8A8K64D4直接设置占空比的程序
时间: 2024-03-03 13:49:17 浏览: 218
STC8A8K64D4,多串口通信的 .c和.h文件
以下是STC8A8K64D4直接设置占空比的程序示例:
```c
#include <STC8.H>
#define FOSC 24000000L
void timer0_init(void);
void pwm_init(void);
void main(void)
{
P0M0 = 0x00; // 设置P0.0为推挽输出
P0M1 = 0x01;
timer0_init(); // 初始化定时器0
pwm_init(); // 初始化PWM
while(1);
}
void timer0_init(void)
{
AUXR |= 0x80; // 定时器0为1T模式
TMOD &= 0xF0; // 设置定时器0为模式0(16位自动重载)
TL0 = 0x00; // 设置定时器0计数初值
TH0 = 0x00;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
EA = 1; // 开启总中断
}
void pwm_init(void)
{
PWMCFG = 0x00; // 设置PWM时钟源为FOSC
PWMCR = 0x80; // 设置PWM为8位高电平有效模式
PWM0CPL = 0x00; // 设置PWM0占空比的低8位
PWM0CPH = 0x00; // 设置PWM0占空比的高8位
PWM0P = 0xFF; // 设置PWM0周期为255
PWM0T1 = 0x00; // 设置PWM0有效时间1
PWM0T2 = 0x00; // 设置PWM0有效时间2
PWM0OE = 1; // 允许PWM0输出
}
void timer0_isr(void) interrupt 1
{
static unsigned char count = 0;
static bit flag = 0;
TH0 = (65536 - FOSC/12/1000) / 256; // 1ms定时
TL0 = (65536 - FOSC/12/1000) % 256;
count++;
if(count == 255) // 每255ms更新一次占空比
{
count = 0;
flag = ~flag;
if(flag) // PWM0占空比为50%
{
PWM0CPH = 0x80;
PWM0CPL = 0x00;
}
else // PWM0占空比为10%
{
PWM0CPH = 0x10;
PWM0CPL = 0x00;
}
}
}
```
在上面的代码中,通过定时器0中断来实现每隔一定时间改变PWM的占空比。具体来说,每隔255ms就将占空比从50%切换到10%或从10%切换到50%。需要注意的是,PWM的占空比采用8位高电平有效模式,因此占空比的取值范围为0~255。
阅读全文