單片微型計算機(jī)原理及接口技術(shù) 課件匯 陳桂友 17-串行通信-34 DMA模塊_第1頁
單片微型計算機(jī)原理及接口技術(shù) 課件匯 陳桂友 17-串行通信-34 DMA模塊_第2頁
單片微型計算機(jī)原理及接口技術(shù) 課件匯 陳桂友 17-串行通信-34 DMA模塊_第3頁
單片微型計算機(jī)原理及接口技術(shù) 課件匯 陳桂友 17-串行通信-34 DMA模塊_第4頁
單片微型計算機(jī)原理及接口技術(shù) 課件匯 陳桂友 17-串行通信-34 DMA模塊_第5頁
已閱讀5頁,還剩494頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

單片微型計算機(jī)原理及接口技術(shù)(17)1/242/24隨著計算機(jī)測控系統(tǒng)和物聯(lián)網(wǎng)的發(fā)展,通信功能顯得越來越重要。STC8H8K64U單片機(jī)集成了:4個異步串行通信接口(UART)1個SPI通信口1個I2C接口1個USB接口3/24內(nèi)容提綱一串行通信的相關(guān)概念二串行通信的分類三通用異步接收器/發(fā)送器UART4/24串行通信的相關(guān)概念一5/24一.串行通信的相關(guān)概念串行通信——數(shù)據(jù)一位一位地順序傳送基本的數(shù)據(jù)通信方式有兩種:并行通信——數(shù)據(jù)的各位同時傳送6/24串行通信的分類二7/24二.串行通信的分類-11、按照通信格式的同步方式分類按照該分類方法,串行通信可分為異步通信和同步通信。(1)異步通信在異步傳送中,每一個字符要用起始位(0)和停止位(1)作為字符開始和結(jié)束的標(biāo)志,它們是以字符位為單位一個個地發(fā)送和接收的。8/24二.串行通信的分類-2異步通信的數(shù)據(jù)幀格式(7個數(shù)據(jù)位)9/24二.串行通信的分類-3異步通信的數(shù)據(jù)幀格式(8個數(shù)據(jù)位)10/24二.串行通信的分類-4在異步數(shù)據(jù)傳送中,CPU與外設(shè)之間事先必須約定好以下內(nèi)容:1)字符格式雙方要設(shè)定好字符的編碼形式、奇偶校驗形式、起始位和停止位的規(guī)定。2)通信速率通信速率通常使用波特率來表示。典型的表示方法:如,9600,n,8,1波特率為9600bps沒有奇偶校驗8個數(shù)據(jù)位1個停止位11/24二.串行通信的分類-5(2)同步通信同步通信效率高,但線路復(fù)雜,適合于近距離通信。同步傳送時需要注意的是:同步通信的收/發(fā)雙方必須使用相同的同步字符;在同步傳送中要求用同步時鐘來實現(xiàn)發(fā)送端和接收端之間的嚴(yán)格同步,而且對同步時鐘脈沖信號的相位一致性要求非常嚴(yán)格。12/24二.串行通信的分類-62、按照數(shù)據(jù)的傳送方向分類(1)單工方式:只允許數(shù)據(jù)按一個固定的方向傳送。無線電廣播13/24二.串行通信的分類-72、按照數(shù)據(jù)的傳送方向分類(2)半雙工方式:數(shù)據(jù)可以從A發(fā)送到B,也可以從B發(fā)送到A。但同一時刻只能向一個方向傳送。對講機(jī)14/24二.串行通信的分類-82、按照數(shù)據(jù)的傳送方向分類(3)全雙工方式:數(shù)據(jù)可同時在兩個方向上傳送。手機(jī)15/24二.串行通信的分類-72、按照數(shù)據(jù)的傳送方向分類多終端通信方式16/24通用異步接收器/發(fā)送器UART三17/241.串行接口

在串行傳送中,數(shù)據(jù)是一位一位按順序進(jìn)行傳送的,而計算機(jī)內(nèi)部的數(shù)據(jù)是并行傳送的。因此當(dāng)計算機(jī)向外發(fā)送數(shù)據(jù)時,必須將并行的數(shù)據(jù)轉(zhuǎn)換為串行的數(shù)據(jù)再行傳送。反之,又必須將串行數(shù)據(jù)轉(zhuǎn)換為并行數(shù)據(jù)輸入計算機(jī)中。上述并→串或串→并的轉(zhuǎn)換既可以用軟件實現(xiàn),也可用硬件實現(xiàn)。但由于用軟件實現(xiàn)會使CPU的負(fù)擔(dān)增加,降低了其利用率,故目前往往用硬件完成這種轉(zhuǎn)換。通用的異步接收器/發(fā)送器(UART,UniversalAsynchronousReceiver/Transmitter)就可實現(xiàn)上述“串行-并行轉(zhuǎn)換”,是串行接口的核心部件。18/241.串行接口串行接口通過系統(tǒng)總線和CPU相連。19/242.通用的異步接收器/發(fā)送器UART的結(jié)構(gòu)硬件UART既能發(fā)送,實現(xiàn)并行→串行輸出;又能接收,實現(xiàn)串行→并行輸入。對每一方來說都是一個雙緩沖器結(jié)構(gòu)。當(dāng)UART接收數(shù)據(jù)時,串行數(shù)據(jù)先經(jīng)RXD端進(jìn)入移位寄存器,再經(jīng)移位寄存器輸出并行數(shù)據(jù)到緩沖器,最后通過數(shù)據(jù)總線送到CPU;當(dāng)UART發(fā)送信息時,先由CPU經(jīng)數(shù)據(jù)總線將并行數(shù)據(jù)送給緩沖器,再由并行緩沖器送給移位寄存器,最后逐位由TXD端輸出。所有這些工作都是在時鐘信號和其他控制信號作用下完成的。圖8-8

硬件UART的結(jié)構(gòu)硬件UART的結(jié)構(gòu)如圖8-8所示。20/24在UART中設(shè)置有出錯標(biāo)志,一般有以下3種:1)奇偶錯誤(Parityerror)UART在接收時會檢查字符中的每一位(包括奇偶校驗位),計算其“1”的總和是否符合奇偶檢驗的要求,以確定是否發(fā)生傳送錯誤。2)幀錯誤(Frameerror)當(dāng)接收時鐘和發(fā)送時鐘的頻率相差太大,從而引起在起始位之后剛采樣幾次就造成錯位時,會出現(xiàn)停止位(按規(guī)定停止位應(yīng)為高電平)為低電平(此情況下,未必每個停止位都是低電平),從而引起信息幀格式錯誤,幀錯誤標(biāo)志FE置位。3)溢出(丟失)錯誤(Overrunerror)UART接收端在接收到第一個字符后便放入接收數(shù)據(jù)緩沖器,繼續(xù)從RXD線上接收第二個字符,并等待CPU從接收數(shù)據(jù)緩沖器中取走第一個字符。如果CPU很忙,一直沒有機(jī)會取走第一個字符,以致接收到的第二字符進(jìn)入接收數(shù)據(jù)緩沖器而造成第一個字符被丟失,于是產(chǎn)生了溢出錯誤,UART自動使溢出錯誤標(biāo)志OE置位。一旦傳送中出現(xiàn)上述錯誤,會發(fā)出出錯信息。3.通用的異步接收器/發(fā)送器UART的出錯標(biāo)志21/24

UART是用外部時鐘的方法與數(shù)據(jù)進(jìn)行同步的。外部的時鐘周期Tc和數(shù)據(jù)中每一位數(shù)據(jù)所占的時間Td有如下關(guān)系:Tc=Td/K其中,K=16或64。若K=16,在每一個時鐘脈沖的上升沿采樣接收數(shù)據(jù)線,當(dāng)發(fā)現(xiàn)了第一個“0”(即起始位的開始),以后又連續(xù)采樣8個“0”,則確定它為起始位(不是干擾信號),然后開始讀出接收數(shù)據(jù)的每個數(shù)位值,如下圖所示。4.通用的異步接收器/發(fā)送器UART的同步過程22/24

由于每個數(shù)據(jù)位時間Td為外部時鐘的16倍,所以每16個外部時鐘脈沖讀一次數(shù)據(jù)位。從下圖中可以看出,取樣時間正好在數(shù)據(jù)位時間的中間時刻,這就避開了信號在上升或下降時可能產(chǎn)生的不穩(wěn)定狀態(tài),保證了采樣數(shù)值的正確。

