51单片机定时器问题,题目如图所示,蜂鸣器的位置在P3^6

如题所述

第1个回答  2012-02-19
#include<reg52.h>
#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;
}
}
第2个回答  2012-02-18
一、间隔300ms,那同一个频率 的时间呢?如500Hz 的时间长度。
还是说,每个频率时间长度都是300ms,中间没有间隔。如果真是这样,1Hz 的周期为1s,半周都500ms了,300ms不够用。所以300ms只是两个频率之间过渡的空白吧。
二、蜂鸣器 是高电平 驱动 还是 低电平 驱动?频率过渡之间的空白是停止蜂鸣器,还是不管?
三、最后 1KHz的频率结束后,该如何?是停止 还是 循环?
四、系统 晶振是多大的呢?本回答被网友采纳
第3个回答  2012-02-19
控制蜂鸣器发声,声音,这个词,不是随便用的。

声音的频率范围是:20Hz ~20kHz。

题目中的 1Hz、10Hz,都不是声音。

此题无解。

关闭了吧。追问

谢谢你一语道破,我觉得1hz这几个频率是发声频率,不是指声音的频率其中的发生装置可能就是一个有源蜂鸣器。

本回答被提问者采纳
第4个回答  2012-02-18
1个足够
相似回答