單片機RS485串口通信
MAX3082的發(fā)送和接收轉換是由芯片的RE/和DE端控制的。RE/=1,DE=1時,MAX3082處于發(fā)送狀態(tài);RE/=0,DE=0時,MAX3082處于接收狀態(tài)。一般使用單片機的一個IO口連接RE/和DE端。在上電復位時,由于硬件電路穩(wěn)定需要一定的時間,并且單片機各端口復位后處于高電平狀態(tài),這樣就會使總線上各個分機處于發(fā)送狀態(tài),由于上電時各電路不穩(wěn)定,可能向總線發(fā)送信息。因此,如果用一根口線作發(fā)送和接收控制信號,應該將口線反向后接入MAX3082的控制端,使上電時MAX3082處于接收狀態(tài)。另外,在主從機軟件上也應做處理措施,如:上電時或通信之前,對串行口做幾次空操作,清除端口的非法數(shù)據(jù)和命令。
本文引用地址:http://m.butianyuan.cn/article/201611/318595.htmRS-485的通信程序編寫和RS-232沒有太大區(qū)別,如果使用一個IO口控制MAX3082的RE/和DE端口,RS-485只比RS-232多了一個接收和發(fā)送的轉換控制位。初始化串口時,使該位處于低電平,即接收狀態(tài)。發(fā)送數(shù)據(jù)時,使該位先為高,發(fā)送完數(shù)據(jù)后拉低。程序如下:
sbitRS485_EP3^5//發(fā)送,接收控制位
void UART1_Init(void)
{
SCON = 0x50;//方式1,8位數(shù)據(jù),可變波特率
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;//置高,發(fā)送
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) { //中斷接收數(shù)據(jù) } ES = 1; }
評論