UART接收數(shù)據(jù)的讀數(shù)時刻23/24下一講內(nèi)容

1、STC8H8K64U單片機(jī)的串口簡介

2、STC8H8K64U的串口寄存器

3、STC8H8K64U單片機(jī)的串口工作模式24/24單片微型計算機(jī)原理及接口技術(shù)(18)25/29內(nèi)容提綱二STC8H8K64U的串口寄存器三STC8H8K64U單片機(jī)的串口工作模式一STC8H8K64U單片機(jī)的串口簡介26/29STC8H8K64U的串口簡介一27/29STC8H8K64U單片機(jī)具有4個采用UART工作方式的全雙工串行通信接口(串口1、串口2、串口3、串口4)。每個串口由2個數(shù)據(jù)緩沖器、1個移位寄存器、1個串行控制寄存器和一個波特率發(fā)生器等組成。每個串口的數(shù)據(jù)緩沖器由接收緩沖器和發(fā)送緩沖器構(gòu)成,它們在物理上是獨立的,既可以接收數(shù)據(jù)也可以發(fā)送數(shù)據(jù),還可以同時發(fā)送和接收數(shù)據(jù)。接收緩沖器只能讀出,不能寫入,而發(fā)送緩沖器則只能寫入,不能讀出。它們共用一個地址號,但在物理上是獨立的。STC8H8K64U的串口1既可以用于異步串行通信,也可以構(gòu)成同步移位寄存器。串口1與傳統(tǒng)8051單片機(jī)的串口完全兼容。串口2~4的結(jié)構(gòu)、工作原理與串口1類似,只能用于異步串行通信。28/29串口1有四種工作模式,可通過對寄存器SCON中SM0、SM1位的設(shè)置進(jìn)行選擇,其中兩種工作模式的波特率可變,另外兩種是固定的。串口2/串口3/串口4都只有兩種工作模式,可通過對寄存器S2CON中S2SM0、S3SM0和S4SM0位的設(shè)置進(jìn)行選擇,兩種工作模式的波特率都是可變的。用戶可用軟件選擇不同的工作模式,并設(shè)置不同的波特率。主機(jī)可通過查詢或中斷方式對接收/發(fā)送進(jìn)行程序處理,使用十分靈活。通過設(shè)置相關(guān)的特殊功能寄存器,串口1、串口2、串口3、串口4的引腳均可以進(jìn)行切換(請參見第三章)。功能引腳的切換功能不僅可以使得電路板的布線更加合理,而且還可以將一個通信接口分時復(fù)用為多個通信接口。

29/29STC8H8K64U的UART接口的寄存器二30/29表8-1新出現(xiàn)的與串口有關(guān)的特殊功能寄存器寄存器地址b7b6b5b4b3b2b1b0復(fù)位值SCON98HSM0/FESM1SM2RENTB8RB8TIRI00000000BSBUF99H

00000000BS2CON9AHS2SM00S2SM2S2RENS2TB8S2RB8S2TIS2RI00000000BS2BUF9BH

00000000BS3CONACHS3SM0S3ST3S3SM2S3RENS3TB8S3RB8S3TIS3RI00000000BS3BUFADH

00000000BS4CON84HS4SM0S4ST4S4SM2S4RENS4TB8S4RB8S4TIS4RI00000000BS4BUF85H

00000000BPCON87HSMODSMOD0LVDFPOFGF1GF0PDIDL00110000BAUXR8EHT0x12T1x12UART_M0x6TR2T2_C/T

T2x12EXTRAMS1ST200000000BSADDRA9H

00000000BSADENB9H

00000000B除了與中斷和定時器相關(guān)的特殊功能寄存器外,新出現(xiàn)的與串口有關(guān)的特殊功能寄存器如表8-1所示。31/291、串口控制寄存器SCON指定串口1的工作模式串行通信模式控制位串口工作于模式2或模式3,SM2位是進(jìn)行主-從多機(jī)通信的控制位。模式1和模式0為非多機(jī)通信方式,SM2應(yīng)設(shè)置為0。允許接收控制位發(fā)送的第9位數(shù)據(jù)接收到的第9位數(shù)據(jù)發(fā)送中斷標(biāo)志位必須用軟件清零接收中斷標(biāo)志位必須用軟件清零SCON的內(nèi)容只能使用字節(jié)操作指令設(shè)定。32/29

表8-2串口1的工作方式SM0SM1串口1工作模式功能說明波特率00模式0同步移位串行模式當(dāng)UART_M0x6=0時,波特率為SYSclk/12;當(dāng)UART_M0x6=1時,波特率為SYSclk/201模式1可變波特率8位數(shù)據(jù)模式串口1用T1作為波特率發(fā)生器且T1工作于模式0(16位自動重裝模式)或串口1用T2作為波特率發(fā)生器時的波特率為:波特率=(T1的溢出率或T2的溢出率)/4。10模式2固定波特率9位數(shù)據(jù)模式波特率=(2SMOD/64)*SYSclk11模式3可變波特率9位數(shù)據(jù)模式與模式1波特率的計算方法相同SM0/FE:PCON寄存器中的SMOD0位為1時,該位用于幀錯誤檢測,當(dāng)檢測到一個無效停止位時,通過UART接收器設(shè)置該位。它必須由軟件清零。PCON寄存器中的SMOD0為0時,該位和SM1一起指定串行通信的工作方式。33/29

(2)SM2:多機(jī)通信控制位。多機(jī)通信主要指單片機(jī)通信時工作于模式2和模式3。SM2位主要用于模式2和模式3,是進(jìn)行主-從多機(jī)通信的控制位。這種多機(jī)通信方式一般為“一臺主機(jī),多臺從機(jī)”系統(tǒng),主機(jī)發(fā)送的信息可被各從機(jī)接收,而從機(jī)只能與主機(jī)進(jìn)行通信,從機(jī)間互相不能直接通信。設(shè)有一個由主機(jī)(單片機(jī)或其他具有串行接口的設(shè)備)和3個STC8H8K64U單片機(jī)組成的從機(jī)系統(tǒng),則多機(jī)通信系統(tǒng)示意圖如下圖所示。圖

多機(jī)通信系統(tǒng)示意圖34/29

實現(xiàn)多機(jī)通信的過程:(1)主、從機(jī)均初始化為模式2或模式3,置SM2=1,允許中斷。(2)主機(jī)置TB8=1,發(fā)送要尋址的從機(jī)地址。(3)所有從機(jī)均接收主機(jī)發(fā)送的地址,并進(jìn)行地址比較。(4)被尋址的從機(jī)確認(rèn)地址后,置本機(jī)SM2=0,此時可向主機(jī)返回地址,供主機(jī)核對。(5)核對無誤后,主機(jī)向被尋址的從機(jī)發(fā)送命令,通知從機(jī)接收或發(fā)送數(shù)據(jù)。(6)通信只能在主、從機(jī)之間進(jìn)行,兩個從機(jī)之間的通信需通過主機(jī)作中介。(7)本次通信結(jié)束后,主、從機(jī)重置SM2=1,主機(jī)可再對其他從機(jī)尋址。在實際工程應(yīng)用中,這種多機(jī)通信中的接口協(xié)議常用RS-485標(biāo)準(zhǔn)。RS-485是一種多發(fā)送器的電路標(biāo)準(zhǔn),它允許雙導(dǎo)線上一個發(fā)送器驅(qū)動最多256個負(fù)載設(shè)備(不同的芯片數(shù)量不同)。RS-485為半雙工,在某一時刻,一個發(fā)送另一個接收。在電路設(shè)計上,平衡連接電纜兩端要有終端電阻。常用的RS-485芯片是MAX1487(目前也出現(xiàn)了很多與其兼容的芯片),其包含一個驅(qū)動器和一個接收器,適合于RS-485通信標(biāo)準(zhǔn)的低功率收發(fā)器。詳細(xì)信息及使用方法,請參見相關(guān)手冊。35/29

