打印

请教各位程序那个地方出错了

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

#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| | 2013-6-18 22:32 | 只看该作者
首先确定:真的是用的蜂鸣器吗???看代码似乎是扬声器????
如果是蜂鸣器,你不需要用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| | 2013-6-18 22:34 | 只看该作者
主程序不断调用beep_beep程序
while(1)
   {
beep_beep();
      }
而beep_beep不断控制BEEP
BEEP=~BEEP;       //输出频率500Hz
怎么会关闭呢
尽管中断有关BEEP,但上面仍在控制BEEP
...

使用特权

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

使用特权

评论回复
5
yinxiangh|  楼主 | 2013-6-18 22:36 | 只看该作者
好吧,我再缕缕

使用特权

评论回复
6
yinxiangh|  楼主 | 2013-6-18 22:37 | 只看该作者
结贴了,大家晚安啊

使用特权

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

本版积分规则

723

主题

7134

帖子

2

粉丝