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

关于郭天祥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 tt=0; fre=50000;//50毫秒是20HZ beep=~beep; } if(flag>=80&&flag tt=0; fre=5000;//5毫秒是200HZ beep=~beep; } if(flag>=160&&flag tt=0; fre=1250;//1.25毫秒是800HZ beep=~beep; } if(flag>=240&&flag tt=0; fre=312;//0.312毫秒约等于3200HZ beep=~beep; } if(flag>=320&&flag 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 tt=0; fre=50000; beep=~beep; }            } if(flag>=6&&flag tt=0; fre=50000; beep=~beep; }            } if(flag>=12&&flag tt=0; fre=10000;//10毫秒对应100HZ beep=~beep; } if(flag>=24&&flag tt=0; fre=2500; beep=~beep; } if(flag>=36&&flag 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                        tt=0; fre=100000;//100毫秒就是10HZ beep=~beep;            } if(flag>=80&&flag tt=0; fre=10000;//10毫秒对应100HZ beep=~beep; } if(flag>=160&&flag tt=0; fre=2500;//2.5毫秒对应400HZ beep=~beep; } if(flag>=240&&flag 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单片机教程视频课后题《同时用两个定时器控制蜂鸣器发声》

发表回复

提供最优质的资源集合

立即查看 了解详情