




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
優(yōu)選STCCAS的串行口及SPI接口現(xiàn)在是1頁\一共有94頁\編輯于星期一8.1通信的有關(guān)概念
實(shí)際應(yīng)用中,計算機(jī)的CPU與外部設(shè)備之間常常要進(jìn)行信息的交換,計算機(jī)之間也需要交換信息,所有這些信息的交換均稱為“通信”。現(xiàn)在是2頁\一共有94頁\編輯于星期一并行通信與串行通信
通信的基本方式可分為并行通信和串行通信兩種。并行通信,是指數(shù)據(jù)的各位同時進(jìn)行傳送的方式。其特點(diǎn)是傳輸速度快,但當(dāng)距離較遠(yuǎn),位數(shù)又多時導(dǎo)致了通信線路復(fù)雜且成本高。串行通信,是指數(shù)據(jù)一位一位的順序傳送的通信方式。其特點(diǎn)是通信線路簡單,只要一對傳輸線就可以實(shí)現(xiàn)通信,從而大大的降低了成本,特別適用于遠(yuǎn)距離通信,但傳送速度慢?,F(xiàn)在是3頁\一共有94頁\編輯于星期一1.按照串行數(shù)據(jù)的同步方式分類
按照串行數(shù)據(jù)的同步方式,串行通信本身又分為異步傳送和同步傳送兩種基本方式。(1)異步傳送在異步傳送中,每一個字符要用起始位和停止位作為字符開始和結(jié)束的標(biāo)志,它是以字符為單位一個個的發(fā)送和接收的。異步傳送時,每個字符的組成格式如下:首先是一個起始位表示字符的開始;后面緊跟著的是字符的數(shù)據(jù)字,數(shù)據(jù)字可以是5,6,7或8位數(shù)據(jù),在數(shù)據(jù)字中可根據(jù)需要加入奇偶校驗位;最后是停止位,其長度可以是一位,一位半或兩位。所以,串行傳送的數(shù)據(jù)字節(jié)加上成幀信號起始位和停止位就形成一個字符串行傳送的幀。起始位用邏輯“0”低電平表示,停止位用邏輯“1”高電平表示。圖(a)所示為數(shù)據(jù)字為7位的ASCII碼,第8位是奇偶校驗位。加上起始位、停止位,一個字符由10位組成。這樣形成幀信號后,字符便可以一個接一個的傳送了。在異步傳送中,字符間隔不固定,在停止位后可以加空閑位,空閑位用高電平表示,用于等待發(fā)送。這樣,接收和發(fā)送可以隨時的或間斷的進(jìn)行,而不受時間的限制。圖(b)為有空閑位的情況。8.1.1串行通信的分類現(xiàn)在是4頁\一共有94頁\編輯于星期一現(xiàn)在是5頁\一共有94頁\編輯于星期一(2)同步傳送所謂同步傳送就是去掉異步傳送時每個字符的起始位和停止位的成幀標(biāo)志信號,僅在數(shù)據(jù)塊開始處用同步字符來指示。如下圖所示。同步傳送的有效數(shù)據(jù)位傳送速率高于異步傳送,可達(dá)50千波特。其缺點(diǎn)是硬件設(shè)備較為復(fù)雜,因為它要求要有時鐘來實(shí)現(xiàn)發(fā)送端和接收端之間的嚴(yán)格同步,而且對時鐘脈沖信號的相位一致性還要求非常嚴(yán)格,為此通常還要采用“鎖相器”等措施來保證。在異步數(shù)據(jù)傳送中,CPU與外設(shè)之間事先必須約好兩項事宜:第一、字符格式。雙方要約好字符的編碼形式、奇偶校驗形式、以及起始位和停止位的規(guī)定。第二、波特率(Baudrate)。波特率是衡量數(shù)據(jù)傳送速率的指標(biāo),它要求發(fā)送站和接收站都要以相同的數(shù)據(jù)傳送速率工作。現(xiàn)在是6頁\一共有94頁\編輯于星期一2.按照數(shù)據(jù)的傳送方向分類
1)點(diǎn)對點(diǎn)傳輸
一般情況下,串行數(shù)據(jù)傳送是在兩個通信端之間進(jìn)行的。其數(shù)據(jù)傳送的方式有如圖所示的幾種情況。圖(a)為單工通信方式。A端為發(fā)送站,B端為接收站,數(shù)據(jù)僅能從A站發(fā)至B站。圖(b)為半雙工通信方式。數(shù)據(jù)可以從A發(fā)送到B,也可以由B發(fā)送到A。不過同一時間只能作一個方向的傳送,其傳送方式由收發(fā)控制開關(guān)K來控制。圖(c)為全雙工通信方式。每個站(A、B)既可同時發(fā)送,又可同時接收?,F(xiàn)在是7頁\一共有94頁\編輯于星期一
2)主從多終端通信方式
A站可以向多個終端(B、C、D…)發(fā)出信息。在A站允許的條件下,可以控制管理B、C、D…等站在不同的時間向A站發(fā)出信息。根據(jù)數(shù)據(jù)傳送的方向又可分為多終端半雙工通信和多終端全雙工通信。這種多終端通信方式常用于主――從計算機(jī)系統(tǒng)通信中。現(xiàn)在是8頁\一共有94頁\編輯于星期一8.1.2通用的異步接收器/發(fā)送器UART
在串行傳送中,數(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)換既可以用通用的異步接收器/發(fā)送器實(shí)現(xiàn)。通用的異步接收器/發(fā)送器,簡稱UART(UniversalAsynchronousReceiver/Transmitter),是串行接口的核心部件,其結(jié)構(gòu)如圖所示,它既能發(fā)送,由并行→串行輸出;又能接收,由串行→并行輸入。對每一方來說都是一個雙緩沖器結(jié)構(gòu)。當(dāng)UART接收數(shù)據(jù)時,串行數(shù)據(jù)先經(jīng)RXD端(ReceiverData)進(jìn)入移位寄存器,再經(jīng)移位寄存器輸出并行數(shù)據(jù)到緩沖器,最后通過數(shù)據(jù)總線送到CPU;當(dāng)UART發(fā)送信息時,先由CPU經(jīng)數(shù)據(jù)總線將并行數(shù)據(jù)送給緩沖器,再由并行緩沖器送給一位寄存器,最后逐位由TXD(TransmitterData)端輸出。所有這些工作都是在時鐘信號和其他控制信號作用下完成的?,F(xiàn)在是9頁\一共有94頁\編輯于星期一現(xiàn)在是10頁\一共有94頁\編輯于星期一8.2STC12C5A60S2單片機(jī)的串行口
STC12C5A60S2單片機(jī)具有2個采用UART工作方式的全雙工串行通信接口(串口1和串口2)。每個串口由2個數(shù)據(jù)緩沖器、1個移位寄存器、1個串行控制寄存器和一個波特率發(fā)生器等組成。每個串口的數(shù)據(jù)緩沖器由串行接收緩沖器和發(fā)送緩沖器構(gòu)成,它們在物理上是獨(dú)立的,既可以接收數(shù)據(jù)也可以發(fā)送數(shù)據(jù),還可以同時發(fā)送和接收數(shù)據(jù)。接收緩沖器只能讀出,不能寫入,而發(fā)送緩沖器則只能寫入,不能讀出。它們共用一個地址號。STC12C5A60S2的串行口既可以用于串行異步通信,也可以構(gòu)成同步移位寄存器。如果在串行口的輸入/輸出引腳上加上電平轉(zhuǎn)換器,可以方便地構(gòu)成標(biāo)準(zhǔn)的RS-232接口。串口1與傳統(tǒng)8051單片機(jī)的串口完全兼容。串口2的結(jié)構(gòu)、工作原理與串口1類似。現(xiàn)在是11頁\一共有94頁\編輯于星期一8.2.1串行接口的寄存器
與串行接口1相關(guān)的寄存器有SCON、PCON、AUXR、SBUF、TMOD、TL1、TH1、TCON、IE、IP、IPH、SADEN和SADDR。與串行接口2相關(guān)的寄存器有:S2CON、S2BUF、BRT、AUXR、IE2、IP2、IPH2和AUXR1。
D7D6D5D4D3D2D1D0SM0/FESM1SM2RENTB8RB8TIRISM0/FE:PCON寄存器中的SMOD0位為1時,該位用于幀錯誤檢測,當(dāng)檢測到一個無效停止位時,通過UART接收器設(shè)置該位。它必須由軟件清零。PCON寄存器中的SMOD0為0時,該位和SM1一起指定串行通信的工作方式1.串口1控制寄存器SCONSCON(地址為98H,復(fù)位值為00H)用于確定串行通道的操作方式和控制串行通道的某些功能。也可用于發(fā)送和接收第九個數(shù)據(jù)位(TB8、RB8),并設(shè)有接收和發(fā)送中斷標(biāo)志(RI及TI)位。SCON各位的意義如下:現(xiàn)在是12頁\一共有94頁\編輯于星期一SM0/FESM1方式說明波特率000移位寄存器工作方式fOSC/120118位數(shù)據(jù)位的UART工作方式可變1029位數(shù)據(jù)位的UART工作方式fOSC/64,fOSC/321139位數(shù)據(jù)位的UART工作方式可變
SM2:在方式2和方式3時,如SM2=1,只有在接收數(shù)據(jù)第9位為1時才能激發(fā)中斷標(biāo)志(RI=1)。在方式1時,如SM2=1,則只有在接收到有效停止位時才能激發(fā)中斷標(biāo)志(RI=1)。在方式0時,SM2應(yīng)為0。
REN:允許串行I/O口接收控制位。用軟件置REN=1時為允許接收狀態(tài),可啟動串行口的接收器RXD,開始接收數(shù)據(jù)。用軟件復(fù)位(REN=0)時,為禁止接收狀態(tài)。
TB8:在方式2和方式3時,它是要發(fā)生的第九個數(shù)據(jù)位,按需要由軟件進(jìn)行置位或清零。例如可用作數(shù)據(jù)的奇偶校驗位,或在多機(jī)通信中表示是地址幀/數(shù)據(jù)幀標(biāo)志位(TB8=1/0)。
RB8:在方式2和方式3時,它是接收到的第九位數(shù)據(jù),作為奇偶位或地址幀/數(shù)據(jù)幀標(biāo)志位。在方式1時,若SM2=0,則RB8是接收到的停止位,在方式0時,不使用RB8。
現(xiàn)在是13頁\一共有94頁\編輯于星期一TI:發(fā)生中斷標(biāo)志位。在方式0時,當(dāng)串行發(fā)送數(shù)據(jù)字第八位結(jié)束時,由內(nèi)部硬件置位(TI=1),向CPU申請發(fā)生中斷。CPU響應(yīng)中斷后,必須用軟件清零,取消此中斷標(biāo)志。在其他方式時,它在停止位開始發(fā)送時由硬件置位。同樣,必須用軟件使其復(fù)位。
RI:接收中斷標(biāo)志位。在方式0時,串行接收到第八位結(jié)束時由內(nèi)部硬件置位。在其他方式中,它在接收到停止位的中間時刻由硬件置位,也必須用軟件來復(fù)位。當(dāng)一幀數(shù)據(jù)發(fā)送完成時,發(fā)送中斷標(biāo)志TI被置位,接著發(fā)生串口中斷,進(jìn)入串口中斷服務(wù)程序。但CPU事先并不能分辨是TI還是RI的中斷請求,因此,必須在中斷服務(wù)程序中用位測試指令加以判別。兩個中斷標(biāo)志位TI及RI均不能自動復(fù)位,必須在中斷服務(wù)程序中使用清中斷標(biāo)志位指令,撤銷中斷請求狀態(tài),否則原先的中斷標(biāo)志位狀態(tài)又將表示有中斷請求。現(xiàn)在是14頁\一共有94頁\編輯于星期一2.串口2控制寄存器S2CON寄存器S2CON(地址為9AH,復(fù)位值為00H)用于確定串口2的操作方式和控制串口2的某些功能,也可用于發(fā)送和接收第9個數(shù)據(jù)位(S2TB8、S2RB8),并設(shè)有接收和發(fā)送中斷標(biāo)志(S2RI及S2TI)位。S2CON各位的意義如下:位號D7D6D5D4D3D2D1D0位名稱S2SM0S2SM1S2SM2S2RENS2TB8S2RB8S2TIS2RI寄存器S2CON的各個位與寄存器SCON的各個位含義和功能都類似,讀者可以進(jìn)行對比學(xué)習(xí),在此,不再贅述?,F(xiàn)在是15頁\一共有94頁\編輯于星期一3.掉電控制寄存器PCON
PCON(地址為87H,復(fù)位值為30H)中的SMOD用于設(shè)置方式1、方式2和方式3的波特率是否加倍。各位的定義如下:位號D7D6D5D4D3D2D1D0位名稱SMODSMOD0LVDFPOFGF1GF0PDIDL其中,與串行通信相關(guān)的位是SMOD和SMOD0。SMOD:串行口波特率系數(shù)控制位。復(fù)位時,SMOD=0。1:使方式1、方式2和方式3的波特率加倍。0:各工作方式的波特率不加倍。SMOD0:幀錯誤檢測有效控制。復(fù)位時,SMOD0=0。1:SCON寄存器中的SM0/FE位用于FE(幀錯誤檢測)功能。0:SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指定串行通信的工作方式?,F(xiàn)在是16頁\一共有94頁\編輯于星期一4.輔助寄存器AUXR
輔助寄存器AUXR(地址為8EH,復(fù)位值為00H)各位的定義如下:T0x12和T1x12用于設(shè)置定時器0和定時器1的速度。詳見“第8章定時/計數(shù)器與可編程計數(shù)器陣列”一章。EXTRAM用于設(shè)置是否允許使用內(nèi)部擴(kuò)展的1024字節(jié)擴(kuò)展RAM。1)UART_M0x6:串行口模式0的通信速度設(shè)置位。0:UART串口模式0的速度是傳統(tǒng)12T的8051速度,12分頻。1:UART串口模式0的速度是傳統(tǒng)12T的8051的6倍,2分頻。2)BRTR:獨(dú)立波特率發(fā)生器運(yùn)行控制位。0:不允許獨(dú)立波特率發(fā)生器運(yùn)行。1:允許獨(dú)立波特率發(fā)生器運(yùn)行。3)S2SMOD:UART2的波特率加倍控制位。0:UART2的波特率不加倍。1:UART2的波特率加倍。位號D7D6D5D4D3D2D1D0位名稱T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRS現(xiàn)在是17頁\一共有94頁\編輯于星期一4)BRTx12:獨(dú)立波特率發(fā)生器計數(shù)控制位。0:獨(dú)立波特率發(fā)生器每12個時鐘計數(shù)一次。1:獨(dú)立波特率發(fā)生器每1個時鐘計數(shù)一次。5)S1BRS:串口1波特率發(fā)生器選擇位。0:選擇定時器1作為串口1波特率發(fā)生器。1:選擇獨(dú)立波特率發(fā)生器作為串口1的波特率發(fā)生器,此時定時器1得到釋放,可以作為獨(dú)立定時器使用。
★
注意:對于具有串口2的STC12C5A60S2單片機(jī),串口2只能使用獨(dú)立波特率發(fā)生器作為波特率發(fā)生器,不能夠選擇定時器1作為波特率發(fā)生器;串口1可以選擇定時器1作為波特率發(fā)生器,也可以選擇獨(dú)立波特率發(fā)生器作為波特率發(fā)生器?,F(xiàn)在是18頁\一共有94頁\編輯于星期一5.獨(dú)立波特率發(fā)生器寄存器BRT
獨(dú)立波特率發(fā)生器寄存器BRT(地址為9CH,復(fù)位值為00H)用于保存重裝時間常數(shù)。6.從機(jī)地址控制寄存器為了方便多機(jī)通信,STC12C5A60S2單片機(jī)設(shè)置了從機(jī)地址控制寄存器SADEN和SADDR。其中,SADEN是從機(jī)地址掩模寄存器(地址為B9H,復(fù)位值為00H),SADDR是從機(jī)地址寄存器(地址為A9H,復(fù)位值為00H)。7.?dāng)?shù)據(jù)緩沖器數(shù)據(jù)緩沖器用于保存要發(fā)送的數(shù)據(jù)或者從串口接收到的數(shù)據(jù)。串口1的數(shù)據(jù)緩沖器是SBUF,串口2的數(shù)據(jù)緩沖器是S2BUF。對于串口1,當(dāng)一個字符接收完畢,移位寄存器中的數(shù)據(jù)字節(jié)裝入串行接收數(shù)據(jù)緩沖器SBUF中,其第9位則裝入SCON寄存器的RB8位。如果SM2使得已接收的數(shù)據(jù)無效,則RB8位和SBUF緩沖器中的內(nèi)容不變。對于串口2,當(dāng)一個字符接收完畢,移位寄存器中的數(shù)據(jù)字節(jié)裝入串行接收數(shù)據(jù)緩沖器S2BUF中,其第9位則裝入S2CON寄存器的S2RB8位。如果S2SM2使得已接收的數(shù)據(jù)無效,則S2RB8位和S2BUF緩沖器中的內(nèi)容不變。無論對于串口1還是串口2,發(fā)送緩沖器只能寫入,不能讀出;接收緩沖器只能讀出,不能寫入。因此,串口1的兩個緩沖器共用一個地址號(99H),串口2的兩個緩沖器共用一個地址號(9BH)?,F(xiàn)在是19頁\一共有94頁\編輯于星期一
(4)串行收發(fā)寄存器SBUF(字節(jié)地址99H,沒有位尋址)在所有的串行方式中,在寫SBUF信號的控制下,將其數(shù)據(jù)裝入移位寄存器,前面8位為數(shù)據(jù)字節(jié),其最低位就是移位寄存器的移位輸出位。根據(jù)不同的工作方式會將“1”或TB8的值裝入移位寄存器的第九位,并進(jìn)行發(fā)送。當(dāng)一個字符接收完畢,移位寄存器中的數(shù)據(jù)字節(jié)裝入串行接收數(shù)據(jù)緩沖器SBUF中,其第九位則裝入SCON寄存器的RB8位。如果SM2使得已接收的數(shù)據(jù)無效,則RB8位和SBUF緩沖器中的內(nèi)容不變。發(fā)送緩沖器只能寫入不能讀出,而接收緩沖器只能讀出,不能寫入。因而兩個緩沖器可共有一個地址號(99H)?,F(xiàn)在是20頁\一共有94頁\編輯于星期一8.2.2串行接口的四種工作方式
1.方式0-移位寄存器方式。(1)串口1的工作方式0
串行口輸出端可直接與移位寄存器相連,也可用作擴(kuò)展I/O口或外接同步輸入輸出設(shè)備。
發(fā)送過程:當(dāng)CPU將數(shù)據(jù)寫入到發(fā)送緩沖區(qū)SBUF時,串行口即把8位數(shù)據(jù)以Fosc/12的波特率由RXD引腳輸出,同時由TXD引腳輸出同步脈沖。字符發(fā)送完畢,置中斷標(biāo)志TI為1。
接收過程:控制字除方式0外,還應(yīng)置允許接收控制位REN=1。清除RI中斷標(biāo)志。接收器啟動后RXD為數(shù)據(jù)輸入端,TXD為同步信號輸出端。接收器以Fosc/12波特率采樣RXD引腳輸入的數(shù)據(jù)信息。當(dāng)接收完8位數(shù)據(jù)時又重新置RI=1。方式0工作時,必須使SCON控制字的SM2位(多機(jī)通信控制位)為0。由于波特率固定,無須用定時器提供。但以中斷方式傳送數(shù)據(jù)時,CPU響應(yīng)中斷并不會自動清除TI、RI標(biāo)志,所以在中斷服務(wù)程序中必須由指令清0。例如CLRTI及CLRRI指令。(2)串口2的工作方式0串行數(shù)據(jù)通過RXD2/P1.2(RXD2/P4.2)接收和發(fā)送,TXD2/P1.3(TXD2/P4.3)輸出同步移位時鐘,發(fā)送接收的是8位數(shù)據(jù),低位在先,波特率固定在Fosc/12?,F(xiàn)在是21頁\一共有94頁\編輯于星期一方式0工作方式波形圖現(xiàn)在是22頁\一共有94頁\編輯于星期一2.其他方式-UART方式(1)串口1的UART方式
發(fā)送過程:CPU執(zhí)行數(shù)據(jù)寫入發(fā)送緩沖區(qū)SBUF的指令即可啟動發(fā)送(如MOVSBUF,A)。串行口內(nèi)自動將發(fā)送緩沖區(qū)中內(nèi)容送入發(fā)送移位寄存器。發(fā)送移位寄存器先發(fā)一個起始位,接著按程序設(shè)定每個字符的代碼,先低位后高位。數(shù)據(jù)字加上奇偶校驗位或可控位(方式2,3中即為程序設(shè)定的TB8位的值),再發(fā)停止位,從而完成一幀的發(fā)送。串行數(shù)據(jù)均由TXD端輸出,發(fā)送完畢將中斷標(biāo)志位置1,以供查詢及向CPU申請中斷之用。
接收過程:接收數(shù)據(jù)均由RXD輸入,串行口以所選定的波特率的16倍速率采樣RXD端狀態(tài)。當(dāng)采樣的RXD端電平由1到0的跳變時,就啟動接收器。串行口按程序?qū)彾ǖ母袷浇邮找粠a,并把此碼的數(shù)據(jù)位拼成并行碼送入接收緩沖寄存器中(在方式1時,把停止位:方式2、3時把程控的第九位數(shù)據(jù)都送入RB8),等待CPU取走。為保證可靠無誤,對每一數(shù)據(jù)位要進(jìn)行連續(xù)3次采樣,接收的值取3次采樣中至少相同的二次的值。接收完畢,置接收中斷標(biāo)志RI=1。CPU的響應(yīng)中斷后必須在中斷服務(wù)程序中使RI清零?,F(xiàn)在是23頁\一共有94頁\編輯于星期一方式1工作方式波形圖現(xiàn)在是24頁\一共有94頁\編輯于星期一方式2、3工作方式波形圖現(xiàn)在是25頁\一共有94頁\編輯于星期一方式1與方式2、3的區(qū)別之一是:方式1其數(shù)據(jù)字是8位異步通信接口,串行口發(fā)送/接收收共10位信息,第0位為起始位“0”,1—8位是數(shù)據(jù)位,最后是停止位“1”;方式2、3其數(shù)據(jù)字為9位的異步通信接口。1位起始位“0”,8位數(shù)據(jù)位,第9位是可程控位“1”或“0”,最后是停止位“1”,共有11位信息。方式1與方式2、3的區(qū)別之二是:方式1、3的波特率是可變的,其波特率取決于定時器1的溢出率和特殊功能寄存器PCON中的SMOD位的值,即工作方式1、3的波特率=2SMOD×(定時器1的溢出率)/32而工作方式2的波特率=2SMOD×(振蕩器頻率)/64顯然,方式2的波特率變化范圍比方式1、3小,這也是方式2和方式3的唯一區(qū)別。
TB8可用于多機(jī)通信或作為奇偶校驗位使用。若以TB8位作為奇偶校驗位,處理方法為數(shù)據(jù)寫入SBUF之前,先將數(shù)據(jù)的奇偶位寫入TB8(設(shè)工作寄存器區(qū)2的R0作為發(fā)送數(shù)據(jù)區(qū)地址指針)?,F(xiàn)在是26頁\一共有94頁\編輯于星期一
RIPTI:PUSH PSW;保護(hù)現(xiàn)場PUSH ACCSETB PSW.4CLR PSW.3CLR TI;發(fā)送中斷標(biāo)志TI清零MOV A,@R0;取數(shù)據(jù)MOV C,PMOV TB8,CMOV SBUF,A;數(shù)據(jù)寫入到發(fā)送緩沖器,啟動發(fā)送器INC R0;數(shù)據(jù)指針加1POP ACCPOP PSW;恢復(fù)現(xiàn)場RETI現(xiàn)在是27頁\一共有94頁\編輯于星期一對輸入方式而言,除選不同的方式控制外,均應(yīng)使REN=1,允許串行接收。只有在最后的移位脈沖產(chǎn)生并同時滿足下列二個條件時,才會產(chǎn)生接收數(shù)據(jù)裝入SBUF和RB8及置位RI的信號:對方式1 對方式2、31)RI=0 1)RI=02)SM2=0或接收到的停止位=1 2)SM2=0或接收到的第九個數(shù)據(jù)=1如果不滿足上述條件,接收到的信號將不可避免的丟失。由此可見,中斷標(biāo)志必須由用戶在中斷服務(wù)程序中設(shè)置清“0”指令。否則,將有可能產(chǎn)生另一次中斷而造成混亂并影響后序數(shù)據(jù)的接收?,F(xiàn)在是28頁\一共有94頁\編輯于星期一(2)串口2的UART方式1)模式1:10位數(shù)據(jù)通過TXD2/P1.3(TXD2/P4.3)發(fā)送,通過RXD2/P1.2(RXD2/P4.2)接收。一幀數(shù)據(jù)包含一個起始位(0),8個數(shù)據(jù)位和一個停止位(1)。接收時,停止位進(jìn)入特殊功能寄存器S2CON的S2RB8位。波特率由獨(dú)立波特率發(fā)生器BRT的溢出率決定。2)模式2:11位數(shù)據(jù)通過TXD2/P1.3(TXD2/P4.3)發(fā)送,通過RXD2/P1.2(RXD2/P4.2)接收。一幀數(shù)據(jù)包含一個起始位(0),8個數(shù)據(jù)位,一個可編程的第9位和一個停止位(1)。發(fā)送時,第9位數(shù)據(jù)由特殊功能寄存器S2CON的S2TB8位確定;接收時,第9位數(shù)據(jù)進(jìn)入特殊功能寄存器S2CON的S2RB8位。波特率為:Fosc/32或者Fosc/64。3)模式3:波特率的確定方法與模式1相同,數(shù)據(jù)的傳輸模式和模式2相同。現(xiàn)在是29頁\一共有94頁\編輯于星期一8.2.3多處理機(jī)通信
下面以使用串口1為例說明多機(jī)通信的過程。串行口控制寄存器SCON中的SM2位為方式2和方式3工作時進(jìn)行多機(jī)通信的控制位。這種多機(jī)通信方式一般為一臺主機(jī):多臺從機(jī)系統(tǒng);主機(jī)發(fā)送信息可被各從機(jī)接收,而從機(jī)只能對主機(jī)發(fā)送信息。而從機(jī)間互相不能直接通信?,F(xiàn)在是30頁\一共有94頁\編輯于星期一多機(jī)系統(tǒng)中使用兩類信息,一類是地址信息,用于選擇從機(jī);另一類是要傳送的數(shù)據(jù)信息。在通信中使用第9位區(qū)分兩類信息。地址幀:第9位為1數(shù)據(jù)幀:第9位為0從機(jī)系統(tǒng)由初始化程序(或相關(guān)處理程序)將串行口置成工作方式2或3,SM2=1,REN=1,處于接收狀態(tài)。當(dāng)主機(jī)和某一從機(jī)通信時,主機(jī)應(yīng)先發(fā)出地址幀確定某從機(jī)的地址,接著才能送數(shù)據(jù)或命令。當(dāng)各從機(jī)接收到主機(jī)發(fā)出的地址幀信息后,由于第9數(shù)據(jù)位為“1”,可激發(fā)中斷標(biāo)志RI=1,分別中斷CPU。各CPU響應(yīng)中斷后均進(jìn)入中斷服務(wù)程序,在服務(wù)程序中把主機(jī)送來的地址號與本從機(jī)的地址號相比較,若地址相等,則使本機(jī)之SM2置“0”,為接收主機(jī)接著送來的數(shù)據(jù)幀作準(zhǔn)備。而地址號不符的其他從機(jī)仍然維持SM2=1狀態(tài),對主機(jī)以后發(fā)出的數(shù)據(jù)幀信息不予理睬,不激發(fā)中斷標(biāo)志RI=0,直到與主機(jī)發(fā)出的地址信息相符后,才可接收以后的數(shù)據(jù)信息。從而實(shí)現(xiàn)了主從一對一通信(點(diǎn)――點(diǎn)通信)。在多機(jī)通信時,SM2控制位起著極為重要的作用?,F(xiàn)在是31頁\一共有94頁\編輯于星期一方式0:串口1:波特率為振蕩頻率的1/12或1/2(由UART_M0x6決定)。
串口2:波特率為振蕩頻率的1/12,忽略波特率發(fā)生器。方式2:波特率是可編程設(shè)定的,有兩種波特率可選擇,它取決于電源控制寄存器PCON中SMOD位的值,當(dāng)SMOD=0時,為振蕩頻率的1/64;當(dāng)SMOD=1時,為振蕩頻率的1/32。工作于方式1和3時:波特率是可變的。對于串口1,可以通過編程改變定時器1的溢出率或者獨(dú)立波特率發(fā)生器的溢出率來確定波特率。對于串口2,只能通過編程改變獨(dú)立波特率發(fā)生器的溢出率來確定波特率。
波特率=×(定時器1的溢出率或獨(dú)立波特率發(fā)生器的溢出率
)定時器1作為波特率發(fā)生器應(yīng)用時,最典型的用法是定時器1工作在自動再裝入時間常數(shù)的定時方式2(即定時器的方式控制寄存器TMOD的高四位為0010B狀態(tài)。定時器的控制寄存器TCON的TCON.6(TR1)=1啟動定時器1,禁止定時器中斷)。這時溢出率取決于TH1中的自動重新再裝入值。定時器1的溢出率可由下式算出:溢出率=其中,12T模式時,n=1;1T模式時,n=0。將此值代入求波特率的算式,可求得串行口的波特率=8.2.4波特率的設(shè)定
現(xiàn)在是32頁\一共有94頁\編輯于星期一當(dāng)使用獨(dú)立波特率發(fā)生器BRT時,獨(dú)立波特率發(fā)生器的溢出率為:獨(dú)立波特率發(fā)生器的溢出率=Fosc/[12n×(256–BRT)]其中,BRT為BRT寄存器的值。對于獨(dú)立波特率發(fā)生器BRT,1T模式是指BRTx12=1,12T模式是指BRTx12=0。12T模式時,n=1;1T模式時,n=0。此時,串行口的波特率計算公式為:串行口的波特率=
由于串口2只能使用獨(dú)立波特率發(fā)生器,因此,在使用串口2時,應(yīng)特別注意波特率的設(shè)置方法。
現(xiàn)在是33頁\一共有94頁\編輯于星期一SMOD=0時,自動重裝時間常數(shù)RELOAD的計算方法:(1)計算RELOAD1)12T模式的計算公式:RELOAD=256-INT(fosc/Baud0/32/12+0.5)2)1T模式的計算公式:RELOAD=256-INT(fosc/Baud0/32+0.5)式中,INT()表示取整運(yùn)算即舍去小數(shù),在式中加0.5可以達(dá)到四舍五入的目的。fosc為晶振頻率;Baud0為標(biāo)準(zhǔn)波特率。(2)計算用RELOAD產(chǎn)生的波特率1)12T模式:Baud=fosc/(256-RELOAD)/32/122)1T模式:Baud=fosc/(256-RELOAD)/32(3)計算誤差率error=(Baud-Baud0)/Baud0*100%(4)如果誤差率>4.5%,則需要更換波特率或者更換晶體頻率,重復(fù)步驟1)-4)。例如:設(shè)fosc=22.1184MHz,Baud0=57600,則12T模式時,RELOAD=256-INT(22118400/57600/32/12+0.5)=255=0FFHBaud=22118400/(256-255)/32/12=57600誤差等于零。又如,設(shè)fosc=18.432MHz,Baud0=57600,則12T模式時,RELOAD=256-INT(18432000/57600/32/12+0.5)=0FFHBaud=18432000/(256-255)/32/12=48000誤差:error=(48000-57600)/57600*100%=-16.66%誤差很大,需要更換波特率或者更換晶體頻率。在實(shí)際設(shè)計時,為了保證通信的可靠性,應(yīng)盡量保證設(shè)計后的誤差為0。常用波特率與系統(tǒng)時鐘及定時器1的重裝時間常數(shù)等設(shè)置關(guān)系請參考表8-4?,F(xiàn)在是34頁\一共有94頁\編輯于星期一8.2.5串行接口通信應(yīng)用舉例
1、串口1的編程要點(diǎn)(1)設(shè)置串口的工作模式設(shè)置SCON寄存器的內(nèi)容。若要串口接收,需將其中的REN位置1。(2)設(shè)置正確的波特率1)使用定時器1作為波特率發(fā)生器時,需要設(shè)置定時器1的工作方式和時間常數(shù)(設(shè)定TMOD和TH1、TL1寄存器的內(nèi)容);啟動定時器1(置位TR1)。2)使用獨(dú)立波特率發(fā)生器時,需要設(shè)置獨(dú)立波特率發(fā)生器寄存器和相應(yīng)的位,包括:獨(dú)立波特率發(fā)生器寄存器BRT,BRTx12位,SMOD位。啟動BRT(置位BRTR),BRT開始計數(shù)。(3)設(shè)置串口的中斷優(yōu)先級(設(shè)置PS和PSH,也可以不設(shè)置,取默認(rèn)值),設(shè)置相應(yīng)的中斷控制位(ES和EA)。(4)如要串口1發(fā)送,將數(shù)據(jù)送入SBUF。(5)編制串行中斷服務(wù)程序,在中斷服務(wù)程序中要有清除中斷標(biāo)志指令(將TI和RI清零)。
現(xiàn)在是35頁\一共有94頁\編輯于星期一2、串口2的編程要點(diǎn)(1)設(shè)置串口2的工作模式設(shè)置S2CON寄存器中的S2SM0和S2SM1兩位。如要串口2接收,將S2REN置1。(2)設(shè)置串口2的波特率相應(yīng)的寄存器和位,包括:獨(dú)立波特率發(fā)生器寄存器BRT、BRTx12和S2SMOD位。啟動BRT(置位BRTR),BRT開始計數(shù)。(3)設(shè)置串口2的中斷優(yōu)先級(設(shè)置PS2和PS2H,也可以不設(shè)置,取默認(rèn)值),設(shè)置打開相應(yīng)的中斷控制位(ES2和EA)。(4)如要串口2發(fā)送,將數(shù)據(jù)送入S2BUF。(5)編制串行中斷服務(wù)程序,在中斷服務(wù)程序中要設(shè)置清除中斷標(biāo)志指令(分別是接收完成標(biāo)志S2RI和發(fā)送完成標(biāo)志S2TI)。現(xiàn)在是36頁\一共有94頁\編輯于星期一例8-1
設(shè)有甲、乙兩臺單片機(jī),編出兩臺單片機(jī)間實(shí)現(xiàn)如下串行通信功能的程序。甲機(jī)發(fā)送:將首址為ADDRT的128個字節(jié)的數(shù)據(jù)塊順序向乙機(jī)發(fā)送;乙機(jī)接收:將接收的128個字節(jié)的數(shù)據(jù),順序存放在以首址為ADDRR的數(shù)據(jù)緩沖區(qū)中。編制該類程序的要點(diǎn)是,選定正確的控制字,以保證接口功能的初始化;選擇合適的波特率,這主要是選擇定時器1的方式和時間常數(shù)的確定;最后還應(yīng)注意是在串行中斷服務(wù)程序中要設(shè)置清除中斷標(biāo)志指令,否則將產(chǎn)生另一個中斷?,F(xiàn)在是37頁\一共有94頁\編輯于星期一甲機(jī)發(fā)送程序流程圖現(xiàn)在是38頁\一共有94頁\編輯于星期一匯編語言發(fā)送程序如下:$include(STC12C5A.INC);包含STC12C5A60S2單片機(jī)寄存器定義文件 ORG 0000H LJMP MAINT ;跳至主程序入口 ORG 0023H LJMP INTSE1 ;轉(zhuǎn)至串行中斷服務(wù)程序 ORG 0100HMAINT: MOV SP,#60H ;設(shè)置堆棧指針 MOV SCON,#01000000B ;置串行口工作方式1 MOV TMOD,#20H ;定時器1為工作方式2 MOV TH1,#0FDH ;產(chǎn)生9600bps的時間常數(shù) MOV TL1,#0FDH SETB TR1 ;啟動定時器1 SETB ES ;串行口開中斷 SETB EA ;開中斷 MOV DPTR,#ADDRT ;ADDRT是首址,可以使用EQU定義 MOV R0,#00H ;傳送字節(jié)數(shù)初值 MOVX A,@DPTR ;取第一個發(fā)送字節(jié) MOV SBUF,A ;啟動串行口發(fā)送 SJMP$ ;等待中斷;中斷服務(wù)程序INTSE1: CLR TI ;將中斷標(biāo)志清零 CJNER0,#7FH,LOOPT;判斷128B是否發(fā)送完,若沒完,則轉(zhuǎn)LOOPT CLR ES ;全部發(fā)送完畢,禁止串行口中斷 LJMP ENDT ;轉(zhuǎn)中斷返回LOOPT: INC R0 ;修改字節(jié)數(shù)指針
INC DPTR ;修改地址指針
MOVX A,@DPTR ;取發(fā)送數(shù)據(jù)
MOV SBUF,A ;啟動串行口ENDT: RETI ;中斷返回
END
現(xiàn)在是39頁\一共有94頁\編輯于星期一對應(yīng)的C語言程序如下:#include“stc12c5a.h”//包含STC12C5A60S2單片機(jī)寄存器定義文件unsignedcharxdataADDRT[128]; //在外部RAM區(qū)定義128個單元unsignedcharnum=0;
//聲明計數(shù)變量unsignedchar*psend; //指向發(fā)送數(shù)據(jù)區(qū)的指針voidmain(void) //主程序{ SCON=0x40; //置串行口工作方式1 TMOD=0x20; //定時器1為工作方式2 TH1=0xFD; //產(chǎn)生9600bps的時間常數(shù) TL1=0xFD; TR1=1; //啟動定時器1 ES=1; //串行口開中斷 EA=1; //開中斷 psend=ADDRT; //設(shè)置發(fā)送數(shù)據(jù)緩沖區(qū)指針 SBUF=*psend; //發(fā)送第一個數(shù)據(jù) while(1); //等待中斷}voidUART_ISR(void)interrupt4 //中斷號4是串行中斷{ TI=0; //清發(fā)送中斷標(biāo)志 num++; //修改計數(shù)變量值 if(num==0x7F)ES=0; //判斷是否發(fā)送完,若已完,則關(guān)中斷 else //否則,修改指針,發(fā)送下一個數(shù)據(jù) { psend++; SBUF=*psend; }}現(xiàn)在是40頁\一共有94頁\編輯于星期一乙機(jī)接收數(shù)據(jù)流程圖現(xiàn)在是41頁\一共有94頁\編輯于星期一接收程序如下(匯編語言):對應(yīng)的C語言程序請思考$include(STC12C5A.INC);包含STC12C5A60S2單片機(jī)寄存器定義文件 ORG 0000H LJMP MAINR ;轉(zhuǎn)主程序 ORG 0023H LJMP INTSE2 ;轉(zhuǎn)串行口中斷服務(wù)程序 ORG 0100HMAINR: MOV SP,#60H ;設(shè)置堆棧指針 MOV SCON,#01010000B ;置串行口工作方式1,允許接收
MOV TMOD,#20H ;定時器1為工作方式2 MOV TH1,#0FDH ;產(chǎn)生9600bps的時間常數(shù)
MOV TL1,#0FDH SETB TR1 ;啟動定時器1 SETB ES ;串行口開中斷 SETB EA ;開中斷
MOV DPTR,#ADDRR ;數(shù)據(jù)緩沖區(qū)首址送DPTR MOV R0,#00H ;置傳送字節(jié)數(shù)初值
SJMP $ ;等待中斷;中斷服務(wù)程序INTSE2: 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 ;中斷返回
END現(xiàn)在是42頁\一共有94頁\編輯于星期一例8-2設(shè)有甲、乙兩臺單片機(jī),編寫程序,使用調(diào)用子程序的方法進(jìn)行串行通信。甲機(jī)(發(fā)送機(jī));從內(nèi)部RAM單元20H~25H中取出6個ASCII碼數(shù)據(jù),在最高位加上奇偶校驗位后由串行口發(fā)送。采用8位異步通信,波特率為1200bps,(假設(shè)系統(tǒng)時鐘為11.0592MHz)。乙機(jī)(接收機(jī)):把接收到的ASCII碼數(shù)據(jù),先進(jìn)行奇偶校驗,若校驗正確,將數(shù)據(jù)依次存放在內(nèi)部RAM區(qū)20H~25H單元中。若校驗出錯,則將出錯信息“0FFH”存入相應(yīng)的單元?,F(xiàn)在是43頁\一共有94頁\編輯于星期一調(diào)用子程序的查詢方式串行通信流程圖現(xiàn)在是44頁\一共有94頁\編輯于星期一甲機(jī)的匯編語言程序如下:$include(STC12C5A.INC);包含STC12C5A60S2單片機(jī)寄存器定義文件 ORG 0000H ;主程序入口
LJMP MAINT ORG 0030HMAINT: MOV SP,#60H MOV TMOD,#20H ;置定時器1為工作方式2 MOV TH1,#0E8H ;置波特率時間常數(shù)
MOV TL1,#0E8H MOV SCON,#40H ;置串行口為工作方式1 SETB TR1 ;啟動定時器1工作
MOV R0,#20H ;數(shù)據(jù)首地址送R0 MOV R7,#06H ;傳送字節(jié)數(shù)送R7LOOPT: MOV A,@R0 ;取一個待傳送的數(shù)據(jù)字節(jié)
LCALL DATAOUT ;調(diào)用串行可發(fā)送子程序
INC R0 ;修改地址指針
DJNZ R7,LOOPT ;若沒有全部發(fā)送完畢,則轉(zhuǎn)LOOPT繼續(xù)發(fā)送
SJMP $DATAOUT:;串行口發(fā)送子程序
MOV C,P ;設(shè)置奇偶校驗位(補(bǔ)奇)
CPL C MOV ACC.7,C MOV SBUF,A ;啟動串行口發(fā)送數(shù)據(jù)
JNB TI,$ ;等待數(shù)據(jù)字節(jié)發(fā)送完畢
CLR TI ;清發(fā)送標(biāo)志TI,為下一數(shù)據(jù)字節(jié)串行發(fā)送作準(zhǔn)備
RET END現(xiàn)在是45頁\一共有94頁\編輯于星期一對應(yīng)的C語言程序如下:#include“stc12c5a.h”//包含STC12C5A60S2單片機(jī)寄存器定義文件unsignedchardataADDRT[6]_at_0x20; //在內(nèi)部RAM區(qū)定義6個單元voidmain(void) //主程序{ unsignedchari; TMOD=0x20;//置定時器1為工作方式2 TH1=0xe8;//置波特率時間常數(shù)
TL1=0xe8; SCON=0x40;//置串行口為工作方式1 TR1=1;//啟動定時器1工作
for(i=0;i<6;i++) UART_SEND(ADDRT[i]);//發(fā)送一個數(shù)據(jù)
while(1); //發(fā)送完畢,循環(huán)等待}voidUART_SEND(unsignedcharsenddata)//串行口發(fā)送子程序{ bittmpbit; ACC=senddata; tmpbit=P;//設(shè)置奇偶校驗位(補(bǔ)奇)
tmpbit=!tmpbit; if(tmpbit)senddata=senddata|0x80; elsesenddata=senddata&0x7f; SBUF=senddata;//啟動串行口發(fā)送數(shù)據(jù)
while(TI==0);//等待數(shù)據(jù)字節(jié)發(fā)送完畢
TI=0;//清發(fā)送標(biāo)志TI,為下一數(shù)據(jù)字節(jié)串行發(fā)送作準(zhǔn)備}現(xiàn)在是46頁\一共有94頁\編輯于星期一$include(STC12C5A.INC);包含STC12C5A60S2單片機(jī)寄存器定義文件
ORG 0000H ;主程序入口地址
LJMP MAINR ORG 0030HMAINR: MOV SP,#60H MOV TMOD,#20H ;置定時器1為工作方式2 MOV TH1,#0E8H ;置波特率時間常數(shù)
MOV TL1,#0E8H MOV SCON,#52H ;置串行口為工作方式1,并使REN=1 SETB TR1 ;啟動定時器1 MOV R0,#20H ;存放數(shù)據(jù)首地址送R0 MOV R7,#06H ;存放數(shù)據(jù)字節(jié)數(shù)送R7LOOP: LCALL DATAIN ;調(diào)用接收子程序
JC ERROR ;若C=1,則出錯,轉(zhuǎn)出錯處理程序
MOV @R0,A ;將接收的數(shù)據(jù)送指定RAM單元中
LJMP LOOPCERROR: MOV @R0,#0FFH ;將出錯字符”0FFH”送指定RAM單元LOOPC: INC R0 ;修改地址指針
DJNZ R7,LOOP ;若沒全部接收完畢,則繼續(xù)接收數(shù)據(jù);否則順序進(jìn)行
SJMP $;串行口接收子程序DATAIN: JNB RI,$ ;等待一個數(shù)據(jù)字節(jié)接收完畢
CLR RI ;接收完畢,清標(biāo)志RI,為接收下一個數(shù)據(jù)字節(jié)作準(zhǔn)備
MOV A,SBUF ;接收到的數(shù)據(jù)字節(jié)送A MOV C,P ;檢查奇偶校驗位
CPL C ANL A,#7FH ;消去奇校驗位
RET ;子程序返回
END
乙機(jī)匯編語言程序現(xiàn)在是47頁\一共有94頁\編輯于星期一【例8-3】多機(jī)通信編程舉例
現(xiàn)用簡單實(shí)例說明多機(jī)串行通信中從機(jī)的基本工作過程。而實(shí)際應(yīng)用中還需要考慮通信的規(guī)范協(xié)議。有些協(xié)議很復(fù)雜,在此不加以考慮。假設(shè)系統(tǒng)晶振頻率為11.0592MHz。編程實(shí)現(xiàn)如下功能:主機(jī):先向從機(jī)發(fā)送一幀地址信息,然后再向從機(jī)發(fā)送10個數(shù)據(jù)信息。從機(jī):接收主機(jī)發(fā)來的地址幀信息,并與本機(jī)的地址號相比較,若不符合,仍保持SM2=1不變;若相等,則使SM2清零,準(zhǔn)備接收后續(xù)的數(shù)據(jù)信息,直至接收完10個數(shù)據(jù)信息。
現(xiàn)在是48頁\一共有94頁\編輯于星期一a)主機(jī)程序流程圖b)從機(jī)程序流程圖
現(xiàn)在是49頁\一共有94頁\編輯于星期一主機(jī)程序:$include(STC12C5A.INC);包含STC12C5A60S2單片機(jī)寄存器定義文件ADDRT EQU 0000HSLAVE EQU 5 ;從機(jī)地址號 ORG 0000H LJMP MAINT ;主程序入口地址
ORG 0023H LJMP INTST ;串行口中斷入口地址
ORG 0100HMAINT: MOV SP,#60H MOV SCON,#0C0H ;串行口方式3 MOV TMOD,#20H ;置T1工作方式2 MOV TH1,#0FAH ;置4800波特率
MOV TL1,#0FAH ;相應(yīng)的時間常數(shù)
MOV DPTR,#ADDRT ;置數(shù)據(jù)地址指針
MOV R0,#00H ;發(fā)送數(shù)據(jù)字節(jié)計數(shù)清零
MOV R2,#SLAVE ;從機(jī)地址號→R2 SETB TR1 ;啟動T1 SETB ES ;串行口開中斷
SETB EA ;CPU開中斷
SETB TB8 ;置位TB8,作為地址幀信息特征
MOV A,R2 ;發(fā)送地址幀信息
MOV SBUF,A SJMP $ ;等待中斷現(xiàn)在是50頁\一共有94頁\編輯于星期一;串行口中斷服務(wù)程序:INTST: 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 END
現(xiàn)在是51頁\一共有94頁\編輯于星期一對應(yīng)的C語言版程序如下:#include“stc12c5a.h”//包含STC12C5A60S2單片機(jī)寄存器定義文件unsignedcharxdataADDRT[10]; //保存數(shù)據(jù)的外部RAM單元unsignedcharSLAVE; //保存從機(jī)地址號的變量unsignedcharnum=0,*mypdata;voidmain(void){ SCON=0xC0; TMOD=0x20; TH1=0xFA; TL1=0xFA; mypdata=ADDRT; SLAVE=5; //定義從機(jī)地址,在此假設(shè)從機(jī)地址為5 TR1=1; ES=1; EA=1; TB8=1; SBUF=SLAVE; //發(fā)送從機(jī)地址
while(1); //等待中斷}
現(xiàn)在是52頁\一共有94頁\編輯于星期一voidSerial_ISR(void)interrupt4{ TI=0; TB8=0; SBUF=*mypdata; //發(fā)送數(shù)據(jù)
mypdata++; //修改指針
num++; if(num==0x0a)ES=0;}現(xiàn)在是53頁\一共有94頁\編輯于星期一從機(jī)程序如下:$include(STC12C5A.INC);包含STC12C5A60S2單片機(jī)寄存器定義文件ADDRR EQU 0000HSLAVE EQU 5 ;從機(jī)地址號 ORG 0000H LJMP MAINR ;從機(jī)主程序入口地址
ORG 0023H LJMP INTSR ;串行口中斷入口地址
ORG 0100HMAINR: MOV SP,#60H MOV SCON,#0F0H ;串行口方式3,SM2=1,REN=1,接收狀態(tài)
MOV TMOD,#20H ;置T1為工作方式2 MOV TH1,#0FAH ;置4800波特率
MOV TL1,#0FAH ;相應(yīng)的時間常數(shù)
MOV DPTR,#ADDRR ;置數(shù)據(jù)地址指針
MOV R0,#0AH ;置接收數(shù)據(jù)字節(jié)數(shù)指針
SETB TR1 ;啟動T1 SETB ES ;串行口開中斷
SETB EA ;CPU開中斷
SJMP $ ;等待中斷現(xiàn)在是54頁\一共有94頁\編輯于星期一INTSR: 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 ;中斷返回
END
現(xiàn)在是55頁\一共有94頁\編輯于星期一對應(yīng)的C語言版程序如下:#include“stc12c5a.h”//包含STC12C5A60S2單片機(jī)寄存器定義文件unsignedcharxdataADDRR[10];unsignedcharSLAVE,num=0x0a,rdata,*mypdata;voidmain(void){ SCON=0xF0; TMOD=0x20; TH1=0xFA; TL1=0xFA; mypdata=ADDRR; SLAVE=5; //設(shè)定從機(jī)地址
TR1=1; ES=1; EA=1; while(1); //等待中斷}
現(xiàn)在是56頁\一共有94頁\編輯于星期一voidSerial_ISR(void)interrupt4{ 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
//為下一次接收地址信息作準(zhǔn)備
SM2=1; }}現(xiàn)在是57頁\一共有94頁\編輯于星期一【例8-4】串口1使用獨(dú)立波特率發(fā)生器作串行通信的實(shí)例。#include“stc12c5a.h”//包含STC12C5A60S2寄存器定義文件#include“intrins.h”#defineRELOAD_COUNT0xfb//Fosc=18.432MHz,12T,SMOD=0,9600bpssbitMCU_Start_Led=P1^4;unsignedchararray[9]={0,2,4,6,8,10,12,14,16};voidUART_send(unsignedchari);voiddelay(void);voiddisplay_MCU_Start_Led(void);voidmain(void){ unsignedchari; //串口初始化
SCON=0x50;//0101,00008位可變波特率,無奇偶校驗位
BRT=RELOAD_COUNT; AUXR=0x11;//BRTR=1,啟動獨(dú)立波特率發(fā)生器
//S1BRS=1,串口1選擇獨(dú)立波特率發(fā)生器作為波特率發(fā)生器
現(xiàn)在是58頁\一共有94頁\編輯于星期一
ES=1; //允許串口中斷
EA=1; //開總中斷
display_MCU_Start_Led();//點(diǎn)亮發(fā)光二極管表示單片機(jī)開始工作
UART_send(0x34);//串口發(fā)送數(shù)據(jù)表示單片機(jī)串口正常工作
UART_send(0xa7);//串口發(fā)送數(shù)據(jù)表示單片機(jī)串口正常工作
for(i=0;i<9;i++) UART_send(array[i]); while(1);}voidUART_send(unsignedchari){ ES=0;//關(guān)串口中斷
TI=0;//清零串口發(fā)送完成中斷請求標(biāo)志
SBUF=i; while(TI==0);//等待發(fā)送完成
TI=0;//清零串口發(fā)送完成中斷請求標(biāo)志
ES=1;//允許串口中斷}現(xiàn)在是59頁\一共有94頁\編輯于星期一voiddelay(void){ unsignedintg,j; for(j=0;j<5;j++) { for(g=0;g<50000;g++) {_nop_();_nop_();_nop_(); } }}現(xiàn)在是60頁\一共有94頁\編輯于星期一voiddisplay_MCU_Start_Led(void){unsignedchari;for(i=0;i<5;i++){MCU_Start_Led=0;//點(diǎn)亮MCU開始工作指示燈
delay();MCU_Start_Led=1;//熄滅MCU開始工作指示燈
delay();}}現(xiàn)在是61頁\一共有94頁\編輯于星期一voidUART_Receive(void)interrupt4{ unsignedchark; if(RI==1){ RI=0; k=SBUF; UART_send(k+1);}elseTI=0;}
現(xiàn)在是62頁\一共有94頁\編輯于星期一8.2.6計算機(jī)與單片機(jī)之間的串行通信
在以計算機(jī)為控制中心的數(shù)據(jù)采集與自動控制系統(tǒng)中,通常需要用單片機(jī)采集數(shù)據(jù),然后用異步串行通信方式傳給計算機(jī);要完成的控制命令由計算機(jī)通過串行通信方式傳給單片機(jī),由單片機(jī)進(jìn)行控制。計算機(jī)和單片機(jī)之間的串行通信一般采用RS-232、RS-422或RS-485總線標(biāo)準(zhǔn)接口,也有采用非標(biāo)準(zhǔn)的20mA電流環(huán)的。這里介紹最常用的RS-232接口串行通信的設(shè)計方法。RS-232是早期為公用電話網(wǎng)絡(luò)數(shù)據(jù)通信而制定的標(biāo)準(zhǔn),其邏輯電平與TTL/CMOS電平完全不同。邏輯“0”規(guī)定為+5~+15V之間,邏輯“1”規(guī)定為-5~-15V之間。由于RS-232發(fā)送和接收之間有公共地,傳輸采用非平衡模式,因此共模噪聲會耦合到信號系統(tǒng)中,標(biāo)準(zhǔn)中建議的最大通信距離為15m。下面通過一個簡單實(shí)例,介紹計算機(jī)與單片機(jī)進(jìn)行RS232通信的硬件接口設(shè)計和軟件設(shè)計?,F(xiàn)在是63頁\一共有94頁\編輯于星期一【例8-5】計算機(jī)向單片機(jī)發(fā)送一個數(shù)據(jù),單片機(jī)接收到數(shù)據(jù)后,將接收到的數(shù)據(jù)回發(fā)給計算機(jī)。假設(shè)單片機(jī)的系統(tǒng)時鐘為11.0592MHz,通信參數(shù)為“9600,n,8,1”(這是常見的通信參數(shù)表示方法,即波特率為9600bps,8個數(shù)據(jù)位,1個停止位,沒有奇偶校驗)。在計算機(jī)上顯示從單片機(jī)發(fā)送過來的數(shù)據(jù)。可以使用該方法測試硬件電路的連接情況?,F(xiàn)在是64頁\一共有94頁\編輯于星期一
1.硬件接口設(shè)計從硬件上講,計算機(jī)的串行口是RS-232電平的,而單片機(jī)的串口是TTL電平的。因此,要實(shí)現(xiàn)單片機(jī)與計算機(jī)之間的串行通信,必須通過電路實(shí)現(xiàn)TTL電平和RS-232電平的轉(zhuǎn)換。常用的電平轉(zhuǎn)換集成電路是MAX232或者與它兼容轉(zhuǎn)換芯片,它包含兩路驅(qū)動器和接收器。單片機(jī)與計算機(jī)進(jìn)行串行通信的硬件連接,最簡單的方法是采用三線制連接方式,也就是說,計算機(jī)的9針串口只連接其中的3根線:第5腳的GND、第2腳的RXD、第3腳的TXD。電路如教材圖1-7?,F(xiàn)在是65頁\一共有94頁\編輯于星期一2.軟件設(shè)計
軟件設(shè)計往往因應(yīng)用系統(tǒng)要求的不同而不同。根據(jù)題目的要求,進(jìn)行如下的計算機(jī)程序設(shè)計和單片機(jī)程序設(shè)計。(1)上位計算機(jī)程序設(shè)計
軟件設(shè)計往往因應(yīng)用系統(tǒng)要求的不同而不同。軟件設(shè)計分為上位機(jī)程序設(shè)計和單片機(jī)程序設(shè)計兩部分。如果僅僅為了測試串口的電路連接以及單片機(jī)通信程序設(shè)計正確與否,上位機(jī)程序可以直接使用現(xiàn)成的串口調(diào)試助手軟件。當(dāng)然,也可以使用VisualC++等可視化程序開發(fā)環(huán)境自行設(shè)計。串口調(diào)試助手軟件可以從中下載。
現(xiàn)在是66頁\一共有94頁\編輯于星期一利用STC2C5A60S2單片機(jī)的串口2和上位計算機(jī)通信。匯編語言程序(系統(tǒng)晶振為11.0592MHz,波特率為9600bit/s):$INCLUDE(STC12C5A.INC);包含STC12C5A60S2單片機(jī)寄存器定義文件BITTEST DATA 20HS2TIbit BIT 01HS2RIbit BIT 00H ORG 0000H LJMP MAIN ORG 0043H LJMP UART2_ISR ORG 0100HMAIN: MOV SP,#60H ;設(shè)置堆棧
MOV S2CON,#50H;010100008位可變波特率,無奇偶校驗位,允許接收
MOV BRT,#0FDH MOV AUXR,#11H;BRTR=1(啟動BRT),S1BRS=1 MOVIE2,#01H;允許串口2中斷,ES2=1 SETB EA SJMP $現(xiàn)在是67頁\一共有94頁\編輯于星期一UART2_ISR: MOV BITTEST,S2CON ;將S2CON保存到20H單元以便位尋址
JBC S2RIbit,RDATA ;若是接收中斷,則將S2RI清零
CLR S2TIbit ;否則就是發(fā)送中斷,將S2TI清零
LJMP RETURNRDATA: MOV A,S2BUF ;讀取收到的數(shù)據(jù)
CPL A MOV S2BUF,A ;將收到的數(shù)據(jù)發(fā)送回去RETURN: MOV S2CON,BITTEST;該語句可以起到中斷標(biāo)志清零的作用
RETI END現(xiàn)在是68頁\一共有94頁\編輯于星期一對應(yīng)的C語言程序如下:#include“stc12c5a.h”//包含STC12C5A60S2單片機(jī)寄存器定義文件charbdatabittest;//為了保存中斷標(biāo)志sbitTIbit=bittest^1;//第1位sbitRIbit=bittest^0;//第0位voidmain(void){ S2CON=0x50; BRT=0xFD; AUXR=0x11; IE2=0x01; EA=1; while(1);}現(xiàn)在是69頁\一共有94頁\編輯于星期一voidUART2_ISR(void)interrupt8{ unsignedchartmpdata; bittest=S2CON; if(RIbit) { RIbit=0; tmpdata=S2BUF; S2BUF=~tmpdata; } else TIbit=0; S2CON=bittest; //清零中斷標(biāo)志}現(xiàn)在是70頁\一共有94頁\編輯于星期一8.3.1串行外設(shè)接口(SPI)的結(jié)構(gòu)1.SPI簡介串行外設(shè)接口(SerialPeripheralInterface,簡稱SPI)實(shí)際上是一種串行總線接口標(biāo)準(zhǔn),SPI方式可允許同時同步接收和傳送8位數(shù)據(jù),是一種全雙工串行總線。其速度比UART串行接口要快。SPI支持在同一總線上將多個從機(jī)連接到一個主機(jī)。同一總線上也可以有多個主機(jī),當(dāng)兩個或多個主機(jī)試圖同時進(jìn)行數(shù)據(jù)傳輸時,需要進(jìn)行碰撞檢測。STC12C5A60S2單片機(jī)集成了SPI接口,它是一個全雙工高速同步通信接口,既可以和其他微處理器通信,也可以與具有SPI兼容接口的器件,如存儲器、A/D轉(zhuǎn)換器、D/A轉(zhuǎn)換器、LED或LCD驅(qū)動器等進(jìn)行同步通信。SPI也可以在一個多主機(jī)系統(tǒng)中負(fù)責(zé)內(nèi)部處理器之間的通信。SPI接口有兩種操作模式:主模式和從模式。在主模式中支持高達(dá)3Mbit/s的速率(工作頻率為12MHz時,如果CPU主頻采用20MHz到36MHz,則可更高);從模式時速度無法太快,速度在fosc/8以內(nèi)較好。此外,SPI接口還具有傳輸完成標(biāo)志和寫沖突標(biāo)志保護(hù)功能。8.3STC12C5A60S2單片機(jī)的SPI接口現(xiàn)在是71頁\一共有94頁\編輯于星期一2.SPI接口的結(jié)構(gòu)現(xiàn)在是72頁\一共有94頁\編輯于星期一8.3.2SPI的數(shù)據(jù)通信1、SPI接口信號
SPI接口由MISO(與P1.6共用)、MOSI(與P1.5共用)、SCLK(與P1.7)和/SS(與P1.4共用)4根信號線構(gòu)成。
MOSI(MasterOutSlaveIn,主出從入):
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)場土地交換合同范本
- 買賣農(nóng)村房合同范本
- 分期購房抵押合同范例
- 合肥經(jīng)紀(jì)合同范例
- 他人代付合同范例
- app售后服務(wù)合同范例
- 做櫥柜合同范例
- 善于休息增進(jìn)健康 教學(xué)設(shè)計-九年級體育與健康
- 合作養(yǎng)肉鵝合同范例
- 勞動轉(zhuǎn)正合同范例
- 1.北京的春節(jié) 練習(xí)題(含答案)
- 年度得到 · 沈祖蕓全球教育報告(2024-2025)
- (一模)渭南市2025屆高三教學(xué)質(zhì)量檢測(I)語文試卷(含答案解析)
- 2025年支部工作計劃
- 精神病老人藥物護(hù)理
- ISO27001信息安全管理體系全套文件(手冊+程序文件+作業(yè)規(guī)范)
- 抖音矩陣規(guī)劃方案
- 拉薩市2025屆高三第一次聯(lián)考(一模)文科綜合試卷(含答案解析)
- 《焊接檢驗員培訓(xùn)》課件
- (中級)多媒體應(yīng)用設(shè)計師軟考試題及答案
- 《中國建筑特色》課件
評論
0/150
提交評論