请帮我看看是这个程序有问题还是我单片机连线有问题?

2019-07-15 13:08发布

想实现这样一个功能://A:当打火机靠近火焰传感器模块一次时,led灯一直亮,蜂鸣器循环放歌。          //B:当随时向声音传感器模块吹一口气时,led灭,蜂鸣器不再响
现在我只能实现功能A。 B实现不了。但是我检查好久没看出来程序错在哪里了,请帮我看看,谢谢
火焰传感器和声音传感器都是低电平有效,都可以直接接单片机

//我的思路;         //"打火机靠近火焰传感器模块一次"使进入“led灯一直亮”和“蜂鸣器循环放歌”两个中断  
         //"随时向声音传感器模块吹一口气" 使退出“led灯一直亮”和“蜂鸣器循环放歌”两个中断
         //由主函数中断进入“led灯一直亮”和“蜂鸣器循环放歌”两个部分。
         //在中断1中不断检查是否有吹气声音

//led用P1.0,1.1口  
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit  BEEP=P2^3;                 //蜂鸣器
sbit fire_sensor=P3^0;//定义火焰传感器管脚
sbit sound_sensor=P3^1;  //定义声音传感器管脚。
uchar code SOUNDLONG[]=       //控制音调
{
  18,6,24,24,24,48,
  18,6,24,24,24,48,
  18,6,24,24,24,24,24,
  18,6,24,24,24,48,0
};

uchar code SOUNDTONE[]=       //控制音 {MOD}
{
212,212,190,212,159,169,
212,212,190,212,142,159,
212,212,106,126,159,169,190,
119,119,126,159,142,159,0        //生日快乐end
};
void delay(uint z);
void Play_Music();
void Music(uchar number);
void delay10us(uchar time);
void delay50us(uchar time);
void main()
{
        uint x=60000,y=110;         //60秒内检测是否有热源,开机超过60秒不再检测
        TH0=(65536-50000)/256;        //两个定时器的初值可任意设置
        TL0=(65536-50000)%256;
        TH1=(65536-50000)/256;         //两个定时器的初值任意设置可
        TL1=(65536-50000)%256;
        EA=1;
        ET0=1;
        ET1=1;
        for(;x>0;x--)
                for(;y>0;y--)
                        {
                                if(fire_sensor==0)        //如果有热源
                                {
                                         TR0=1;
                                        TR1=1;                //开启定时器T0,T1
                                }                                                  
                        }
}

void light() interrupt 1
{
        TR0=0;
        TH0=(65536-65000)/256;                          
        TL0=(65536-65000)%256;
        P1=0xfc;               //1111 1000
        delay(1);             
    if(sound_sensor==0)        //如果有声音(吹气)
        {  
                TR0=0;
                TR1=0;
                P1=0xff; //关掉led
                BEEP=1;//关蜂鸣器
                delay(1000); //延时
        }  
        TR0=1;
}

void sound() interrupt 3
{
        TR1=0;
        while(1)
        {
                   Play_Music();       //生日快乐
                   delay10us(250);
        }
        TR1=1;
}

void Play_Music()
{
  uint k,n;
  uint SoundLong,SoundTone;
  uint i,j,m;
  do
  {
     if(i>=25) i=0;
     SoundLong=SOUNDLONG[i];
     SoundTone=SOUNDTONE[i];
     i++;
     for(n=0;n<SoundLong;n++)
      {
      for(k=0;k<12;k++)
       {
           BEEP=0;
           for(m=0;m<SoundTone;m++);
           BEEP=1;
           for(m=0;m<SoundTone;m++);

          }
      }
      delay50us(6);

  }while((SOUNDLONG[i]!=0)||(SOUNDTONE[j]!=0));               
}

void delay50us(uchar time)
{
  uchar a,b;
  for(a=0;a<time;a++)
    for(b=0;b<6;b++);
}

void delay10us(uchar time)
{
  uchar a,b,c;
  for(a=0;a<time;a++)
     for(b=0;b<10;b++)
             for(c=0;c<120;c++);
}