若以TB8位作為奇偶校驗位,處理方法為:在數(shù)據(jù)寫入SBUF之前,先將數(shù)據(jù)的奇偶位寫入TB8。可以編程如下(假設(shè)使用工作寄存器區(qū)2的R0作為發(fā)送數(shù)據(jù)區(qū)地址指針):RIPTI: PUSH PSW ;保護(hù)現(xiàn)場 PUSH ACC SETB PSW.4 CLR PSW.3 ;選擇工作寄存器區(qū)2 CLR TI ;發(fā)送中斷標(biāo)志TI清零 MOV A,@R0 ;取數(shù)據(jù) MOV C,P MOV TB8,C MOV SBUF,A ;數(shù)據(jù)寫入到發(fā)送緩沖器,啟動發(fā)送器 INC R0 ;數(shù)據(jù)指針加1 POP ACC POP PSW ;恢復(fù)現(xiàn)場 RETI36/292.串口2控制寄存器S2CON指定串口2的工作模式S2SM0串口2工作模式功能說明波特率0模式0可變波特率8位數(shù)據(jù)方式(T2的溢出率)/41模式1可變波特率9位數(shù)據(jù)方式(T2的溢出率)/437/293.串口3控制寄存器S3CON指定串口3的工作模式S3SM0串口3工作模式功能說明波特率0模式0可變波特率8位數(shù)據(jù)方式(T2的溢出率)/4或(T3的溢出率)/41模式1可變波特率9位數(shù)據(jù)方式(T2的溢出率)/4或(T3的溢出率)/4串口3波特率發(fā)生器選擇0:選擇T2作為串口3的波特率發(fā)生器。1:選擇T3作為串口3的波特率發(fā)生器。38/29

4.串口4控制寄存器S4CON指定串口4的工作模式串口4波特率發(fā)生器選擇0:選擇T2作為串口4的波特率發(fā)生器。1:選擇T4作為串口4的波特率發(fā)生器。S4SM0串口4工作模式功能說明波特率0模式0可變波特率8位數(shù)據(jù)方式(T2的溢出率)/4或(T4的溢出率)/41模式1可變波特率9位數(shù)據(jù)方式(T2的溢出率)/4或(T4的溢出率)/439/295.掉電控制寄存器PCON串行口波特率系數(shù)控制位。0:串口1各工作模式的波特率均不加倍。1:串口1模式1、模式2和模式3的波特率加倍。幀錯誤檢測有效控制。1:使能幀錯誤檢測功能。此時SCON中的SM0/FE為FE功能,即為幀錯誤檢測標(biāo)志位。0:無幀錯檢測功能。40/296.輔助寄存器AUXR串口1模式0的通信速度設(shè)置位。1:串口1模式0的波特率6倍速,即固定為Fosc/12*6=Fosc/2。0:串口1模式0的波特率不加倍,固定為Fosc/12。串口1波特率發(fā)生器選擇位。0:選擇定時器1作為波特率發(fā)生器。1:選擇定時器2作為波特率發(fā)生器。41/297.從機(jī)地址控制寄存器為了方便多機(jī)通信,STC8H8K64U單片機(jī)設(shè)置了從機(jī)地址控制寄存器SADEN和SADDR。其中,SADEN是從機(jī)地址掩模寄存器(地址為B9H,復(fù)位值為00H),SADDR是從機(jī)地址寄存器(地址為A9H,復(fù)位值為00H)。主機(jī)可以用從機(jī)地址來選擇性地訪問從機(jī),可以用廣播的方式來尋址所有的從機(jī)。從機(jī)的地址由SADDR和SADEN寄存器定義,從機(jī)地址是由SADDR設(shè)定的8位數(shù)據(jù),如果SADEN中相應(yīng)的位置0,則SADDR中對應(yīng)的位無效。只有當(dāng)SADEN中的相應(yīng)位為1,SADDR中的數(shù)據(jù)才有效。也就是說,SADEN寄存器使能串口的自動地址識別功能,當(dāng)SADEN中的某位被置為1,那么SADDR寄存器中的相應(yīng)位會與接收到的數(shù)據(jù)進(jìn)行比較。如果SADEN.n被設(shè)為0,那么系統(tǒng)會忽略對該位的比較。如果SADEN為全0,那么對于所有的地址幀系統(tǒng)都會產(chǎn)生中斷。42/297.從機(jī)地址控制寄存器例如SADDR= 11001010SADEN= 10000001則匹配地址為 1xxxxxx0即,只要主機(jī)送出的地址數(shù)據(jù)中的bit0為0且bit7為1就可以和本機(jī)地址相匹配再例如SADDR= 11001010SADEN= 00001111則匹配地址為 xxxx1010即,只要主機(jī)送出的地址數(shù)據(jù)中的低4位為1010就可以和本機(jī)地址相匹配,而高4為被忽略,可以為任意值。43/29

8.?dāng)?shù)據(jù)緩沖器數(shù)據(jù)緩沖器用于保存要發(fā)送的數(shù)據(jù)或者從串口接收到的數(shù)據(jù)。串口1的數(shù)據(jù)緩沖器是SBUF(地址是99H),串口2的數(shù)據(jù)緩沖器是S2BUF(地址是9BH),串口3的數(shù)據(jù)緩沖器是S3BUF(地址是ADH),串口4的數(shù)據(jù)緩沖器是S4BUF(地址是85H)。對于串口1,SBUF是用來存放發(fā)送和接收數(shù)據(jù)的兩個獨立的緩沖寄存器,CPU執(zhí)行給SBUF賦值的語句時,觸發(fā)串口1的發(fā)送,串口1便一位一位地發(fā)送數(shù)據(jù),發(fā)送完成后標(biāo)志TI=1;在CPU允許接收串行數(shù)據(jù)時,外部串行數(shù)據(jù)經(jīng)RXD送入SBUF,電路便自動啟動接收,第9位則裝入SCON寄存器的RB8位,直至完成一幀數(shù)據(jù)后將RI置1,當(dāng)串口接收緩沖器接收到一幀數(shù)據(jù)時,可以執(zhí)行讀取SBUF內(nèi)容的語句讀取串口數(shù)據(jù),如rxbuffer=SBUF。對于串口2、串口3和串口4,數(shù)據(jù)緩沖寄存器的功能與使用方法和串口1的SBUF相似,讀者可參考學(xué)習(xí),在此不做詳細(xì)描述。44/29STC8H8K64U的串口工作模式三45/29(1)串口1的工作模式1)串口1工作模式0當(dāng)軟件設(shè)置SCON的SM0、SM1為“00”時,串口1工作于模式0,串行通信接口工作在同步移位寄存器模式,RxD為串行通訊的數(shù)據(jù)口,TxD為同步移位脈沖輸出腳,發(fā)送、接收的是8位數(shù)據(jù),低位在先。該模式下,必須清0多機(jī)通信控制位SM2,使之不影響TB8位和RB8位。模式0的發(fā)送過程:當(dāng)主機(jī)執(zhí)行將數(shù)據(jù)寫入發(fā)送緩沖器SBUF指令時啟動發(fā)送,串行口即將8位數(shù)據(jù)從RxD引腳輸出(從低位到高位),發(fā)送完中斷標(biāo)志TI置1,TxD引腳輸出同步移位脈沖信號。串口1工作模式0的發(fā)送數(shù)據(jù)時序圖如圖8-10-1所示。圖8-10-1串口1工作方式0發(fā)送數(shù)據(jù)時序2.STC8H8K64U的串口工作模式46/29模式0的接收過程:首先將接收中斷請求標(biāo)志RI清零并置位允許接收控制位REN時啟動模式0接收過程。啟動接收過程后,RxD為串行數(shù)據(jù)輸入端,TxD為同步脈沖輸出端。當(dāng)接收完成一幀數(shù)據(jù)(8位)后,控制信號復(fù)位,中斷標(biāo)志RI被置1,呈中斷申請狀態(tài)。當(dāng)再次接收時,必須通過軟件將RI清0。串口1工作模式0的接收數(shù)據(jù)時序圖如圖8-10-2所示。圖8-10-2串口1工作模式0接收數(shù)據(jù)時序串口1工作模式0時的波特率:當(dāng)UART_M0x6=0時,波特率為SYSclk/12;當(dāng)UART_M0x6=1時,波特率為SYSclk/2。其中,SYSclk為系統(tǒng)工作頻率。47/292)串口1工作模式1當(dāng)軟件設(shè)置SCON寄存器的SM0、SM1為“01”時,串行口1工作于模式1。此方式為8位UART格式,一幀信息為10位,包括1位起始位,8位數(shù)據(jù)位(低位在先)和1位停止位。起始位和停止位是在發(fā)送時自動插入的。接收時,停止位進(jìn)入SCON的RB8位。波特率可變,即可根據(jù)需要設(shè)置波特率。TxD為數(shù)據(jù)發(fā)送引腳,RxD為數(shù)據(jù)接收引腳,方式1提供異步全雙工通信,適合于點到點的通信。工作模式1的幀格式如圖8-11所示。圖8-11串口1工作方式1的幀格式48/29

