打印

中断程序不起作用

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

#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; //关闭蜂鸣器
  }
}

相关帖子

沙发
xhtxzxw| | 2010-6-29 02:13 | 只看该作者
本帖最后由 xhtxzxw 于 2010-6-29 02:29 编辑

首先确定:真的是用的蜂鸣器吗???看代码似乎是扬声器????
如果是蜂鸣器,你不需要用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; //关闭蜂鸣器,关不了的,嘿嘿
  }
}

使用特权

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

使用特权

评论回复
地板
wzl-xx@163.com| | 2010-6-29 16:14 | 只看该作者
暂时不看你的硬件,先看你的程序。
依据你的思想,在程序中因该注意的几点是:
    首先中断总允许EA=1;要在初始化的最后允许。
    其次中断的应用用不用using一般没什么问题,有时候用了可能还会发生冲突。
    在中断程序中每一秒钟都控制蜂鸣器关闭一次,引起重复操作。可以在中断中设置标志位,主程序判断。
在主程序中再设置标志位,使其蜂鸣器程序只执行一次。
宪程序可以更改如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit  BEEP=P3^7;
uint n,nn;
uint j,Timer_flag,Stop_flag;

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

void beep_beep()
{
if(Stop_flag==0)
{
  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定时
   ET0=1;
   TR0=1;
   EA=1;
   while(1)
   {
   beep_beep();
   if(Timer_flag)
   {
     BEEP=1; //关闭蜂鸣器
   }
         Stop_flag=1;
   }
   }

void Time0(void) interrupt 1
{
   TH0=0xfc;               //1ms定时
   TL0=0x66;
   n++;
   if(n==100)
   {
      n=0;
  nn++;
   }
  if(nn==5)
  {
   nn=0;
   Timer_flag=1;
  }
}

使用特权

评论回复
5
wzl-xx@163.com| | 2010-6-29 16:15 | 只看该作者
以上方法是一种比较麻烦的方法,还可以换另一种思想编程

使用特权

评论回复
6
wzl-xx@163.com| | 2010-6-29 16:20 | 只看该作者
既然用了延时,就可以开机后就会延时一段时间关闭,不必使用中断。
你还可以不用中断直接应用如下程序:

#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();
}
}

void main()
{
   beep_beep();
   BEEP=1; //关闭蜂鸣器
   while(1);
}

使用特权

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

使用特权

评论回复
8
zjswuyunbo| | 2010-6-29 21:00 | 只看该作者
呵呵,觉得楼主思维太混乱了

使用特权

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

本版积分规则

0

主题

58

帖子

1

粉丝