当前位置: 代码迷 >> 单片机 >> 定时器中断程序
  详细解决方案

定时器中断程序

热度:103   发布时间:2016-04-28 15:11:29.0
定时器中断程序求助
1、变量tim的作用是什么?
2、两个定时器间的工作机制是怎样的。

/*******************************************************************/
/*                                                          
同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个
频率持续的时间,间隔2s依次输出
1,10,50,  100,200,  400,  800,  1k(hz)的方波? (8)
()时间间隔。
设晶振频率为12MHz。
*/
/*********************************************************/
#include<reg52.h>  //52单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int    //宏定义
#define uchar unsigned char  //宏定义
sbit beep=P2^3;
uchar tt;
uint tim,flag;

void main()     //主函数
{
tim=50000;
beep=0;
TMOD=0x11;//设置定时器0,定时器1为工作方式1
TH0=(65536-tim)/256;
TL0=(65536-tim)%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-tim)/256;
TL0=(65536-tim)%256;
tt++;
if(flag<40)    //以下几个if分别用来选取不同的频率
if(tt==10)
{
tt=0;
tim=50000;
beep=~beep;
}
if(flag>=40&&flag<80)
{
tt=0;
tim=50000;
beep=~beep;
}
if(flag>=80&&flag<120)
{
tt=0;
tim=10000;
beep=~beep;
}
if(flag>=120&&flag<160)
{
tt=0;
tim=5000;
beep=~beep;
}
if(flag>=160&&flag<200)
{
tt=0;
tim=2500;
beep=~beep;
}
if(flag>=200&&flag<240)
{
tt=0;
tim=1250;
beep=~beep;
}
if(flag>=240&&flag<280)
{
tt=0;
tim=625;
beep=~beep;
}
if(flag>=280&&flag<320)
{
tt=0;
tim=312;
beep=~beep;
}
if(flag>=320&&flag<360)
{
tt=0;
tim=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;
    tim=50000;
  }
}

------解决方案--------------------
书上不是写的很详细吗?各个参数的功能,定义,甚至定时器的工作机制都说的很明白。说明你看书不认真
------解决方案--------------------
两个问题倒过来回答比较容易理解:

2 两个定时器是各自独立工作的。但在 Timer1 计时 2 秒时,会为 Timer0 改变计时参数,从而缩短了蜂鸣器通断时间,改变了开关频率。

1 tim 变量用来控制 Timer0 的溢出时间,它不断变小,就使蜂鸣器开关频率不断提高。
------解决方案--------------------
1、tim就是一个变量,决定了定时器的TH0和TL0的大小,就是定时器的时间的大小!!
2、TIME1的时间是固定的,是50ms进一次中断!!然后TIME1每进一次中断,标志位flag加1,标志位flag的次数决定了TIME0的时间变化,因为每次进中断后定时器的初始值是要重新赋值的!!
------解决方案--------------------
给个蜂鸣器的例子供大家参考,有源无源通用http://blog.csdn.net/libiaojs/article/details/9496651
  相关解决方案