调试了几个小时,还是找不出哪里错了。大家帮忙看一下

2019-03-24 19:52发布

 由上位机发送1给单片机时,蜂鸣器以400ms频率发声,发2时以200ms频率发声,发3时以100ms频率发声,发4关闲蜂鸣器。   #include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp=0;
sbit beep=P3^6;//蜂鸣器引脚,低电平有效
//初始化
void init()
{
TMOD=0X20;
SCON=0X50;
TR1=1;
TH1=TL1=0XFD;
ES=1;
EA=1;
}
 //一毫秒延时
void delay(uint i)
{
 uchar j;
   while(i--)
  {
   for(j=0;j<115;j++);
  }
}
//发送回PC
void send(uchar dat)
{
 SBUF=dat;
 while(!TI);   //等待发送完成
 TI=0;    //把发送标志位置零
}
//蜂鸣器
void beep0(uchar z)
 {
   while(1)
   {
   beep=0;
   delay(z);
   beep=1;
   delay(z);
   }
 }
 //判断从PC向单片机发送的数值
 void p()
 {
 if(temp==1)
   beep0(200);
 else if(temp==2)
   beep0(100);
 else if(temp==3)
   beep0(50);
 else if(temp==4)
   beep=1;
 }
 //主函数
void main()
{
  init(); //初始化
  while(1)
  {
  p();
  }
 }
 //串口接收中断函数
void ser() interrupt 4
{
 if(RI==1)
 {
 RI=0;
 temp=SBUF;
 send (temp);
   }
}
    出现的情况是:只能发送一次,而第二次、第三次、第四次无效。 例如发送数字1,后发送四蜂鸣器还在响,关不掉。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
lalahu
2019-03-25 06:53

不对, void beep0(uchar z)

{

 while(1) { beep=0;

delay(z);

 beep=1; delay(z);

}

 }

应该是在这个死循环中跳不出来了。

回不到上一个循环中了。

这是主要的错误吧。

 

 

delay(z);把z设成全局变量,在中断里修改它。

 

[ 本帖最后由 lalahu 于 2011-6-20 12:16 编辑 ]

一周热门 更多>