希望高手帮忙,说明一下单片机中定时器0和定时器1中断执行过程

#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;
}
}

定时器1 50ms中断一次,每次中断FLAG加1
40次即为2秒,所以在定时器0中断时,要判断是0-40,40-80等时间段
定时器0中断时,要再次装入定时时间常数,但在0-40,40-80等时间段内装入的时间常数是不同的,因此beep取反的频率就不同
但由于定时器0中断10次BEEP才取反一次,所以当fre=50000;50*10= 500ms才取反一次
这么低的频率对无源蜂鸣器是没有响应的
当fre=50000; 0.156*10= 1.56ms取反一次,周期3.12ms 频率300多HZ,对于有源蜂鸣器响应是很困难的
所以用有源蜂鸣器演奏例程中的音乐只能呕呀嘈杂难为听了
温馨提示:内容为网友见解,仅供参考
无其他回答

求单片机高手帮忙详细解释下程序 特别是中断那
这应该是一个闪烁灯的程序,定时器以方式2自动重装的方式工作,定时器到时产生一次中断就将记数字段减一,等到计数字段减到0就改变一次LED灯的状态,这基实就是一个延时的过程。总的来讲就是定时器每100us就产生一次中断,而每次中断就将计数字段减一,因此计数字段应该设为10000,这样就是产生10000次...

51单片机定时器0和定时器1使用冲突
SM0=0;SM1=1;当 REN=1; 执行完后,单片机完全符合串口方式0,同步移位方式,如果你这时板子接在电脑串口上,不管你电脑有没有发串口数据,单片机RXD脚已经在接收了,而且你没写串口中断,RI不清0,那就在串口中断里出不来了,下面的程序都做不到,所以你定时器0不动,关了T1就等于关了串口,...

51单片机的程序问题!求高手帮忙!
void timer0() interrupt 1 { TH0=(65535-50000)\/256;TH0=(65535-50000)%256;--TL0 ……void timer1()interrupt 3 { TH1=(65535-50000)\/256;TH1=(65535-50000)%256; --TL1 !另外,各种定时,都用同一个定时器即可。

单片机定时器\/计数器的工作方式
问题1:定时器\/计数器 TH0 & TL0 的 高 低 两个字节 的 计算方式 是 两个 字节 最大 数据 为 65536(十进制) , 或者 0FFFFH (十六进制)高字节 为 TH0=(65536-X)\/256 ,就是 除以 256 后的 整数部分,低字节 为 TL0=(65536-X)%256 ,减去 高字节后 余下的部分,问...

单片机与pwm问题
首先,如果中断优先级别控制寄存器IP默认的话,那么0和1的优先级是一样的,关键就是谁先来的问题,在100us先进定时器1是肯定的,因为定时器0在前面已经执行了几次中断了,执行需要时间,所以在100us时会略微滞后于定时器1。但是我看不懂你需要实现的是什么功能,你不可能让我一句句读你程序去推敲你...

求教一个51单片机程序。。(LCD电子时钟)
现在手上有一块单片机开发板,还有一个1602显示屏,设计要求如下:以单片机控制的时钟,在LCD显示器上显示当前的时间。设计的基本要求:1.使用文字型LCD显示器显示当前时间。2.显示格式为“时时:分分:妙秒”。3.用4个功能键操作来设置当前时间。功能键K1-K4功能如下:①K1:进入设置现在的时间。②K2:设置小时。③K3...

急!基于单片机的数字示波器设计
char flag=1; \/\/按键标志,当flag=1时表示没有按下,当flag=0时表示有按键按下int keycount=0; \/\/按键计数unsigned char waveth,wavetl; \/\/用于对定时器付值unsigned int frecount=100; \/\/频率计数unsigned int mbjs; \/\/码表计数,共采32个点\/\/毫秒延时程序void delayms(int ms){ uchar i; while(ms-...

怎样使一个定时器定时另一个同时在计数,高手赶快出现帮忙解决啊
我就以51单片机为例讲解.两个定时\/计数器都开,一个设置为定时,一个设置为计数,在特殊功能寄存器TMOD中的C\/T中可以设置,TMOD左边四位控定时\/计数器1,右边四位控定时\/计数器0.C\/T为1,表示counter计数器,C\/T为0表示timer定时器.定时\/计数器1和定时\/计数器0设置的方法一样.

单片机高手进!!我想用51单片机实现可控硅移相调压。
void timer0() interrupt 1 { TH0=(65536-3000)\/256;TL0=(65536-3000)%256;time=0;TR0=1;}

请高手帮忙加个看门狗程序
MAIN ORG 000BH LJMP ERR MAIN:MOV SP,60H MOV PSW,00H MOV SCON,00H MOV TMOD,01H ;设置T0为16位定时器 SETB ET0 ;允许T0中断 SETB PT0 ;设置T0中断为高级中断 MOV TL0,00H ;设定T0的定时初值,定时时间约为16ms(6M晶振)MOV TH0,0B0H SETB EA ;开中断 SETB TR0 ;...

相似回答