51單片機:串口多機通信
專欄的第一篇文章,不是串口通信有什麼特別的地方,只是突然想學著別人寫寫博客,記錄自己天天在做的事,順便幫助後人更快的學習。雖然現在感覺寫博客很有趣,但可能以後會堅持不下去,畢竟應該沒多少人會看這個專欄。不過就算沒人看,以後還可以給面試官看看,也算是一種履歷。嗯……現在大三剛開學,應該還有一年半的時間可以記錄,說不定以後會補補之前學的內容呢,就當是複習了。
那,這塊串口通信板是實驗室老師給我布置的任務:
要求實現三個功能:
- 利用單片機自帶串口實現51單片機到51單片機的雙向串列通信。
- 利用單片機IO口實現51單片機到51單片機的雙向高速串列通信(目前達到12萬波特率)。
- 通過串口,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和單片機的區別