关于郭天祥51单片机教程视频课后题《同时用两个定时器控制蜂鸣器发声》

题目为:同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,

1k(hz)的方波。

给出的代码为:

#include  //51单片机头文件
#include //包含有左右循环移位子函数的库
#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) //10个50毫秒是500毫秒,就是2HZ
{
tt=0;
fre=50000;
beep=~beep;
}
if(flag>=40&&flag<80)
{
tt=0;
fre=50000;//50毫秒是20HZ
beep=~beep;
}
if(flag>=80&&flag<120)
{
tt=0;
fre=10000;//10毫秒是100HZ
beep=~beep;
}
if(flag>=120&&flag<160)
{
tt=0;
fre=5000;//5毫秒是200HZ
beep=~beep;
}
if(flag>=160&&flag<200)
{
tt=0;
fre=2500;//2.5毫秒是400HZ
beep=~beep;
}
if(flag>=200&&flag<240)
{
tt=0;
fre=1250;//1.25毫秒是800HZ
beep=~beep;
}
if(flag>=240&&flag<280)
{
tt=0;
fre=625;//0.625毫秒是1600HZ
beep=~beep;
}
if(flag>=280&&flag<320)
{
tt=0;
fre=312;//0.312毫秒约等于3200HZ
beep=~beep;
}
if(flag>=320&&flag<360)
{
tt=0;
fre=156;//0.156毫秒约等于6400HZ
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使蜂鸣器发生2,20,100,200,400,800,1600,3200,6400HZ,9种频率的声音,定时器1使每种声音持续响2秒

正确的代码应该为:

/*同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个频率持续的时间,
间隔300ms依次输出1,10,50,100,200,400,800,
1k(hz)的方波。*/
#include  //51单片机头文件
#include //包含有左右循环移位子函数的库
#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<6)    //以下几个if分别用来选取不同的频率
 {
            if(tt==20)//20个50毫秒是1秒,1秒对应1HZ
{
tt=0;
fre=50000;
beep=~beep;
}
           }
if(flag>=6&&flag<12)
 {
            if(tt==2)//两个50毫秒是100毫秒,100毫秒对应10HZ
               {
tt=0;
fre=50000;
beep=~beep;
}
           }
if(flag>=12&&flag<18)
{
tt=0;
fre=20000;//20毫秒对应500HZ
beep=~beep;
}
if(flag>=18&&flag<24)
{
tt=0;
fre=10000;//10毫秒对应100HZ
beep=~beep;
}
if(flag>=24&&flag<30)
{
tt=0;
fre=5000;
beep=~beep;
}
if(flag>=30&&flag<36)
{
tt=0;
fre=2500;
beep=~beep;
}
if(flag>=36&&flag<42)
{
tt=0;
fre=1250;
beep=~beep;
}
if(flag>=42&&flag<48)
{
tt=0;
fre=1000;
beep=~beep;
}
TR0=1;
}
void timer1() interrupt 3  //定时器1中断用来产生300毫秒时间定时
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
flag++;
if(flag==48)
 {
   flag=0;
   fre=50000;
 }
}

但是300毫秒太快,不好分辨,最好还是变成持续2秒能听出效果

/*同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个频率持续的时间,
间隔2s依次输出1,10,50,100,200,400,800,1k(hz)的方波。*/
#include  //51单片机头文件
#include //包含有左右循环移位子函数的库
#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==20)//20个50毫秒是1秒,1秒对应1HZ
{
tt=0;
fre=50000;
beep=~beep;
}
if(flag>=40&&flag<80)
{
      
                tt=0;
fre=100000;//100毫秒就是10HZ
beep=~beep;
  
        }
if(flag>=80&&flag<120)
{
tt=0;
fre=20000; //20毫秒对应50HZ
beep=~beep;
}
if(flag>=120&&flag<160)
{
tt=0;
fre=10000;//10毫秒对应100HZ
beep=~beep;
}
if(flag>=160&&flag<200)
{
tt=0;
fre=5000;//5毫秒对应200HZ
beep=~beep;
}
if(flag>=200&&flag<240)
{
tt=0;
fre=2500;//2.5毫秒对应400HZ
beep=~beep;
}
if(flag>=240&&flag<280)
{
tt=0;
fre=1250; //1.25毫秒对应800HZ
beep=~beep;
}
if(flag>=280&&flag<320)
{
tt=0;
fre=1000;//1毫秒对应1K HZ
beep=~beep;
}
TR0=1;
}
void timer1() interrupt 3  //定时器1中断用来产生2秒时间定时
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
flag++;
if(flag==320)
 {
   flag=0;
   fre=50000;
 }
}

欢迎大家指正!



你可能感兴趣的:(关于郭天祥51单片机教程视频课后题《同时用两个定时器控制蜂鸣器发声》)