51单片机两个定时器同时使用程序,望大神解答一二!拜谢~~!!

#include<reg52.h> //52单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit beep=P2^3;
uchar tt;
uint fre,flag;

void main() //主函数
{
fre=50000;
beep=0;
TMOD=0x11;//设置定时器0,定时器1为工作方式1
TH0=(65536-fre)/256;
TL0=(65536-fre)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
ET1=1;
TR1=1;
TR0=1;//启动定时器0
while(1);//等待中断产生

}

void timer0() interrupt 1 //定时器0中断
{
TR0=0; //进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失
TH0=(65536-fre)/256;
TL0=(65536-fre)%256;
tt++;
if(flag<40) //以下几个if分别用来选取不同的频率
if(tt==10)
{
tt=0;
fre=50000;
beep=~beep;
}
if(flag>=40&&flag<80)
{
tt=0;
fre=50000;
beep=~beep;
}
if(flag>=80&&flag<120)
{
tt=0;
fre=10000;
beep=~beep;
}
if(flag>=120&&flag<160)
{
tt=0;
fre=5000;
beep=~beep;
}
if(flag>=160&&flag<200)
{
tt=0;
fre=2500;
beep=~beep;
}
if(flag>=200&&flag<240)
{
tt=0;
fre=1250;
beep=~beep;
}
if(flag>=240&&flag<280)
{
tt=0;
fre=625;
beep=~beep;
}
if(flag>=280&&flag<320)
{
tt=0;
fre=312;
beep=~beep;
}
if(flag>=320&&flag<360)
{
tt=0;
fre=156;
beep=~beep;
}
TR0=1;
}
void timer1() interrupt 3 //定时器1中断用来产生2秒时间定时
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
flag++;
if(flag==360)
{
flag=0;
fre=50000;
}
}这个程序的运行顺序是什么先响应谁啊?定时器0吗?还是同时响应然后按照优先级执行呢?另外还想问下如果将65536存入TH0和TL0是不是是16个0啊?

第1个回答  2014-08-14
优先级高的能打断优先级低的,就是低优先级的正在执行的时候,优先级高的来了低的就会被打断。执行完高的 再来执行低的,存入65536,中断会出问题的。追问

这个程序是不是定时器0提前于定时器1两个指令周期被响应?(因为主函数中先给定时器0赋值,但是如果要是先给定时器1赋值是不是先响应定时器1呢?个人猜想…不知道对不对)假设我的程序先给定时器1赋值,那么两个指令周期后定时器0被响应,定时器0中执行TR1=0,定时器1被关闭,那么定时器1中两个指令周期加的24个1还会被保留吗?还是在定时器0执行结束后定时器1重头开始执行呢?

追答

哪个先响应和哪个先被赋值没关系,这个是看哪个所设的时间先到,哪个就进去中断服务子程序。如果同是到,就会先进优先级高的。所以些两点中断的话一定要注意中断不要嵌套,一嵌套,时间就不对了。

如果你在中断中关了另一个中断,自然就没了。至于定时器0执行完后,定时器1是从被打断的地方开始执行。并不会重新开始。

本回答被网友采纳
第2个回答  推荐于2017-06-19
定时时间是一样的,但是由于先启动的是T1定时器(TR1=1),所以T1先溢出,首先相应的是T1定时器中断。本回答被网友采纳
第3个回答  2014-08-14
我啊啊啊额外啊追问

有病!!!!!