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

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条回答
ddllxxrr
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);
   }
}


呵呵,实验我都做了,楼主只管考过用就行

一周热门 更多>