51单片机同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间

51单片机同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔2s依次输出1,10,50,100,200,400,800,1kHZ。代码如下:
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar b,a,c;
sbit beep=P2^3;
uint temp[]={20000,2000,400,200,50,25,20};
void main()
{
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50)/256;
TL1=(65536-50)%256;
EA=1;
ET0=1;
TR0=1;
ET1=1;
TR1=1;
while(1)
{
if(b==temp[c])
beep=~beep;
if(a==40)
c++;

}
}

void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;

}
void timer1() interrupt 3
{
TH1=(65536-50)/256;
TL1=(65536-50)%256;
b++;

}
实际操作时候蜂鸣器有响,但是频率不改变。求高手大大们帮我看看哪里出错了。

至少已经发现两个问题:
1,通过程序可以看出,Timer0的中断周期比Timer1的中断周期长,那么定时器0控制频率,定时器1控制这个频率持续的时间的说法可能有误;
2,uchar b,a,c;中的“b”最大值不会超过255,那么b=temp[c]能行吗?当c = 0时,temp[c] = 20000,uchar b是不能=uint temp的,除非你的51编译器比较特殊。将程序改为:

uint b;
main()
{
...............
...............
while(1)
{
if(b==temp[c])
{
beep=~beep;
b=0;//如果不加这一句,一次循环之后,猴年马月才能等到b==temp[c]
}
if(a==40)
c++;
if(c==6);//如果不加这这两行,程序将出现不可预料的错误。
c = 0;
}

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-01
输出1,10,50,100,200,400,800,1kHZ
----

低于 20Hz,人,就听不见了。

帮你改了改,可听见许多不同的声音了。
但是,输出的,不是你要求的频率。

所谓的专业回答,并不能解决你的问题,是瞎忽悠而已。
电脑网络分类达人 董辉,明显是被忽悠瘸了。
第2个回答  推荐于2017-07-26
分2步:
先用定时器让它按照频率响起来
再加入间隔的时间本回答被网友采纳
第3个回答  2013-01-18
if(b==temp[c])
beep=~beep;

你这句没有加限制
这样修改:

if(b==temp[c])
{
beep=~beep;
b = 0;
}