打印

蜂鸣器不能关闭

[复制链接]
1689|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yinxiangh|  楼主 | 2014-12-15 20:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
麻烦大家帮我看看程序,程序主要是 主程序启动后蜂鸣器响,定时一定时间后关闭蜂鸣器,现在程序启动后,蜂鸣器不能关闭,请教各位程序那个地方出错了,谢谢了!程序如下:

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP=P3^7;
uint n,nn;
uint j;

void delay500(void)
{
uchar i;
for(i=230;i>0;i--);
}

void beep_beep()
{
for(j=200;j>0;j--)
{
BEEP=~BEEP; //输出频率1KHz
delay500(); //延时500us
}
for(j=200;j>0;j--)
{
BEEP=~BEEP; //输出频率500Hz
delay500(); //延时1ms
delay500();
}
}

main()
{
TMOD=0x01;
TH0=0xfc; TL0=0x66; //1ms定时
EA=1; ET0=1;
TR0=1;
while(1)
{
beep_beep();
}
}

void Time0(void) interrupt 1 using 0
{
TH0=0xfc; //1ms定时
TL0=0x66;
n++;
if(n==100)
{
n=0;
nn++;
}
if(nn==5)
{
nn=0;
BEEP=1; //关闭蜂鸣器
}
}
沙发
pangb| | 2014-12-15 20:58 | 只看该作者
首先确定:真的是用的蜂鸣器吗???看代码似乎是扬声器????
如果是蜂鸣器,你不需要用BEEP=~BEEP方法给她方波,只需要直接给加电就是了
P3.7输出直接驱动蜂鸣器,一般是不行的声音太小,可以加一级三极管驱动一下。
这就要看三极管接法是否等价于一个反相器,如果是,用BEEP=0就能让蜂鸣器响,否则BEEP=1让蜂鸣器响
如果是扬声器,现在这样给方波就对了。当然也要考虑三极管驱动才有大一点的声音。

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit  BEEP=P3^7;
uint n, nn;
uint j;
char Beep_End = 0;  //新加的变量

void delay500(void)
{
    uchar  i;
    for(i=230; i>0; i--);
}

void beep_beep()
{
    for(j=200;j>0;j--)
    {
      BEEP=~BEEP;       //输出频率1KHz
      delay500();       //延时500us
    }
    for(j=200;j>0;j--)
    {
      BEEP=~BEEP;       //输出频率500Hz
      delay500();       //延时1ms
      delay500();
    }
}

main()
{
    TMOD=0x01;
  TH0=0xfc; TL0=0x66;      //1ms定时
    EA=1; ET0=1;
  TR0=1;

   while(1)   
  {
      if(!Beep_End)  BEEP = 0;//也许要写成BEEP = 1。如果是扬声器用beep_beep();
      else                BEEP = 1;//也许要写成BEEP = 0。
    }
}

void Time0(void) interrupt 1 using 0
{
    TH0=0xfc;               //1ms定时
    TL0=0x66;
    n++;
    if(n==100)
    {
    n=0;
      if(nn<5) nn++;
    }
    if(nn==5)
    {
      nn=0;
      Beep_End = 1;  //新加的
//    BEEP=1; //关闭蜂鸣器,关不了的,嘿嘿
    }
}

使用特权

评论回复
板凳
chenjunt| | 2014-12-15 20:59 | 只看该作者
主程序不断调用beep_beep程序
while(1)
     {
beep_beep();
        }
而beep_beep不断控制BEEP
BEEP=~BEEP;       //输出频率500Hz
怎么会关闭呢
尽管中断有关BEEP,但上面仍在控制BEEP
...

使用特权

评论回复
地板
zyf部长| | 2014-12-15 20:59 | 只看该作者
我分析一下你的程序:开机蜂鸣器响,定时时间到后蜂鸣器关闭,经过一段很小很小的时间(你察觉不到),程序返回主程序 运行到 发声程序 BEEP=~BEEP处,定时器还在响!关闭的时间太短了。  你可以在定时器函数的最后一句加while(1);   单片机程序一定要注意有些程序语句执行的时间太短,人无法察觉

使用特权

评论回复
5
yinxiangh|  楼主 | 2014-12-15 21:00 | 只看该作者
好吧,我再缕缕

使用特权

评论回复
6
yinxiangh|  楼主 | 2014-12-15 21:00 | 只看该作者
结贴了,大家晚安啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

723

主题

7134

帖子

2

粉丝