STC8H1K08 单片机PWM驱动蜂鸣器代码
时间: 2025-01-13 21:51:46 浏览: 68
STC8H1K08 单片机 PWM 驱动蜂鸣器示例代码
对于STC8H1K08单片机而言,利用其内部集成的CCP/PCA模块能够实现PWM波形输出来驱动蜂鸣器发声。具体来说,在配置好相应寄存器之后,可以通过调整占空比改变声音频率从而控制音调高低。
下面给出一段基于Keil C编译环境编写用于该款单片机产生不同频率方波以驱动有源蜂鸣器发出连续变化音高的程序实例:
#include <reg52.h>
sbit BEEP = P1^7; // 定义蜂鸣器连接端口为P1.7
void Timer0_Init(void);
void PCA_Init(void);
unsigned char duty_cycle = 0;
int main(void){
EA = 1;
Timer0_Init();
PCA_Init();
while(1){
TH0 = (65536 - 20000) / 256; // 设置定时初值, 改变此数值可调节频率
TL0 = (65536 - 20000) % 256;
TR0 = 1; // 启动T0
for(duty_cycle=0;duty_cycle<=99;duty_cycle++){
CCAPM1 = ((duty_cycle * 200) >> 8); // 计算高电平持续时间
CCAPL1 = ((duty_cycle * 200) & 0xFF);
CCAPM2 = (((100-duty_cycle)*200)>>8); // 计算低电平持续时间
CCAPL2 = (((100-duty_cycle)*200)&0xFF);
CKCON |= 0x04; // T0溢出时更新PCA通道比较值
TF0 = 0; // 清除TF0标志位
while(!TF0){} // 等待一次周期结束
}
}
}
// 初始化定时器0
void Timer0_Init(){
TMOD &= 0xF0;
TMOD |= 0x01;
ET0 = 1;
}
// 初始化PCA模块
void PCA_Init(){
CMOD |= 0x04; // 使用T0作为PCA时钟源
CR = 1; // 开启PCA计数器
EPCAL = 1; // 允许PCA中断请求
}
上述代码实现了通过修改TH0
和TL0
中的重载值来设定PWM波形的基础频率;并通过不断循环更改两个互补工作的PCA通道(CCAPM1
, CCAPL1
)与(CCAPM2
, CCAPL2
)之间的匹配值达到动态调整占空比的效果[^1]。
相关推荐


















