当前位置: 代码迷 >> 单片机 >> 以下代码
  详细解决方案

以下代码

热度:140   发布时间:2016-04-28 16:24:51.0
请高手看看以下代码
#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;
  }
}

------解决方案--------------------
优先级是当一个中断触发时,另一个高优先级的中断可以打断它(或者说是中断嵌套), 51单片机的默认(此时的IP寄存器不做设置)中断优先级为: 
外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断;


 楼主这里的程序 TR1=1;
TR0=1;//启动定时器0 先启动了TR1,而t0和t1的计数初值都一样,那显然是t1先开始计时,所以t1先溢出产生中断了,但是t0中断应该会嵌入t1中断中,除非你在t1中断的开头和结尾分别加上EA=0,EA=1
  相关解决方案