串口1工作模式1的功能結(jié)構(gòu)示意圖如圖8-10所示。圖8-10串行口1模式1功能結(jié)構(gòu)圖49/29

串口1工作模式1數(shù)據(jù)接收/發(fā)送時序圖如圖8-13所示。圖8-13串口1工作模式1時序圖串口1工作模式1的波特率是可變的,由T1或T2的溢出率和SMOD共同決定。當(dāng)串口1用T1作為波特率發(fā)生器且T1工作于模式0(16位自動重裝模式)或串口1用T2作為波特率發(fā)生器時的波特率為:波特率=(T1的溢出率或T2的溢出率)/4。50/293)串口1工作模式2很少使用。4)串口1工作模式3當(dāng)軟件設(shè)置SCON寄存器的SM0、SM1為“11”時,串行口1工作于模式3。串行數(shù)據(jù)通過TxD發(fā)送,RxD接收。每幀數(shù)據(jù)均為11位,包括1位起始位,8位數(shù)據(jù)位,1位可程控為1或0的第9位及1位停止位。模式3的幀格式如圖8-14所示。工作模式3波特率的計算方法與模式1相同。圖8-14串口1工作模式3的數(shù)據(jù)幀格式51/29(2)串口2的工作模式串口2只有兩種工作模式,它們都是UART方式(即異步串行通信模式)。1)模式010位數(shù)據(jù)通過RxD2/P1.0(RxD2_2/P4.0)接收,通過TxD2/P1.1(TxD2_2/P4.2)發(fā)送。一幀數(shù)據(jù)包含一個起始位(0),8個數(shù)據(jù)位和一個停止位(1)。接收時,停止位進(jìn)入特殊功能寄存器S2CON的S2RB8位。波特率由定時器T2的溢出率決定。當(dāng)T2工作在1T模式(T2x12=1)時,串行口2的波特率=SYSclk/(65536-[RL_TH2,RL_TL2])/4;當(dāng)T2工作在12T模式(T2x12=0)時,串行口2的波特率=SYSclk/12/(65536-[RL_TH2,RL_TL2])/4。其中,RL_TH2是T2H的重裝載寄存器,RL_TL2是TL2的重裝載寄存器。使用時,直接給TH2和TL2進(jìn)行賦值即可。2)模式111位數(shù)據(jù)通過TxD2/P1.1(TxD2_2/P4.2)發(fā)送,通過RxD2/P1.0(RxD2_2/P4.0)接收。一幀數(shù)據(jù)包含一個起始位(0)、8個數(shù)據(jù)位、一個可編程的第9位和一個停止位(1)。發(fā)送時,第9位數(shù)據(jù)位來自特殊功能寄存器S2CON的S2TB8位。接收時,第9位進(jìn)入特殊功能寄存器S2CON的S2RB8位。波特率的計算方法與方式0相同,在此不再復(fù)述。串口3和串口4的工作模式與串口2類似,請讀者對比學(xué)習(xí),在此不做詳細(xì)敘述。52/29下一講內(nèi)容

1、波特率的設(shè)定

2、UART的應(yīng)用舉例53/29單片微型計算機(jī)原理及接口技術(shù)(19)54/21內(nèi)容提綱二UART接口的應(yīng)用舉例一波特率的設(shè)定55/21波特率的設(shè)定一56/211.串口1波特率的設(shè)定(1)模式0的波特率當(dāng)UART_M0x6=0時,波特率為SYSclk/12;當(dāng)UART_M0x6=1時,波特率為SYSclk/2。(2)模式2的波特率串行口1工作于模式2時,波特率有兩種波特率可選,取決于電源控制寄存器PCON中SMOD位的值,當(dāng)SMOD=0時,為SYSclk/64;當(dāng)SMOD=1時,為SYSclk/32。(3)模式1和3的波特率串行口1工作于模式1和3時,波特率是可變的,可以通過編程改變定時器1的溢出率或者定時器2的溢出率來確定波特率。編程時應(yīng)注意,當(dāng)定時器作為波特率發(fā)生器使用時,應(yīng)禁止定時器產(chǎn)生中斷(ET1=0或ET2=0)。典型用法是將定時器設(shè)置工作在自動重裝入時間常數(shù)的定時方式。設(shè)置完成后,啟動定時器(TR1=1或TR2=1)。57/21

假設(shè)SYSclk為系統(tǒng)時鐘頻率。串口1用T1作為波特率發(fā)生器,且T1工作于模式0(16位自動重裝模式)時的公式如下:波特率=(T1的溢出率)/4=SYSclk/121–T1x12/(65536-[RL_TH1,RL_TL1])/4其中,12T模式時,T1x12=0;1T模式時,T1x12=1。RL_TH1是TH1的自動重裝載寄存器,RL_TL1是TL1的自動重裝載寄存器。注意:此時波特率與SMOD無關(guān)。T2只有一種工作方式,即16位自動重裝方式,因此使用T2作為波特率發(fā)生器時的公式如下:串口1的波特率=SYSclk/121–T2x12/(65536-[RL_TH2,RL_TL2])/4其中,RL_TH2是TH2的自動重裝寄存器;RL_TL2是TL2的自動重裝寄存器。在實際應(yīng)用中,一般選用模式1或模式3。此時,波特率的設(shè)置關(guān)鍵在于T1和T2的溢出率的計算。58/21

2.串口2~4的波特率設(shè)定對于串口2、串口3和串口4,具體使用T2、T3或T4中的哪一個定時器作為波特率發(fā)生器前面已有詳細(xì)敘述。在此,以T2作為波特率發(fā)生器為例,波特率計算方法如下公式所示:波特率=SYSclk/12n/(65536–[RL_TH2,RL_TL2])/4串口3和串口4波特率的設(shè)定方式與串口2類似,介紹從略。常用的串口波特率與系統(tǒng)時鐘以及定時器工作與16位自動裝載模式時的重裝時間常數(shù)之間的關(guān)系見表8-7。讀者在設(shè)計系統(tǒng)時,可以直接從表中查得所需設(shè)置的時間常數(shù)。表8-7

常用波特率與系統(tǒng)時鐘及重裝時間常數(shù)之間的關(guān)系時鐘頻率(MHz)波特率(bps)時間常數(shù)(12T)時間常數(shù)(1T)11.0592115200FFFEHFFE8H57600FFFCHFFD0H38400FFFAHFFB8H19200FFF4HFF70H9600FFE8HFEE0H4800FFD0HFDC0H2400FFA0HFB80H1200FF40HF700H59/21

也可以使用STC提供的ISP軟件中的波特率計算器工具進(jìn)行計算。該工具的界面如圖8-14所示。60/21UART接口的應(yīng)用舉例二61/21

在編程應(yīng)用中,雖然可以采用查詢方式進(jìn)行通信,但是,為了進(jìn)行實時任務(wù)處理,一般采用中斷方式進(jìn)行串行通信程序設(shè)計。(1)串口1的編程要點①設(shè)置串行口的工作模式設(shè)置SCON寄存器的SM0和SM1的內(nèi)容。若需要串行口具有接收功能,則置REN=1。②設(shè)置正確的波特率(a)使用T1作為波特率發(fā)生器時,需要設(shè)置T1的工作模式和時間常數(shù)(設(shè)定TMOD和TH1、TL1寄存器的內(nèi)容);啟動T1(置TR1=1)。(b)使用T2作為波特率發(fā)生器時,需要設(shè)置T2寄存器和相應(yīng)的位,包括:T2自動重裝寄存器TH2和TL2,T2_C/T位,T2x12位,SMOD位。啟動T2(置TR2=1)。③設(shè)置串行口的中斷優(yōu)先級(設(shè)置PS寄存器的內(nèi)容,也可以不設(shè)置,取默認(rèn)值),設(shè)置相應(yīng)的中斷控制位(ES和EA)。④如要串口1發(fā)送,將數(shù)據(jù)送入SBUF。⑤編制串行中斷服務(wù)程序,在中斷服務(wù)程序中要有清除中斷標(biāo)志指令(將TI和RI清0)。62/21

