一个关于at89c51的串口工作方式的问题
swsg 2005-04-11 09:18:40 我使用at89c51单片机串口传输进行控制,因为使用到了多机通信,所以采用了它的方式3具体的串口配置如下:
TMOD=0x20; //定时器T1为方式1
TH1=0xf3; /*定时器送初值,波特率为2400*/
TL1=0xf3;
PCON=0x80; /*smod=1*/
SCON=0xf0; /*串行口为方式3*/
TR1=1 ; /*启动定时器*/
PS = 1; //优先级控制打开
ES= 1; //open the uart interrupt
EA= 0; //permit interrupt
然后我发送采用了数据和地址分别用不同的函数进行
void SerialSendAddrChar(uint8 ch) //发送地址的串口中断
{
TB8=1;
SBUF=ch;
while(TI==0);
TI=0;
}
void SerialSendOprChar(uint8 ch) //发送数据的串口中断
{
TB8=0;
SBUF=ch;
while(TI==0);
TI=0;
}
具体的流程是中心发送了一地址后发送一个数据,在接收端先收到地址码,通过和本地的地址码(本地的地址码放在p2口)进行比较如果相同则置sm2=0,允许接收数据。不同则不进行操作,具体的接收端程序如下:
void SerialInt(void) interrupt 4 using 1 //接收中断
{
uint8 tem;
if(RI)
{
EA = 0;
ES = 0;
tem=SBUF;
Serial_int(tem); //调用接收中断的数据处理子程序
RI=0;
ES = 1;
EA = 1;
}
}
void Serial_int(unsigned char S_char) //中断接收处理子程序,处理通过串口接收到的数据
{
uint8 tmp;
if(RB8==1)
{
tmp=P2;
if(S_char==tmp) //分站,则比较是否为当前站操作
{
SM2=0;
Isaddr=1;
}
else
{
Not_here=1;
}
}
else
{
switch(S_char)
{
case Comm_to_sub:
Iscenter_comm=1;
config(1);
break;
case Reply:
Comm=1;
config(1);
break;
case Fre_full:
Nofre=1;
config(0);
break;
default:break;
}
SM2=1;
}
}
现在的问题是我按上面的进行操作后,把串口设置成方式3以后程序运行起来串口好像根本就没有接收中断产生。我用示波器看了串口的rxd脚,当txd上有波形的时候rxd上也有波形啊(而且rxd和txd上的波形相同)。而当我设置成方式1是串口可以正常工作,但是这样的话我无法进行地址选择啊!!
各位大侠帮我看看啊