[code=csharp]
#include<reg52>
#define uchar unsigned char
#define uint unsigned int
uchar num,flag,a,beep_num;
sbit beep=P2^3;
void main()
{
TMOD=0x21; //定时器1工作在方式2(8位初值自动重装方式),定时器0工作在方式1
TH1=0xfd;
TL1=0xfd;
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
TR1=1;
SCON=0x50; //SM0=0,SM1=1,REN=1
EA=1;
ES=1;
ET0=1;
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
TR0=1;
ES=1; //因为从上位机发送一个数据,单片机接收到就会产生中断,进入中断后flag=1,
} //如果不将大括号在这里结束,则蜂鸣器只会收到第一次发送的数据,只会有一种声音,
//后面再从上位机发送任何数据都不起作用,只会按第一次接收到的数据来使蜂鸣器发声
if(a=='1')
{
if(num==8)
{
num=0;
beep=~beep;
}
}
if(a=='2')
{
if(num==4)
{
num=0;
beep=~beep;
}
}
if(a=='3')
{
if(num==2)
{
num=0;
beep=~beep;
}
}
if(a=='4')
{
TR0=0;
beep=1;
}
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
num++;
}
[/code]