单片机RS485串口通信
MAX3082的发送和接收转换是由芯片的RE/和DE端控制的。RE/=1,DE=1时,MAX3082处于发送状态;RE/=0,DE=0时,MAX3082处于接收状态。一般使用单片机的一个IO口连接RE/和DE端。在上电复位时,由于硬件电路稳定需要一定的时间,并且单片机各端口复位后处于高电平状态,这样就会使总线上各个分机处于发送状态,由于上电时各电路不稳定,可能向总线发送信息。因此,如果用一根口线作发送和接收控制信号,应该将口线反向后接入MAX3082的控制端,使上电时MAX3082处于接收状态。另外,在主从机软件上也应做处理措施,如:上电时或通信之前,对串行口做几次空操作,清除端口的非法数据和命令。
RS-485的通信程序编写和RS-232没有太大区别,如果使用一个IO口控制MAX3082的RE/和DE端口,RS-485只比RS-232多了一个接收和发送的转换控制位。初始化串口时,使该位处于低电平,即接收状态。发送数据时,使该位先为高,发送完数据后拉低。程序如下:
sbitRS485_EP3^5//发送,接收控制位
void UART1_Init(void)
{
SCON = 0x50;//方式1,8位数据,可变波特率
RS485_E= 0;//置低,接收
TMOD|= 0x20;//定时器1,方式2,8位自重载
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 { 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; }
单片机RS485串口通 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)