(2)串口2的編程要點①設(shè)置串口2的工作模式設(shè)置S2CON寄存器中的S2SM0位。如需要串行口2具有接收功能,則置S2REN=1。②設(shè)置串口2的波特率串口2只能使用T2作為波特率發(fā)生器,設(shè)置內(nèi)容包括:TH2和TL2,T2_C/位,T2x12位。啟動T2(置TR2=1)。③設(shè)置串口2的中斷優(yōu)先級(設(shè)置PS2,也可以不設(shè)置,取默認(rèn)值),設(shè)置打開相應(yīng)的中斷控制位(ES2和EA)。④如要串口2發(fā)送,將數(shù)據(jù)送入S2BUF。⑤編制串行中斷服務(wù)程序,在中斷服務(wù)程序中要設(shè)置清除中斷標(biāo)志指令(分別是接收完成標(biāo)志S2RI和發(fā)送完成標(biāo)志S2TI)。(3)串口3和串口4的編程要點串口3和串口4的編程要點與串口2類似,請讀者自行總結(jié)。63/21

【例8-1】設(shè)有甲、乙兩臺單片機(jī),編寫程序,使兩臺單片機(jī)間實現(xiàn)如下串行通信功能。(假設(shè)系統(tǒng)時鐘為11.0592MHz)。甲機(jī)發(fā)送:將首址為ADDRT的128字節(jié)的外部RAM數(shù)據(jù)塊順序向乙機(jī)發(fā)送;乙機(jī)接收:將接收的128字節(jié)的數(shù)據(jù),順序存放在以首址為ADDRR的外部RAM中。解:甲機(jī)發(fā)送數(shù)據(jù)的程序流程如圖8-15所示。圖8-15甲機(jī)發(fā)送程序流程圖64/21

匯編語言發(fā)送程序如下:$INCLUDE(STC8H.INC) ;包含STC8H單片機(jī)的寄存器定義文件

ORG 0000H

LJMP MAINT ;跳至主程序入口

ORG 0023H

LJMP UART1_ISR ;轉(zhuǎn)至串行中斷服務(wù)程序

ORG 0200HMAINT:MOV SP,#80H ;設(shè)置堆棧指針

MOV SCON,#50H ;8位數(shù)據(jù),可變波特率

ANL AUXR,#0FEH ;串口1選擇定時器1為波特率發(fā)生器

ANL TMOD,#0FH ;設(shè)定定時器1為16位自動重裝方式

MOV TL1,#0E8H ;設(shè)定定時初值

MOV TH1,#0FFH ;設(shè)定定時初值

CLR ET1 ;禁止定時器1中斷

SETB TR1 ;啟動定時器1

SETB ES ;串行口開中斷

SETB EA ;開中斷65/21

MOV DPTR,#ADDRT ;ADDRT是首址,可以使用EQU定義 MOV R0,#00H ;傳送字節(jié)數(shù)初值

MOVX A,@DPTR ;取第一個發(fā)送字節(jié)

MOVSBUF,A ;啟動串行口發(fā)送

SJMP $ ;等待中斷

;中斷服務(wù)程序UART1_ISR:

CLR

TI ;將中斷標(biāo)志清零

CJNER0,#7FH,LOOPT

;判斷128B是否發(fā)送完,若沒完,則轉(zhuǎn)LOOPT

CLRES ;全部發(fā)送完畢,禁止串行口中斷

LJMPENDT

;轉(zhuǎn)中斷返回LOOPT:INCR0 ;修改字節(jié)數(shù)指針 INCDPTR ;修改地址指針,繼續(xù)取下一發(fā)送數(shù)據(jù) MOVXA,@DPTR

;取發(fā)送數(shù)據(jù) MOV SBUF,A ;啟動串行口ENDT:RETI ;中斷返回

END66/21

對應(yīng)的C語言版程序如下:#include“stc8h.h” //包含單片機(jī)的寄存器定義頭文件unsignedcharxdataADDRT[128];

//在外部RAM區(qū)定義128個單元unsignedcharnum=0;

//聲明計數(shù)變量unsignedchar*psend; //指向發(fā)送數(shù)據(jù)區(qū)的指針voidmain(void) //主程序,在C語言的主程序中可以不設(shè)置堆棧指針{ SCON=0x40; //8位數(shù)據(jù),可變波特率

AUXR&=0xFE; //串口1選擇定時器1為波特率發(fā)生器

TMOD&=0x0F; //設(shè)定定時器1為16位自動重裝方式

TL1=0xE8; //設(shè)定定時初值

TH1=0xFF; //設(shè)定定時初值

TR1=1; //啟動定時器1 ES=1; //串行口開中斷

EA=1; //開中斷

psend=ADDRT; //設(shè)置發(fā)送數(shù)據(jù)緩沖區(qū)指針

SBUF=*psend; //發(fā)送第一個數(shù)據(jù)

while(1); //等待中斷}67/21

voidUART1_ISR(void)interruptUART1_VECTOT //串口1中斷服務(wù)函數(shù){ TI=0; //清發(fā)送中斷標(biāo)志

num++; //修改計數(shù)變量值

if(num==0x7F)ES=0; //判斷是否發(fā)送完,若已完,則關(guān)中斷

else //否則,修改指針,發(fā)送下一個數(shù)據(jù)

{ myp++; SBUF=*myp; }}68/21

乙機(jī)接收數(shù)據(jù)的程序流程如圖8-16所示。圖8-16乙機(jī)接收數(shù)據(jù)流程圖注意,接收方的波特率必須和發(fā)送方的波特率相同!69/21

接收程序如下:$INCLUDE(STC8H.INC)

ORG 0000H

LJMP MAINR ;轉(zhuǎn)主程序

ORG 0023H

LJMP UART1_ISR ;轉(zhuǎn)串行口中斷服務(wù)程序

ORG 0200HMAINR:MOV SP,#80H ;設(shè)置堆棧指針

MOV SCON,#50H ;8位數(shù)據(jù),可變波特率,允許接收

ANL AUXR,#0FEH ;串口1選擇定時器1為波特率發(fā)生器

ANL TMOD,#0FH ;設(shè)定定時器1為16位自動重裝方式

MOV TL1,#0E8H ;設(shè)定定時初值

MOV TH1,#0FFH ;設(shè)定定時初值

CLR ET1 ;禁止定時器1中斷 SETB TR1 ;啟動定時器1 SETB ES ;串行口開中斷 SETB EA ;開中斷 MOV DPTR,#ADDRR ;數(shù)據(jù)緩沖區(qū)首址送DPTR MOV R0,#00H ;置傳送字節(jié)數(shù)初值 SJMP $ ;等待中斷70/21

;中斷服務(wù)程序UART1_ISR:

CLR RI ;清接收中斷標(biāo)志 MOV A,SBUF ;取接收的數(shù)據(jù) MOVX @DPTR,A ;接收的數(shù)據(jù)送緩沖區(qū) CJNE R0,#7FH,LOOPR

;判別接收完沒有。若沒有,轉(zhuǎn)LOOPR繼續(xù)接收 CLR ES

;若接收完,則關(guān)串行口中斷 LJMP ENDRLOOPR:INC R0 ;修改計數(shù)指針 INC DPTR ;修改地址指針ENDR: RETI ;中斷返回 END71/21

對應(yīng)的C語言版程序如下:#include“stc8h.h”unsignedcharxdataADDRR[128];unsignedcharnum=0;unsignedchar*prec;voidUART1_ISR(void)interruptUART1_VECTOR{ RI=0; num++; if(num==128) ES=0; else

{ *prec=SBUF; prec++; }}72/21

