51单片机T的两个计时器怎么同时使用?下面是我的代码,为什么实现不了?

同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,
1k(hz)的方波。

我的代码是:
#include<reg52.h>
#define uint unsigned int
uint rate[] = {1000,100,20,10,5,2,1}; //对应的毫秒
int i = 0,x,t1=0,t2=0;
sbit FM = P2^3;
void inset(){
TMOD = 0x11;
EA = 0;
ET0 = 1;
ET1 = 1;
TR0 = 1;
TR1 = 1;
PT0 = 1;
TH0 = (65536 - 1000)/256;
TL0 = (65536 - 1000)%256;
TH1 = (65536 - 50000)/256;
TL1 = (65536 - 50000)%256;
x = rate[0];
}

void main(){
inset();
while(1);
}
void time1() interrupt 1{
if(x == t1){
t1=0;
FM = 0;
}
FM = 1;
TH0 = (65536 - 1000)/256;
TL0 = (65536 - 1000)%256;
t1++;
}

void time() interrupt 3{
TH1 = (65536 - 50000)/256;
TL1 = (65536 - 50000)%256;
if(t2 == 6 ){
t2 = 0;
if(i>6) i = 0;
x = rate[i++];
}
t2++;
}

是的,EA是用来开总中断的,如果EA=0则所有可用中断都无用。EA相当于使能信号。必须EA=1时中断才被打开。具体开那个还得看具体中断的使能信号,如定时的TR0,TR1信号。追问

我改过来啦,但是蜂鸣器还是不发声???

追答

市场上的蜂鸣器分为两种,第一种是通电就发声,第二种是通入脉冲才发声的。所以看看你的蜂鸣器是那一种。可以先测试下,给蜂鸣器通5V电源,要串接个电阻限流,如果不发声则说明是第二种哦。
你的程序应该对应蜂鸣器的第二种形式的,即要通入脉冲才叫的。
希望对你有所帮助!

追问

不是啊,就是单片机上面的,我开始也弄啦一下,我给他个低电平,蜂鸣器就响啦。谢谢你哦,能在帮我看下嘛、?我菜鸟,不是很懂

追答

#include

sbit buzz = P3^5;

void T0_irq(void) interrupt 1 using 1
{
TH0 = -(300/256);
TL0 =- (300%256);

buzz = ~buzz;
}

main()
{
TMOD = 0x01;
TH0 = -(1000/256);
TL0 =- (1000%256);
EA = 1;
ET0 = 1;
TR0 = 1;

for(;;){

}
}

这是个最简单的程序,可以用的,你可以在这个上面修改。。。

追问

恩,这个我也会,但是上面的程序为什么不行了?

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-06
因为你EA=0,中断未启用 = =||追问

我改过来啦,但是蜂鸣器还是不发声???

追答

你写法不对 = =||

你把FM=1那个删了,然后把FM=0改成FM=~FM就可以了。

按照你这种写法,每次FM刚置0第二个指令周期就置1了,总体情况就是FM一直置1,没有发生有效的震动+延时,于是就不发声了。

第2个回答  2019-08-19
使用定时器首先要设置定时器的工作方式,在tmod这个特殊寄存器设置,再设置初值,定多长时间,最后开定时器中断