51單片機:串口多機通信

專欄的第一篇文章,不是串口通信有什麼特別的地方,只是突然想學著別人寫寫博客,記錄自己天天在做的事,順便幫助後人更快的學習。雖然現在感覺寫博客很有趣,但可能以後會堅持不下去,畢竟應該沒多少人會看這個專欄。不過就算沒人看,以後還可以給面試官看看,也算是一種履歷。嗯……現在大三剛開學,應該還有一年半的時間可以記錄,說不定以後會補補之前學的內容呢,就當是複習了。


那,這塊串口通信板是實驗室老師給我布置的任務:

要求實現三個功能:

  1. 利用單片機自帶串口實現51單片機到51單片機的雙向串列通信。
  2. 利用單片機IO口實現51單片機到51單片機的雙向高速串列通信(目前達到12萬波特率)。
  3. 通過串口,232介面,485介面實現51單片機與PC機的雙向多機通信。

除這些需要實現的功能外,還需要掌握和理解SPI匯流排,I2C匯流排,CAN匯流排的相關內容,及掌握目前主流的通信協議和應用方法,這些以後再說。

這篇博客主要講要求的第三點,及串口多機通信方面的內容,編程語言為51單片機的彙編語言,使用的單片機型號為:STC89C52


實現多機通信的基本思路:

51單片機有一個自帶的串口,在進行多機通信時通常將串口工作模式設置為方式3(主從模式+可調波特率)。

串口在工作方式3下,每個數據幀包含11位信號。其中包括1位起始位(低電平)、8位數據位、1位可編程位(TB8)、1位停止位(高電平)。

數據幀格式:

SCON串口功能寄存器:

串口的多機通信是依靠SCON寄存器里的SM2和RB8兩個功能位實現的,因為其在工作模式三下有如下性質:

當SM2為0時:無論收到數據的第9位是0還是1,都使RI(接收中斷標誌位)置高,接收數據。

當SM2為1時

當接收到的第9位1(地址)時,使RI置高,接收數據。

當接收到的第9位0(數據)時,不置高RI,丟棄數據。

利用上述性質,可以通過軟體編程實現:

SM2=0,第9位數據=0:代表這是發送給本機的數據

SM2=1,第9位數據=1:代表這是廣播的地址

SM2=1,第9位數據=0:代表這不是發送給本機的數據

以上就是利用串口進行多機通信的基本思路。


PC_MCU: MOV DPTR,#PM_TAB MOV A,#0 LCALL PRINTF_LCD SETB SERIAL_FLAG ;置高標誌位,告訴中斷正在和PC通信 MOV A,#03H LCALL SERIAL_READY ;進行方式3的初始化PM_1: LCALL SAO_KEY JNB KEY_UP,PM_K1 LJMP PM_K5PM_K1: JNB KEY_DN,PM_K2 LJMP PM_K5PM_K2: JNB KEY_OK,PM_K3 LJMP PM_K5PM_K3: JNB KEY_RE,PM_K4 RETPM_K4: JNB KEY_SD,PM_K5 CLR ES CLR EA SETB TB8 ;即將發送地址 MOV SBUF,ID ;發送地址 JNB TI,$ CLR TI MOV SBUF,SW_8 ;發送數據 JNB TI,$ CLR TI SETB ES SETB EAPM_K5: LJMP PM_1

推薦閱讀:

看看這個立黨的嘴臉
精簡封裝技巧5----函數指針_鬧鐘
eM4 OS設計中的可重入性
學習單片機的過程
ARM和單片機的區別

TAG:串口 | 單片機 | 硬體 |