单片机RS-485串口通信

单片机RS-485串口通信

RS-485是半双工的通信方式,发送和接收共用同一物理信道。在任意时刻只允许一台单机处于发送状态。因此要求应答的单机必须在侦听到总线上呼叫信号已经发送完毕,并且没有其它单机发出应答信号的情况下,才能应答。半双工通信对主机和从机的发送和接收时序有严格的要求。如果在时序上配合不好,就会发生总线冲突,使整个系统的通信瘫痪,无法正常工作。要使总线上的设备在时序上严格配合。在复位时,使主从机都处于接收状态。

MAX3082的发送和接收转换是由芯片的 RE/DE端控制的。RE/=1DE=1时,MAX3082处于发送状态;RE/=0DE=0时,MAX3082处于接收状态。一般使用单片机的一个IO口连接RE/DE端。在上电复位时,由于硬件电路稳定需要一定的时间,并且单片机各端口复位后处于高电平状态,这样就会使总线上各个分机处于发送状态,由于上电时各电路不稳定,可能向总线发送信息。因此,如果用一根口线作发送和接收控制信号,应该将口线反向后接入MAX3082的控制端,使上电时MAX3082处于接收状态。另外,在主从机软件上也应做处理措施,如:上电时或通信之前,对串行口做几次空操作,清除端口的非法数据和命令。

RS-485的通信程序编写和RS-232没有太大区别,如果使用一个IO口控制MAX3082RE/DE端口, RS-485只比RS-232多了一个接收和发送的转换控制位。初始化串口时,使该位处于低电平,即接收状态。发送数据时,使该位先为高,发送完数据后拉低。程序如下:

 

sbit  RS485_E  P3^5     //发送,接收控制位

 

void UART1_Init(void)

{

      SCON = 0x50;           //方式18位数据,可变波特率

 

      RS485_E      = 0;        //置低,接收

 

      TMOD|= 0x20;           //定时器1,方式28位自重载

      PCON = 0x00;           //波特率倍频禁止

      TH1  = 0xfd;             //晶振22.1184MHz,波特率19200;

      TL1  = 0xfd;             

      IE      |= 0x90;                  //开中断

      IP     = 0x10;

      TR1  = 1   ;            //启动定时器

}

 

void UART1_Send_Char(const INT8U dt)

{   

      SBUF    = dt;

      while(!TI);           

      TI = 0;

}

 

void UART1_Send_String(INT8U *str, INT8U len)

{

      INT8U i;

      RS485_E      = 1;        //置高,发送

      ES          = 0;

      for(i=0; i<len; i++)

      {

             UART1_Send_Char(*(str+i));  

      }

      RS485_E      = 0;        //置低,接收

      ES          = 1;                     

}

 

void UART1_Interrupt(void) interrupt 4        

{

      RS485_E = 0;             //接收   

      ES = 0;

      if(RI)                                 

      {

             //中断接收数据

      }

      ES = 1;

}

 

 

你可能感兴趣的:(工作,IO,String,IE)