这两天在学单片机的串口通信,可是写了一个程序,功能实现不了,21ic的强人帮忙看一下,谢谢!
题目的要求是这样的:
由上位机发送1给单片机时,蜂鸣器以400ms频率发声,发2时以200ms频率发声,发3时以100ms频率发声,发4时关闭蜂鸣器。
#include<reg52.h>
unsigned char a,b;
sbit fmq=P2^3;
void ser() interrupt 4
{
a=SBUF;
b=1;
}
void init()
{
TMOD=0X20;//设置定时器1为方式2
TH1=0XFD;
TL1=0XFD;//装初值,设定波特率为9600
TR1=1;//启动T1 (确定TCON中的TR1位)
SM0=0;
SM1=1;//确定串口工作方式为方式1(编程SCON寄存器)
EA=1;
ES=1;
}
void delay(unsigned char z)
{
unsigned char x,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}
void main()
{
init();
REN=1;//(启动串行口接受数据)
while(1)
{
if(b==1)
{
while(!RI);
RI=0;
b=0;
}
if(a==0X01)
{
a=0;
while(1)
{
fmq=0;
delay(400);
fmq=~fmq;
delay(400);
}
}
if(a==0X02)
{
a=0;
while(1)
{
fmq=0;
delay(200);
fmq=~fmq;
delay(200);
}
}
if(a==0X03)
{
a=0;
while(1)
{
fmq=0;
delay(100);
fmq=~fmq;
delay(100);
}
}
if(a==0X04)
{
a=0;
while(1)
{
fmq=1;
}
}
}
}
程序的结果是这样的,当第一次第二次发送数据的时候,程序能够按照预期的走,但是到第三次发送数据的时候,蜂鸣器没有反应,复位之后,再发送,好使。 |