由上位机发送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,后发送四蜂鸣器还在响,关不掉。
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
不对, void beep0(uchar z)
{
while(1) { beep=0;
delay(z);
beep=1; delay(z);
}
}
应该是在这个死循环中跳不出来了。
回不到上一个循环中了。
这是主要的错误吧。
delay(z);把z设成全局变量,在中断里修改它。
//蜂鸣器
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);
}
}
呵呵,实验我都做了,楼主只管考过用就行
一周热门 更多>