高手进,关于蜂鸣器的C51程序疑问

来源:百度知道 编辑:UC知道 时间:2024/07/07 12:23:40
同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个
频率持续的时间,间隔2s依次输出
1,10,50,100,200,400,800,
1k(hz)的方波?
设晶振频率为12MHz。
#include<reg51.h> //51单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit beep=P3^7;
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;

间隔40是正好是间隔2秒,定时器50000的定时时间是0.05秒,0.05*40=2秒 .前两个是50000,其中第一个50000还要乘以前面10(tt的值)就变成500000了,10*0.05s=0.5s,半个波长是0.5s,故T1=1s,所以f1=1Hz,第二个50000不需要乘以10,故半波长为0.05s,T2=0.1s,f2=10Hz,同理类推下面的即可。此段程序最后两个if有问题,应该是1.6k和3.2k的频率。不止8个频率,共产生了9个频率。

500000单位是us,要实现间隔2s,则0.05*40=2秒,前2秒即flag==40.。这就是为什么分别是flag<40.。flag>=40&&flag<80。。。这样划分了,实现每2s变频依次,每次变频分别响2s(注意不用加延时,因为语句已经相当于延时2s了)。。。