voidmain(void){ SCON=0x50; //8位數(shù)據(jù),可變波特率 AUXR&=0xFE; //串口1選擇定時器1為波特率發(fā)生器 TMOD&=0x0F; //設(shè)定定時器1為16位自動重裝方式 TL1=0xE8; //設(shè)定定時初值 TH1=0xFF; //設(shè)定定時初值 ET1=0; //禁止定時器1中斷 TR1=1; ES=1; EA=1; prec=ADDRR; while(1);}73/21下一講內(nèi)容

STC8H8K64U的UART接口應(yīng)用舉例-274/21單片微型計算機(jī)原理及接口技術(shù)(20)75/18內(nèi)容提綱UART接口的應(yīng)用舉例-276/18

【例8-2】多機(jī)通信編程舉例現(xiàn)用簡單實例說明多機(jī)串行通信中從機(jī)的基本工作過程。而實際應(yīng)用中還需要考慮通信的規(guī)范協(xié)議。有些協(xié)議很復(fù)雜,在此不加以考慮。假設(shè)系統(tǒng)晶振頻率為11.0592MHz。主機(jī):先向從機(jī)發(fā)送一幀地址信息,然后再向從機(jī)發(fā)送10個數(shù)據(jù)信息。從機(jī):接收主機(jī)發(fā)來的地址幀信息,并與本機(jī)的地址號相比較,若不符合,仍保持SM2=1不變;若相等,則使SM2清零,準(zhǔn)備接收后續(xù)的數(shù)據(jù)信息,直至接收完10個數(shù)據(jù)信息。解:主機(jī)和從機(jī)的程序流程如圖8-18所示。77/18流程圖78/18

主機(jī)匯編語言程序:$INCLUDE(STC8H.INC) ;包含單片機(jī)寄存器定義文件ADDRT EQU 0000HSLAVE EQU 5 ;從機(jī)地址號

ORG 0000H LJMP MAINT ;主程序入口地址 ORG 0023H LJMP UART1_ISR ;串口1中斷入口地址

ORG 0200HMAINT: MOV SP,#80H MOV SCON,#0C0H ;串行口方式3 MOV AUXR,#00H ;選擇T1作為波特率發(fā)生器,12T MOV TMOD,#00H ;置T1工作方式0 MOV TH1,#0FFH ;置9600波特率

MOV TL1,#0E8H ;相應(yīng)的時間常數(shù)

MOV DPTR,#ADDRT ;置數(shù)據(jù)地址指針

MOV R0,#00H ;發(fā)送數(shù)據(jù)字節(jié)計數(shù)清0 MOV R2,#SLAVE ;從機(jī)地址號→R2 SETB TR1 ;啟動T1 79/18

SETB ES ;串行口開中斷

SETB EA ;CPU開中斷

SETB TB8 ;置位TB8,作為地址幀信息特征

MOV A,R2 ;發(fā)送地址幀信息

MOV SBUF,A SJMP $ ;等待中斷UART1_ISR: CLR TI ;清發(fā)送中斷標(biāo)志

CLR TB8 ;清TB8位,為發(fā)送數(shù)據(jù)幀信息做準(zhǔn)備

MOVX A,@DPTR ;發(fā)送一個數(shù)據(jù)字節(jié)

MOV SBUF,A INC DPTR ;修改指針

INC R0 CJNE R0,#0AH,LOOPT ;判數(shù)據(jù)字節(jié)是否發(fā)送完

CLR ESLOOPT: RETI END80/18

主機(jī)的C語言程序:#include"stc8h.h" //包含單片機(jī)寄存器定義文件unsignedcharxdataADDRT[10]; //保存數(shù)據(jù)的外部RAM單元unsignedcharSLAVE; //保存從機(jī)地址號的變量unsignedcharnum=0,*mypdata;voidmain(void){ SCON=0xC0; TMOD=0x0; TH1=0xff; TL1=0xe8; mypdata=ADDRT; SLAVE=5; //定義從機(jī)地址,在此假設(shè)從機(jī)地址為5 TR1=1; ES=1; EA=1; TB8=1; SBUF=SLAVE; //發(fā)送從機(jī)地址

while(1); //等待中斷}81/18

voidUART1_ISR(void)interruptUART1_VECTOR{ TI=0; TB8=0; SBUF=*mypdata; //發(fā)送數(shù)據(jù)

mypdata++; //修改指針

num++; if(num==0x0a)ES=0;}82/18

從機(jī)匯編語言程序:$INCLUDE(STC8H.INC) ;包含單片機(jī)寄存器定義文件ADDRR EQU 0000HSLAVE EQU 5 ;從機(jī)地址號

ORG 0000H LJMP MAINR ;從機(jī)主程序入口地址

ORG 0023H LJMP UART1_ISR ;串口1中斷入口地址

ORG 0200HMAINR: MOV SP,#80H MOV SCON,#0F0H ;串行口方式3,SM2=1,REN=1,接收狀態(tài) MOV AUXR,#00H ;選擇T1作為波特率發(fā)生器,12T MOV TMOD,#00H ;置T1為工作方式0 MOV TH1,#0FFH ;置9600波特率

MOV TL1,#0E8H ;相應(yīng)的時間常數(shù)

MOV DPTR,#ADDRR ;置數(shù)據(jù)地址指針

MOV R0,#0AH ;置接收數(shù)據(jù)字節(jié)數(shù)指針

SETB TR1 ;啟動T1 SETB ES ;串行口開中斷

SETB EA ;CPU開中斷

SJMP $ ;等待中斷83/18

UART1_ISR: CLR RI ;清接收中斷標(biāo)志

MOV A,SBUF ;取接收信息

MOV C,RB8 ;取RB8(信息特征位)→C JNC LOOPR1 ;RB8=0為數(shù)據(jù)幀信息,轉(zhuǎn)LOOPR1 XRL A,#SLAVE ;RB8=1為地址幀信息,與本機(jī)地址號SLAVE比較

JZ LOOPR2 ;地址相等,則轉(zhuǎn)LOOPR2 LJMP ENDR ;地址不相等,則轉(zhuǎn)中斷返回ENDRLOOPR2: CLR SM2 ;清SM2,為后面接收數(shù)據(jù)幀信息做準(zhǔn)備

LJMP ENDR ;中斷返回LOOPR1: MOVX @DPTR,A ;接收的數(shù)據(jù)→數(shù)據(jù)緩沖區(qū)

INC DPTR ;修改地址指針

DJNZ R0,ENDR ;數(shù)據(jù)字節(jié)沒全部接收完,則轉(zhuǎn)LOOPR2 SETB SM2 ;全部接收完,置SM2=1ENDR: RETI ;中斷返回

END84/18

從機(jī)的C語言程序:#include"stc8h.h" //包含單片機(jī)寄存器定義文件unsignedcharxdataADDRR[10];unsignedcharSLAVE,num=0x0a,rdata,*mypdata;voidmain(void){ SCON=0xf0; AUXR=0x0; TMOD=0x0; TH1=0xff; TL1=0xe8; mypdata=ADDRR; SLAVE=5; //設(shè)定從機(jī)地址

TR1=1; ES=1; EA=1; while(1); //等待中斷}85/18

voidUART1_ISR(void)interruptUART1_VECTOR{ RI=0; rdata=SBUF; //將接收緩沖區(qū)的數(shù)據(jù)保存到rdata變量中

if(RB8) //RB8=1說明收到的信息是地址

{

if(rdata==SLAVE) //如果地址相等,則SM2=0 SM2=0; } else /接收到的信息是數(shù)據(jù)

{ *mypdata=rdata; mypdata++; num––; if(num==0x00) //所有數(shù)據(jù)接收完畢

SM2=1; //令SM2=1,為下一次接收地址信息做準(zhǔn)備

}}進(jìn)行多機(jī)通信時應(yīng)注意,只有在從機(jī)啟動以后,處于接收狀態(tài),主機(jī)才能開始發(fā)送信息。86/18【例8-3】串口1使用T2做波特率發(fā)生器的串行通信實例。利用計算機(jī)向單片機(jī)發(fā)送一個數(shù)據(jù),單片機(jī)收到數(shù)據(jù)后,將數(shù)據(jù)按位取反后回發(fā)給計算機(jī)。解:單片機(jī)的C語言程序如下:#include"stc8h.h" //包含寄存器定義文件voidUartInit(void);voidmain(void){ UartInit(); //串口1初始化 ES=1; //允許串口1中斷

EA=1; //開總中斷

while(1);}87/18voidUartInit(void) //9600bps@11.0592MHz。本函數(shù)參考自STC-ISP工具{ SCON=0x50; //8位數(shù)據(jù),可變波特率

AUXR|=0x01; //串口1選擇定時器2為波特率發(fā)生器

AUXR&=0xFB; //定時器時鐘12T模式

T2L=0xE8; //設(shè)置定時初始值

T2H=0xFF; //設(shè)置定時初始值

AUXR|=0x10; //定時器2開始計時}voidUART1_ISR(void)interruptUART1_VECTOR{ unsignedcharrec_data; if(RI==1) { RI=0; rec_data=SBUF; SBUF=~rec_data; } else TI=0;}88/18【例8-3】串口1使用T2做波特率發(fā)生器的串行通信實例。利用計算機(jī)向單片機(jī)發(fā)送一個數(shù)據(jù),單片機(jī)收到數(shù)據(jù)后,將數(shù)據(jù)按位取反后回發(fā)給計算機(jī)。解:單片機(jī)的C語言程序如下:#include"stc8h.h" //包含寄存器定義文件voidUartInit(void);voidmain(void){ UartInit(); //串口1初始化 ES=1; //允許串口1中斷

EA=1; //開總中斷

while(1);}89/18【例8-4】串口2的使用實例。利用串口2發(fā)送一組數(shù)據(jù)。晶振頻率SYSclk=22.1184MHz,波特率為115200bps,8個數(shù)據(jù)位,1個停止位。發(fā)送數(shù)據(jù)以0作為結(jié)束標(biāo)志。解:單片機(jī)的C語言程序如下:#include"stc8h.h"unsignedcharteststr[]={"STC8HUart2Test!\r\n"};unsignedcharstr_index;voidUartInit(void);voidmain(void){P_SW2|=0x80;//擴(kuò)展寄存器(XFR)訪問使能

