51单片机调占空比方波

51单片机输出方波,占空比可调(占空比在0.5左右),频率可调(频率在10KHZ左右),完整的C语言程序,急求,求大神快点吧。
不用带显示,要求占空比根据AD采样结果随时可调,这个做不到的话先用按键调应急一下也行啊。

给你提供给一个思路:利用51定时器产生us级别的中断,然后设置两个变量,一个是pwm周期,也就是你说的1/10kHz,另一个是占空比变量,让占空比变量的值是周期寄存器值的一半就可以了这样就是50%占空比的方波,等到你要改占空比或者频率的时候只要改这两个变量就行追问

能给一下C程序吗?还有那个占空比根据AD采样结果随时可调怎么办呢?

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-05
频率在10KHZ 1/10KHZ/2=50us

#include<reg52.h>
sbit P1_0=P1^0;

void int_X_T()
{
IE=0x82;
TMOD=0x01;
TH0=(65536-50)/256;
TL0=(65536-50)%256;
TR0=1;
}

void int_x() interrupt 1
{
TH0=(65536-50)/256;
TL0=(65536-50)%256;
P1_0=!P1_0;
}

void main()
{
int_X_T();
while(1);
}追问

能不能把调节部分也写上?调占空比。还有要求占空比根据AD采样结果随时可调怎么办呢?

追答

嫌烦就找了个按键调占空比的给你了

这是键盘中断程序
void keyscan() interrupt 0 //外部中断0
{ float TF0,TZ1;
EX0=0; //关中断
delay(10); //延时消抖
if(P1 !=0x0f) //判断是否有键按下
{ if(KEY1==0) freq+=100; //按键为1号,频率加100
if(KEY2==0) freq+=10; //按键为2号,频率加10
if(freq>500) freq=50; //频率大于500Hz,重新赋值为50Hz
if( KEY3==0) zkb+=10; //按键为3号,占空比加10
if( KEY4==0) zkb++ ; //按键为4号,占空比加1
if(zkb>99) zkb=1; //占空比大于99,重新赋值为1

TF0=(65536-fosc/(12.0*freq)); //频率定时初值
TZ1=(65536-(fosc*zkb)/(12.0*100*freq)); //占空比定时初值

TIMER0_H=(uint)TF0/256; //计算定时器0和定时器1的初值
TIMER0_L=(uint)TF0%256;
TIMER1_H=(uint)TZ1/256;
TIMER1_L=(uint)TZ1%256;
}
P1=0x0f; //给键盘扫描口赋初值
EX0=1; //开中断
}

追问

能不能解释一下第一次那个程序的原理啊?什么意思

追答

原理就是按晶振频率来。他就像脉搏一样。。这么讲要追溯好多东西了。你就知道8位单片机是65535溢出,高八位和第八位赋值,
TH0=(65536-50)/256;
TL0=(65536-50)%256;
我们选择的是工作方式一,TMOD寄存器在工作方式一的时候为65535.当然其他工作方式又不一样。知道这个就好设置频率了。PWM就基于这个上下翻转就可以了。

追问

最后一个问题:你写的第一个程序改哪里是改频率,改哪里是改占空比?我怎么改仿真的结果都是一样,都是一个占空比0.5的方波。另外,多问一个程序:http://zhidao.baidu.com/question/588908658.html?quesup2&oldq=1

追答

恩 我写的第一个是不可调的。要调的话 要设变量。你发的那个就不错啊。可以调节

本回答被提问者和网友采纳