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

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
1楼-- · 2019-03-25 02:43
 精彩回答 2  元偷偷看……
lalahu
2楼-- · 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 编辑 ]
qq502835899
3楼-- · 2019-03-25 07:53
同意楼上说的
ddllxxrr
4楼-- · 2019-03-25 10:31
你第一次发1时,进了了

//蜂鸣器
void beep0(uchar z)
{
   while(1)
   {
   beep=0;
   delay(z);
   beep=1;
   delay(z);
   }
}
它是个死循环,就是说你的串口虽然好用是因为中断没受影响

应这样改

//蜂鸣器
void beep0(uchar z)
{
    while(1)
   {
   if(temp==0x01)
   z=200;
else if(temp==0x02)
   z=100;
else if(temp==0x03)
   z=50;
else if(temp==0x04)
z=0;  
beep=1;
   
   
   beep=0;
   delay(z);
   beep=1;
   delay(z);
   }
}


呵呵,实验我都做了,楼主只管考过用就行
ddllxxrr
5楼-- · 2019-03-25 13:26
楼主还是比较有才,赞一个哈
bendaye
6楼-- · 2019-03-25 13:49
恩,判断z的时候z应该是全局变量才行,或者就像楼上的,直接用单片机串行口收到的。赞一个楼主....

一周热门 更多>