P4M1=0x3c; P4M0=0x3c;//設(shè)置P4.2~P4.5為漏極開路(實驗箱加了上拉電阻到3.3V) UartInit(); P_SW2|=1;//UART2switchto:0:P1.0P1.1,1:P4.6P4.7 IE2|=0x01;//允許UART2中斷

EA=1; str_index=0; S2BUF=teststr[str_index];while(1);}90/18voidUartInit(void) //115200bps@22.1184MHz{ S2CON=0x50; //8位數(shù)據(jù),可變波特率

AUXR&=0xFB; //定時器時鐘12T模式

T2L=0xFC; //設(shè)置定時初始值

T2H=0xFF; //設(shè)置定時初始值

AUXR|=0x10; //定時器2開始計時}//串口2中斷服務(wù)程序voidUART2_ISR(void)interruptUART2_VECTOR{ if((S2CON&1)!=0){S2CON&=~1;//ClearRxflag}if((S2CON&2)!=0){S2CON&=~2;//ClearTxflag str_index++; if(teststr[str_index]==0) IE2^=0xfe; //關(guān)串口2中斷

elseS2BUF=teststr[str_index]; }}91/18下一講內(nèi)容

1、STC8H8K64U單片機(jī)的SPI接口的結(jié)構(gòu)

2、STC8H8K64U單片機(jī)的SPI接口的數(shù)據(jù)通信92/18單片微型計算機(jī)原理及接口技術(shù)(21)93/22內(nèi)容提綱二STC8H8K64U單片機(jī)SPI接口的數(shù)據(jù)通信一STC8H8K64U單片機(jī)SPI接口的結(jié)構(gòu)94/22STC8H8K64U單片機(jī)SPI接口的結(jié)構(gòu)一95/221.SPI接口簡介STC8H8K64U集成了串行外設(shè)接口(SerialPeripheralInterface,簡稱SPI)。SPI接口既可以和其他微處理器通信,也可以與具有SPI兼容接口的器件,如存儲器、A/D轉(zhuǎn)換器、D/A轉(zhuǎn)換器、LED或LCD驅(qū)動器等進(jìn)行同步通信(例如,液晶模塊12864)。SPI接口有兩種操作模式:主模式和從模式。在主模式中支持高達(dá)3Mbit/s的速率;從模式時速度無法太快,速度在SYSclk/8以內(nèi)較好。此外,SPI接口還具有傳輸完成標(biāo)志和寫沖突標(biāo)志保護(hù)功能。96/22

2.SPI接口的結(jié)構(gòu)97/22STC8H8K64U單片機(jī)的SPI接口數(shù)據(jù)通信二98/22

99/22

100/22

101/22

圖SPI接口的單主機(jī)-單從機(jī)連接方式102/22(2)雙器件方式在雙器件方式中,兩個設(shè)備相連,主機(jī)和從機(jī)不固定。有兩種設(shè)置方法,分別是:設(shè)置方法1:兩個設(shè)備初始化時都設(shè)置為SSIG設(shè)置為0,MSTR設(shè)置為1,且將SS腳設(shè)置為雙向口模式輸出高電平。此時兩個設(shè)備都是不忽略SS的主機(jī)模式。當(dāng)其中一個設(shè)備需要啟動傳輸時,可將自己的SS腳設(shè)置為輸出模式并輸出低電平,拉低對方的SS腳,這樣另一個設(shè)備就被強(qiáng)行設(shè)置為從機(jī)模式了。設(shè)置方法2:兩個設(shè)備初始化時都將自己設(shè)置成忽略SS的從機(jī)模式,即將SSIG設(shè)置為1,MSTR設(shè)置為0。當(dāng)其中一個設(shè)備需要啟動傳輸時,先檢測SS腳的電平,如果時候高電平,就將自己設(shè)置成忽略SS的主模式,即可進(jìn)行數(shù)據(jù)傳輸了。雙器件方式也稱為互為主從方式,其連接方式如下圖所示。圖SPI接口的雙器件連接方式103/22(3)單主機(jī)-多從機(jī)方式在這種方式中,多個設(shè)備相連,其中一個設(shè)備固定作為主機(jī),其他設(shè)備固定作為從機(jī)。主機(jī)的設(shè)置:SSIG設(shè)置為1,MSTR設(shè)置為1,固定為主機(jī)模式。主機(jī)可以使用任意端口分別連接各個從機(jī)的SS腳,拉低其中一個從機(jī)的SS腳即可使能相應(yīng)的從機(jī)設(shè)備。從機(jī)的設(shè)置:SSIG設(shè)置為0,SS管腳作為從機(jī)的片選信號。單主機(jī)-多從機(jī)方式的連接如下圖所示。圖

SPI接口的單主機(jī)-多從機(jī)連接方式104/22STC8H8K64U單片機(jī)進(jìn)行SPI通信時,主機(jī)和從機(jī)的選擇由SPEN、SSIG和MSTR聯(lián)合控制。主機(jī)和從機(jī)的選擇見表8-8。表8-8

主機(jī)和從機(jī)的選擇105/22控制位通信端口說明SPENSSIGMSTRSSMISOMOSISCLK0xxx輸入輸入輸入關(guān)閉SPI功能,SS/MOSI/MISO/SCLK均為普通IO1000輸出輸入輸入從機(jī)模式,且被選中1001高阻輸入輸入從機(jī)模式,但未被選中101→00輸出輸入輸入從機(jī)模式,不忽略SS且MSTR為1的主機(jī)模式,當(dāng)SS管腳被拉低時,MSTR將被硬件自動清零,工作模式將被被動設(shè)置為從機(jī)模式1011輸入高阻高阻主機(jī)模式,空閑狀態(tài)輸出輸出主機(jī)模式,激活狀態(tài)110x輸出輸入輸入從機(jī)模式111x輸入輸出輸出主機(jī)模式

