STC单片机输出PWM信号,频率要25KHz,请大神指教,怎么实现,或者直接给我一个程序,谢谢!

用的是11.0592 晶振,定时10us,调不出25KHz,请指教.....
#include <reg51.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit PWM = P3^4;
sbit key = P3^5;
sbit r_led = P3^2;
sbit g_led = P3^1;
sbit b_led = P3^3;
//u8 Motor_on[]={0,5,10,15};
u8 timer;
/*
void delay(u16 num)
{
u16 x,y;
for(x=num; x>0; x--)
for(y=110; y>0; y--)
{
;
}
}
*/
void IO_Init(void)
{
PWM = 0;
r_led = 1;
g_led = 1;
b_led = 1;
}

void InitTimer0(void) //10us定时
{
TMOD = 0x01;
TH0 = 0x0FF;
TL0 = 0x0F7;
//TH0 = (65536-50000)/256;
//TL0 = (65536-50000)&256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main (void)
{
IO_Init();
InitTimer0();
while(1);
}
void timer_t0(void) interrupt 1//定时器0中断服务函数,入口
{
TR0 = 0;
TH0 = 0x0FF;
TL0 = 0x0F7;
//TH0 = (65536-50000)/256;
//TL0 = (65536-50000)&256;
TR0 = 1;

timer++;
if(timer == 100)
timer = 0;
if(timer <= 30)
PWM = 1;
else PWM = 0;
}

void PWM_init (void){//PWM初始化函数
CMOD=0x02; //设置PCA定时器,计数频率为晶振频率/2 当为12Mhz时,PWM输出频率约23.4Khz
//CMOD=0x00; //设置PCA定时器,计数频率为晶振频率/12 当为12Mhz时,PWM输出频率约3.9Khz
//CMOD=0x04; //设置PCA定时器,计数频率为定时器0的溢出率,如果让定时器0设为16位计数模式,其溢出频率可以在很大范围内调节,从而以产生很高或很低的PWM频率
CL=0x00;
CH=0x00;
CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(0100 0010)
CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
CCAP1H=0x00; // PWM1初始时为0
CR=1; //启动PCA定时器
}
实际上要产生低频率的PWM波,不用其硬件PWM功能完全可以
用定时器中断方式即可实现
让定时器 200us中断一次(中断不算频繁呀) ,设一变量a,每次中断a加1,100次就是20ms,,另设一变量b,数值在1-100之间,每次中断比较a和 b的大小,如果a<b,则引脚 输出高电平,否则为低电平,这样通过改变b的值,就可实现频率为50HZ,占空比1-100%可调的PWM方波
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-05-27
STC单片机型号不同的话输出PWM实现方式也会有所不同的,问题下面的是使用定时器中断实现的PWM输出,此外有些型号PWM输出可以使用单片机自带的硬件模块,通过写入寄存器数值即可实现PWM输出,可以到STC官网上下载说明文件,里面介绍很详细。