at89c52在串口通信中遇到的问题
时间:10-02
整理:3721RD
点击:
由于下位机采用at89c52,串口通信采用中断方式接收与发送,发现自己在串口通信时,上位机发送的数据下位机9针串口有接收指示,但是功能不能实现,还有就是下位机发送数据的时候上位机接收数据的时候有时会出现误码,比如00f0的时候,上位机接收到的时候有时是00f0,有时是f000,就是会出现慢一拍的情况,上下位机的波特率都一样。下面是我的串口程序,高手指导指导下!谢谢了!
void ck_init() interrupt 4 using 1 //串口中断函数
{ ES=0;
if(RI==1) //接收停止,置零准备下一次接收
{ RI=0;
recv[recvnum++]=SBUF;
temp=recv[0];
temp<<8;
temp=temp|recv[1];
if(recvnum>2)
{recvnum=0;
num=num+1;}
if(num==1)
{recv[0]<<8;
alarmH=recv[0]|recv[1];
num=1;
}
if(num==2)
{recv[0]<<8;
alarmL=recv[0]|recv[1];
num=2;
}
if(num==3)
{recv[0]<<8;
settemperature=recv[0]|recv[1];
num=3;
}
if(num==4)
{recv[0]<<8;
zhengwencha=recv[0]|recv[1];
num=4;
}
if(num==5)
{recv[0]<<8;
fuwencha=recv[0]|recv[1];
num=0;
}
num=0;
}
if(TI==1) //发送停止,置零准备下一次发送
{
TI=0;
if(sendnum<2)
{send[0]=temp_highbyte;
send[1]=temp_lowbyte;
SBUF=send[sendnum++];}
else
{sendnum=0;}
}
ES=1;
return;
}
void main(void)
{
ckcsh(); //串口初始化函数
while(1)
{
heat_or_cooling();
if(temp>=0)
{temp_highbyte=temp/256;
temp_lowbyte=temp%256;
}
else
{temp_highbyte=((~temp)+1)/256;
temp_highbyte=(temp_highbyte|0xf0);
temp_lowbyte=((~temp)+1)%256;
}
send[0]=temp_highbyte;
send[1]=temp_lowbyte;
SBUF=send[sendnum++]; //启动发送数据
alarm(); //报警函数
if(Flag==1)
{bell=!bell;
warn=!warn;} //蜂鸣器响
else
{bell=1;
warn=1;}
}
}
void ck_init() interrupt 4 using 1 //串口中断函数
{ ES=0;
if(RI==1) //接收停止,置零准备下一次接收
{ RI=0;
recv[recvnum++]=SBUF;
temp=recv[0];
temp<<8;
temp=temp|recv[1];
if(recvnum>2)
{recvnum=0;
num=num+1;}
if(num==1)
{recv[0]<<8;
alarmH=recv[0]|recv[1];
num=1;
}
if(num==2)
{recv[0]<<8;
alarmL=recv[0]|recv[1];
num=2;
}
if(num==3)
{recv[0]<<8;
settemperature=recv[0]|recv[1];
num=3;
}
if(num==4)
{recv[0]<<8;
zhengwencha=recv[0]|recv[1];
num=4;
}
if(num==5)
{recv[0]<<8;
fuwencha=recv[0]|recv[1];
num=0;
}
num=0;
}
if(TI==1) //发送停止,置零准备下一次发送
{
TI=0;
if(sendnum<2)
{send[0]=temp_highbyte;
send[1]=temp_lowbyte;
SBUF=send[sendnum++];}
else
{sendnum=0;}
}
ES=1;
return;
}
void main(void)
{
ckcsh(); //串口初始化函数
while(1)
{
heat_or_cooling();
if(temp>=0)
{temp_highbyte=temp/256;
temp_lowbyte=temp%256;
}
else
{temp_highbyte=((~temp)+1)/256;
temp_highbyte=(temp_highbyte|0xf0);
temp_lowbyte=((~temp)+1)%256;
}
send[0]=temp_highbyte;
send[1]=temp_lowbyte;
SBUF=send[sendnum++]; //启动发送数据
alarm(); //报警函数
if(Flag==1)
{bell=!bell;
warn=!warn;} //蜂鸣器响
else
{bell=1;
warn=1;}
}
}
UART中断中的程序有问题,自己好好看。一句一句的想想。看着就感觉你的程序学的不规范