51單片機(jī)串口通信及波特率設(shè)置
1. 數(shù)據(jù)緩沖寄存器SBUF
SBUF是可以直接尋址的專用寄存器。物理上,它對(duì)應(yīng)著兩個(gè)寄存器,即一個(gè)發(fā)送寄存器一個(gè)接收寄存器,CPU寫SBUF就是修改發(fā)送寄存器;讀SBUF就是讀接收寄存器。接收器是雙緩沖的,以避免在接收下一幀數(shù)據(jù)之前,CPU未能及時(shí)的響應(yīng)接收器的中斷,沒(méi)有把上一幀的數(shù)據(jù)讀走而產(chǎn)生兩幀數(shù)據(jù)重疊的問(wèn)題。對(duì)于發(fā)送器,為了保持最大的傳輸速率,一般不需要雙緩沖,因?yàn)榘l(fā)送時(shí)CPU是主動(dòng)的,不會(huì)產(chǎn)生重疊問(wèn)題。
2. 狀態(tài)控制寄存器SCON
SCON是一個(gè)逐位定義的8位寄存器,用于控制串行通信的方式選擇、接收和發(fā)送,指示串口的狀態(tài),SCON即可以字節(jié)尋址也可以位尋址,字節(jié)地址98H,地址位為98H~9FH。它的各個(gè)位定義如下:
MSB LSB
SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
SM0和SM1是串口的工作方式選擇位,2個(gè)選擇位對(duì)應(yīng)4種工作方式,如下表,其中Fosc是振蕩器的頻率。
SM0 SM1 | 工作方式 | 功能 | 波特率 |
0 0 | 0 | 8位同步移位寄存器 | Fosc/12 |
0 1 | 1 | 10位UART | 可變 |
1 0 | 2 | 11位UART | Fosc/64或Fosc/32 |
1 1 | 3 | 11位UART | 可變 |
SM2在工作方式2和3中是多機(jī)通信的使能位。在工作方式0中,SM2必須為0。在工作方式1中,若SM2=1且沒(méi)有接收到有效的停止位,則接收中斷標(biāo)志位RI不會(huì)被激活。在工作方式2和3中若SM2=1且接收到的第9位數(shù)據(jù)(RB8)為0,則接收中斷標(biāo)志RB8不會(huì)被激活,若接收到的第9位數(shù)據(jù)(RB8)為1,則RI置位。此功能可用于多處理機(jī)通信。
REN為允許串行接收位,由軟件置位或清除。置位時(shí)允許串行接收,清除時(shí)禁止串行接收。
TB8是工作方式2和3要發(fā)送的第9位數(shù)據(jù)。在許多通信協(xié)議中該位是奇偶位,可以按需要由軟件置位或清除。在多處理機(jī)通信中,該位用于表示是地址幀還是數(shù)據(jù)幀。
RB8是工作方式2和3中接收到的第9位數(shù)據(jù)(例如是奇偶位或者地址/數(shù)據(jù)標(biāo)識(shí)位),在工作方式1中若SM2=0,則RB8是已接收的停止位。在工作方式0中RB8不使用。
TI 為發(fā)送中斷標(biāo)志位,由硬件置位,軟件清除。工作方式0中在發(fā)送第8位末尾由硬件置位;在其他工作方式時(shí),在發(fā)送停止位開(kāi)始時(shí)由硬件置位。TI=1時(shí),申請(qǐng)中斷。CPU響應(yīng)中斷后,發(fā)送下一幀數(shù)據(jù)。在任何工作方式中都必須由軟件清除TI。
RI為接收中斷標(biāo)志位,由硬件置位,軟件清除。工作方式0中在接收第8位末尾由硬件置位;在其他工作方式時(shí),在接收停止位的中間由硬件置位。RI=1時(shí),申請(qǐng)中斷,要求CPU取走數(shù)據(jù)。但在工作方式1中,SM2=1且未接收到有效的停止位時(shí),不會(huì)對(duì)RI置位。在任何工作方式中都必須由軟件清除RI。
系統(tǒng)復(fù)位時(shí),SCON的所有位都被清除。
控制寄存器PCON也是一個(gè)逐位定義的8位寄存器,目前僅僅有幾位有定義,如下所示:
MSB LSB
SMOD | —— | —— | —— | GF1 | GF0 | PD | IDL |
僅最高位SMOD與串口的控制有關(guān),其他位與掉電方式有關(guān)。PCON的地址為87H只能按字節(jié)尋址,SMOD是串行通信波特率系數(shù)控制位,當(dāng)串口工作在工作方式1、2時(shí),若使用T1作為波特率發(fā)生器其SMOD=1則波特率加倍(見(jiàn)下面詳述)。
GF1 和GF0用于一般的用途,對(duì)于AT89系列為通用的標(biāo)志位,PD為電源下降位,對(duì)于AT89系列,PD為1進(jìn)入掉電狀態(tài),IDL為IDLE模式位,對(duì)于AT89系列,IDL為1進(jìn)入空閑工作方式,在PD和IDL同時(shí)為1時(shí),PD優(yōu)先。
(1) 工作方式0
SM0=0且SM1=0時(shí),串口選擇工作方式0,實(shí)質(zhì)這是一種同步移位寄存器模式。
其數(shù)據(jù)傳輸?shù)牟ㄌ芈使潭镕osc/12,數(shù)據(jù)由RXD引腳輸入或輸出,同步時(shí)鐘由TXD引腳輸出。接收/發(fā)送的是8位數(shù)據(jù),傳輸是低位在前,幀格式如下:
…….. | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | ……. |
(2)工作方式1
當(dāng)SM0=0且SM1=1時(shí),串口選擇工作方式1,其數(shù)據(jù)傳輸?shù)牟ㄌ芈视啥〞r(shí)/計(jì)數(shù)器T1、T2的溢出速率決定,可通過(guò)程序設(shè)定。當(dāng)T2CON寄存器中的RCLK和TCLK置位時(shí),用T2作為發(fā)送和接收波特率發(fā)生器,而RCLK=TCLK=0時(shí),用T1作為波特率發(fā)生器,兩者還可以交叉使用,即發(fā)送和接收采用不同的波特率。數(shù)據(jù)由TXD引腳發(fā)送,由RXD引腳接收。
發(fā)送或接收一幀的數(shù)據(jù)為10位,即1位起始位(0)、8位數(shù)據(jù)位(低位在先)和1位停止位(1)。真格式如下:
起始位0 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | 停止位1 |
類似于工作方式0,當(dāng)執(zhí)行任一條SBUF指令時(shí),就啟動(dòng)串行數(shù)據(jù)的發(fā)送。在執(zhí)行寫入SBUF的指令時(shí),也將“1”寫入發(fā)送移位寄存器的第9位,并通知發(fā)送控制器有發(fā)送請(qǐng)求。實(shí)際上,發(fā)送過(guò)程始于內(nèi)部的16分頻計(jì)數(shù)器下次滿度翻轉(zhuǎn)(全“1”變?nèi)?ldquo;0”)后的那幾個(gè)機(jī)器周期的開(kāi)始。所以,每位的發(fā)送過(guò)程與16分頻計(jì)數(shù)器同步,而不是與“寫SBUF”同步。
此方式的工作過(guò)程包括發(fā)送和接收兩部分。
當(dāng)執(zhí)行任一條寫SBUF指令時(shí),就啟動(dòng)串行數(shù)據(jù)的發(fā)送。在執(zhí)行寫入SBUF的指令時(shí),也將“1”寫入發(fā)送移位寄存器的第9位,并使發(fā)送控制器開(kāi)始發(fā)送。在這期間,內(nèi)部的定時(shí)保證寫入SBUF與激活發(fā)送之間有一個(gè)完整的機(jī)器周期。當(dāng)發(fā)送脈沖有效后,移位寄存器的內(nèi)容由RXD引腳串行移位輸出,移位脈沖由TXD引腳輸出。
在發(fā)送有效的每個(gè)機(jī)器周期,發(fā)送移位寄存器右移一位,就在其左邊補(bǔ)“0 ”。當(dāng)數(shù)據(jù)的最高位移到移位寄存器的輸出時(shí),原寫入第9位的“1”正好移到最高位的左邊一位,由此向左的所有位都為“0”,這標(biāo)志著發(fā)送控制器要進(jìn)行最后依次移位,并撤消發(fā)送有效,同時(shí)使發(fā)送中斷標(biāo)志TI置位。
當(dāng)REN=1且接收中斷標(biāo)志RI位清除時(shí),即啟動(dòng)一個(gè)接收過(guò)程。在下一個(gè)機(jī)器周期,接收控制器將“11111110”寫入接收移位寄存器,并在下一周期內(nèi)激發(fā)接收有效,同時(shí)由TXD引腳輸出移位脈沖。在移位脈沖的控制下,接收移位寄存器的內(nèi)容每一個(gè)機(jī)器周期左移一位,同時(shí)由RXD引腳接收一位輸入信號(hào)。
每當(dāng)接收移位寄存器左移一位,原寫入的“11111110”也左移一位。當(dāng)最右邊的“0”移到最左邊時(shí),標(biāo)志著接收控制器要進(jìn)行最后一次移位。在最后移位即將結(jié)束時(shí),接收移位寄存器的內(nèi)容送入到接收數(shù)據(jù)緩沖寄存器SBUF,然后在啟動(dòng)接收的第10個(gè)機(jī)器周期時(shí),清除接收信號(hào),將RI置位。
如果在第一個(gè)時(shí)鐘周期中接收到的不是起始位(“0”),就復(fù)位接收電路,繼續(xù)檢測(cè)RXD引腳上1到0的跳變。如果接收到的是起始位,就將其移入接收移位寄存器,然后接收該幀的其他位。接收到的位從右邊移入,原來(lái)寫入的1從左邊移出,當(dāng)起始位移到最左邊時(shí),接收控制器將控制進(jìn)行最后一次移位,把接收到的第9為數(shù)據(jù)送到接收數(shù)據(jù)緩沖器SBUF和RB8,同時(shí)置位RI。
在進(jìn)行最后一次移位時(shí),能將數(shù)據(jù)送入到接收數(shù)據(jù)緩沖器SBUF和RB8而且置位RI的條件如下:
● RI=0,即上一真數(shù)據(jù)接收完成時(shí),發(fā)出的中斷請(qǐng)求已經(jīng)被響應(yīng),SBUF中的上一幀數(shù)據(jù)已經(jīng)被取走。
● SM2=0或接收到的停止位為1。
這兩個(gè)條件有一個(gè)不滿足接收到的數(shù)據(jù)就有可能丟失,并且無(wú)法修復(fù);如兩者都滿足則數(shù)據(jù)裝入SBUF,停止位裝入RB8且置位RI。
開(kāi)始發(fā)送后的一個(gè)位周期,發(fā)送信號(hào)有效,開(kāi)始將起始位送TXD引腳。一位時(shí)間后,數(shù)據(jù)信號(hào)有效。發(fā)送移位寄存器將數(shù)據(jù)由低位到高位順序輸出至TXD引腳。一位時(shí)間后第一個(gè)移位脈沖出現(xiàn),將最低數(shù)據(jù)位從右邊移出,同時(shí)從左邊補(bǔ)上“0”。當(dāng)數(shù)據(jù)的最高位移到移位寄存器的輸出端時(shí),先前寫入第9位的“1”正好移到最高位的左邊一位,而它的左區(qū)全部為“0”。在第10個(gè)位周期(16分頻計(jì)數(shù)器回0時(shí)),發(fā)送控制器要進(jìn)行最后一次清除發(fā)送信號(hào),同時(shí)使發(fā)送中斷標(biāo)志TI置位。
當(dāng)REN=1且接收中斷標(biāo)志RI位清除后,若在RXD引腳上檢測(cè)到一個(gè)由“1”到“0”的跳變,立即啟動(dòng)一次接收的過(guò)程。同時(shí)復(fù)位16分頻計(jì)數(shù)器,使輸入位的邊沿與時(shí)鐘對(duì)齊,并將1FFH(9個(gè)“1”)寫入接收移位寄存器。接收控制器繼續(xù)以波特率的16倍的速率繼續(xù)對(duì)RXD引腳進(jìn)行檢測(cè),對(duì)每一位時(shí)間的第7、8、9個(gè)計(jì)數(shù)狀態(tài)的采樣值用多數(shù)表決法,當(dāng)2次或2次以上的采樣值相同時(shí),采樣值被接受。
(1) 工作方式2和3
當(dāng)SM0=1且SM1=0時(shí),串口選擇工作方式2,當(dāng)SM0=1且SM1=1時(shí),串口選擇工作方式3。數(shù)據(jù)由TXD引腳發(fā)送由RXD引腳接收。
發(fā)送和接收的一幀信息為11位,即1位起始位(0),9位數(shù)位(低位在前,第9位數(shù)據(jù)位是可編程位)1位停止位(1)。發(fā)送時(shí),可編程位(TB8)可賦0或1,接收時(shí)可編程位進(jìn)入SCON中的RB8。幀的格式如下:
起始位0 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | 可編程位D8 | 停止位1 |
評(píng)論