51單片機串口多機通信的實現和編程
一、51單片機的主從模式,首先要設定工作方式3:(主從模式+波特率可變)
SCON串口功能寄存器:SM0=1;SM1=1(工作方式3)

注:主機和從機都要為工作方式3。
【工作方式2 (SM0 SM1 :1 0):串行口為11位異步通信接口。發送或接收一幀信息包括1位起始位“0”、8位數據位、1位可編程位、1位停止位“1”。發送數據:發送前,先根據通信協議由軟件設置TB8為“奇偶校驗位”或“數據標識位”,然后將要發送的數據寫入SBUF,即能啟動發送器。發送過程是由執行任何一條以SBUF為目的寄存器的指令而啟動的,把8位數據裝入SBUF,同時還把TB8裝到發送移位寄存器的第9位上,然后從TXD(P3.1)端口輸出一幀數據。接收數據:先置REN=1,使串行口為允許接收狀態,同時還要將RI清“0”。然后再根據SM2的狀態和所接收到的RB8的狀態決定此串行口在信息到來后是否置R1=1,并申請中斷,通知CPU接收數據。當SM2=0時,不管RB8為“0”還是為“1”,都置RI=1,此串行口將接收發送來的信息。當SM2=1時,且RB8=1,表示在多機通信情況下,接收的信息為“地址幀”, 此時置RI=1,串行口將接收發來的地址。當SM2=1時,且RB8=0,表示在多機通信情況下,接收的信息為“數據幀”, 但不是發給本從機的,此時RI不置為“1”,因而SBUF中接收的數據幀將丟失。
工作方式3 (SM0 SM1 :1 1):為波特率可變的11位異步通信方式,除了波特率有所區別之外,其余方式都與方式2相同。】【以上內容摘自網絡】
二、主機的配置發送“地址”時,把TB8設定為1,發送數據時TB8設定為0
(類似于:主機 TB8=1發送的是地址,TB8=0發送的是數據)
發送幀結構:
![]()
假設主機將發送“1234”給地址為1的從機:調用函數:TXdata(1,"1234$");
void TXdata(uchar addr,uchar *str)
{
TB8 = 1; //發送地址
SBUF = addr; //把地址發送出去
while(!TI); //判斷是否發送成功(發送成功后TI會置1,需手動清0)
TI = 0;
TB8 = 0; //發送數據
while(*str != '\0') //發送數組
{
SBUF = (*str);
while(!TI);
TI = 0;
str++;
}
}
三、從機配置
1. 從機接收時,首先串口初始化時,使SM2=1(接收地址模式,即只能接收到TB8=1的數據,才觸發中斷),主機發送TB=0的數據,被認為是總線上的主機發送給別機的通信數據,本機丟棄,不產生中斷。
2. 接收的地址與本機地址相符后,使SM2=0(接收數據模式,接收數據正常觸發中斷)
(類似于:從機 SM2=1只接收地址,SM2=0只接收數據)
void chuan() interrupt 4 //串口中斷服務函數
{
ES = 0; //關閉串口中斷
if(RI) //再次判斷,是否接收到數據(接收到數據后,RI會置1,需手動清0)
{
RXData = SBUF;
if(RXstart) //判斷是否接收到過本地址
{
if(RXData != '$') //判斷是否接收到 數據結束 標志 $
{
temp[j] = RXData; //沒有接收到結束標志,正常保存數據至數組
j++;
}
else //接收到 結束標志 $
{
RXstart= 0; //本次接收結束
SM2 = 1; //重新 配置為:只接收地址 模式,下次發送TB8=1才中斷
j = 0;
}
}
if(RXData == 1) //判斷是否呼叫本機,地址范圍:000 – 254(00 - FE)
{
RXstart = 1; //開始接收數據
SM2 = 0; //配置為:接收數據 模式
}
}
RI = 0; //清除接收標志位
ES = 1; //重新開啟串口中斷
}
四、串口初始化配置
89S51、52、STC12Cxxx + 11.0592M晶振,9600bps
void UART_init()
{
TMOD = 0x20; //定時器1,工作方式2:8位、自動重裝
TH1 = 0xfd; //fd: 9600bps @ 11.0592M
TL1 = 0xfd; //e8: 1200bps @ 11.0592M
//f4: 2400bps @ 11.0592M
REN = 1; //允許串口接收
SM0 = 1;
SM1 = 1; //SM0和SM1:串口工作模式3,主從模式 + 波特率可變
SM2 = 1; //只接收地址(從機如此配置,主機不需要)
ES = 1; //開串口中斷
TR1 = 1; //啟動定時器1
EA = 1; //中斷 總開關
}
五、接線圖和注意事項

1、從機和從機之間通信,只能通過主機中轉。
2、各從機的TXD輸出不能設置為推挽輸出,要設置為開漏輸出。
3、通信總線不能過長,最好不超過2米。

編輯:admin 最后修改時間:2018-05-19


