51单片机12MHz晶振输出方波

51单片机接12MHz晶振,定时器0工作方式1,如何设置定时器初值可使频率达到20Hz~20KHz。我是用键盘电路输入频率和占空比,但频率最大只能达到3KHz左右。
求指导,最好能有关于定时器、中断函数的算法参考一下,急求!!!!

1K T=500us+500us
10K T=50us+50us
20K T=25us+25us

1K以上时,最好不要用定时器0工作方式1,里面涉及到软件延时。

给你提供一个简单的20KHz的方波程序。51单片机接12MHz晶振,定时器0工作方式2。
将程序下载到单片机里,测试一下,试试看。根据实测结果要作调整。
未加按键,略作参考吧。(太晚了,不想写了。)

#include <AT89X55.H>
sbit P10=P1^0;
void Delay25us();

void main()
{
TMOD=0x02;
TH0=(256-25)/256;
TL0=(256-25)%256;
while(1)
{
P10=~P10;
Delay25us();
}
}

void Delay25us()
{
TR0=1;
while(!TF0);
TR0=0;
TF0=0;
}追问

谢谢你的帮助,我正在按照你的方法进行调试。还有个问题想请教一下,就是我的这个电路要求方波的占空比是可调的,如果要设定不同的占空比应该如何调整程序?比如说,你的程序占空比是50%嘛,在20KHz时周期为50us,你设定25us进一次中断,如果要40%或30%的占空比应该如何调整程序比较合理?麻烦你给讲解一下,我明天就要答辩了,真的很急

追答

最佳的方法是采用按键中断的方法。
利用按键的加减设定一个计数值。
如:50,代表占空比为50%,此时,高电平为50%,低电平也为50%;
60,代表占空比为60%,此时,高电平为60%,低电平也为40%;
延时为:高电平,60%*50us,低电平,(1-60%)*50us。
这是算法,需要在程序中实现。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-28
可先算出周期,20Hz的周期为50ms,20KHz的周期是50μs。51单片机在12MHz晶振下,定时最大时间为65.536ms。所以要得到20KHz频率是可以实现的。如要得到20KHz频率,占空比为1:1的方波,只需让定时器定时25μs,12MHz晶振下定时时标为Tcy=12/fosc=1μs;计数个数为X=25μs/1μs=25.定时初值为C=2^16-25=65511.换成十六进制为FFE7H。
即TH0=0FF,TL0=0E7。