3.SPI接口的數(shù)據(jù)通信過程在SPI通信中,數(shù)據(jù)傳輸總是由主機(jī)啟動的。如果SPI使能(SPEN=1)并選擇作為主機(jī)時,主機(jī)對SPI數(shù)據(jù)寄存器SPDAT的寫操作將啟動SPI時鐘發(fā)生器和數(shù)據(jù)的傳輸。在數(shù)據(jù)寫入SPDAT之后的半個到一個SPI位時間后,數(shù)據(jù)將出現(xiàn)在MOSI引腳。寫入主機(jī)SPDAT寄存器的數(shù)據(jù)從MOSI腳移出發(fā)送到從機(jī)的MOSI腳。同時從機(jī)SPDAT寄存器的數(shù)據(jù)從MISO腳移出發(fā)送到主機(jī)的MISO腳。傳輸完一個字節(jié)后,SPI時鐘發(fā)生器停止,傳輸完成標(biāo)志(SPIF)置位,如果SPI中斷使能則會產(chǎn)生一個SPI中斷。主機(jī)和從機(jī)CPU的兩個移位寄存器可以看作是一個16位循環(huán)移位寄存器。當(dāng)數(shù)據(jù)從主機(jī)移位傳送到從機(jī)的同時,數(shù)據(jù)也以相反的方向移入。這意味著在一個移位周期中,主機(jī)和從機(jī)的數(shù)據(jù)相互交換。106/224.SPI中斷如果允許SPI中斷,發(fā)生SPI中斷時,CPU就會跳轉(zhuǎn)到中斷服務(wù)程序的入口地址004BH處執(zhí)行中斷服務(wù)程序。注意,在中斷服務(wù)程序中,必須把SPI中斷請求標(biāo)志清零。5.寫沖突SPI在發(fā)送時為單緩沖,在接收時為雙緩沖。這樣在前一次發(fā)送尚未完成之前,不能將新的數(shù)據(jù)寫入移位寄存器。當(dāng)發(fā)送過程中對數(shù)據(jù)寄存器進(jìn)行寫操作時,WCOL位將置位以指示數(shù)據(jù)沖突。在這種情況下,當(dāng)前發(fā)送的數(shù)據(jù)繼續(xù)發(fā)送,而新寫入的數(shù)據(jù)將丟失。接收數(shù)據(jù)時,接收到的數(shù)據(jù)傳送到一個并行讀數(shù)據(jù)緩沖區(qū),這樣將釋放移位寄存器以進(jìn)行下一個數(shù)據(jù)的接收。但必須在下個字符完全移入之前從數(shù)據(jù)寄存器中讀出接收到的數(shù)據(jù),否則,前一個接收數(shù)據(jù)將丟失。WCOL可通過軟件向其寫入“1”清零。107/226.?dāng)?shù)據(jù)格式SPI接口的時鐘信號線SCLK有Idle和Active兩種狀態(tài):Idle狀態(tài)是指在不進(jìn)行數(shù)據(jù)傳輸?shù)臅r候(或數(shù)據(jù)傳輸完成后)SCLK所處的狀態(tài);Active是與Idle相對的一種狀態(tài)。時鐘相位位(CPHA)允許用戶設(shè)置采樣和改變數(shù)據(jù)的時鐘邊沿。時鐘極性位CPOL允許用戶設(shè)置時鐘極性。如果CPOL=0,Idle狀態(tài)=低電平,Active狀態(tài)=高電平。如果CPOL=1,Idle狀態(tài)=高電平,Active狀態(tài)=低電平。主機(jī)總是在SCLK=Idle狀態(tài)時,將下一位要發(fā)送的數(shù)據(jù)置于數(shù)據(jù)線MOSI上。從Idle狀態(tài)到Active狀態(tài)的轉(zhuǎn)變,稱為SCLK前沿。從Active狀態(tài)到Idle狀態(tài)的轉(zhuǎn)變,稱為SCLK后沿。一對SCLK前沿和后沿構(gòu)成一個SCLK時鐘周期,一個SCLK時鐘周期傳輸一位數(shù)據(jù)。不同的CPHA,主機(jī)和從機(jī)對應(yīng)的數(shù)據(jù)格式如圖1~圖4所示。108/22圖8-26CPHA=0時SPI從機(jī)傳輸格式109/22圖8-27CPHA=1時SPI從機(jī)傳輸格式110/22圖8-28CPHA=0時SPI主機(jī)傳輸格式111/22圖8-29CPHA=1時SPI主機(jī)傳輸格式112/227.SPI時鐘預(yù)分頻器選擇SPI時鐘預(yù)分頻器選擇是通過SPCTL寄存器中的SPR1-SPR0位實現(xiàn)的。113/22下一講內(nèi)容

1、STC8H8K64U單片機(jī)SPI接口的寄存器

2、STC8H8K64U單片機(jī)SPI接口的應(yīng)用舉例114/22單片微型計算機(jī)原理及接口技術(shù)(22)115/20內(nèi)容提綱二STC8H8K64U單片機(jī)SPI接口的應(yīng)用舉例一STC8H8K64U單片機(jī)SPI接口的寄存器116/20STC8H8K64U單片機(jī)SPI接口的寄存器一117/20與SPI接口有關(guān)的特殊功能寄存器如表8-9所示。寄存器地址b7b6b5b4b3b2b1b0復(fù)位值SPICTLCEHSSIGSPENDORDMSTRCPOLCPHASPR1SPR000000100BSPSTATCDHSPIFWCOL------00xxxxxxBSPDATCFH

00000000B118/20(1)SPI控制寄存器(SPCTL)

寄存器地址b7b6b5b4b3b2b1b0復(fù)位值SPICTLCEHSSIGSPENDORDMSTRCPOLCPHASPR1SPR000000100B119/205)位3:CPOL,SPI時鐘極性選擇位。0:SPI空閑時SCK=0(低電平),SCK的前時鐘沿為上升沿而后沿為下降沿;1:SPI空閑時SCK=1(高電平),SCK的前時鐘沿為下降沿而后沿為上升沿。6)位2:CPHA,SPI時鐘相位選擇控制位。0:數(shù)據(jù)SS管腳為低電平驅(qū)動第一位數(shù)據(jù)并在SCLK的后時鐘沿改變數(shù)據(jù),前時鐘沿采樣數(shù)據(jù)(必須SSIG=0);1:數(shù)據(jù)在SCLK的前時鐘沿驅(qū)動,后時鐘沿采樣。7)位1:SPR1,與SPR0聯(lián)合構(gòu)成SPI時鐘速率選擇控制位。8)位0:SPR0,與SPR1聯(lián)合構(gòu)成SPI時鐘速率選擇控制位。SPI時鐘選擇見表8-10。SPR1SPR0時鐘(SCLK)00SYSclk/401SYSclk/810SYSclk/1611SYSclk/32表8-10

SPI時鐘頻率的選擇其中,SYSclk是系統(tǒng)時鐘頻率。120/20(2)SPI狀態(tài)寄存器(SPSTAT)

(3)SPI數(shù)據(jù)寄存器(SPDAT)地址b7b6b5b4b3b2b1b0復(fù)位值CFHMSB

LSB00H121/20STC8H8K64U單片機(jī)SPI接口的應(yīng)用舉例二122/20

123/20

【例8-5】利用STC8H8K64U單片機(jī)對W25X40CL進(jìn)行讀寫操作。大容量的串行Flash存儲器在實際工程中得到了應(yīng)用,可用來保存生產(chǎn)數(shù)據(jù)、語音數(shù)據(jù)、漢字字庫等。W25X40CL是一款容量為4Mbit高速存儲器,工作電壓2.3V~3.6V。圖8-30W25X40CL的引腳分布圖圖8-31W25X40CL內(nèi)部結(jié)構(gòu)框圖W25X40CL的詳細(xì)介紹請參見教材內(nèi)容。124/20STC8H8K64U單片機(jī)連接W25X40CL的電路圖如圖8-32所示。圖8-32STC8H8K64U單片機(jī)連接W25X40CL的電路圖125/20

部分代碼:/*************串行FLASH引腳聲明**************/sbitSF_CS=P2^2;//PIN1sbitSF_SO=P2^4;//PIN2sbitSF_SI=P2^3;//PIN5sbitSF_SCK=P2^5;//PIN6//SPI相關(guān)函數(shù)

voidSPI_init(void){SPCTL=0xd2;//11010010//忽略SS引腳功能,使用MSTR確定器件是主機(jī)還是從機(jī)//使能SPI功能;先傳輸數(shù)據(jù)高位(MSB);設(shè)置主機(jī)模式//SCLK空閑時為低電平,前沿為上升沿,后沿為下降沿//SS管腳為低電平驅(qū)動第一位數(shù)據(jù)并在SCLK的后沿改變數(shù)據(jù)//SPI時鐘頻率選擇,16分頻P_SW1=(P_SW1&0xf3)|0x04;//SPI口切換到:P2.2P2.3P2.4P2.5SF_SCK=0; //設(shè)置時鐘的初始電平為低SF_SI=1;SPSTAT=SPIF+WCOL;//清0SPIF和WCOL標(biāo)志}

126/20voidSPI_WriteByte(u8out)//SPI寫一個字節(jié){SPDAT=out;while((SPSTAT&SPIF)==0);SPSTAT=SPIF+WCOL;//清0SPIF和WCOL標(biāo)志}u8SPI_ReadByte(void)//SPI讀一個字節(jié){SPDAT=0xff;while((SPSTAT&SPIF)==0);SPSTAT=SPIF+WCOL;//清0SPIF和WCOL標(biāo)志return(SPDAT);}127/20//FLASH相關(guān)宏定義

#defineSFC_WREN0x06//串行Flash命令集(具體說明請參見數(shù)據(jù)手冊)#defineSFC_RDSR0x05#defineSFC_READ

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論