读到一段,同时用两个定时器控制蜂鸣器发声的单片机代码,有个细节没看懂,想请大佬解释一下,谢谢!if(tt==10) //如果tt==10,也就是定时器0溢出10次。也就是定时器0计数10次。那为什么这里要判断tt==10呢?。后面不用再判断呢?
代码原文如下:
/*******************************************************************/
/*
同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个
频率持续的时间,间隔2s依次输出
1,10,50,100,200,400,800,
1k(hz)的方波?
设晶振频率为12MHz。
*/
/*********************************************************/
#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分别用来选取不同的频率
//注意,以下if的条件,每次都是间隔40个flag,flag值由定时器1决定,也就是定时器1溢出的次数。
if(flag<40) //flag 小于40
if(tt==10) //如果tt==10,也就是定时器0溢出10次。也就是定时器0计数10次。那为什么这里要判断tt==10呢?。后面不用再判断呢?
{
tt=0;
fre=50000;
beep=~beep;
}
if(flag>=40&&flag<80) //flag 大于或等于40,同时flag小于80
{
tt=0;
fre=50000;
beep=~beep;
}
if(flag>=80&&flag<120) //flag 大于或等于80,同时flag小于120
{
tt=0;
fre=10000;
beep=~beep;
}
if(flag>=120&&flag<160) //flag 大于或等于120,同时flag小于160
{
tt=0;
fre=5000;
beep=~beep;
}
if(flag>=160&&flag<200) //flag 大于或等于160,同时flag小于200
{
tt=0;
fre=2500;
beep=~beep;
}
if(flag>=200&&flag<240) //flag 大于或等于200,同时flag小于240
{
tt=0;
fre=1250;
beep=~beep;
}
if(flag>=240&&flag<280) //flag 大于或等于240,同时flag小于280
{
tt=0;
fre=625;
beep=~beep;
}
if(flag>=280&&flag<320) //flag 大于或等于280,同时flag小于320
{
tt=0;
fre=312;
beep=~beep;
}
if(flag>=320&&flag<360) //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;
}
}
|