void delay(uint z)
{
        uint i,j;
        for(i=z;i>0;i--)
                for(j=110;j>0;j--);
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
wufa1986
1楼-- · 2019-07-15 18:43
兄弟,你这程序有很大问题,在中断中运行长时间程序,然后这么简单的程序居然用了2个中断,中断不是这样用的
逻辑容易混乱。当然你写这程序是为了连续中断用法那又是另外一回事了

unsigned char Play_Music()
{
  uint k,n;
  uint SoundLong,SoundTone;
  uint i,j,m;
  do
  {
     if(i>=25) i=0;
     SoundLong=SOUNDLONG[i];
     SoundTone=SOUNDTONE[i];
     i++;
     for(n=0;n<SoundLong;n++)
      {
      for(k=0;k<12;k++)
       {
           BEEP=0;
           for(m=0;m<SoundTone;m++);
           BEEP=1;
           for(m=0;m<SoundTone;m++);

          }
      }
      delay50us(6);
if(sound_sensor==0)        //如果有声音(吹气)
{
return 1;
}
  }while((SOUNDLONG[i]!=0)||(SOUNDTONE[j]!=0));   
  return 0
}

void delay50us(uchar time)
{
  uchar a,b;
  for(a=0;a<time;a++)
    for(b=0;b<6;b++);
}


void main()
{
        uint x=60000,y=110;         //60秒内检测是否有热源,开机超过60秒不再检测
        for(;x>0;x--)
                for(;y>0;y--)
                        {
                                if(fire_sensor==0)        //如果有热源
                                {
                                         P1=0x00; //开led
                                                                                 while(1)
                                                                                 {
                                                                                 if( Play_Music())     //一直生日快乐直到吹气退出
                                                                                 {
                                     P1=0xff; //关掉led
                                    BEEP=1;//关蜂鸣器
                                                                        break;
                                                                                 }
                                                                                 }
                                                                                 break;//跳出检测
                                }                                                   
                        }

while(1);

}
最佳答案
275849752
2楼-- · 2019-07-16 00:31
下面没有注释的语句都是些放歌啊,延时啊什么的,应该不会错在那里,
275849752
3楼-- · 2019-07-16 03:23
 精彩回答 2  元偷偷看……
275849752
4楼-- · 2019-07-16 04:17
修改了一下,重发一次
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit  BEEP=P2^3;                 //蜂鸣器
sbit fire_sensor=P3^0;//定义火焰传感器管脚
sbit sound_sensor=P3^1;  //定义声音传感器管脚。//有时得要定义全局变量 ,用于控制是否进入中断
uchar code SOUNDLONG[]=       //控制音调
{
  18,6,24,24,24,48,
  18,6,24,24,24,48,
  18,6,24,24,24,24,24,
  18,6,24,24,24,48,0
};

uchar code SOUNDTONE[]=       //控制音 {MOD}
{
212,212,190,212,159,169,
212,212,190,212,142,159,
212,212,106,126,159,169,190,
119,119,126,159,142,159,0        //生日快乐end
};
void delay(uint z);
void Play_Music();
void Music(uchar number);
void delay10us(uchar time);
void delay50us(uchar time);
void main()
{
        uint x=60000,y=110;                  //60秒内检测是否有热源
        TH0=(65536-50000)/256;                          //两个定时器的初值随便,反正只进一次中断且进中断后延时液与定时器无关
        TL0=(65536-50000)%256;
        TH1=(65536-50000)/256;                          //两个定时器的初值随便,反正只进一次中断且进中断后延时液与定时器无关
        TL1=(65536-50000)%256;
        EA=1;
        ET0=1;
        ET1=1;
        for(;x>0;x--)
                for(;y>0;y--)
                        {
                                if(fire_sensor==0)                 //如果有热源
                                {
                                         TR0=1;
                                        TR1=1;                                //开启定时器T0,T1
                                }                                                  
                        }
}

void light() interrupt 1
{
        TR0=0;
        TH0=(65536-50000)/256;                          
        TL0=(65536-50000)%256;
        P1=0xfc;               //1111 1000
        delay(1);       //延时多少秒有待测试,根据音乐定,音乐大约33秒        //但是后来发现中断执行是有先后顺序的,就像语句一样,中断1第一遍执行完了之后才会开始执行中断2的第一遍       
    if(sound_sensor==0)                //如果有声音  //在中断1或3里面检测是否应该关灯与停止放音乐,而不是在main中,因为main函数这部分语句只执行一次,可能等不到有声音就执行过去了
        {  
                TR0=0;
                TR1=0;
                P1=0xff;//关掉led
                BEEP=1;
                delay(1000);
        }  
        TR0=1;
}

void sound() interrupt 3
{
        TR1=0;
        TH1=(65536-50000)/256;                          
        TL1=(65536-50000)%256;
        while(1)
        {
                   Play_Music();       //生日快乐
                   delay10us(250);
        }
        TR1=1;
//        if(sound_sensor==0)                //如果有声音  //在中断1或3里面检测是否应该关灯与停止放音乐,而不是在main中,因为main函数这部分语句只执行一次,可能等不到有声音就执行过去了
//        {
//        P1=0xff;//关掉led
//        EA=0;
//        delay(1);
//        }
}

void Play_Music()
{
  uint k,n;
  uint SoundLong,SoundTone;
  uint i,j,m;
  do
  {
     if(i>=25) i=0;
     SoundLong=SOUNDLONG[i];
     SoundTone=SOUNDTONE[i];
     i++;
     for(n=0;n<SoundLong;n++)
      {
      for(k=0;k<12;k++)
       {
           BEEP=0;
           for(m=0;m<SoundTone;m++);
           BEEP=1;
           for(m=0;m<SoundTone;m++);

          }
      }
      delay50us(6);

  }while((SOUNDLONG[i]!=0)||(SOUNDTONE[j]!=0));               
}

void delay50us(uchar time)
{
  uchar a,b;
  for(a=0;a<time;a++)
    for(b=0;b<6;b++);
}

void delay10us(uchar time)
{
  uchar a,b,c;
  for(a=0;a<time;a++)
     for(b=0;b<10;b++)
             for(c=0;c<120;c++);
}

void delay(uint z)
{
        uint i,j;
        for(i=z;i>0;i--)
                for(j=110;j>0;j--);
}


阿飞7812
5楼-- · 2019-07-16 05:23
275849752 发表于 2016-9-2 22:30
修改了一下,重发一次
#include
#define uchar unsigned char

能给图看看吗
275849752
6楼-- · 2019-07-16 11:05
第一张是板子和传感器整个
IMG_20160903_111134.jpg

一周热门 更多>