已閱讀5頁(yè),還剩90頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
.,第8章串行通信,8.1通信的有關(guān)概念,8.2STC12C5A60S2單片機(jī)的串行接口,8.3STC12C5A60S2單片機(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)是通信線路簡(jiǎn)單,只要一對(duì)傳輸線就可以實(shí)現(xiàn)通信,從而大大的降低了成本,特別適用于遠(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)位;最后是停止位,其長(zhǎng)度可以是一位,一位半或兩位。所以,串行傳送的數(shù)據(jù)字節(jié)加上成幀信號(hào)起始位和停止位就形成一個(gè)字符串行傳送的幀。起始位用邏輯“0”低電平表示,停止位用邏輯“1”高電平表示。圖(a)所示為數(shù)據(jù)字為7位的ASCII碼,第8位是奇偶校驗(yàn)位。加上起始位、停止位,一個(gè)字符由10位組成。這樣形成幀信號(hào)后,字符便可以一個(gè)接一個(gè)的傳送了。在異步傳送中,字符間隔不固定,在停止位后可以加空閑位,空閑位用高電平表示,用于等待發(fā)送。這樣,接收和發(fā)送可以隨時(shí)的或間斷的進(jìn)行,而不受時(shí)間的限制。圖(b)為有空閑位的情況。,8.1.1串行通信的分類,.,.,(2)同步傳送所謂同步傳送就是去掉異步傳送時(shí)每個(gè)字符的起始位和停止位的成幀標(biāo)志信號(hào),僅在數(shù)據(jù)塊開始處用同步字符來(lái)指示。如下圖所示。同步傳送的有效數(shù)據(jù)位傳送速率高于異步傳送,可達(dá)50千波特。其缺點(diǎn)是硬件設(shè)備較為復(fù)雜,因?yàn)樗笠袝r(shí)鐘來(lái)實(shí)現(xiàn)發(fā)送端和接收端之間的嚴(yán)格同步,而且對(duì)時(shí)鐘脈沖信號(hào)的相位一致性還要求非常嚴(yán)格,為此通常還要采用“鎖相器”等措施來(lái)保證。,在異步數(shù)據(jù)傳送中,CPU與外設(shè)之間事先必須約好兩項(xiàng)事宜:第一、字符格式。雙方要約好字符的編碼形式、奇偶校驗(yàn)形式、以及起始位和停止位的規(guī)定。第二、波特率(Baudrate)。波特率是衡量數(shù)據(jù)傳送速率的指標(biāo),它要求發(fā)送站和接收站都要以相同的數(shù)據(jù)傳送速率工作。,.,2按照數(shù)據(jù)的傳送方向分類1)點(diǎn)對(duì)點(diǎn)傳輸一般情況下,串行數(shù)據(jù)傳送是在兩個(gè)通信端之間進(jìn)行的。其數(shù)據(jù)傳送的方式有如圖所示的幾種情況。圖(a)為單工通信方式。A端為發(fā)送站,B端為接收站,數(shù)據(jù)僅能從A站發(fā)至B站。圖(b)為半雙工通信方式。數(shù)據(jù)可以從A發(fā)送到B,也可以由B發(fā)送到A。不過(guò)同一時(shí)間只能作一個(gè)方向的傳送,其傳送方式由收發(fā)控制開關(guān)K來(lái)控制。圖(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ù)時(shí),必須將并行的數(shù)據(jù)轉(zhuǎn)換為串行的數(shù)據(jù)再行傳送。反之,又必須將串行數(shù)據(jù)轉(zhuǎn)換為并行數(shù)據(jù)輸入計(jì)算機(jī)中。上述并串或串并的轉(zhuǎn)換既可以用通用的異步接收器/發(fā)送器實(shí)現(xiàn)。通用的異步接收器/發(fā)送器,簡(jiǎn)稱UART(UniversalAsynchronousReceiver/Transmitter),是串行接口的核心部件,其結(jié)構(gòu)如圖所示,它既能發(fā)送,由并行串行輸出;又能接收,由串行并行輸入。對(duì)每一方來(lái)說(shuō)都是一個(gè)雙緩沖器結(jié)構(gòu)。當(dāng)UART接收數(shù)據(jù)時(shí),串行數(shù)據(jù)先經(jīng)RXD端(ReceiverData)進(jìn)入移位寄存器,再經(jīng)移位寄存器輸出并行數(shù)據(jù)到緩沖器,最后通過(guò)數(shù)據(jù)總線送到CPU;當(dāng)UART發(fā)送信息時(shí),先由CPU經(jīng)數(shù)據(jù)總線將并行數(shù)據(jù)送給緩沖器,再由并行緩沖器送給一位寄存器,最后逐位由TXD(TransmitterData)端輸出。所有這些工作都是在時(shí)鐘信號(hào)和其他控制信號(hào)作用下完成的。,.,.,8.2STC12C5A60S2單片機(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)成,它們?cè)谖锢砩鲜仟?dú)立的,既可以接收數(shù)據(jù)也可以發(fā)送數(shù)據(jù),還可以同時(shí)發(fā)送和接收數(shù)據(jù)。接收緩沖器只能讀出,不能寫入,而發(fā)送緩沖器則只能寫入,不能讀出。它們共用一個(gè)地址號(hào)。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位為1時(shí),該位用于幀錯(cuò)誤檢測(cè),當(dāng)檢測(cè)到一個(gè)無(wú)效停止位時(shí),通過(guò)UART接收器設(shè)置該位。它必須由軟件清零。PCON寄存器中的SMOD0為0時(shí),該位和SM1一起指定串行通信的工作方式,1.串口1控制寄存器SCONSCON(地址為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)。在方式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)部硬件置位(TI=1),向CPU申請(qǐng)發(fā)生中斷。CPU響應(yīng)中斷后,必須用軟件清零,取消此中斷標(biāo)志。在其他方式時(shí),它在停止位開始發(fā)送時(shí)由硬件置位。同樣,必須用軟件使其復(fù)位。RI:接收中斷標(biāo)志位。在方式0時(shí),串行接收到第八位結(jié)束時(shí)由內(nèi)部硬件置位。在其他方式中,它在接收到停止位的中間時(shí)刻由硬件置位,也必須用軟件來(lái)復(fù)位。當(dāng)一幀數(shù)據(jù)發(fā)送完成時(shí),發(fā)送中斷標(biāo)志TI被置位,接著發(fā)生串口中斷,進(jìn)入串口中斷服務(wù)程序。但CPU事先并不能分辨是TI還是RI的中斷請(qǐng)求,因此,必須在中斷服務(wù)程序中用位測(cè)試指令加以判別。兩個(gè)中斷標(biāo)志位TI及RI均不能自動(dòng)復(fù)位,必須在中斷服務(wù)程序中使用清中斷標(biāo)志位指令,撤銷中斷請(qǐng)求狀態(tài),否則原先的中斷標(biāo)志位狀態(tài)又將表示有中斷請(qǐng)求。,.,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)行對(duì)比學(xué)習(xí),在此,不再贅述。,.,3.掉電控制寄存器PCONPCON(地址為87H,復(fù)位值為30H)中的SMOD用于設(shè)置方式1、方式2和方式3的波特率是否加倍。各位的定義如下:,其中,與串行通信相關(guān)的位是SMOD和SMOD0。SMOD:串行口波特率系數(shù)控制位。復(fù)位時(shí),SMOD=0。1:使方式1、方式2和方式3的波特率加倍。0:各工作方式的波特率不加倍。SMOD0:幀錯(cuò)誤檢測(cè)有效控制。復(fù)位時(shí),SMOD0=0。1:SCON寄存器中的SM0/FE位用于FE(幀錯(cuò)誤檢測(cè))功能。0:SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指定串行通信的工作方式。,.,4輔助寄存器AUXR輔助寄存器AUXR(地址為8EH,復(fù)位值為00H)各位的定義如下:,T0 x12和T1x12用于設(shè)置定時(shí)器0和定時(shí)器1的速度。詳見(jiàn)“第8章定時(shí)/計(jì)數(shù)器與可編程計(jì)數(shù)器陣列”一章。EXTRAM用于設(shè)置是否允許使用內(nèi)部擴(kuò)展的1024字節(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波特率發(fā)生器選擇位。0:選擇定時(shí)器1作為串口1波特率發(fā)生器。1:選擇獨(dú)立波特率發(fā)生器作為串口1的波特率發(fā)生器,此時(shí)定時(shí)器1得到釋放,可以作為獨(dú)立定時(shí)器使用。,注意:對(duì)于具有串口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ī)地址控制寄存器SADEN和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。對(duì)于串口1,當(dāng)一個(gè)字符接收完畢,移位寄存器中的數(shù)據(jù)字節(jié)裝入串行接收數(shù)據(jù)緩沖器SBUF中,其第9位則裝入SCON寄存器的RB8位。如果SM2使得已接收的數(shù)據(jù)無(wú)效,則RB8位和SBUF緩沖器中的內(nèi)容不變。對(duì)于串口2,當(dāng)一個(gè)字符接收完畢,移位寄存器中的數(shù)據(jù)字節(jié)裝入串行接收數(shù)據(jù)緩沖器S2BUF中,其第9位則裝入S2CON寄存器的S2RB8位。如果S2SM2使得已接收的數(shù)據(jù)無(wú)效,則S2RB8位和S2BUF緩沖器中的內(nèi)容不變。無(wú)論對(duì)于串口1還是串口2,發(fā)送緩沖器只能寫入,不能讀出;接收緩沖器只能讀出,不能寫入。因此,串口1的兩個(gè)緩沖器共用一個(gè)地址號(hào)(99H),串口2的兩個(gè)緩沖器共用一個(gè)地址號(hào)(9BH)。,.,(4)串行收發(fā)寄存器SBUF(字節(jié)地址99H,沒(méi)有位尋址)在所有的串行方式中,在寫SBUF信號(hào)的控制下,將其數(shù)據(jù)裝入移位寄存器,前面8位為數(shù)據(jù)字節(jié),其最低位就是移位寄存器的移位輸出位。根據(jù)不同的工作方式會(huì)將“1”或TB8的值裝入移位寄存器的第九位,并進(jìn)行發(fā)送。當(dāng)一個(gè)字符接收完畢,移位寄存器中的數(shù)據(jù)字節(jié)裝入串行接收數(shù)據(jù)緩沖器SBUF中,其第九位則裝入SCON寄存器的RB8位。如果SM2使得已接收的數(shù)據(jù)無(wú)效,則RB8位和SBUF緩沖器中的內(nèi)容不變。發(fā)送緩沖器只能寫入不能讀出,而接收緩沖器只能讀出,不能寫入。因而兩個(gè)緩沖器可共有一個(gè)地址號(hào)(99H)。,.,8.2.2串行接口的四種工作方式,1方式0移位寄存器方式。(1)串口1的工作方式0串行口輸出端可直接與移位寄存器相連,也可用作擴(kuò)展I/O口或外接同步輸入輸出設(shè)備。發(fā)送過(guò)程:當(dāng)CPU將數(shù)據(jù)寫入到發(fā)送緩沖區(qū)SBUF時(shí),串行口即把8位數(shù)據(jù)以Fosc/12的波特率由RXD引腳輸出,同時(shí)由TXD引腳輸出同步脈沖。字符發(fā)送完畢,置中斷標(biāo)志TI為1。接收過(guò)程:控制字除方式0外,還應(yīng)置允許接收控制位REN=1。清除RI中斷標(biāo)志。接收器啟動(dòng)后RXD為數(shù)據(jù)輸入端,TXD為同步信號(hào)輸出端。接收器以Fosc/12波特率采樣RXD引腳輸入的數(shù)據(jù)信息。當(dāng)接收完8位數(shù)據(jù)時(shí)又重新置RI=1。方式0工作時(shí),必須使SCON控制字的SM2位(多機(jī)通信控制位)為0。由于波特率固定,無(wú)須用定時(shí)器提供。但以中斷方式傳送數(shù)據(jù)時(shí),CPU響應(yīng)中斷并不會(huì)自動(dòng)清除TI、RI標(biāo)志,所以在中斷服務(wù)程序中必須由指令清0。例如CLRTI及CLRRI指令。(2)串口2的工作方式0串行數(shù)據(jù)通過(guò)RXD2/P1.2(RXD2/P4.2)接收和發(fā)送,TXD2/P1.3(TXD2/P4.3)輸出同步移位時(shí)鐘,發(fā)送接收的是8位數(shù)據(jù),低位在先,波特率固定在Fosc/12。,.,方式0工作方式波形圖,.,2其他方式UART方式(1)串口1的UART方式發(fā)送過(guò)程:CPU執(zhí)行數(shù)據(jù)寫入發(fā)送緩沖區(qū)SBUF的指令即可啟動(dòng)發(fā)送(如MOVSBUF,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申請(qǐng)中斷之用。接收過(guò)程:接收數(shù)據(jù)均由RXD輸入,串行口以所選定的波特率的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取走。為保證可靠無(wú)誤,對(duì)每一數(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位為起始位“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ù)寫入SBUF之前,先將數(shù)據(jù)的奇偶位寫入TB8(設(shè)工作寄存器區(qū)2的R0作為發(fā)送數(shù)據(jù)區(qū)地址指針)。,.,RIPTI:PUSHPSW;保護(hù)現(xiàn)場(chǎng)PUSHACCSETBPSW.4CLRPSW.3CLRTI;發(fā)送中斷標(biāo)志TI清零MOVA,R0;取數(shù)據(jù)MOVC,PMOVTB8,CMOVSBUF,A;數(shù)據(jù)寫入到發(fā)送緩沖器,啟動(dòng)發(fā)送器INCR0;數(shù)據(jù)指針加1POPACCPOPPSW;恢復(fù)現(xiàn)場(chǎng)RETI,.,對(duì)輸入方式而言,除選不同的方式控制外,均應(yīng)使REN=1,允許串行接收。只有在最后的移位脈沖產(chǎn)生并同時(shí)滿足下列二個(gè)條件時(shí),才會(huì)產(chǎn)生接收數(shù)據(jù)裝入SBUF和RB8及置位RI的信號(hào):對(duì)方式1對(duì)方式2、31)RI01)RI=02)SM2=0或接收到的停止位12)SM2=0或接收到的第九個(gè)數(shù)據(jù)1如果不滿足上述條件,接收到的信號(hào)將不可避免的丟失。由此可見(jiàn),中斷標(biāo)志必須由用戶在中斷服務(wù)程序中設(shè)置清“0”指令。否則,將有可能產(chǎn)生另一次中斷而造成混亂并影響后序數(shù)據(jù)的接收。,.,(2)串口2的UART方式1)模式1:10位數(shù)據(jù)通過(guò)TXD2/P1.3(TXD2/P4.3)發(fā)送,通過(guò)RXD2/P1.2(RXD2/P4.2)接收。一幀數(shù)據(jù)包含一個(gè)起始位(0),8個(gè)數(shù)據(jù)位和一個(gè)停止位(1)。接收時(shí),停止位進(jìn)入特殊功能寄存器S2CON的S2RB8位。波特率由獨(dú)立波特率發(fā)生器BRT的溢出率決定。2)模式2:11位數(shù)據(jù)通過(guò)TXD2/P1.3(TXD2/P4.3)發(fā)送,通過(guò)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為例說(shuō)明多機(jī)通信的過(guò)程。串行口控制寄存器SCON中的SM2位為方式2和方式3工作時(shí)進(jìn)行多機(jī)通信的控制位。這種多機(jī)通信方式一般為一臺(tái)主機(jī):多臺(tái)從機(jī)系統(tǒng);主機(jī)發(fā)送信息可被各從機(jī)接收,而從機(jī)只能對(duì)主機(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ù)程序,在服務(wù)程序中把主機(jī)送來(lái)的地址號(hào)與本從機(jī)的地址號(hào)相比較,若地址相等,則使本機(jī)之SM2置“0”,為接收主機(jī)接著送來(lái)的數(shù)據(jù)幀作準(zhǔn)備。而地址號(hào)不符的其他從機(jī)仍然維持SM2=1狀態(tài),對(duì)主機(jī)以后發(fā)出的數(shù)據(jù)幀信息不予理睬,不激發(fā)中斷標(biāo)志RI=0,直到與主機(jī)發(fā)出的地址信息相符后,才可接收以后的數(shù)據(jù)信息。從而實(shí)現(xiàn)了主從一對(duì)一通信(點(diǎn)點(diǎn)通信)。在多機(jī)通信時(shí),SM2控制位起著極為重要的作用。,.,方式0:串口1:波特率為振蕩頻率的1/12或1/2(由UART_M0 x6決定)。串口2:波特率為振蕩頻率的1/12,忽略波特率發(fā)生器。方式2:波特率是可編程設(shè)定的,有兩種波特率可選擇,它取決于電源控制寄存器PCON中SMOD位的值,當(dāng)SMOD=0時(shí),為振蕩頻率的1/64;當(dāng)SMOD=1時(shí),為振蕩頻率的1/32。工作于方式1和3時(shí):波特率是可變的。對(duì)于串口1,可以通過(guò)編程改變定時(shí)器1的溢出率或者獨(dú)立波特率發(fā)生器的溢出率來(lái)確定波特率。對(duì)于串口2,只能通過(guò)編程改變獨(dú)立波特率發(fā)生器的溢出率來(lái)確定波特率。波特率(定時(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í)溢出率取決于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(256BRT)其中,BRT為BRT寄存器的值。對(duì)于獨(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)特別注意波特率的設(shè)置方法。,.,SMOD=0時(shí),自動(dòng)重裝時(shí)間常數(shù)RELOAD的計(jì)算方法:(1)計(jì)算RELOAD1)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/122)1T模式:Baud=fosc/(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=0FFHBaud=22118400/(256-255)/32/12=57600誤差等于零。又如,設(shè)fosc=18.432MHz,Baud0=57600,則12T模式時(shí),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è)計(jì)時(shí),為了保證通信的可靠性,應(yīng)盡量保證設(shè)計(jì)后的誤差為0。常用波特率與系統(tǒng)時(shí)鐘及定時(shí)器1的重裝時(shí)間常數(shù)等設(shè)置關(guān)系請(qǐng)參考表8-4。,.,8.2.5串行接口通信應(yīng)用舉例,1、串口1的編程要點(diǎn)(1)設(shè)置串口的工作模式設(shè)置SCON寄存器的內(nèi)容。若要串口接收,需將其中的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)先級(jí)(設(shè)置PS和PSH,也可以不設(shè)置,取默認(rèn)值),設(shè)置相應(yīng)的中斷控制位(ES和EA)。(4)如要串口1發(fā)送,將數(shù)據(jù)送入SBUF。(5)編制串行中斷服務(wù)程序,在中斷服務(wù)程序中要有清除中斷標(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)先級(jí)(設(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)。,.,例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ā)送程序流程圖,.,匯編語(yǔ)言發(fā)送程序如下:$include(STC12C5A.INC);包含STC12C5A60S2單片機(jī)寄存器定義文件ORG0000HLJMPMAINT;跳至主程序入口ORG0023HLJMPINTSE1;轉(zhuǎn)至串行中斷服務(wù)程序ORG0100HMAINT:MOVSP,#60H;設(shè)置堆棧指針MOVSCON,#01000000B;置串行口工作方式1MOVTMOD,#20H;定時(shí)器1為工作方式2MOVTH1,#0FDH;產(chǎn)生9600bps的時(shí)間常數(shù)MOVTL1,#0FDHSETBTR1;啟動(dòng)定時(shí)器1SETBES;串行口開中斷SETBEA;開中斷MOVDPTR,#ADDRT;ADDRT是首址,可以使用EQU定義MOVR0,#00H;傳送字節(jié)數(shù)初值MOVXA,DPTR;取第一個(gè)發(fā)送字節(jié)MOVSBUF,A;啟動(dòng)串行口發(fā)送SJMP$;等待中斷;中斷服務(wù)程序INTSE1:CLRTI;將中斷標(biāo)志清零CJNER0,#7FH,LOOPT;判斷128B是否發(fā)送完,若沒(méi)完,則轉(zhuǎn)LOOPTCLRES;全部發(fā)送完畢,禁止串行口中斷LJMPENDT;轉(zhuǎn)中斷返回LOOPT:INCR0;修改字節(jié)數(shù)指針I(yè)NCDPTR;修改地址指針MOVXA,DPTR;取發(fā)送數(shù)據(jù)MOVSBUF,A;啟動(dòng)串行口ENDT:RETI;中斷返回END,.,對(duì)應(yīng)的C語(yǔ)言程序如下:#include“stc12c5a.h”/包含STC12C5A60S2單片機(jī)寄存器定義文件unsignedcharxdataADDRT128;/在外部RAM區(qū)定義128個(gè)單元unsignedcharnum=0;/聲明計(jì)數(shù)變量unsignedchar*psend;/指向發(fā)送數(shù)據(jù)區(qū)的指針voidmain(void)/主程序SCON=0 x40;/置串行口工作方式1TMOD=0 x20;/定時(shí)器1為工作方式2TH1=0 xFD;/產(chǎn)生9600bps的時(shí)間常數(shù)TL1=0 xFD;TR1=1;/啟動(dòng)定時(shí)器1ES=1;/串行口開中斷EA=1;/開中斷psend=ADDRT;/設(shè)置發(fā)送數(shù)據(jù)緩沖區(qū)指針SBUF=*psend;/發(fā)送第一個(gè)數(shù)據(jù)while(1);/等待中斷voidUART_ISR(void)interrupt4/中斷號(hào)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ǔ)言):對(duì)應(yīng)的C語(yǔ)言程序請(qǐng)思考$include(STC12C5A.INC);包含STC12C5A60S2單片機(jī)寄存器定義文件ORG0000HLJMPMAINR;轉(zhuǎn)主程序ORG0023HLJMPINTSE2;轉(zhuǎn)串行口中斷服務(wù)程序ORG0100HMAINR:MOVSP,#60H;設(shè)置堆棧指針MOVSCON,#01010000B;置串行口工作方式1,允許接收MOVTMOD,#20H;定時(shí)器1為工作方式2MOVTH1,#0FDH;產(chǎn)生9600bps的時(shí)間常數(shù)MOVTL1,#0FDHSETBTR1;啟動(dòng)定時(shí)器1SETBES;串行口開中斷SETBEA;開中斷MOVDPTR,#ADDRR;數(shù)據(jù)緩沖區(qū)首址送DPTRMOVR0,#00H;置傳送字節(jié)數(shù)初值SJMP$;等待中斷;中斷服務(wù)程序INTSE2:CLRRI;清接收中斷標(biāo)志MOVA,SBUF;取接收的數(shù)據(jù)MOVXDPTR,A;接收的數(shù)據(jù)送緩沖區(qū)CJNER0,#7FH,LOOPR;判別接收完沒(méi)有。若沒(méi)有,轉(zhuǎn)LOOPR繼續(xù)接收CLRES;若接收完,則關(guān)串行口中斷LJMPENDRLOOPR:INCR0;修改計(jì)數(shù)指針I(yè)NCDPTR;修改地址指針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ù),先進(jìn)行奇偶校驗(yàn),若校驗(yàn)正確,將數(shù)據(jù)依次存放在內(nèi)部RAM區(qū)20H25H單元中。若校驗(yàn)出錯(cuò),則將出錯(cuò)信息“0FFH”存入相應(yīng)的單元。,.,調(diào)用子程序的查詢方式串行通信流程圖,.,甲機(jī)的匯編語(yǔ)言程序如下:$include(STC12C5A.INC);包含STC12C5A60S2單片機(jī)寄存器定義文件ORG0000H;主程序入口LJMPMAINTORG0030HMAINT:MOVSP,#60HMOVTMOD,#20H;置定時(shí)器1為工作方式2MOVTH1,#0E8H;置波特率時(shí)間常數(shù)MOVTL1,#0E8HMOVSCON,#40H;置串行口為工作方式1SETBTR1;啟動(dòng)定時(shí)器1工作MOVR0,#20H;數(shù)據(jù)首地址送R0MOVR7,#06H;傳送字節(jié)數(shù)送R7LOOPT:MOVA,R0;取一個(gè)待傳送的數(shù)據(jù)字節(jié)LCALLDATAOUT;調(diào)用串行可發(fā)送子程序INCR0;修改地址指針DJNZR7,LOOPT;若沒(méi)有全部發(fā)送完畢,則轉(zhuǎn)LOOPT繼續(xù)發(fā)送SJMP$DATAOUT:;串行口發(fā)送子程序MOVC,P;設(shè)置奇偶校驗(yàn)位(補(bǔ)奇)CPLCMOVACC.7,CMOVSBUF,A;啟動(dòng)串行口發(fā)送數(shù)據(jù)JNBTI,$;等待數(shù)據(jù)字節(jié)發(fā)送完畢CLRTI;清發(fā)送標(biāo)志TI,為下一數(shù)據(jù)字節(jié)串行發(fā)送作準(zhǔn)備RETEND,.,對(duì)應(yīng)的C語(yǔ)言程序如下:#include“stc12c5a.h”/包含STC12C5A60S2單片機(jī)寄存器定義文件unsignedchardataADDRT6_at_0 x20;/在內(nèi)部RAM區(qū)定義6個(gè)單元voidmain(void)/主程序unsignedchari;TMOD=0 x20;/置定時(shí)器1為工作方式2TH1=0 xe8;/置波特率時(shí)間常數(shù)TL1=0 xe8;SCON=0 x40;/置串行口為工作方式1TR1=1;/啟動(dòng)定時(shí)器1工作for(i=0;i6;i+)UART_SEND(ADDRTi);/發(fā)送一個(gè)數(shù)據(jù)while(1);/發(fā)送完畢,循環(huán)等待voidUART_SEND(unsignedcharsenddata)/串行口發(fā)送子程序bittmpbit;ACC=senddata;tmpbit=P;/設(shè)置奇偶校驗(yàn)位(補(bǔ)奇)tmpbit=!tmpbit;if(tmpbit)senddata=senddata|0 x80;elsesenddata=senddata/清發(fā)送標(biāo)志TI,為下一數(shù)據(jù)字節(jié)串行發(fā)送作準(zhǔn)備,.,$include(STC12C5A.INC);包含STC12C5A60S2單片機(jī)寄存器定義文件ORG0000H;主程序入口地址LJMPMAINRORG0030HMAINR:MOVSP,#60HMOVTMOD,#20H;置定時(shí)器1為工作方式2MOVTH1,#0E8H;置波特率時(shí)間常數(shù)MOVTL1,#0E8HMOVSCON,#52H;置串行口為工作方式1,并使REN=1SETBTR1;啟動(dòng)定時(shí)器1MOVR0,#20H;存放數(shù)據(jù)首地址送R0MOVR7,#06H;存放數(shù)據(jù)字節(jié)數(shù)送R7LOOP:LCALLDATAIN;調(diào)用接收子程序JCERROR;若C1,則出錯(cuò),轉(zhuǎn)出錯(cuò)處理程序MOVR0,A;將接收的數(shù)據(jù)送指定RAM單元中LJMPLOOPCERROR:MOVR0,#0FFH;將出錯(cuò)字符”0FFH”送指定RAM單元LOOPC:INCR0;修改地址指針DJNZR7,LOOP;若沒(méi)全部接收完畢,則繼續(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é)送AMOVC,P;檢查奇偶校驗(yàn)位CPLCANLA,#7FH;消去奇校驗(yàn)位RET;子程序返回END,乙機(jī)匯編語(yǔ)言程序,.,【例8-3】多機(jī)通信編程舉例,現(xiàn)用簡(jiǎn)單實(shí)例說(shuō)明多機(jī)串行通信中從機(jī)的基本工作過(guò)程。而實(shí)際應(yīng)用中還需要考慮通信的規(guī)范協(xié)議。有些協(xié)議很復(fù)雜,在此不加以考慮。假設(shè)系統(tǒng)晶振頻率為11.0592MHz。編程實(shí)現(xiàn)如下功能:主機(jī):先向從機(jī)發(fā)送一幀地址信息,然后再向從機(jī)發(fā)送10個(gè)數(shù)據(jù)信息。從機(jī):接收主機(jī)發(fā)來(lái)的地址幀信息,并與本機(jī)的地址號(hào)相比較,若不符合,仍保持SM2=1不變;若相等,則使SM2清零,準(zhǔn)備接收后續(xù)的數(shù)據(jù)信息,直至接收完10個(gè)數(shù)據(jù)信息。,.,a)主機(jī)程序流程圖b)從機(jī)程序流程圖,.,主機(jī)程序:$include(STC12C5A.INC);包含STC12C5A60S2單片機(jī)寄存器定義文件ADDRTEQU0000HSLAVEEQU5;從機(jī)地址號(hào)ORG0000HLJMPMAINT;主程序入口地址ORG0023HLJMPINTST;串行口中斷入口地址ORG0100HMAINT:MOVSP,#60HMOVSCON,#0C0H;串行口方式3MOVTMOD,#20H;置T1工作方式2MOVTH1,#0FAH;置4800波特率MOVTL1,#0FAH;相應(yīng)的時(shí)間常數(shù)MOVDPTR,#ADDRT;置數(shù)據(jù)地址指針MOVR0,#00H;發(fā)送數(shù)據(jù)字節(jié)計(jì)數(shù)清零MOVR2,#SLAVE;從機(jī)地址號(hào)R2SETBTR1;啟動(dòng)T1SETBES;串行口開中斷SETBEA;CPU開中斷SETBTB8;置位TB8,作為地址幀信息特征MOVA,R2;發(fā)送地址幀信息MOVSBUF,ASJMP$;等待中斷,.,;串行口中斷服務(wù)程序:INTST:CLRTI;清發(fā)送中斷標(biāo)志CLRTB8;清TB8位,為發(fā)送數(shù)據(jù)幀信息作準(zhǔn)備MOVXA,DPTR;發(fā)送一個(gè)數(shù)據(jù)字節(jié)MOVSBUF,AINCDPTR;修改指針I(yè)NCR0CJNER0,#0AH,LOOPT;判數(shù)據(jù)字節(jié)是否發(fā)送完CLRESLOOPT:RETIEND,.,對(duì)應(yīng)的C語(yǔ)言版程序如下:#include“stc12c5a.h”/包含STC12C5A60S2單片機(jī)寄存器定義文件unsignedcharxdataADDRT10;/保存數(shù)據(jù)的外部RAM單元unsignedcharSLAVE;/保存從機(jī)地址號(hào)的變量unsignedcharnum=0,*mypdata;voidmain(void)SCON=0 xC0;TMOD=0 x20;TH1=0 xFA;TL1=0 xFA;mypdata=ADDRT;SLAVE=5;/定義從機(jī)地址,在此假設(shè)從機(jī)地址為5TR1=1;ES=1;EA=1;TB8=1;SBUF=SLAVE;/發(fā)送從機(jī)地址while(1);/等待中斷,.,voidSerial_ISR(void)interrupt4TI=0;TB8=0;SBUF=*mypdata;/發(fā)送數(shù)據(jù)mypdata+;/修改指針num+;if(num=0 x0a)ES=0;,.,從機(jī)程序如下:$include(STC12C5A.INC);包含STC12C5A60S2單片機(jī)寄存器定義文件ADDRREQU0000HSLAVEEQU5;從機(jī)地址號(hào)ORG0000HLJMPMAINR;從機(jī)主程序入口地址ORG0023HLJMPINTSR;串行口中斷入口地址ORG0100HMAINR:MOVSP,#60HMOVSCON,#0F0H;串行口方式3,SM2=1,REN=1,接收狀態(tài)MOVTMOD,#20H;置T1為工作方式2MOVTH1,#0FAH;置4800波特率MOVTL1,#0FAH;相應(yīng)的時(shí)間常數(shù)MOVDPTR,#ADDRR;置數(shù)據(jù)地址指針MOVR0,#0AH;置接收數(shù)據(jù)字節(jié)數(shù)指針SETBTR1;啟動(dòng)T1SETBES;串行口開中斷SETBEA;CPU開中斷SJMP$;等待中斷,.,INTSR:CLRRI;清接收中斷標(biāo)志MOVA,SBUF;取接收信息MOVC,RB8;取RB8(信息特征位)CJNCLOOPR1;RB8=0為數(shù)據(jù)幀信息,轉(zhuǎn)LOOPR1XRLA,#SLAVE;RB8=1為地址幀信息,與本機(jī)地址號(hào)SLAVE相比較JZLOOPR2;地址相等,則轉(zhuǎn)LOOPR2LJMPENDR;地址不相等,則轉(zhuǎn)中斷返回ENDRLOOPR2:CLRSM2;清SM2,為后面接收數(shù)據(jù)幀信息作準(zhǔn)備LJMPENDR;中斷返回LOOPR1:MOVXDPTR,A;接收的數(shù)據(jù)數(shù)據(jù)緩沖區(qū)INCDPTR;修改地址指針DJNZR0,ENDR;數(shù)據(jù)字節(jié)沒(méi)全部接收完,則轉(zhuǎn)LOOPR2SETBSM2;全部接收完,置SM2=1ENDR:RETI;中斷返回END,.,對(duì)應(yīng)的C語(yǔ)言版程序如下:#include“stc12c5a.h”/包含STC12C5A60S2單片機(jī)寄存器定義文件unsignedcharxdataADDRR10;unsignedcharSLAVE,num=0 x0a,rdata,*mypdata;voidmain(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(1);/等待中斷,.,voidSerial_ISR(void)interrupt4RI=0;rdata=SBUF;/將接收緩沖區(qū)的數(shù)據(jù)保存到rdata變量中if(RB8)/RB8=1說(shuō)明收到的信息是地址if(rdata=SLAVE)/如果地址相等,則SM2=0SM2=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”/包含STC12C5A60S2寄存器定義文件#include“intrins.h”#defineRELOAD_COUNT0 xfb/Fosc=18.432MHz,12T,SMOD=0,9600bpssbitMCU_Start_Led=P14;unsignedchararray9=0,2,4,6,8,10,12,14,16;voidUART_send(unsignedchari);voiddelay(void);voiddisplay_MCU_Start_Led(void);voidmain(void)unsignedchari;/串口初始化SCON=0 x50;/0101,00008位可變波特率,無(wú)奇偶校驗(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(arrayi);while(1);voidUART_send(unsignedchari)ES=0;/關(guān)串口中斷TI=0;/清零串口發(fā)送完成中斷請(qǐng)求標(biāo)志SBUF=i;while(TI=0);/等待發(fā)送完成TI=0;/清零串口發(fā)送完成中斷請(qǐng)求標(biāo)志ES=1;/允許串口中斷,.,voiddelay(void)unsignedintg,j;for(j=0;j5;j+)for(g=0;g50000;g+)_nop_();_nop_();_nop_();,.,voiddisplay_MCU_Start_Led(void)unsignedchari;for(i=0;i5;i+)MCU_Start_Led=0;/點(diǎn)亮MCU開始工作指示燈delay();MCU_Start_Led=1;/熄滅MCU開始工作指示燈delay();,.,voidUART_Receive(void)interrupt4unsignedchark;if(RI=1)RI=0;k=SBUF;UART_send(k+1);elseTI=0;,.,8.2.6計(jì)算機(jī)與單片機(jī)之間的串行通信,在以計(jì)算機(jī)為控制中心的數(shù)據(jù)采集與自動(dòng)控制系統(tǒng)中,通常需要用單片機(jī)采集數(shù)據(jù),然后用異步串行通信方式傳給計(jì)算機(jī);要完成的控制命令由計(jì)算機(jī)通過(guò)串行通信方式傳給單片機(jī),由單片機(jī)進(jìn)行控制。計(jì)算機(jī)和單片機(jī)之間的串行通信一般采用RS-232、RS-422或RS-485總線標(biāo)準(zhǔn)接口,也有采用非標(biāo)準(zhǔn)的20mA電流環(huán)的。這里介紹最常用的RS-232接口串行通信的設(shè)計(jì)方法。RS-232是早期為公用電話網(wǎng)絡(luò)數(shù)據(jù)通信而制定的標(biāo)準(zhǔn),其邏輯電平與TTL/CMOS電平完全不同。邏輯“0”規(guī)定為+5+15V之間,邏輯“1”規(guī)定為-5-15V之間。由于RS-232發(fā)送和接收之間有公共地,傳輸采用非平衡模式,因此共模噪聲會(huì)耦合到信號(hào)系統(tǒng)中,標(biāo)準(zhǔn)中建議的最大通信距離為15m。下面通過(guò)一個(gè)簡(jiǎn)單實(shí)例,介紹計(jì)算機(jī)與單片機(jī)進(jìn)行RS232通信的硬件接口設(shè)計(jì)和軟件設(shè)計(jì)。,.,【例8-5】計(jì)算機(jī)向單片機(jī)發(fā)送一個(gè)數(shù)據(jù),單片機(jī)接收到數(shù)據(jù)后,將接收到的數(shù)據(jù)回發(fā)給計(jì)算機(jī)。假設(shè)單片機(jī)的系統(tǒng)時(shí)鐘為11.0592MHz,通信參數(shù)為“9600,n,8,1”(這是常見(jiàn)的通信參數(shù)表示方法,即波特率為9600bps,8個(gè)數(shù)據(jù)位,1個(gè)停止位,沒(méi)有奇偶校驗(yàn))。在計(jì)算機(jī)上顯示從單片機(jī)發(fā)送過(guò)來(lái)的數(shù)據(jù)??梢允褂迷摲椒y(cè)試硬件電路的連接情況。,.,1硬件接口設(shè)計(jì)從硬件上講,計(jì)算機(jī)的串行口是RS-232電平的,而單片機(jī)的串口是TTL電平的。因此,要實(shí)現(xiàn)單片機(jī)與計(jì)算機(jī)之間的串行通信,必須通過(guò)電路實(shí)現(xiàn)TTL電平和RS-232電平的轉(zhuǎn)換。常用的電平轉(zhuǎn)換集成電路是MAX232或者與它兼容轉(zhuǎn)換芯片,它包含兩路驅(qū)動(dòng)器和接收器。單片機(jī)與計(jì)算機(jī)進(jìn)行串行通信的硬件連接,最簡(jiǎn)單的方法是采用三線制連接方式,也就是說(shuō),計(jì)算機(jī)的9針串口只連接其中的3根線:第5腳的GND、第2腳的RXD、第3腳的TXD。電路如教材圖1-7。,.,2軟件設(shè)計(jì)軟件設(shè)計(jì)往往因應(yīng)用系統(tǒng)要求的不同而不同。根據(jù)題目的要求,進(jìn)行如下的計(jì)算機(jī)程序設(shè)計(jì)和單片機(jī)程序設(shè)計(jì)。(1)上位計(jì)算機(jī)程序
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度綠色環(huán)保紙箱批量購(gòu)銷合作協(xié)議書3篇
- 2024信用卡年度信用卡用戶信用修復(fù)與信用體系建設(shè)服務(wù)協(xié)議3篇
- 2024年地磚行業(yè)綠色生產(chǎn)標(biāo)準(zhǔn)認(rèn)證合同3篇
- 2024年數(shù)據(jù)中心弱電系統(tǒng)集成及配套設(shè)備租賃合同3篇
- 2024宿舍管理員宿舍衛(wèi)生習(xí)慣養(yǎng)成聘用合同書3篇
- 2024年影視制作合同標(biāo)的拍攝計(jì)劃
- 2024中草藥種植與中醫(yī)藥養(yǎng)生度假村合作合同3篇
- 癰病的護(hù)理常規(guī)
- 編制教材合同范例寫
- 后期承包合同范例
- 設(shè)計(jì)中的重點(diǎn)、難點(diǎn)及關(guān)鍵技術(shù)問(wèn)題的把握控制及相應(yīng)措施
- 新時(shí)代高校馬克思主義學(xué)院內(nèi)涵式發(fā)展的現(xiàn)狀和現(xiàn)實(shí)進(jìn)路
- 2024以租代購(gòu)合同
- 湖南省益陽(yáng)市2023-2024學(xué)年高二上學(xué)期1月期末物理試題 含答案
- 2019水電工程探地雷達(dá)探測(cè)技術(shù)規(guī)程
- 災(zāi)難事故避險(xiǎn)自救-終結(jié)性考核-國(guó)開(SC)-參考資料
- JP柜技術(shù)規(guī)范可編輯范本
- 有關(guān)中醫(yī)康復(fù)治療課件
- 江蘇省蘇州市(2024年-2025年小學(xué)五年級(jí)語(yǔ)文)統(tǒng)編版期末考試((上下)學(xué)期)試卷及答案
- 期末復(fù)習(xí)試題(試題)-2024-2025學(xué)年四年級(jí)上冊(cè)數(shù)學(xué)人教版
- 第六單元(整體教學(xué)課件)七年級(jí)語(yǔ)文上冊(cè)大單元教學(xué)名師備課系列(統(tǒng)編版2024)
評(píng)論
0/150
提交評(píng)論