MCS-51 串行口
串行通訊的基本概念
通訊的基本方式:串行通訊與并行通訊,串行同步通訊、串行異步通訊,單工、半雙工和全雙工串行通訊。
并行通訊:數據各位同時傳送。 串行通訊:數據一位一位順序傳送。
串行異步通訊:按照事先約定好的速率收發數據。
串行同步通訊
一種串行同步通訊的方法:需要有數據端、同步時鐘端。
MCS-51串行口的基本結構
發送器:將CPU送來的并行數據,通過發送移位寄存器變為串行數據逐位發送,并自動添加起始位、停止位和奇偶校驗位。
接收器:將接收到的串行數據,經接收移位寄存器變為并行數據,去掉起始位、停止位后,將正確數據送到接收數據緩沖器,供CPU讀取。
控制器:接收CPU送來的編程命令,按選定方式實現對串行接口的控制。主要控制參數有:傳送波特率的選擇、數據格式的選擇等。另外還與CPU交換狀態信號和中斷信號。
SCON為串行口控制/狀態寄存器,通過編程寫入SCON的控制位可選擇串行口的工作方式,讀出SCON的狀態位可查詢串行口的工作狀態。
定時/計數器T1被用作串行口的波特率發生器,由可控分頻電路決定數據傳送的波特率。
串行口信息的發送/接收是通過寫/讀數據緩沖區SBUF來實現的。
串行口的SFR
串行數據緩沖器SBUF(99H)
串行口有兩個8位數據緩沖器,一個是發送數據緩沖器SBUF,一個是接收數據緩沖器SBUF。它們共用一個地址99H,發送SBUF只能寫入,而接收SBUF只能讀出。
通過指令區分: MOV SBUF, A(寫指令,發送) MOV A, SBUF(讀指令,接收)
控制寄存器SCON(98H)
SM0 SM1 SM2 REN TB8 RB8 TI RI
節電控制寄存器PCON(87H)
SMOD(D7)
復位后狀態均為00H
串行口控制寄存器SCON
SM0、SM1:串行口4種工作方式選擇位
SM2:方式2和方式3中的多機通信控制位。在方式2和方式3中,如SM2=1,則當接收到的第9位數據(RB8)為0時,不激活接收中斷標示RI(RI=1).在方式1中,如SM2=1,則只有當接收到有效停止位時才激活RI,若沒有接收到有效停止位,則RI清0.在方式0中,SM2必須為0.
需要多機通訊時SM2設為1,不需要時SM2設為0.
REN: 允許串行接收位。REN=1允許接收;REN=0禁止接收,由軟件置位或清0.
TB8:是工作在方式2和3時,要發送的第9位數據,可由軟件置1或清0.在許多的通訊協議中,該位奇偶校驗位。在多機通訊中用來表示是地址幀還是數據幀,TB8=1為地址幀,TB8=0為數據幀。
RB8:當工作在方式2和3時,為接收到的第9位數據。
TI:發送中斷標志位,在方式0串行發送第8位數據結束時由硬件置1,或在其他方式串行發送停止位后置1,并申請中斷。CPU響應中斷后,可發送下一幀數據,TI必須由軟件清0.
RI:為接收結束中斷標志。在方式0中,當接收到一幀數據的第8位結束時,RI=1.在其他方式中,接收到停止位后,RI=1,表示可讀取接收SBUF中的內容。RI必須由軟件清0.
每次發送和接收前,要注意先將TI和RI標志位清0.
串行口作為一個中斷源,中斷入口地址只有一個(0023H),當用中斷方式同時進行發送和接收時,可通過查詢TI和RI狀態確定是發送還是接收結束引起的中斷。
節點控制寄存器PCON
PCON主要用于節電運行方式控制,PCON.7用作串行口波特率加倍控制位。當設定SMOD=1時,波特率加倍,當SMOD=0時,波特率不加倍。
SM0、SM1工作方式選擇位
8位和9位是指串行通訊中一幀數據的有效位
工作方式0:(SM0 = 0 SM1 = 0)
串行口方式0為8位數據同步移位寄存器方式。RXD引腳位同步數據的輸入/輸出端,TXD引腳為同步移位脈沖輸出端。一個數據幀為8位,每一個移位脈沖對應數據幀的一個數據位。方式0的波特率固定為fosc/12.
發送時前提是REN位為0(表示禁止接收),當給SBUF寫入數據并把工作方式設置成0時,REN=1表示允許接收。在TXD管腳輸出的每一個時鐘有效期間內,讀取每個位并存到移位寄存器中完成接收操作。當把8位數據都發送出去時TI位置1,表示發送工作結束
接收到8位數據時自動把RI置1表示接收完一幀數據。TI和RI分別是發送和接收到有效數據的標志。
方式0相當于串行通訊中的同步通訊。方式0下串行口相當于半雙工狀態。
半雙工指的是發送和接收必須是分時存在的,兩個功能不能同時完成。
方式0的說明:
寫入SCON使REN=0,TI=0;然后執行寫入SBUF的指令,8位數據裝入發送SBUF,硬件啟動串行口發送器進行一次發送。通過發送移位寄存器將8位數據逐位送到RXD引腳,每個機器周期內發送一位數據。對應發送數據的每一位,有TXD引腳同步輸出一個移位脈沖。發送完一幀,自動置位TI標志,并申請串行口中斷。若cpu響應中斷,則將從0023H單元開始執行串行口的中斷服務程序。
寫入SCON使REN=1、RI=0,將啟動串行口接收器開始接收。由TXD輸出移位脈沖,每對應一個移位脈沖,采樣一次RXD引腳信號。每個機器周期采樣一次RXD引腳,采樣的數據送入接收移位寄存器后,接收移位寄存器左移一位。接收完一幀,自動置位RI標志,申請串行口中斷,并將接收下來的8位數據裝入接收SBUF中,若CPU響應中斷,則從0023H單元開始執行串行口的中斷服務程序。
串行口方式0常用于擴展單片機的并行I/O口,也可外接串行同步I/O設備。用于方式0輸入/輸出數據皆通過RXD端,因此方式0位半雙工方式,只能分時進行發送和接收。
方式1 (SM0=0 SM1=1)
功能說明:串行口方式1為8位數據全雙工異步通信方式。TXD為發送數據端,RXD為接收數據段。一個數據幀為10位,包含8位數據位,1個起始位“0”和1個停止位“1”。串行口用方式1工作時,使用定時器T1作為波特率發生器,波特率的設定以T1的溢出為基準,波特率計算式為:(2^SMOD/32)*T1溢出率。
方式1的時序圖
方式1功能說明
執行寫入SBUF指令,將8位數據裝入發送SBUF,并啟動發送器進行一次發送:先將起始位“0”送到TXD引腳,再從低到高逐位發送8位數據,最后發送停止位“1”。每位發送占用的時間由設定的波特率決定。發送完一幀數據,置位TI標志,申請串行口中斷。
當REN=1時,允許接收器準備接收。開始,以16倍于波特率的速率檢測RXD引腳的負跳變,當檢測到負跳變后,啟動一次接收,接收完一幀信息,判斷是否滿足條件:RI = 0,而且停止位為1(或SM2=0)。若同時滿足這兩個條件,則置位RI標志,申請串行口中斷,并將接收的8位數據裝入接收SBUF,停止位裝入RB8;否則接收無效,丟失所接收的一幀信息,且不影響RI標志。一位時間以后,接收器重新開始檢測RXD端的負跳變,以準備接收下一幀數據。
方式2、方式3
串行口方式2和方式3皆為9位數據全雙工異步通信方式,比串行口方式1增加了第9位數據位。TXD為發送數據端,RXD為接收數據端。一幀信息有11位,包括9位數據位,1個起始位“0”和1個停止位“1”。發送數據的第9位在SCON中的TB8中(8位數據在SBUF中),接收數據的第9位存入SCON中的RB8中。第9位數據位也稱為可編程位,常用作奇偶校驗位或多機通信中的地址/數據識別位。
串行口的方式2與方式3的唯一差別是波特率設定方法不同,方式2的波特率以系統時鐘為基準,計算方式為:(2^SMOD/64)*fosc. 方式3的波特率與方式1的相同,計算式為:(2^SMOD/32)*T1溢出率。
方式2、3的功能說明
發送時,應先將發送數據的第9位送入TB8,再寫入8位數據發送SBUF,使發送器啟動一次發送,將一幀數據逐位送到TXD引腳:發送起始位“0”之后,再發送SBUF中的8位數據,接著發送TB8中的第9位,最后發送停止位“1”。一幀發送結束,置位TI標志,申請串行口中斷。
方式2和方式3的接收過程和方式1的接收過程基本相同,但RB8中裝入的是接收數據的第9位,而不是停止位。接收有效必須同時滿足的兩個條件改為:RI=0,且接收的第9位數據位為1(或SM2=0)。當正確接收到一幀數據后,前面8位數據進入接收SBUF,第9位數據進入RB8.
波特率的制定
波特率的定義:串行口每秒鐘發送或者接收的位數。
串行口方式0的波特率是固定的,為系統時鐘的12分頻(fosc/12),即每個機器周期傳送一位數據位。
串行口用方式2工作時,波特率為(2^SMOD/64)* fosc。SMOD為PCON中的D7位,即波特率加倍選擇位。方式2可有兩種波特率供選擇,當SMOD=0時,波特率位focs/64;當SMOD=1時,波特率則為fosc/32.
串行口方式1和方式3用定時器T1作為波特率發生器,其波特率有多種選擇,與T1的溢出率有關。
波特率=(2^SMOD/32)* T1溢出率
T1溢出率:T1溢出時間的倒數
T1用于波特率發生器時一般工作于非門控(GATE=0)定時器方式2,即常數自動重裝入方式。
fosc:晶振的頻率
串行口用方式1和方式3工作時,當需要很低的波特率時,也可選擇T1工作于方式1,但需利用T1溢出中斷來實現軟件重裝初值,T1用方式1工作時溢出率為
N為T1溢出后用軟件重裝初值所需的機器周期數。
T1產生的常用波特率
方式0和方式2的波特率是由晶振產生。方式1和3波特率產生是由T1口的溢出率決定,用戶可以隨意設定。
波特率計算的幾點注意事項:
(1)波特率的相對誤差不大于2.5%
(2)注意SMOD位對波特率的影響
例如:通訊波特率設為2400,晶振頻率為6MHz,計算T1 的計時常數。
當SMOD=0時,計時常數約為249,相對誤差7%
當SMOD=1時,計時常數約為243,相對誤差為0.16%。
MCS-51雙機串行通訊的實現
如何進行物理連線?
對串行口進行編程時,應注意1:設置相同的波特率;2:設定相同的串行口的工作方式;3:設計中斷服務程序或查詢程序,注意對TI、RI的處理(硬件置位、軟件清0)
波特率的選擇?
工作方式的選擇?
如何編程實現?
方式3發送50H~55H的內容
待發送的16個字節存放在片內RAM中,地址位為50H~5FH,串行口波特率為2400,波特率發送器T1工作于方式2,且SMOD=0, 晶振為11.0592MHz,計算得到的TL1的初值位F4H,串行口工作于方式3,第9位發送奇偶校驗位。
方式3接收(通過查詢的方法)
接收到的16個字節存放在片內RAM中
地址為50H~5FH
串行口波特率為2400
波特率發生器T1工作于方式2,且SMOD=0
晶振為11.0592MHz
計算得到TL1的初值為F4H
串行口工作于方式3
奇偶校驗方式判斷接收數據書否出錯
設校驗出錯標志位F0
雙機通訊小結
物理接線:TXD---RXD、RXD------TXD 共地
必須一致的波特率
必須一致的工作方式
各自的發送和接收程序可以不同
提高:多機通訊
主機與各從機實現全雙工通信,而各從機之間只能通過主機交換信息。
下圖是由MCS-51構成的集散式分布系統
多機通信控制位SM2的使用:
當串行口以方式2(或方式3)接收時,若SM2=1,則只有接收到第9位數據為1,才將接收的數據裝入接收SBUF,并置位RI標志;否則,不會置位RI,也不產生中斷請求,一幀信息被丟棄。
若SM2=0,則接收到的第9位不論是0還是1,都會將數據裝入SBUF,并置位RI標志。根據這一功能,可實現多機系統中主從一對一通信。
(1)令所有從機SM2=1,處于只接收地址幀狀態(第9位為1)
(2) 主機令TB9=1, 并發送地址呼叫信息
(3) 各從機接收到地址幀后,將接收到的地址與本機地址編號相比較,確認是否為被呼叫目標。
(4)被呼叫從機使SM2請0,變為接收數據幀狀態,而未被呼叫從機仍保持SM2=1.
(5)主機使TB9=0,發送控制或數據信息
(6)只有SM2=0的從機能接收到控制或數據信息,仍保持SM2=1的從機不予理睬。
主機向02號從機發送50H~5FH單元內的數據。發送程序如下:
RS-232的“D”型9針插頭的引腳定義
雙MCS51通過RS232接口通訊
總結
以上是生活随笔為你收集整理的MCS-51 串行口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求图的割点,割边(啊哈算法)
- 下一篇: GaN是否具有可靠性?或者说我们能否如此