51单片机方波调频率、占空比

谁能把这个程序产生方波的频率改为10K hz?

#include<reg51.h> // 用定时器0 控制 PWM
sbit P1_0 = P1^0; // P1.0 PWM 输出
sbit key10 = P3^2; // 调节 PWM0 占空比 按键
sbit key11 = P3^3;
unsigned char PWM0 = 2; // 占空比调整
unsigned char counter = 0; // 计数的
bit tt1; // 标志位
void main() // 主函数
{
TMOD=0x10;
TH1=(65536-50)/256; // 定时时间 可以修改
TL1=(65536-50)%256; // 12 MHz
EA=1; // 中断启动
ET1=1;
TR1=1;
while(1)
{ // 调节 PWM0 占空比
if(key10==0 && tt1==0) {tt1 = 1; PWM0++;} // K1、K2
if(key11==0 && tt1==0) {tt1 = 1; PWM0--;}
if(key10==1 && key11==1) tt1=0;
}
}
void Timer0(void) interrupt 3 // 定时器0 PWM 控制
{
TH1=(65536-50)/256; // 定时时间 可以修改
TL1=(65536-50)%256;
counter++;
if(counter >= 20) counter = 0; // PWM 20级 可以修改
if(counter >= PWM0) P1_0 = 0; else P1_0 = 1;
}

原理是进一次“T0中断”看一看counter走到哪里。。周期是由counter=20*溢出周期控制的。还有。在T0中断里设置T1是不会幸福的。。。占空比是由PWM0的位置决定的。在counter走到PWM0之前高电平,走到之后低电平。
还有,这个程序提供的占空比发生方式很糟糕。。步数少、难控制、容易溢出,比如PWM0>20、稍微不耗资源。可以试着用两个中断分别控制周期和占空比。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-07
改counter即可,计算运行的指令周期
第2个回答  2013-09-05

试试这个很简单的仿真实例,频率 占空比 都可以调节。

追问

这个是做的不错,可是我不太懂原理,我想知道在程序中调哪个地方可以改变初始频率,调哪里能改变初始占空比

追答

if(key12==0 && tt2==0) {tt2 = 1; TH1++;} // K2、K3 频率 +
if(key13==0 && tt2==0) {tt2 = 1; TH1--;} // 频率 -
if(key12==1 && key13==1) tt2=0;

追问

不用调频率,直接从原程序改个地方把频率改成10Khz就行,可以吗?
再稍微解释一下最好了

追答

TH1=(65536-5)/256; // 定时时间 可以修改
TL1=(65536-5)%256; // 根据 PWM 20级 定时器时间 5 uS 试试

追问

这样改之后周期有600多us,还是不行,这个频率要100us。而且那个pwm20级也不明白。
上面这个算了,我想问一下你能不能重新帮我写一个程序,简单点,用定时器来做。用两个按键调占空比,频率不用调,但是初值要修改方便,初值就为10Khz,占空比初值为0.5。可不可以啊?我给你追加分数

追答

5uS*20=100uS ( 晶振 12 MHz ) , 周期 100 uS 就是 频率 10K Hz
只是 定时器 中断时间 太短,来不及处理,所以没有办法 达到 10KHz 频率
在实际电路中 可以用 STC 1T 芯片 可以做到,
或者 晶振 ( > 100 MHz 一般单片机 做不到 )

本回答被提问者采纳
相似回答