版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第8章 串行通信,8.1 通信的有關(guān)概念,8.2 STC12C5A60S2單片機(jī)的串行接口,8.3 STC12C5A60S2單片機(jī)的SPI接口,8.1 通信的有關(guān)概念,實(shí)際應(yīng)用中,計(jì)算機(jī)的CPU與外部設(shè)備之間常常要進(jìn)行信息的交換,計(jì)算機(jī)之間也需要交換信息,所有這些信息的交換均稱為“通信”。,并行通信與串行通信,通信的基本方式可分為并行通信和串行通信兩種。并行通信,是指數(shù)據(jù)的各位同時(shí)進(jìn)行傳送的方式。其特點(diǎn)是傳輸速度快,但當(dāng)距離較遠(yuǎn),位數(shù)又多時(shí)導(dǎo)致了通信線路復(fù)雜且成本高。串行通信,是指數(shù)據(jù)一位一位的順序傳送的通信方式。其特點(diǎn)是通信線路簡單,只要一對傳輸線就可以實(shí)現(xiàn)通信,從而大大的降低了成本,特別適
2、用于遠(yuǎn)距離通信,但傳送速度慢。,1.按照串行數(shù)據(jù)的同步方式分類,按照串行數(shù)據(jù)的同步方式,串行通信本身又分為異步傳送和同步傳送兩種基本方式。 (1)異步傳送 在異步傳送中,每一個(gè)字符要用起始位和停止位作為字符開始和結(jié)束的標(biāo)志,它是以字符為單位一個(gè)個(gè)的發(fā)送和接收的。 異步傳送時(shí),每個(gè)字符的組成格式如下:首先是一個(gè)起始位表示字符的開始;后面緊跟著的是字符的數(shù)據(jù)字,數(shù)據(jù)字可以是5,6,7或8位數(shù)據(jù),在數(shù)據(jù)字中可根據(jù)需要加入奇偶校驗(yàn)位;最后是停止位,其長度可以是一位,一位半或兩位。所以,串行傳送的數(shù)據(jù)字節(jié)加上成幀信號起始位和停止位就形成一個(gè)字符串行傳送的幀。起始位用邏輯“0”低電平表示,停止位用邏輯“1
3、”高電平表示。圖(a)所示為數(shù)據(jù)字為7位的ASCII碼,第8位是奇偶校驗(yàn)位。加上起始位、停止位,一個(gè)字符由10位組成。這樣形成幀信號后,字符便可以一個(gè)接一個(gè)的傳送了。 在異步傳送中,字符間隔不固定,在停止位后可以加空閑位,空閑位用高電平表示,用于等待發(fā)送。這樣,接收和發(fā)送可以隨時(shí)的或間斷的進(jìn)行,而不受時(shí)間的限制。圖(b)為有空閑位的情況。,8.1.1 串行通信的分類,(2)同步傳送 所謂同步傳送就是去掉異步傳送時(shí)每個(gè)字符的起始位和停止位的成幀標(biāo)志信號,僅在數(shù)據(jù)塊開始處用同步字符來指示。如下圖所示。同步傳送的有效數(shù)據(jù)位傳送速率高于異步傳送,可達(dá)50千波特。其缺點(diǎn)是硬件設(shè)備較為復(fù)雜,因?yàn)樗笠?/p>
4、時(shí)鐘來實(shí)現(xiàn)發(fā)送端和接收端之間的嚴(yán)格同步,而且對時(shí)鐘脈沖信號的相位一致性還要求非常嚴(yán)格,為此通常還要采用“鎖相器”等措施來保證。,在異步數(shù)據(jù)傳送中,CPU與外設(shè)之間事先必須約好兩項(xiàng)事宜: 第一、字符格式。雙方要約好字符的編碼形式、奇偶校驗(yàn)形式、以及起始位和停止位的規(guī)定。 第二、波特率(Baud rate)。波特率是衡量數(shù)據(jù)傳送速率的指標(biāo),它要求發(fā)送站和接收站都要以相同的數(shù)據(jù)傳送速率工作。,2按照數(shù)據(jù)的傳送方向分類 1)點(diǎn)對點(diǎn)傳輸 一般情況下,串行數(shù)據(jù)傳送是在兩個(gè)通信端之間進(jìn)行的。其數(shù)據(jù)傳送的方式有如圖所示的幾種情況。 圖(a)為單工通信方式。A端為發(fā)送站,B端為接收站,數(shù)據(jù)僅能從A站發(fā)至B站。
5、圖(b)為半雙工通信方式。數(shù)據(jù)可以從A發(fā)送到B,也可以由B發(fā)送到A。不過同一時(shí)間只能作一個(gè)方向的傳送,其傳送方式由收發(fā)控制開關(guān)K來控制。 圖(c)為全雙工通信方式。每個(gè)站(A、B)既可同時(shí)發(fā)送,又可同時(shí)接收。,2)主從多終端通信方式 A站可以向多個(gè)終端(B、C、D)發(fā)出信息。在A站允許的條件下,可以控制管理B、C、D等站在不同的時(shí)間向A站發(fā)出信息。根據(jù)數(shù)據(jù)傳送的方向又可分為多終端半雙工通信和多終端全雙工通信。這種多終端通信方式常用于主從計(jì)算機(jī)系統(tǒng)通信中。,8.1.2 通用的異步接收器/發(fā)送器UART 在串行傳送中,數(shù)據(jù)是一位一位按順序進(jìn)行的,而計(jì)算機(jī)內(nèi)部的數(shù)據(jù)是并行的。因此當(dāng)計(jì)算機(jī)向外發(fā)送數(shù)據(jù)
6、時(shí),必須將并行的數(shù)據(jù)轉(zhuǎn)換為串行的數(shù)據(jù)再行傳送。反之,又必須將串行數(shù)據(jù)轉(zhuǎn)換為并行數(shù)據(jù)輸入計(jì)算機(jī)中。上述并串或串并的轉(zhuǎn)換既可以用通用的異步接收器/發(fā)送器實(shí)現(xiàn)。 通用的異步接收器/發(fā)送器,簡稱UART(Universal Asynchronous Receiver/Transmitter),是串行接口的核心部件,其結(jié)構(gòu)如圖所示,它既能發(fā)送,由并行串行輸出;又能接收,由串行并行輸入。對每一方來說都是一個(gè)雙緩沖器結(jié)構(gòu)。當(dāng)UART接收數(shù)據(jù)時(shí),串行數(shù)據(jù)先經(jīng)RXD端(Receiver Data)進(jìn)入移位寄存器,再經(jīng)移位寄存器輸出并行數(shù)據(jù)到緩沖器,最后通過數(shù)據(jù)總線送到CPU;當(dāng)UART發(fā)送信息時(shí),先由CPU經(jīng)數(shù)
7、據(jù)總線將并行數(shù)據(jù)送給緩沖器,再由并行緩沖器送給一位寄存器,最后逐位由TXD(Transmitter Data)端輸出。所有這些工作都是在時(shí)鐘信號和其他控制信號作用下完成的。,8.2 STC12C5A60S2單片機(jī)的串行口,STC12C5A60S2單片機(jī)具有2個(gè)采用UART工作方式的全雙工串行通信接口(串口1和串口2)。每個(gè)串口由2個(gè)數(shù)據(jù)緩沖器、1個(gè)移位寄存器、1個(gè)串行控制寄存器和一個(gè)波特率發(fā)生器等組成。每個(gè)串口的數(shù)據(jù)緩沖器由串行接收緩沖器和發(fā)送緩沖器構(gòu)成,它們在物理上是獨(dú)立的,既可以接收數(shù)據(jù)也可以發(fā)送數(shù)據(jù),還可以同時(shí)發(fā)送和接收數(shù)據(jù)。接收緩沖器只能讀出,不能寫入,而發(fā)送緩沖器則只能寫入,不能讀出
8、。它們共用一個(gè)地址號。STC12C5A60S2的串行口既可以用于串行異步通信,也可以構(gòu)成同步移位寄存器。如果在串行口的輸入/輸出引腳上加上電平轉(zhuǎn)換器,可以方便地構(gòu)成標(biāo)準(zhǔn)的RS-232接口。串口1與傳統(tǒng)8051單片機(jī)的串口完全兼容。串口2的結(jié)構(gòu)、工作原理與串口1類似。,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。,SM0/FE:PCON寄存器中的SMOD0位
9、為1時(shí),該位用于幀錯(cuò)誤檢測,當(dāng)檢測到一個(gè)無效停止位時(shí),通過UART接收器設(shè)置該位。它必須由軟件清零。PCON寄存器中的SMOD0為0時(shí),該位和SM1一起指定串行通信的工作方式,1. 串口1控制寄存器SCON SCON(地址為98H,復(fù)位值為00H)用于確定串行通道的操作方式和控制串行通道的某些功能。也可用于發(fā)送和接收第九個(gè)數(shù)據(jù)位(TB8、RB8),并設(shè)有接收和發(fā)送中斷標(biāo)志(RI及TI)位。SCON各位的意義如下:,SM2:在方式2和方式3時(shí),如SM2=1,只有在接收數(shù)據(jù)第9位為1時(shí)才能激發(fā)中斷標(biāo)志(RI=1)。在方式1時(shí),如SM2=1,則只有在接收到有效停止位時(shí)才能激發(fā)中斷標(biāo)志(RI=1)。在
10、方式0時(shí),SM2應(yīng)為0。 REN:允許串行I/O口接收控制位。用軟件置REN=1時(shí)為允許接收狀態(tài),可啟動(dòng)串行口的接收器RXD,開始接收數(shù)據(jù)。用軟件復(fù)位(REN=0)時(shí),為禁止接收狀態(tài)。 TB8:在方式2和方式3時(shí),它是要發(fā)生的第九個(gè)數(shù)據(jù)位,按需要由軟件進(jìn)行置位或清零。例如可用作數(shù)據(jù)的奇偶校驗(yàn)位,或在多機(jī)通信中表示是地址幀/數(shù)據(jù)幀標(biāo)志位(TB8=1/0)。 RB8:在方式2和方式3時(shí),它是接收到的第九位數(shù)據(jù),作為奇偶位或地址幀/數(shù)據(jù)幀標(biāo)志位。在方式1時(shí),若SM2=0,則RB8是接收到的停止位,在方式0時(shí),不使用RB8。,TI:發(fā)生中斷標(biāo)志位。在方式0時(shí),當(dāng)串行發(fā)送數(shù)據(jù)字第八位結(jié)束時(shí),由內(nèi)部硬件置
11、位(TI=1),向CPU申請發(fā)生中斷。CPU響應(yīng)中斷后,必須用軟件清零,取消此中斷標(biāo)志。在其他方式時(shí),它在停止位開始發(fā)送時(shí)由硬件置位。同樣,必須用軟件使其復(fù)位。 RI:接收中斷標(biāo)志位。在方式0時(shí),串行接收到第八位結(jié)束時(shí)由內(nèi)部硬件置位。在其他方式中,它在接收到停止位的中間時(shí)刻由硬件置位,也必須用軟件來復(fù)位。 當(dāng)一幀數(shù)據(jù)發(fā)送完成時(shí),發(fā)送中斷標(biāo)志TI被置位,接著發(fā)生串口中斷,進(jìn)入串口中斷服務(wù)程序。但CPU事先并不能分辨是TI還是RI的中斷請求,因此,必須在中斷服務(wù)程序中用位測試指令加以判別。兩個(gè)中斷標(biāo)志位TI及RI均不能自動(dòng)復(fù)位,必須在中斷服務(wù)程序中使用清中斷標(biāo)志位指令,撤銷中斷請求狀態(tài),否則原先的
12、中斷標(biāo)志位狀態(tài)又將表示有中斷請求。,2. 串口2控制寄存器S2CON,寄存器S2CON(地址為9AH,復(fù)位值為00H)用于確定串口2的操作方式和控制串口2的某些功能,也可用于發(fā)送和接收第9個(gè)數(shù)據(jù)位(S2TB8、S2RB8),并設(shè)有接收和發(fā)送中斷標(biāo)志(S2RI及S2TI)位。S2CON各位的意義如下:,寄存器S2CON的各個(gè)位與寄存器SCON的各個(gè)位含義和功能都類似,讀者可以進(jìn)行對比學(xué)習(xí),在此,不再贅述。,3. 掉電控制寄存器PCON PCON(地址為87H,復(fù)位值為30H)中的SMOD用于設(shè)置方式1、方式2和方式3的波特率是否加倍。各位的定義如下:,其中,與串行通信相關(guān)的位是SMOD和SMOD
13、0。 SMOD:串行口波特率系數(shù)控制位。復(fù)位時(shí),SMOD=0。 1:使方式1、方式2和方式3的波特率加倍。 0:各工作方式的波特率不加倍。 SMOD0:幀錯(cuò)誤檢測有效控制。復(fù)位時(shí),SMOD0=0。 1:SCON寄存器中的SM0/FE位用于FE(幀錯(cuò)誤檢測)功能。 0:SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指定串行通信的工作方式。,4輔助寄存器AUXR 輔助寄存器AUXR(地址為8EH,復(fù)位值為00H)各位的定義如下:,T0 x12和T1x12用于設(shè)置定時(shí)器0和定時(shí)器1的速度。詳見“第8章 定時(shí)/計(jì)數(shù)器與可編程計(jì)數(shù)器陣列”一章。EXTRAM用于設(shè)置是否允許使用內(nèi)部擴(kuò)展的10
14、24字節(jié)擴(kuò)展RAM。 1)UART_M0 x6:串行口模式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的波特率加倍。,4)BRTx12:獨(dú)立波特率發(fā)生器計(jì)數(shù)控制位。 0:獨(dú)立波特率發(fā)生器每12個(gè)時(shí)鐘計(jì)數(shù)一次。 1:獨(dú)立波特率發(fā)生器每1個(gè)時(shí)鐘計(jì)數(shù)一次。 5)S1BRS:串口1波特率
15、發(fā)生器選擇位。 0:選擇定時(shí)器1作為串口1波特率發(fā)生器。 1:選擇獨(dú)立波特率發(fā)生器作為串口1的波特率發(fā)生器,此時(shí)定時(shí)器1得到釋放,可以作為獨(dú)立定時(shí)器使用。, 注意:對于具有串口2的STC12C5A60S2單片機(jī),串口2只能使用獨(dú)立波特率發(fā)生器作為波特率發(fā)生器,不能夠選擇定時(shí)器1作為波特率發(fā)生器;串口1可以選擇定時(shí)器1作為波特率發(fā)生器,也可以選擇獨(dú)立波特率發(fā)生器作為波特率發(fā)生器。,5獨(dú)立波特率發(fā)生器寄存器BRT 獨(dú)立波特率發(fā)生器寄存器BRT(地址為9CH,復(fù)位值為00H)用于保存重裝時(shí)間常數(shù)。,6從機(jī)地址控制寄存器 為了方便多機(jī)通信,STC12C5A60S2單片機(jī)設(shè)置了從機(jī)地址控制寄存器SADE
16、N和SADDR。其中,SADEN是從機(jī)地址掩模寄存器(地址為B9H,復(fù)位值為00H),SADDR是從機(jī)地址寄存器(地址為A9H,復(fù)位值為00H)。 7數(shù)據(jù)緩沖器 數(shù)據(jù)緩沖器用于保存要發(fā)送的數(shù)據(jù)或者從串口接收到的數(shù)據(jù)。串口1的數(shù)據(jù)緩沖器是SBUF,串口2的數(shù)據(jù)緩沖器是S2BUF。 對于串口1,當(dāng)一個(gè)字符接收完畢,移位寄存器中的數(shù)據(jù)字節(jié)裝入串行接收數(shù)據(jù)緩沖器SBUF中,其第9位則裝入SCON寄存器的RB8位。如果SM2使得已接收的數(shù)據(jù)無效,則RB8位和SBUF緩沖器中的內(nèi)容不變。 對于串口2,當(dāng)一個(gè)字符接收完畢,移位寄存器中的數(shù)據(jù)字節(jié)裝入串行接收數(shù)據(jù)緩沖器S2BUF中,其第9位則裝入S2CON寄存
17、器的S2RB8位。如果S2SM2使得已接收的數(shù)據(jù)無效,則S2RB8位和S2BUF緩沖器中的內(nèi)容不變。 無論對于串口1還是串口2,發(fā)送緩沖器只能寫入,不能讀出;接收緩沖器只能讀出,不能寫入。因此,串口1的兩個(gè)緩沖器共用一個(gè)地址號(99H),串口2的兩個(gè)緩沖器共用一個(gè)地址號(9BH)。,(4)串行收發(fā)寄存器 SBUF(字節(jié)地址99H,沒有位尋址) 在所有的串行方式中,在寫SBUF信號的控制下,將其數(shù)據(jù)裝入移位寄存器,前面8位為數(shù)據(jù)字節(jié),其最低位就是移位寄存器的移位輸出位。根據(jù)不同的工作方式會(huì)將“1”或TB8的值裝入移位寄存器的第九位,并進(jìn)行發(fā)送。 當(dāng)一個(gè)字符接收完畢,移位寄存器中的數(shù)據(jù)字節(jié)裝入串行
18、接收數(shù)據(jù)緩沖器SBUF中,其第九位則裝入SCON寄存器的RB8位。如果SM2使得已接收的數(shù)據(jù)無效,則RB8位和SBUF緩沖器中的內(nèi)容不變。 發(fā)送緩沖器只能寫入不能讀出,而接收緩沖器只能讀出,不能寫入。因而兩個(gè)緩沖器可共有一個(gè)地址號(99H)。,8.2.2 串行接口的四種工作方式,1方式0移位寄存器方式。 (1)串口1的工作方式0 串行口輸出端可直接與移位寄存器相連,也可用作擴(kuò)展I/O口或外接同步輸入輸出設(shè)備。 發(fā)送過程:當(dāng)CPU將數(shù)據(jù)寫入到發(fā)送緩沖區(qū)SBUF時(shí),串行口即把8位數(shù)據(jù)以Fosc/12的波特率由RXD引腳輸出,同時(shí)由TXD引腳輸出同步脈沖。字符發(fā)送完畢,置中斷標(biāo)志TI為1。 接收過程
19、:控制字除方式0外,還應(yīng)置允許接收控制位REN=1。清除RI中斷標(biāo)志。接收器啟動(dòng)后RXD為數(shù)據(jù)輸入端,TXD為同步信號輸出端。接收器以Fosc/12波特率采樣RXD引腳輸入的數(shù)據(jù)信息。當(dāng)接收完8位數(shù)據(jù)時(shí)又重新置RI=1。 方式0工作時(shí),必須使SCON控制字的SM2位(多機(jī)通信控制位)為0。由于波特率固定,無須用定時(shí)器提供。但以中斷方式傳送數(shù)據(jù)時(shí),CPU響應(yīng)中斷并不會(huì)自動(dòng)清除TI、RI標(biāo)志,所以在中斷服務(wù)程序中必須由指令清0。例如CLR TI及CLR RI指令。 (2)串口2的工作方式0 串行數(shù)據(jù)通過RXD2/P1.2(RXD2/P4.2)接收和發(fā)送,TXD2/P1.3(TXD2/P4.3)輸出
20、同步移位時(shí)鐘,發(fā)送接收的是8位數(shù)據(jù),低位在先,波特率固定在Fosc/12。,方式0工作 方式波形圖,2其他方式UART方式 (1)串口1的UART方式 發(fā)送過程:CPU執(zhí)行數(shù)據(jù)寫入發(fā)送緩沖區(qū)SBUF的指令即可啟動(dòng)發(fā)送(如MOV SBUF,A)。串行口內(nèi)自動(dòng)將發(fā)送緩沖區(qū)中內(nèi)容送入發(fā)送移位寄存器。發(fā)送移位寄存器先發(fā)一個(gè)起始位,接著按程序設(shè)定每個(gè)字符的代碼,先低位后高位。數(shù)據(jù)字加上奇偶校驗(yàn)位或可控位(方式2,3中即為程序設(shè)定的TB8位的值),再發(fā)停止位,從而完成一幀的發(fā)送。串行數(shù)據(jù)均由TXD端輸出,發(fā)送完畢將中斷標(biāo)志位置1,以供查詢及向CPU申請中斷之用。 接收過程:接收數(shù)據(jù)均由RXD輸入,串行口以
21、所選定的波特率的16倍速率采樣RXD端狀態(tài)。當(dāng)采樣的RXD端電平由1到0的跳變時(shí),就啟動(dòng)接收器。串行口按程序?qū)彾ǖ母袷浇邮找粠a,并把此碼的數(shù)據(jù)位拼成并行碼送入接收緩沖寄存器中(在方式1時(shí),把停止位:方式2、3時(shí)把程控的第九位數(shù)據(jù)都送入RB8),等待CPU取走。為保證可靠無誤,對每一數(shù)據(jù)位要進(jìn)行連續(xù)3次采樣,接收的值取3次采樣中至少相同的二次的值。接收完畢,置接收中斷標(biāo)志RI=1。CPU的響應(yīng)中斷后必須在中斷服務(wù)程序中使RI清零。,方式1工作方式波形圖,方式2、3工作方式波形圖,方式1與方式2、3的區(qū)別之一是:方式1其數(shù)據(jù)字是8位異步通信接口,串行口發(fā)送/接收收共10位信息,第0位為起始位“
22、0”,18位是數(shù)據(jù)位,最后是停止位“1”;方式2、3其數(shù)據(jù)字為9位的異步通信接口。1位起始位“0”,8位數(shù)據(jù)位,第9位是可程控位“1”或“0”,最后是停止位“1”,共有11位信息。 方式1與方式2、3的區(qū)別之二是:方式1、3的波特率是可變的,其波特率取決于定時(shí)器1的溢出率和特殊功能寄存器PCON中的SMOD位的值,即 工作方式1、3的波特率=2SMOD(定時(shí)器1的溢出率)/32 而工作方式2的波特率=2SMOD(振蕩器頻率)/64 顯然,方式2的波特率變化范圍比方式1、3小,這也是方式2和方式3的唯一區(qū)別。 TB8可用于多機(jī)通信或作為奇偶校驗(yàn)位使用。若以TB8位作為奇偶校驗(yàn)位,處理方法為數(shù)據(jù)寫
23、入SBUF之前,先將數(shù)據(jù)的奇偶位寫入TB8(設(shè)工作寄存器區(qū)2的R0作為發(fā)送數(shù)據(jù)區(qū)地址指針)。,RIPTI: PUSHPSW ;保護(hù)現(xiàn)場 PUSHACC SETBPSW.4 CLRPSW.3 CLRTI ;發(fā)送中斷標(biāo)志TI清零 MOVA,R0 ;取數(shù)據(jù) MOVC,P MOVTB8,C MOVSBUF,A ;數(shù)據(jù)寫入到發(fā)送緩沖器,啟動(dòng)發(fā)送器 INCR0 ;數(shù)據(jù)指針加1 POPACC POPPSW ;恢復(fù)現(xiàn)場 RETI,對輸入方式而言,除選不同的方式控制外,均應(yīng)使REN=1,允許串行接收。只有在最后的移位脈沖產(chǎn)生并同時(shí)滿足下列二個(gè)條件時(shí),才會(huì)產(chǎn)生接收數(shù)據(jù)裝入SBUF和RB8及置位RI的信號: 對方式
24、1對方式2、3 1)RI0 1)RI=0 2)SM2=0或接收到的停止位12)SM2=0或接收到的第九個(gè)數(shù)據(jù)1 如果不滿足上述條件,接收到的信號將不可避免的丟失。由此可見,中斷標(biāo)志必須由用戶在中斷服務(wù)程序中設(shè)置清“0”指令。否則,將有可能產(chǎn)生另一次中斷而造成混亂并影響后序數(shù)據(jù)的接收。,(2)串口2的UART方式 1)模式1:10位數(shù)據(jù)通過TXD2/P1.3(TXD2/P4.3)發(fā)送,通過RXD2/P1.2(RXD2/P4.2)接收。一幀數(shù)據(jù)包含一個(gè)起始位(0),8個(gè)數(shù)據(jù)位和一個(gè)停止位(1)。接收時(shí),停止位進(jìn)入特殊功能寄存器S2CON的S2RB8位。波特率由獨(dú)立波特率發(fā)生器BRT的溢出率決定。
25、2)模式2:11位數(shù)據(jù)通過TXD2/P1.3(TXD2/P4.3)發(fā)送,通過RXD2/P1.2(RXD2/P4.2)接收。一幀數(shù)據(jù)包含一個(gè)起始位(0),8個(gè)數(shù)據(jù)位,一個(gè)可編程的第9位和一個(gè)停止位(1)。發(fā)送時(shí),第9位數(shù)據(jù)由特殊功能寄存器S2CON的S2TB8位確定;接收時(shí),第9位數(shù)據(jù)進(jìn)入特殊功能寄存器S2CON的S2RB8位。波特率為:Fosc/32或者Fosc/64。 3)模式3:波特率的確定方法與模式1相同,數(shù)據(jù)的傳輸模式和模式2相同。,8.2.3 多處理機(jī)通信,下面以使用串口1為例說明多機(jī)通信的過程。 串行口控制寄存器SCON中的SM2位為方式2和方式3工作時(shí)進(jìn)行多機(jī)通信的控制位。這種多
26、機(jī)通信方式一般為一臺(tái)主機(jī):多臺(tái)從機(jī)系統(tǒng);主機(jī)發(fā)送信息可被各從機(jī)接收,而從機(jī)只能對主機(jī)發(fā)送信息。而從機(jī)間互相不能直接通信。,多機(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ī)通信時(shí),主機(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ù)程序
27、,在服務(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ī)通信時(shí),SM2控制位起著極為重要的作用。,方式0: 串口1:波特率為振蕩頻率的1/12或1/2(由UART_M0 x6決定)。 串口2:波特率為振蕩頻率的1/12,忽略波特率發(fā)生器。 方式2: 波特率是可編程設(shè)定的,有兩種波特率可選擇,它取決于電源控制寄存器PCON
28、中SMOD位的值,當(dāng)SMOD=0時(shí),為振蕩頻率的1/64;當(dāng)SMOD=1時(shí),為振蕩頻率的1/32。 工作于方式1和3時(shí):波特率是可變的。 對于串口1,可以通過編程改變定時(shí)器1的溢出率或者獨(dú)立波特率發(fā)生器的溢出率來確定波特率。對于串口2,只能通過編程改變獨(dú)立波特率發(fā)生器的溢出率來確定波特率。 波特率 (定時(shí)器1的溢出率或獨(dú)立波特率發(fā)生器的溢出率 ) 定時(shí)器1作為波特率發(fā)生器應(yīng)用時(shí),最典型的用法是定時(shí)器1工作在自動(dòng)再裝入時(shí)間常數(shù)的定時(shí)方式2(即定時(shí)器的方式控制寄存器TMOD的高四位為0010B狀態(tài)。定時(shí)器的控制寄存器TCON的TCON.6(TR1)=1啟動(dòng)定時(shí)器1,禁止定時(shí)器中斷)。這時(shí)溢出率取決
29、于TH1中的自動(dòng)重新再裝入值。定時(shí)器1的溢出率可由下式算出: 溢出率 其中,12T模式時(shí),n=1;1T模式時(shí),n=0。將此值代入求波特率的算式,可求得 串行口的波特率,8.2.4 波特率的設(shè)定,當(dāng)使用獨(dú)立波特率發(fā)生器BRT時(shí),獨(dú)立波特率發(fā)生器的溢出率為: 獨(dú)立波特率發(fā)生器的溢出率Fosc/12n(256 BRT) 其中,BRT為BRT寄存器的值。對于獨(dú)立波特率發(fā)生器BRT,1T模式是指BRTx12=1,12T模式是指BRTx12=0。12T模式時(shí),n=1;1T模式時(shí),n=0。此時(shí),串行口的波特率計(jì)算公式為: 串行口的波特率 由于串口2只能使用獨(dú)立波特率發(fā)生器,因此,在使用串口2時(shí),應(yīng)特別注意波
30、特率的設(shè)置方法。,SMOD = 0時(shí),自動(dòng)重裝時(shí)間常數(shù)RELOAD的計(jì)算方法: (1)計(jì)算RELOAD 1)12T模式的計(jì)算公式:RELOAD = 256 - INT(fosc/Baud0/32/12 + 0.5) 2)1T模式的計(jì)算公式:RELOAD = 256 - INT(fosc/Baud0/32 + 0.5) 式中,INT( )表示取整運(yùn)算即舍去小數(shù),在式中加 0.5 可以達(dá)到四舍五入的目的。fosc為晶振頻率;Baud0為標(biāo)準(zhǔn)波特率。 (2)計(jì)算用RELOAD產(chǎn)生的波特率 1)12T模式:Baud = fosc/(256 - RELOAD)/32/12 2)1T模式:Baud = f
31、osc/(256 - RELOAD)/32 (3)計(jì)算誤差率 error = (Baud - Baud0)/Baud0 * 100% (4)如果誤差率 4.5%,則需要更換波特率或者更換晶體頻率, 重復(fù)步驟 1)- 4)。 例如:設(shè)fosc = 22.1184MHz,Baud0 = 57600,則12T模式時(shí), RELOAD = 256 - INT( 22118400/57600/32/12 + 0.5) = 255 = 0FFH Baud = 22118400/(256-255)/32/12 = 57600 誤差等于零。 又如,設(shè)fosc = 18.432MHz,Baud0 = 57600,
32、則12T 模式時(shí), RELOAD = 256 - INT( 18432000/57600/32/12 + 0.5) = 0FFH Baud = 18432000/(256-255)/32/12 = 48000 誤差:error = (48000 - 57600)/57600 * 100% = -16.66% 誤差很大,需要更換波特率或者更換晶體頻率。 在實(shí)際設(shè)計(jì)時(shí),為了保證通信的可靠性,應(yīng)盡量保證設(shè)計(jì)后的誤差為0。 常用波特率與系統(tǒng)時(shí)鐘及定時(shí)器1的重裝時(shí)間常數(shù)等設(shè)置關(guān)系 請參考表8-4。,8.2.5 串行接口通信應(yīng)用舉例,1、串口1的編程要點(diǎn) (1)設(shè)置串口的工作模式 設(shè)置SCON寄存器的內(nèi)容
33、。若要串口接收,需將其中的REN位置1。 (2)設(shè)置正確的波特率 1)使用定時(shí)器1作為波特率發(fā)生器時(shí),需要設(shè)置定時(shí)器1的工作方式和時(shí)間常數(shù)(設(shè)定TMOD和TH1、TL1寄存器的內(nèi)容);啟動(dòng)定時(shí)器1(置位TR1)。 2)使用獨(dú)立波特率發(fā)生器時(shí),需要設(shè)置獨(dú)立波特率發(fā)生器寄存器和相應(yīng)的位,包括:獨(dú)立波特率發(fā)生器寄存器BRT,BRTx12位,SMOD位。啟動(dòng)BRT(置位BRTR),BRT開始計(jì)數(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ù)程序中要有清除
34、中斷標(biāo)志指令(將TI和RI清零)。,2、串口2的編程要點(diǎn) (1)設(shè)置串口2的工作模式 設(shè)置S2CON寄存器中的S2SM0和S2SM1兩位。如要串口2接收,將S2REN置1。 (2)設(shè)置串口2的波特率相應(yīng)的寄存器和位,包括:獨(dú)立波特率發(fā)生器寄存器BRT、BRTx12和S2SMOD位。啟動(dòng)BRT(置位BRTR),BRT開始計(jì)數(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ā)送完成
35、標(biāo)志S2TI)。,例8-1 設(shè)有甲、乙兩臺(tái)單片機(jī),編出兩臺(tái)單片機(jī)間實(shí)現(xiàn)如下串行通信功能的程序。 甲機(jī)發(fā)送:將首址為ADDRT的128個(gè)字節(jié)的數(shù)據(jù)塊順序向乙機(jī)發(fā)送; 乙機(jī)接收:將接收的128個(gè)字節(jié)的數(shù)據(jù),順序存放在以首址為ADDRR的數(shù)據(jù)緩沖區(qū)中。 編制該類程序的要點(diǎn)是,選定正確的控制字,以保證接口功能的初始化;選擇合適的波特率,這主要是選擇定時(shí)器1的方式和時(shí)間常數(shù)的確定;最后還應(yīng)注意是在串行中斷服務(wù)程序中要設(shè)置清除中斷標(biāo)志指令,否則將產(chǎn)生另一個(gè)中斷。,甲機(jī)發(fā)送程序流程圖,匯編語言發(fā)送程序如下: $include (STC12C5A.INC) ;包含STC12C5A60S2單片機(jī)寄存器定義文件
36、ORG0000H LJMPMAINT ;跳至主程序入口 ORG0023H LJMPINTSE1 ;轉(zhuǎn)至串行中斷服務(wù)程序 ORG0100H MAINT: MOVSP,#60H;設(shè)置堆棧指針 MOVSCON,#01000000B ;置串行口工作方式1 MOVTMOD,#20H ;定時(shí)器1為工作方式2 MOVTH1,#0FDH;產(chǎn)生9600bps的時(shí)間常數(shù) MOVTL1,#0FDH SETB TR1;啟動(dòng)定時(shí)器1 SETB ES;串行口開中斷 SETB EA;開中斷 MOVDPTR,#ADDRT;ADDRT是首址,可以使用EQU定義 MOVR0,#00H;傳送字節(jié)數(shù)初值 MOVX A,DPTR;取第
37、一個(gè)發(fā)送字節(jié) MOVSBUF,A;啟動(dòng)串行口發(fā)送 SJMP $;等待中斷 ;中斷服務(wù)程序 INTSE1:CLR TI;將中斷標(biāo)志清零 CJNE R0,#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ù) MOVSBUF,A;啟動(dòng)串行口 ENDT:RETI;中斷返回 END,對應(yīng)的C語言程序如下: #include “stc12c5a.h” /包含STC12C5A60S2單片機(jī)寄存器定義文
38、件 unsigned char xdata ADDRT128;/在外部RAM區(qū)定義128個(gè)單元 unsigned char num=0;/聲明計(jì)數(shù)變量 unsigned char *psend;/指向發(fā)送數(shù)據(jù)區(qū)的指針 void main (void) /主程序 SCON=0 x40;/置串行口工作方式1 TMOD=0 x20;/定時(shí)器1為工作方式2 TH1=0 xFD;/產(chǎn)生9600bps的時(shí)間常數(shù) TL1=0 xFD; TR1=1;/啟動(dòng)定時(shí)器1 ES=1;/串行口開中斷 EA=1;/開中斷 psend=ADDRT;/設(shè)置發(fā)送數(shù)據(jù)緩沖區(qū)指針 SBUF=*psend;/發(fā)送第一個(gè)數(shù)據(jù) whil
39、e(1);/等待中斷 void UART_ISR(void) interrupt 4/中斷號4是串行中斷 TI = 0;/清發(fā)送中斷標(biāo)志 num+;/修改計(jì)數(shù)變量值 if(num=0 x7F) ES=0;/判斷是否發(fā)送完,若已完,則關(guān)中斷 else/否則,修改指針,發(fā)送下一個(gè)數(shù)據(jù) psend+; SBUF=*psend; ,乙機(jī)接收數(shù)據(jù)流程圖,接收程序如下(匯編語言): 對應(yīng)的C語言程序請思考 $include (STC12C5A.INC) ;包含STC12C5A60S2單片機(jī)寄存器定義文件 ORG0000H LJMP MAINR ;轉(zhuǎn)主程序 ORG0023H LJMP INTSE2 ;轉(zhuǎn)串行
40、口中斷服務(wù)程序 ORG0100H MAINR:MOVSP,#60H;設(shè)置堆棧指針 MOVSCON,#01010000B;置串行口工作方式1,允許接收 MOVTMOD,#20H;定時(shí)器1為工作方式2 MOVTH1,#0FDH;產(chǎn)生9600bps的時(shí)間常數(shù) MOVTL1,#0FDH SETB TR1;啟動(dòng)定時(shí)器1 SETB ES;串行口開中斷 SETB EA;開中斷 MOVDPTR,#ADDRR;數(shù)據(jù)緩沖區(qū)首址送DPTR MOVR0,#00H;置傳送字節(jié)數(shù)初值 SJMP $;等待中斷 ;中斷服務(wù)程序 INTSE2:CLRRI;清接收中斷標(biāo)志 MOVA,SBUF;取接收的數(shù)據(jù) MOVX DPTR,A
41、;接收的數(shù)據(jù)送緩沖區(qū) CJNE R0,#7FH,LOOPR ;判別接收完沒有。若沒有,轉(zhuǎn)LOOPR繼續(xù)接收 CLRES;若接收完,則關(guān)串行口中斷 LJMP ENDR LOOPR:INCR0;修改計(jì)數(shù)指針 INCDPTR;修改地址指針 ENDR:RETI;中斷返回 END,例8-2 設(shè)有甲、乙兩臺(tái)單片機(jī),編寫程序,使用調(diào) 用子程序的方法進(jìn)行串行通信。 甲機(jī)(發(fā)送機(jī));從內(nèi)部RAM單元20H25H中 取出6個(gè)ASCII碼數(shù)據(jù),在最高位加上奇偶校驗(yàn)位 后由串行口發(fā)送。采用8位異步通信,波特率為 1200bps,(假設(shè)系統(tǒng)時(shí)鐘為11.0592MHz)。 乙機(jī)(接收機(jī)):把接收到的ASCII碼數(shù)據(jù), 先
42、進(jìn)行奇偶校驗(yàn),若校驗(yàn)正確,將數(shù)據(jù)依次存放 在內(nèi)部RAM區(qū)20H25H單元中。若校驗(yàn)出錯(cuò),則將 出錯(cuò)信息“0FFH”存入相應(yīng)的單元。,調(diào)用子程序的查詢方式串行通信流程圖,甲機(jī)的匯編語言程序如下: $include (STC12C5A.INC) ;包含STC12C5A60S2單片機(jī)寄存器定義文件 ORG0000H;主程序入口 LJMPMAINT ORG0030H MAINT:MOVSP,#60H MOVTMOD,#20H;置定時(shí)器1為工作方式2 MOVTH1,#0E8H;置波特率時(shí)間常數(shù) MOVTL1,#0E8H MOVSCON,#40H;置串行口為工作方式1 SETBTR1;啟動(dòng)定時(shí)器1工作 M
43、OVR0,#20H;數(shù)據(jù)首地址送R0 MOVR7,#06H;傳送字節(jié)數(shù)送R7 LOOPT:MOVA,R0;取一個(gè)待傳送的數(shù)據(jù)字節(jié) LCALLDATAOUT;調(diào)用串行可發(fā)送子程序 INCR0;修改地址指針 DJNZR7,LOOPT ;若沒有全部發(fā)送完畢,則轉(zhuǎn)LOOPT繼續(xù)發(fā)送 SJMP$ DATAOUT: ;串行口發(fā)送子程序 MOVC,P;設(shè)置奇偶校驗(yàn)位(補(bǔ)奇) CPLC MOVACC.7,C MOVSBUF,A;啟動(dòng)串行口發(fā)送數(shù)據(jù) JNBTI,$;等待數(shù)據(jù)字節(jié)發(fā)送完畢 CLRTI;清發(fā)送標(biāo)志TI,為下一數(shù)據(jù)字節(jié)串行發(fā)送作準(zhǔn)備 RET END,對應(yīng)的C語言程序如下: #include “stc1
44、2c5a.h” /包含STC12C5A60S2單片機(jī)寄存器定義文件 unsigned char data ADDRT6 _at_ 0 x20;/在內(nèi)部RAM區(qū)定義6個(gè)單元 void main (void) /主程序 unsigned char i; TMOD=0 x20; /置定時(shí)器1為工作方式2 TH1=0 xe8; /置波特率時(shí)間常數(shù) TL1=0 xe8; SCON=0 x40; /置串行口為工作方式1 TR1=1; /啟動(dòng)定時(shí)器1工作 for(i=0;i6;i+) UART_SEND(ADDRTi); /發(fā)送一個(gè)數(shù)據(jù) while(1); /發(fā)送完畢,循環(huán)等待 void UART_SEND
45、(unsigned char senddata) /串行口發(fā)送子程序 bit tmpbit; ACC=senddata; tmpbit=P; /設(shè)置奇偶校驗(yàn)位(補(bǔ)奇) tmpbit=!tmpbit; if (tmpbit) senddata=senddata|0 x80; else senddata=senddata /清發(fā)送標(biāo)志TI,為下一數(shù)據(jù)字節(jié)串行發(fā)送作準(zhǔn)備 ,$include (STC12C5A.INC) ;包含STC12C5A60S2單片機(jī)寄存器定義文件 ORG0000H;主程序入口地址 LJMPMAINR ORG0030H MAINR:MOVSP,#60H MOVTMOD,#20H
46、;置定時(shí)器1為工作方式2 MOVTH1,#0E8H;置波特率時(shí)間常數(shù) MOVTL1,#0E8H MOVSCON,#52H;置串行口為工作方式1,并使REN=1 SETBTR1;啟動(dòng)定時(shí)器1 MOVR0,#20H;存放數(shù)據(jù)首地址送R0 MOVR7,#06H;存放數(shù)據(jù)字節(jié)數(shù)送R7 LOOP:LCALLDATAIN;調(diào)用接收子程序 JCERROR;若C1,則出錯(cuò),轉(zhuǎn)出錯(cuò)處理程序 MOVR0,A;將接收的數(shù)據(jù)送指定RAM單元中 LJMPLOOPC ERROR:MOVR0,#0FFH;將出錯(cuò)字符”0FFH”送指定RAM單元 LOOPC:INCR0;修改地址指針 DJNZR7,LOOP;若沒全部接收完畢,
47、則繼續(xù)接收數(shù)據(jù);否則順序進(jìn)行 SJMP$ ;串行口接收子程序 DATAIN:JNBRI,$;等待一個(gè)數(shù)據(jù)字節(jié)接收完畢 CLRRI;接收完畢,清標(biāo)志RI,為接收下一個(gè)數(shù)據(jù)字節(jié)作準(zhǔn)備 MOVA,SBUF;接收到的數(shù)據(jù)字節(jié)送A MOVC,P;檢查奇偶校驗(yàn)位 CPLC ANLA,#7FH;消去奇校驗(yàn)位 RET;子程序返回 END,乙機(jī)匯編語言程序,【例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ī)
48、發(fā)送10個(gè)數(shù)據(jù)信息。 從機(jī):接收主機(jī)發(fā)來的地址幀信息,并與本機(jī)的地址號相比較,若不符合,仍保持SM2=1不變;若相等,則使SM2清零,準(zhǔn)備接收后續(xù)的數(shù)據(jù)信息,直至接收完10個(gè)數(shù)據(jù)信息。,a) 主機(jī)程序流程圖 b) 從機(jī)程序流程圖,主機(jī)程序: $include (STC12C5A.INC) ;包含STC12C5A60S2單片機(jī)寄存器定義文件 ADDRTEQU0000H SLAVEEQU5;從機(jī)地址號 ORG0000H LJMPMAINT;主程序入口地址 ORG0023H LJMPINTST;串行口中斷入口地址 ORG0100H MAINT:MOVSP,#60H MOVSCON,#0C0H;串行口
49、方式3 MOVTMOD,#20H;置T1工作方式2 MOVTH1,#0FAH;置4800波特率 MOVTL1,#0FAH;相應(yīng)的時(shí)間常數(shù) MOVDPTR,#ADDRT;置數(shù)據(jù)地址指針 MOVR0,#00H;發(fā)送數(shù)據(jù)字節(jié)計(jì)數(shù)清零 MOVR2,#SLAVE;從機(jī)地址號R2 SETBTR1;啟動(dòng)T1 SETBES;串行口開中斷 SETBEA;CPU開中斷 SETBTB8;置位TB8,作為地址幀信息特征 MOVA,R2;發(fā)送地址幀信息 MOVSBUF,A SJMP$;等待中斷,;串行口中斷服務(wù)程序: INTST:CLRTI;清發(fā)送中斷標(biāo)志 CLRTB8;清TB8位,為發(fā)送數(shù)據(jù)幀信息作準(zhǔn)備 MOVXA,
50、DPTR;發(fā)送一個(gè)數(shù)據(jù)字節(jié) MOVSBUF,A INCDPTR;修改指針 INCR0 CJNER0,#0AH,LOOPT;判數(shù)據(jù)字節(jié)是否發(fā)送完 CLRES LOOPT:RETI END,對應(yīng)的C語言版程序如下: #include “stc12c5a.h” /包含STC12C5A60S2單片機(jī)寄存器定義文件 unsigned char xdata ADDRT10;/保存數(shù)據(jù)的外部RAM單元 unsigned char SLAVE;/保存從機(jī)地址號的變量 unsigned char num=0, *mypdata; void main (void) SCON=0 xC0; TMOD=0 x20;
51、TH1=0 xFA; TL1=0 xFA; mypdata=ADDRT; SLAVE=5;/定義從機(jī)地址,在此假設(shè)從機(jī)地址為5 TR1=1; ES=1; EA=1; TB8=1; SBUF=SLAVE;/發(fā)送從機(jī)地址 while(1);/等待中斷 ,void Serial_ISR(void) interrupt 4 TI=0; TB8=0; SBUF=*mypdata;/發(fā)送數(shù)據(jù) mypdata+;/修改指針 num+; if(num=0 x0a) ES=0; ,從機(jī)程序如下: $include (STC12C5A.INC) ;包含STC12C5A60S2單片機(jī)寄存器定義文件 ADDRREQU
52、0000H SLAVEEQU5;從機(jī)地址號 ORG0000H LJMPMAINR;從機(jī)主程序入口地址 ORG0023H LJMPINTSR;串行口中斷入口地址 ORG0100H MAINR:MOVSP,#60H MOVSCON,#0F0H;串行口方式3,SM2=1,REN=1,接收狀態(tài) MOVTMOD,#20H;置T1為工作方式2 MOVTH1,#0FAH;置4800波特率 MOVTL1,#0FAH;相應(yīng)的時(shí)間常數(shù) MOVDPTR,#ADDRR;置數(shù)據(jù)地址指針 MOVR0,#0AH;置接收數(shù)據(jù)字節(jié)數(shù)指針 SETBTR1;啟動(dòng)T1 SETBES;串行口開中斷 SETBEA;CPU開中斷 SJMP
53、$;等待中斷,INTSR:CLRRI;清接收中斷標(biāo)志 MOVA,SBUF;取接收信息 MOVC,RB8;取RB8(信息特征位)C JNCLOOPR1;RB8=0為數(shù)據(jù)幀信息,轉(zhuǎn)LOOPR1 XRLA,#SLAVE;RB8=1為地址幀信息,與本機(jī)地址號SLAVE相比較 JZLOOPR2;地址相等,則轉(zhuǎn)LOOPR2 LJMPENDR;地址不相等,則轉(zhuǎn)中斷返回ENDR LOOPR2:CLRSM2;清SM2,為后面接收數(shù)據(jù)幀信息作準(zhǔn)備 LJMPENDR;中斷返回 LOOPR1:MOVXDPTR,A;接收的數(shù)據(jù)數(shù)據(jù)緩沖區(qū) INCDPTR;修改地址指針 DJNZR0,ENDR;數(shù)據(jù)字節(jié)沒全部接收完,則轉(zhuǎn)L
54、OOPR2 SETBSM2;全部接收完,置SM2=1 ENDR:RETI;中斷返回 END,對應(yīng)的C語言版程序如下: #include “stc12c5a.h” /包含STC12C5A60S2單片機(jī)寄存器定義文件 unsigned char xdata ADDRR10; unsigned char SLAVE,num=0 x0a,rdata,*mypdata; void main (void) SCON=0 xF0; TMOD=0 x20; TH1=0 xFA; TL1=0 xFA; mypdata=ADDRR; SLAVE=5;/設(shè)定從機(jī)地址 TR1=1; ES=1; EA=1; while
55、(1);/等待中斷 ,void Serial_ISR(void) interrupt 4 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=0 x00)/所有數(shù)據(jù)接收完畢,令SM2=1 /為下一次接收地址信息作準(zhǔn)備 SM2=1; ,【例8-4】串口1使用獨(dú)立波特率發(fā)生器作串行通信的實(shí)例。 #include “stc12c5a.h” /包含S
56、TC12C5A60S2寄存器定義文件 #include “intrins.h” #define RELOAD_COUNT 0 xfb /Fosc=18.432MHz,12T,SMOD=0,9600bps sbit MCU_Start_Led = P14; unsigned char array9=0,2,4,6,8,10,12,14,16; void UART_send(unsigned char i); void delay(void); void display_MCU_Start_Led(void); void main(void) unsigned char i; /串口初始化 SCO
57、N = 0 x50; /0101,0000 8位可變波特率,無奇偶校驗(yàn)位 BRT = RELOAD_COUNT; AUXR = 0 x11; / BRTR = 1,啟動(dòng)獨(dú)立波特率發(fā)生器 / S1BRS = 1,串口1選擇獨(dú)立波特率發(fā)生器作為波特率發(fā)生器,ES = 1; /允許串口中斷 EA = 1; /開總中斷 display_MCU_Start_Led(); /點(diǎn)亮發(fā)光二極管表示單片機(jī)開始工作 UART_send(0 x34); /串口發(fā)送數(shù)據(jù)表示單片機(jī)串口正常工作 UART_send(0 xa7); /串口發(fā)送數(shù)據(jù)表示單片機(jī)串口正常工作 for(i = 0;i9;i+) UART_send
58、(arrayi); while(1); void UART_send(unsigned char i) ES = 0; /關(guān)串口中斷 TI = 0; /清零串口發(fā)送完成中斷請求標(biāo)志 SBUF = i; while(TI =0); /等待發(fā)送完成 TI = 0; /清零串口發(fā)送完成中斷請求標(biāo)志 ES = 1; /允許串口中斷 ,void delay(void) unsigned int g,j; for(j=0;j5;j+) for(g=0;g50000;g+) _nop_(); _nop_(); _nop_(); ,void display_MCU_Start_Led(void) unsigned char i; for(i=0;i5;i+) MCU_Start_Led = 0; /點(diǎn)亮MCU開始工作指示燈 delay(); MCU_Start_Led = 1; /熄滅MCU開始工作指示燈 delay(); ,void UART_Receive(void) interrupt 4 unsigned char k; if(RI=1) RI=0; k=SBUF; UART_send(k+1); else T
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026臨沂職業(yè)學(xué)院招聘教師和教輔人員22人考試參考題庫及答案解析
- 消費(fèi)類公司管理制度(3篇)
- 全聚德生日活動(dòng)策劃方案(3篇)
- 2026年浙江興??毓杉瘓F(tuán)有限公司下屬企業(yè)招聘3人參考考試題庫及答案解析
- 陵水打井施工方案(3篇)
- 鋁合金銷售管理制度范本(3篇)
- 內(nèi)江二幼招聘編外教師備考考試試題及答案解析
- 2026上海黃浦區(qū)中意工程創(chuàng)新學(xué)院教務(wù)崗位招聘1人備考考試試題及答案解析
- 動(dòng)量定理在高考中的應(yīng)用
- 2026年寧德師范學(xué)院附屬小學(xué)招聘教師2人備考考試題庫及答案解析
- 南通南通市通州區(qū)圖書館公開招聘勞務(wù)派遣人員筆試歷年備考題庫附帶答案詳解
- 2026年幼兒教師公招考試試題及答案
- 2026中工國際工程股份有限公司社會(huì)招聘筆試備考試題及答案解析
- 物業(yè)總經(jīng)理培訓(xùn)課件
- 短險(xiǎn)銷售技巧培訓(xùn)課件
- 2025年職業(yè)衛(wèi)生健康培訓(xùn)考試試題及答案
- 2026年二十屆四中全會(huì)精神應(yīng)知應(yīng)會(huì)題庫及答案
- 化工品物流樞紐項(xiàng)目運(yùn)營管理方案
- 丈夫家暴協(xié)議書模板
- 皮帶機(jī)制作合同范本
- 糖尿病酮癥酸中毒(DKA)難治性DKA血液凈化模式選擇方案
評論
0/150
提交評論