單片機(jī)原理及應(yīng)用-基于匯編、C51及混合編程第8章串行口通信_(tái)第1頁(yè)
單片機(jī)原理及應(yīng)用-基于匯編、C51及混合編程第8章串行口通信_(tái)第2頁(yè)
單片機(jī)原理及應(yīng)用-基于匯編、C51及混合編程第8章串行口通信_(tái)第3頁(yè)
單片機(jī)原理及應(yīng)用-基于匯編、C51及混合編程第8章串行口通信_(tái)第4頁(yè)
單片機(jī)原理及應(yīng)用-基于匯編、C51及混合編程第8章串行口通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩91頁(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)介

1

第8章串行口通信2主要內(nèi)容8.1串行通信的概念8.2串行口1的相關(guān)寄存器8.3串行口1的工作方式8.4串行口1通信中波特率的設(shè)置8.5串行口2的相關(guān)寄存器8.6串行口2的工作方式8.7串行口的應(yīng)用8.8RS-232串行標(biāo)準(zhǔn)8.9RS-485串行接口8.10SPI串行接口概述8.11SPI串行數(shù)據(jù)通信8.12SPI接口的應(yīng)用38.1串行通信的概念串行通信是按一位一位的順序傳送數(shù)據(jù),串行通信方式又分為同步通信和異步通信兩種。同步通信:發(fā)送方和接收方用同一個(gè)時(shí)鐘控制信號(hào)同步字符同步字符N個(gè)字節(jié)的連續(xù)數(shù)據(jù)校驗(yàn)字符校驗(yàn)字符48.1串行通信的概念異步通信是一種將數(shù)據(jù)以一個(gè)字符為單位進(jìn)行傳送的通信方式傳送一個(gè)字符又稱為一幀信息發(fā)送與接收之間無(wú)時(shí)鐘信號(hào)控制,發(fā)送和接收的速率要求相同起始位:位于一幀數(shù)據(jù)的開(kāi)頭,邏輯“0”電平信號(hào),用來(lái)通知接收設(shè)備開(kāi)始接收一幀信息數(shù)據(jù)位:緊跟起始位之后的是數(shù)據(jù)位,對(duì)51內(nèi)核單片機(jī)來(lái)說(shuō),低位在前,高位在后第9位:常用于對(duì)串行通信數(shù)據(jù)進(jìn)行奇偶校驗(yàn)停止位:邏輯“1”電平信號(hào),應(yīng)大于或等于一個(gè)位數(shù)據(jù)的時(shí)間。在發(fā)送完一幀信息后,用于發(fā)送的數(shù)據(jù)線一直處于高電平狀態(tài),等待再次發(fā)送58.1串行通信的概念串行通信可分為單工、半雙工和全雙工3種方式單工方式只有一根數(shù)據(jù)線,數(shù)據(jù)只能按照一個(gè)固定的方向傳送半雙工方式的數(shù)據(jù)可以由甲向乙傳送,也可以由乙向甲傳送,但是不能在兩個(gè)方向上同時(shí)傳送全雙工方式可以在同一時(shí)刻實(shí)現(xiàn)雙向傳送。在串行通信中,用波特率衡量通信速度的快慢。波特率是指每秒鐘傳送的二進(jìn)制數(shù)的位數(shù)單位:位/秒(bps)字節(jié)/秒(Bps)波特率(bps)=1個(gè)字符的二進(jìn)制位數(shù)×Bps68.1串行通信的概念STC12C5A60S2單片機(jī)具有2個(gè)UART工作方式的串行口接收緩沖器SBUF地址:99H發(fā)送緩沖器SBUF地址:99H串行口1接收緩沖器S2BUF地址:9BH發(fā)送緩沖器S2BUF地址:9BH串行口278.2串行口1的相關(guān)寄存器STC12C5A60S2單片機(jī)的串行口1與8個(gè)特殊功能寄存器相關(guān)串行控制寄存器SCON電源控制寄存器PCON輔助寄存器AUXR獨(dú)立波特率發(fā)生器寄存器BRT喚醒控制寄存器WAKE_CLKO中斷寄存器IE、IP、IPH。88.2串行口1的相關(guān)寄存器1.串行控制寄存器SCON,地址為98H,可進(jìn)行位尋址D7D6D5D4D3D2D1D0SM0/FESM1SM2RENTB8RB8TIRISM0/FE:寄存器PCON中的SMOD0位為1時(shí),該位用于幀錯(cuò)誤檢測(cè)(FE)。當(dāng)檢測(cè)到停止位無(wú)效時(shí),硬件會(huì)將該位置1,必須由軟件清零SMOD0位為0時(shí),SM0、SM1兩位一起確定串行口1的工作方式SM0SM1工作方式功能說(shuō)明波特率00方式0同步串行移位寄存器方式當(dāng)AUXR寄存器中的位UART_M0x6=0時(shí),波特率等于fosc/12;UART_M0x6=1時(shí),波特率等于fosc/201方式18位異步通信(2SMOD/32)×(定時(shí)/計(jì)數(shù)器T1的溢出率或獨(dú)立波特率發(fā)生器的溢出率)10方式29位異步通信(2SMOD/32)×fosc11方式39位異步通信與方式1相同SM2:在方式0中,該位必須為0;在方式2和方式3中,該位為1時(shí),只有接收到的第9位數(shù)據(jù)RB8位為1時(shí),接收才能有效。在方式1中,該位為1時(shí),只有正確接收到停止位時(shí),接收才能有效REN:允許串行接收控制位。當(dāng)該位為1時(shí),允許接收信息;當(dāng)該位為0時(shí),禁止接收信息。TB8:發(fā)送數(shù)據(jù)的第9位RB8:接收數(shù)據(jù)的第9位TI:串行口1發(fā)送中斷請(qǐng)求標(biāo)志位RI:串行口1接收中斷請(qǐng)求標(biāo)志位98.2串行口1的相關(guān)寄存器2.電源控制寄存器PCON,地址為87HD7D6D5D4D3D2D1D0SMODSMOD0LVDFPOFGF1GF0PDIDLSMOD:波特率倍頻選擇位。該位置1,串行口1工作在方式1、2、3時(shí)波特率加倍;該位為0,各工作方式的波特率不加倍SMOD0:幀錯(cuò)誤檢測(cè)有效控制位。該位置1,SCON寄存器中的SM0/FE位用于FE功能;該位為0,SCON寄存器中的SM0/FE位用于方式選擇。108.2串行口1的相關(guān)寄存器3.輔助寄存器AUXR,地址為8EHD7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRSUART_M0x6:串行口1方式0的通信速度控制位。UART_M0x6=0,方式0的波特率為系統(tǒng)時(shí)鐘頻率的12分頻;UART_M0x6=1,方式0的波特率為fosc/2。BRTR:獨(dú)立波特率發(fā)生器運(yùn)行控制位。BRTR=0時(shí),不允許獨(dú)立波特率發(fā)生器工作;BRTR=1時(shí),允許獨(dú)立波特率發(fā)生器工作BRTx12:獨(dú)立波特率發(fā)生器計(jì)數(shù)控制位。BRTx12=0時(shí),獨(dú)立波特率發(fā)生器的計(jì)數(shù)時(shí)鐘源為系統(tǒng)時(shí)鐘頻率fosc的12分頻;BRTx12=1,獨(dú)立波特率發(fā)生器的計(jì)數(shù)時(shí)鐘源為系統(tǒng)時(shí)鐘頻率。S1BRS:串行口1的波特率發(fā)生器選擇位。S1BRS=0時(shí),選擇定時(shí)/計(jì)數(shù)器T1作為串行口1的波特率發(fā)生器;S1BRS=1時(shí),選擇獨(dú)立波特率發(fā)生器作為串行口1的波特率發(fā)生器118.2串行口1的相關(guān)寄存器4.獨(dú)立波特率發(fā)生器寄存器BRT,地址為9CH獨(dú)立波特率發(fā)生器是專門(mén)用于控制串行通信速度的定時(shí)器,與定時(shí)/計(jì)數(shù)器T1工作于方式2的情況相似。BRT用于保存重裝時(shí)間常數(shù)的一個(gè)8位寄存器注意:串行口2:只能使用獨(dú)立波特率發(fā)生器控制發(fā)送與接收,串行口1:既可以選擇T1作為波特率發(fā)生器,也可以選擇獨(dú)立波特率發(fā)生器。串行口1和串行口2不能同時(shí)使用獨(dú)立波特率發(fā)生器,128.2串行口1的相關(guān)寄存器5.喚醒控制寄存器WAKE_CLKO,地址為8FHD7D6D5D4D3D2D1D0PCAWAKEUPRXD_PIN_IET1_PIN_IET0_PIN_IELVD_WAKEBRTCLKOT1CLKOT0CLKORXD_PIN_IE=0時(shí),禁止P3.0/RxD引腳的下降沿置位RI,也禁止RxD引腳喚醒掉電模式;RXD_PIN_IE=1時(shí),允許P3.0/RxD引腳的下降沿將RI置1,并且RxD引腳的下降沿能夠喚醒掉電模式138.3串行口1的工作方式8.3.1方式0串行口1工作在方式0,作同步移位寄存器使用D7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRSUART_M0x6:串行口1方式0的通信速度控制位。UART_M0x6=0,方式0的波特率為系統(tǒng)時(shí)鐘頻率的12分頻;UART_M0x6=1,方式0的波特率為fosc/2。148.3串行口1的工作方式8.3.1方式0串行口數(shù)據(jù)由RxD引腳輸入或輸出,同步移位脈沖通過(guò)TxD引腳輸出,發(fā)送、接收均為8位數(shù)據(jù)發(fā)送過(guò)程:在TI=0的條件下,執(zhí)行MOVSBUF,A指令,啟動(dòng)發(fā)送注意:發(fā)送順序:低位在前,高位在后發(fā)送完一幀數(shù)據(jù)后,由硬件將發(fā)送中斷標(biāo)志位TI置1,向CPU發(fā)出中斷請(qǐng)求。若要再次發(fā)送數(shù)據(jù),必須先通過(guò)程序?qū)I位清0。158.3串行口1的工作方式8.3.1方式0串行口數(shù)據(jù)由RxD引腳輸入或輸出,同步移位脈沖通過(guò)TxD引腳輸出,發(fā)送、接收均為8位數(shù)據(jù)接收過(guò)程:在RI=0的條件下,接收允許控制位REN置1時(shí),處于接收狀態(tài)接收完一幀數(shù)據(jù)后,硬件將接收到的數(shù)據(jù)存入接收緩沖器SBUF,并將中斷標(biāo)志位RI置1,向CPU發(fā)出中斷請(qǐng)求注意:接收順序:先收到的是低位,后收到的是高位若要繼續(xù)接收數(shù)據(jù),必須先通過(guò)程序?qū)I位清0。168.3串行口1的工作方式8.3.2方式18位數(shù)據(jù),低位在前高位在后發(fā)送過(guò)程:在TI為0的條件下,執(zhí)行將數(shù)據(jù)寫(xiě)入SBUF的指令時(shí),啟動(dòng)發(fā)送過(guò)程。在內(nèi)部移位脈沖的控制下,TxD引腳首先發(fā)送起始位、8位數(shù)據(jù)、停止位,發(fā)送完畢后TI置1,向CPU發(fā)出中斷請(qǐng)求178.3串行口1的工作方式8.3.2方式1接收過(guò)程:在RI為0、接收允許控制位REN被置1的條件下,CPU處于接收狀態(tài)。當(dāng)硬件檢測(cè)到RxD引腳由高電平變?yōu)榈碗娖綍r(shí),開(kāi)始接收一幀數(shù)據(jù),并同步波特率發(fā)生器。188.3串行口1的工作方式8.3.2方式1接收過(guò)程:(1)RI=0(2)SM2=0或接收到的停止位為1時(shí)硬件自動(dòng)將接收到的數(shù)據(jù)裝入接收緩沖器SBUF,同時(shí)將停止位寫(xiě)入RB8,置中斷標(biāo)志位RI為1,向CPU提出中斷請(qǐng)求。若不滿足兩個(gè)條件,接收到的數(shù)據(jù)無(wú)法裝入接收緩沖器SBUF,數(shù)據(jù)丟失。注意:無(wú)論滿足這兩個(gè)條件與否,接收控制器將繼續(xù)檢測(cè)RxD引腳,接收下一幀數(shù)據(jù),所以在接收的過(guò)程中,應(yīng)及時(shí)清接收中斷標(biāo)志位RI,以免數(shù)據(jù)丟失198.3串行口1的工作方式8.3.3方式2、方式3

方式2與方式3唯一的區(qū)別在于方式2的波特率是固定的,而方式3的波特率與波特率發(fā)生器有關(guān)

方式1與方式3的區(qū)別是:方式1是8位的串行異步通信、

方式3是9位串行異步通信208.3串行口1的工作方式8.3.3方式2、方式3發(fā)送過(guò)程:將發(fā)送中斷標(biāo)志位TI清0,并通過(guò)位傳送指令將第9位數(shù)據(jù)寫(xiě)入TB8中,然后執(zhí)行MOVSBUF,A指令,啟動(dòng)發(fā)送過(guò)程。一幀數(shù)據(jù)發(fā)送完畢,硬件將發(fā)送中斷標(biāo)志位TI置1218.3串行口1的工作方式8.3.3方式2、方式3接收過(guò)程:允許控制位REN被置1后處于接收狀態(tài)。接收到的第9位(而不是停止位)裝入到RB8位中注意:在方式2和方式3中,SM2為1時(shí),只有接收到的第9位數(shù)據(jù)RB8位為1時(shí),接收才能有效228.3串行口1的工作方式8.3.4多機(jī)通信在多機(jī)通信中方式2和方式3更適合主從通信主機(jī)的SM2位清0從機(jī)的SM2位置1通信過(guò)程舉例

(1)主機(jī)向從機(jī)發(fā)送某一從機(jī)的地址,發(fā)送前將TB8位置1,然后進(jìn)入接收狀態(tài)

(2)各從機(jī)接收到主機(jī)送出的地址信息后,

與本機(jī)地址相符時(shí),表示被選中,將本機(jī)地址回發(fā)給主機(jī)(TB8位為0),執(zhí)行CLRSM2指令。

未被選中的從機(jī),SM2位依然為1,接收不到TB8位為0的數(shù)據(jù)信息。238.3串行口1的工作方式8.3.4多機(jī)通信在多機(jī)通信中方式2和方式3更適合主從通信主機(jī)的SM2位清0從機(jī)的SM2位置1通信過(guò)程舉例

(3)主機(jī)收到從機(jī)回發(fā)的地址后,檢驗(yàn)是否與主機(jī)先前發(fā)送的地址一致,若不同,說(shuō)明發(fā)送過(guò)程出現(xiàn)錯(cuò)誤,再回到第(1)步,若相同,可以發(fā)出指令或數(shù)據(jù)信息(TB8位為0)。

(4)從機(jī)正確地接收到主機(jī)所發(fā)送到的指令或數(shù)據(jù)信息后,回發(fā)先前約定好的應(yīng)答信號(hào)給主機(jī),同時(shí)將SM2位重新置1,以便從機(jī)能夠接收主機(jī)再次發(fā)送地址信息,本次主機(jī)與從機(jī)通信過(guò)程結(jié)束。

理論上,一個(gè)主機(jī)可以與256個(gè)從機(jī)通信,但由于每個(gè)單片機(jī)引腳的輸入阻抗及總線上阻抗的存在,總線上所允許并聯(lián)從機(jī)的數(shù)量要受到限制。如果主機(jī)與過(guò)多的從機(jī)連接時(shí),波特率應(yīng)設(shè)置的低一些以減少通信錯(cuò)誤248.4串行口1通信中波特率的設(shè)置(1)方式0D7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRS輔助寄存器AUXRUART_M0x6=0時(shí),波特率是fosc/12UART_M0x6=1時(shí),波特率是fosc/2258.4串行口1通信中波特率的設(shè)置(2)方式2D7D6D5D4D3D2D1D0SMODSMOD0LVDFPOFGF1GF0PDIDL電源控制寄存器PCON波特率=(2SMOD/64)foscD7D6D5D4D3D2D1D0SMODSMOD0LVDFPOFGF1GF0PDIDLSMOD=0時(shí),波特率=fosc/64當(dāng)SMOD=1時(shí),波特率=fosc/32268.4串行口1通信中波特率的設(shè)置(3)方式1和方式3波特率=2SMOD(定時(shí)/計(jì)數(shù)器T1的溢出率/32)D7D6D5D4D3D2D1D0SMODSMOD0LVDFPOFGF1GF0PDIDLSMOD=0時(shí),波特率=T1的溢出率/32當(dāng)SMOD=1時(shí),波特率=T1的溢出率/16D7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRST1x12=0時(shí),T1的溢出率=(fosc/12)/(256-THl)T1x12=1時(shí),T1的溢出率=fosc/(256-TH1)278.4串行口1通信中波特率的設(shè)置(3)方式1和方式3波特率=2SMOD(獨(dú)立波特率發(fā)生器的溢出率/32)D7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRSBRTx12=0時(shí),獨(dú)立波特率發(fā)生器的溢出率=(fosc/12)/(256-BRT)BRTx12=1時(shí),獨(dú)立波特率發(fā)生器的溢出率=fosc/(256-BRT)288.4串行口1通信中波特率的設(shè)置(3)方式1和方式3T1x12=0,T1工作在方式2時(shí),幾種波特率所對(duì)應(yīng)T1的重裝初值波特率系統(tǒng)時(shí)鐘(MHz)SMODT1重裝初值1920011.05921FDH960011.05921FAH960011.05920FDH480011.05921F4H480011.05920FAH240011.05921E8H240011.05920F4H120011.05921D0H120011.05920E8H298.5串行口2的相關(guān)寄存器與串行口2相關(guān)的寄存器有:1.串行口2的控制寄存器S2CON,地址為9AH,不能位尋址D7D6D5D4D3D2D1D0S2SM0S2SM1S2SM2S2RENS2TB8S2RB8S2TIS2RI2.輔助寄存器AUXR——波特率加倍控制位S2SMODD7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRSS2SMOD位為0時(shí),串行口2的波特率不加倍S2SMOD位為1時(shí),串行口2的波特率加倍308.5串行口2的相關(guān)寄存器與串行口2相關(guān)的寄存器有:3.輔助寄存器AUXR14.獨(dú)立波特率發(fā)生器寄存器BRT5.中斷寄存器IE、IE2、IP2、IP2HD7D6D5D4D3D2D1D0-PCA_P4SPI_P4S2_P4GF2ADRJ-DPSS2_P4位為0時(shí),TxD2為P1.3,RxD2為P1.2S2_P4位為1時(shí),TxD2為P4.3,RxD2為P4.26.發(fā)送緩沖器S2BUF與接收緩沖器S2BUF共用同一個(gè)地址9BH318.6串行口2的工作方式8.6.1方式0當(dāng)S2SM0、S2SM1為00時(shí),串行口2工作在方式0波特率=fosc/12僅有這一種情況8位數(shù)據(jù)低位在前,高位在后通過(guò)RxD2引腳接收或發(fā)送數(shù)據(jù)TxD2引腳輸出同步移位時(shí)鐘328.6串行口2的工作方式8.6.2方式1當(dāng)S2SM0、S2SM1為01時(shí),串行口2工作在方式1TxD2引腳發(fā)送、RxD2引腳接收一幀數(shù)據(jù)包含一個(gè)起始位、8個(gè)數(shù)據(jù)位和一個(gè)停止位停止位存放在S2CON寄存器的S2RB8位338.6串行口2的工作方式8.6.2方式1波特率=(2S2SMOD/32)×獨(dú)立波特率發(fā)生器的溢出率D7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRSBRTx12=0時(shí),獨(dú)立波特率發(fā)生器的溢出率=(fosc/12)/(256-BRT)BRTx12=1時(shí),獨(dú)立波特率發(fā)生器的溢出率=fosc/(256-BRT)348.6串行口2的工作方式8.6.3方式2當(dāng)S2SM0、S2SM1為10時(shí),串行口2工作在方式2TxD2引腳發(fā)送、RxD2引腳接收一幀數(shù)據(jù)包含一個(gè)起始位、9個(gè)數(shù)據(jù)位和一個(gè)停止位發(fā)送時(shí),第9位數(shù)據(jù)位來(lái)自S2CON寄存器中的S2TB8位,接收時(shí),第9位數(shù)據(jù)裝入S2CON寄存器中的S2RB8位D7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRSS2SMOD位為0時(shí),波特率=fosc/64S2SMOD位為1時(shí),波特率=fosc/32358.6串行口2的工作方式8.6.4方式3當(dāng)S2SM0、S2SM1為11時(shí),串行口2工作在方式3TxD2引腳發(fā)送、RxD2引腳接收一幀數(shù)據(jù)包含一個(gè)起始位、9個(gè)數(shù)據(jù)位和一個(gè)停止位發(fā)送時(shí),第9位數(shù)據(jù)位來(lái)自S2CON寄存器中的S2TB8位,接收時(shí),第9位數(shù)據(jù)裝入S2CON寄存器中的S2RB8位波特率的設(shè)定與方式1相同368.7串行口的應(yīng)用1.串行口1的初始化(1)設(shè)置SCON寄存器中各個(gè)相關(guān)位,由SM0、SM1兩位確定工作方式,將TI、RI清0,如果需要接收,將REN位置1;(2)設(shè)置合適的波特率,即設(shè)置定時(shí)/計(jì)數(shù)器T1的工作方式、給TL1、TH1賦初值,啟動(dòng)T1工作;使用獨(dú)立波特率發(fā)生器時(shí),給BRT賦初值,并初始化AUXR寄存器的BRTR及BRTx12兩位;(3)根據(jù)需要確定是否需要開(kāi)放中斷及中斷優(yōu)先級(jí);(4)編寫(xiě)相應(yīng)的中斷或查詢方式的服務(wù)程序。378.7串行口的應(yīng)用2.串行口2的初始化(1)即設(shè)置S2CON寄存器中的各個(gè)相關(guān)位的值,由S2SM0、S2SM1兩位確定工作方式,S2RI、S2TI兩位清0。如果允許接收,將S2REN位置1;(2)設(shè)置獨(dú)立波特率發(fā)生器。初始化AUXR寄存器中的BRTx12、S2SMOD等位,將初值裝入BRT寄存器;(3)將AUXR中的BRTR位置1,啟動(dòng)獨(dú)立波特率發(fā)生器工作;(4)根據(jù)需要設(shè)置中斷優(yōu)先級(jí),開(kāi)放中斷ES2、EA;(5)編寫(xiě)相應(yīng)的中斷或查詢方式的服務(wù)程序。38

【例8-1】STC12C5A60S2單片機(jī)的串行口1與一片8位串入并出的芯片74HC164連接,驅(qū)動(dòng)一組發(fā)光二極管,使發(fā)光二極管從右至左延時(shí)輪流顯示。分析:74HC164是一個(gè)串行輸入并行輸出的移位寄存器,Q0-Q7是并行輸出端,Dsa、Dsb為串行輸入端。CP為時(shí)鐘輸入端。復(fù)位端,低電平有效,當(dāng)復(fù)位端輸入低電平時(shí)清除移位寄存器的值,強(qiáng)制所有的輸出為低電平設(shè)STC12C5A60S2單片機(jī)的系統(tǒng)時(shí)鐘頻率為12MHz,串行口1工作在方式0。對(duì)SCON寄存器賦初值為00H39(1)匯編程序:ORG0000HLJMPMAINORG0100HMAIN:MOVSP,#0BFH;初始化堆棧指針MOVSCON,#00H;串行口1工作在方式0 MOVA,#0FEH;LED顯示碼存A寄存器START:MOVSBUF,A;啟動(dòng)發(fā)送過(guò)程LOOP:JNBTI,LOOP;判斷發(fā)送是否完畢CLRTI;發(fā)送完畢,將TI位清0 ACALLDELAY;延時(shí) RLA;發(fā)光二極管顯示碼左移一位SJMPSTART40DELAY:MOVR7,#0BDH;500ms的延時(shí)程序DL1:MOVR6,#0E6HDL0:MOVR5,#21HDJNZR5,$DJNZR6,DL0DJNZR7,DL1RETEND41(2)C語(yǔ)言程序:#include<STC12C5A.h>#include<intrins.h>//聲明本征函數(shù)庫(kù)voidDELAY();//延時(shí)函數(shù)voidmain(){unsignedcharj;SCON=0x00;//串行口1工作在方式0j=0xFE;//LED顯示碼for(;;){SBUF=j;//啟動(dòng)發(fā)送過(guò)程while(!TI);//等待發(fā)送完畢TI=0;DELAY();//延時(shí)500msj=_crol_(j,1);//循環(huán)左移一位}}42voidDELAY()//延時(shí)500ms函數(shù){unsignedchara,b,c;for(c=189;c>0;c--)for(b=230;b>0;b--)for(a=33;a>0;a--);}43【例8-2】利用STC12C5A60S2單片機(jī)的串行口1外接一片8位的并入串出芯片74HC165,用于擴(kuò)展并行輸入,如圖所示。分析:74HC165是一種并入串出的芯片,其中D0-D7為并行數(shù)據(jù)輸入端,DS為串行數(shù)據(jù)輸入端,Q7為串行輸出端。

當(dāng)并行輸入允許引腳輸入為低時(shí),從D0至D7引腳并行輸入的數(shù)據(jù)被輸入到內(nèi)部移位寄存器內(nèi),

而當(dāng)為高時(shí),并行輸入禁止,移位寄存器的數(shù)據(jù)在CP引腳輸入的時(shí)鐘脈沖上升沿的控制下,向右移動(dòng)一位DS→Q0→Q1→…→Q7,Q7的狀態(tài)出現(xiàn)在第9引腳上。設(shè)串行口1工作在方式0,SCON寄存器的內(nèi)容為00H。44(1)匯編程序段如下:MOVSCON,#00000000B CLRP1.7;并行輸入允許NOP;等待引腳狀態(tài)穩(wěn)定NOP NOPNOPNOPNOPSETBP1.7;禁止并行輸入NOP;等待引腳狀態(tài)穩(wěn)定NOP NOPNOPNOPNOPCLRRI;清除中斷標(biāo)志RISETBREN;允許接收LOOP:JNBRI,LOOP;等待CLRRIMOVA,SBUF45(2)C語(yǔ)言程序#include<STC12C5A.h>#include<intrins.h>sbitP1_7=P1^7;voidmain(){unsignedchartemp;SCON=0x00;P1_7=0;//并行輸入允許_nop_();//等待引腳狀態(tài)穩(wěn)定_nop_();_nop_();_nop_();_nop_();_nop_();P1_7=1;//并行輸入禁止_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();RI=0;//清除接收中斷標(biāo)志RIREN=1;//允許接收while(!RI);//等待接收數(shù)據(jù)RI=0;//清除接收中斷標(biāo)志RItemp=SBUF;//讀入數(shù)據(jù)while(1);}46【例8-3】在圖8-10所示的甲、乙兩機(jī)間的串行通信中,單片機(jī)系統(tǒng)的時(shí)鐘頻率為11.0592MHz,要求波特率為1200bps,編程實(shí)現(xiàn)將甲機(jī)片內(nèi)的30H-3FH單元的數(shù)據(jù)傳送到乙機(jī)片內(nèi)40H-4FH單元中。(1)匯編子程序:分析:甲、乙兩機(jī)都選擇串行口1工作在方式3,9位異步通信方式,TB8用作奇偶校驗(yàn)位,甲機(jī)串口控制寄存器SCON的初值為0C0H,乙機(jī)的控制字0D0H。D7D6D5D4D3D2D1D0SM0/FESM1SM2RENTB8RB8TIRI47【例8-3】在圖8-10所示的甲、乙兩機(jī)間的串行通信中,單片機(jī)系統(tǒng)的時(shí)鐘頻率為11.0592MHz,要求波特率為1200bps,編程實(shí)現(xiàn)將甲機(jī)片內(nèi)的30H-3FH單元的數(shù)據(jù)傳送到乙機(jī)片內(nèi)40H-4FH單元中。(1)匯編子程序:分析:甲、乙兩機(jī)都選擇串行口1工作在方式3,9位異步通信方式,TB8用作奇偶校驗(yàn)位,甲機(jī)串口控制寄存器SCON的初值為0C0H,乙機(jī)的控制字0D0H。定時(shí)/計(jì)數(shù)器T1工作在方式2作為波特率發(fā)生器,TMOD為20H;波特率=2SMOD[(定時(shí)/計(jì)數(shù)器T1的溢出率)/32],T1的溢出率=(波特率×32)/2SMOD,T1的重裝初值=256-(fosc/12)/T1的溢出率=256-(fosc/12)×2SMOD/(波特率×32)=256-(11059200/12)/(1200×32)=232=E8H甲機(jī)的發(fā)送子程序:48TRA_UART:MOVTMOD,#20H;T1工作在方式2ANLAUXR,#0BFH;T1計(jì)數(shù)工作在系統(tǒng)時(shí)鐘的12分頻MOVTL1,#0E8H;給T1的低8位賦初值MOVTH1,#0E8H;給T1的高8位賦初值A(chǔ)NLPCON,#7FH;波特率不加倍MOVSCON,#0C0H;串行口1工作在方式3MOVR0,#30H;R0作為片內(nèi)RAM指針MOVR7,#10H;R7作為發(fā)送計(jì)數(shù)器

SETBTR1;波特率發(fā)生器開(kāi)始工作LOOP:MOVA,@R0;讀取片內(nèi)30H-3FH單元的內(nèi)容MOVC,P MOVTB8,C;將奇偶校驗(yàn)位寫(xiě)入TB8 MOVSBUF,A;啟動(dòng)發(fā)送過(guò)程WAIT:JNBTI,WAIT;等待發(fā)送完畢 CLRTI;發(fā)送完畢,將TI清0 INCR0;指向下一個(gè)單元地址 DJNZR7,LOOP;如果數(shù)據(jù)未發(fā)送完,將繼續(xù)發(fā)送 RET49乙機(jī)接收子程序:RES_UART:MOVTMOD,#20H;T1的初始化 MOVTL1,#0E8H MOVTH1,#0E8HANLAUXR,#0BFH;系統(tǒng)時(shí)鐘的12分頻 ANLPCON,#7FH;波特率不加倍MOVSCON,#0D0H;方式3,且允許接收 MOVR0,#40H;R0作為片內(nèi)RAM指針 MOVR7,#10H;R7作為計(jì)數(shù)器 SETBTR1;波特率發(fā)生器開(kāi)始工作LOOP:NOPWAIT:JNBRI,WAITCLRRI MOVA,SBUF;

50;P與RB8位異或,出錯(cuò)時(shí)跳轉(zhuǎn),

MOVC,PANLC,/RB8MOVF0,CMOVC,RB8ANLC,/PORLC,F(xiàn)0JCERROR MOV@R0,A;數(shù)據(jù)正確,存放進(jìn)40H開(kāi)始的單元 INCR0;R0指向下一個(gè)單元 DJNZR7,LOOP;數(shù)據(jù)未接收完,則繼續(xù) RETERROR:…;錯(cuò)誤處理,此處略…RET51(2)C語(yǔ)言程序:分析:為了保持通信的通暢與準(zhǔn)確,通信中做如下約定:

通信開(kāi)始時(shí),甲機(jī)(主機(jī))首先發(fā)送乙機(jī)(從機(jī))的地址0AAH,并且TB8位為1,

乙機(jī)接收后與自己的地址比較,回發(fā)地址0AAH,并將自己的SM2位清0。

甲機(jī)收到0AAH后,說(shuō)明地址發(fā)送正確開(kāi)始發(fā)送16個(gè)字節(jié)的數(shù)據(jù)。數(shù)據(jù)緩沖區(qū)為數(shù)組buf,數(shù)據(jù)發(fā)送完成后發(fā)送校驗(yàn)和的低字節(jié)。

乙機(jī)接收到數(shù)據(jù)后,存入乙機(jī)的緩沖區(qū)buf中,并用接收的數(shù)據(jù)產(chǎn)生校驗(yàn)和與接收的校驗(yàn)和相比較,如相同,乙機(jī)發(fā)送00H,回答接收正確;如不同,則發(fā)送0FFH,請(qǐng)求甲機(jī)重發(fā)。根據(jù)以上約定,利用串行口2的工作方式3,實(shí)現(xiàn)甲機(jī)作主機(jī),乙機(jī)作從機(jī)的通信方式。由于甲、乙兩機(jī)都要發(fā)送和接收信息,所以甲、乙兩機(jī)的串口控制寄存器的S2REN位都應(yīng)該為1,方式控制字都是0D0H。52甲機(jī)的發(fā)送程序:#include〈STC12C5A.h〉unsignedcharidatabuf[16];//定義16字節(jié)的緩沖區(qū)unsignedcharpf;//校驗(yàn)和的低字節(jié)voidmain(){unsignedchari,j;S2CON=0xD8;//串行口2的初始化,S2TB8位為1BRT=0xE8;//獨(dú)立波特率發(fā)生器寄存器裝入初值A(chǔ)UXR=AUXR|0x10;//獨(dú)立波特率發(fā)生器開(kāi)始工作53for(;;){do{S2BUF=0xAA;//發(fā)送乙機(jī)地址do{j=S2CON;}while((j&0x02)!=0x02);//等待發(fā)送完畢S2CON=(S2CON&0xFD);//S2TI位清0do{j=S2CON;}while((j&0x01)!=0x01);//等待接收應(yīng)答信號(hào)S2CON=(S2CON&0xFE);//S2RI位清0}while((S2BUF^0xAA)!=0);//如果地址有誤;繼續(xù)聯(lián)絡(luò)54do{pf=0;//校驗(yàn)和變量賦初值0S2CON=(S2CON&0xF7);//S2TB8位寫(xiě)入0for(i=0;i﹤16;i++)//發(fā)送16個(gè)字節(jié)的數(shù)據(jù){

S2BUF=buf[i];//發(fā)送數(shù)據(jù)pf+=buf[i];//求校驗(yàn)和的低8位字節(jié)do{j=S2CON;}while((j&0x02)!=0x02);//等待發(fā)送完畢S2CON=(S2CON&0xFD);}55S2BUF=pf;//發(fā)送校驗(yàn)和的低8位字節(jié)do{j=S2CON;}while((j&0x02)!=0x02);//等待發(fā)送完畢S2CON=(S2CON&0xFD);//S2TI位清0do{j=S2CON;}while((j&0x01)!=0x01);//等待接收應(yīng)答信號(hào)S2CON=(S2CON&0xFE);//S2RI位清0}while(S2BUF!=0x00)break;//收到正確應(yīng)答,退出循環(huán)}//否則再重發(fā)while(1);}乙機(jī)接收程序:#include〈STC12C5A.h〉unsignedcharidatabuf[16];//定義16字節(jié)的緩沖區(qū)unsignedcharpf;//校驗(yàn)和的低8位字節(jié)voidmain(){unsignedchari,j;BRT=0xE8;//獨(dú)立波特率發(fā)生器寄存器裝入初值A(chǔ)UXR=AUXR|0x10;//波特率發(fā)生器開(kāi)始工作do{

S2CON=0xF0;//串行口2的初始化do{j=S2CON;}while((j&0x01)!=0x01);//等待接收S2CON=(S2CON&0xFE);//S2RI標(biāo)志位清0

}while((S2BUF^0xAA)!=0);//判斷接收到的是否是乙機(jī)地址S2BUF=0xAA;//回送地址do{

j=S2CON;

}

while((j&0x02)!=0x02);//等待發(fā)送完畢S2CON=0xD0;//將S2SM2位清0while(1)

{

pf=0;//校驗(yàn)和變量賦初值為0

for(i=0;i﹤16;i++)//接收16個(gè)字節(jié)的數(shù)據(jù)

{do{j=S2CON;}while((j&0x01)!=0x01);//等待接收

S2CON=(S2CON&0xFE);//將S2RI位清0

buf[i]=S2BUF;//保存接收數(shù)據(jù)

pf+=buf[i];//求校驗(yàn)和的低8位字節(jié)

}do

{

j=S2CON;

}while((j&0x01)!=0x01);//等待接收校驗(yàn)和的低8位S2CON=S2CON&0xFE;if((S2BUF^pf)==0)//比較校驗(yàn)和{

S2BUF=0x00;

do{

j=S2CON;

}

while((j&0x02)!=0x02);//等待發(fā)送完畢

S2CON=(S2CON&0xFD);break;

}else{S2BUF=0xFF;//校驗(yàn)和出錯(cuò),發(fā)送0xFF,重新接收

do{

j=S2CON;

}

while((j&0x02)!=0x02);//等待發(fā)送完畢

S2CON=(S2CON&0xFD);

}}while(1);}618.8RS-232串行標(biāo)準(zhǔn)

在實(shí)際應(yīng)用系統(tǒng)中,通常需要單片機(jī)進(jìn)行數(shù)據(jù)采集,并將采集的數(shù)據(jù)以串行通信方式傳送給計(jì)算機(jī),或計(jì)算機(jī)以串行通信方式向單片機(jī)傳送指令,如掃描儀、打印機(jī)等。因通信時(shí)(傳輸電纜線上有干擾)信號(hào)要衰減,所以常采用RS-232標(biāo)準(zhǔn)接口,拉開(kāi)“0”和“1”的電壓檔次,以免信息出錯(cuò)。數(shù)據(jù)傳輸速率0~20000bpsTTL正邏輯:“0”:0—2.4V;“1”:3.6V—+5V;RS232負(fù)邏輯(EIA電平):“0”:+5V—+15V;“1”:-5V—-15V。最大傳輸信息的長(zhǎng)度為15米。62能夠適應(yīng)RS-232通信協(xié)議的芯片有很多,下面以MAX-232為例介紹各引腳的功能1~6引腳是內(nèi)部電源變換電路部分與外部電容連接端,功能是產(chǎn)生+12V和-12V兩個(gè)電源,提供給RS-232內(nèi)部串行口的電平轉(zhuǎn)換電路單片機(jī)輸出的TTL電平數(shù)據(jù)從T1IN、T2IN輸入,轉(zhuǎn)換成RS-232電平數(shù)據(jù)從T1OUT、T2OUT輸出到總線。

總線上的RS-232電平數(shù)據(jù)從R1IN、R2IN輸入后轉(zhuǎn)換成TTL電平數(shù)據(jù)再?gòu)腞1OUT、R2OUT輸出送給單片機(jī)。

63

完整的RS-232接口由主信道、輔信道共25根連線組成,用25芯插座實(shí)現(xiàn)連接,但在實(shí)際應(yīng)用中有很多信號(hào)線用不到,常采用9芯插座,信號(hào)引腳含義如圖所示。

當(dāng)設(shè)備間進(jìn)行串行通信聯(lián)絡(luò)時(shí),只需要TxD、RxD、GND三根線實(shí)現(xiàn)串行通信,其余的聯(lián)絡(luò)信號(hào)端可以懸空。TxD:串行數(shù)據(jù)發(fā)送引腳,作為輸出RxD:串行數(shù)據(jù)接收引腳,作為輸入GND:接地信號(hào)64RS-232的典型應(yīng)用電路658.9RS-485串行接口RS-232傳輸距離有限,抗干擾性弱。RS-485標(biāo)準(zhǔn)接

口,能夠很好的解決上述問(wèn)題。RS-485采用電流驅(qū)動(dòng),接口處的電平比RS-232電平低,不易損壞接口處芯片,且與TTL電平兼容;傳輸?shù)淖畲笏俾蕿?0Mbps由于采用了差分驅(qū)動(dòng)器,提高了抗干擾能力,傳輸距離可達(dá)1200m。RS232負(fù)邏輯(EIA電平):“0”:+5V—+15V;“1”:-5V—-15V。最大傳輸信息的長(zhǎng)度為15米。RS485差分信號(hào)負(fù)邏輯:“0”:-6V—-2V;“1”:+

2V—+6V。最大傳輸信息的長(zhǎng)度為1200米。66以MAX-485為例介紹其功能RO:接收器的輸出端。若A引腳的電壓大于B引腳的電壓200mV時(shí),RO為高電平,若A引腳的電平小于B引腳的電平200mV時(shí),RO為低電平。/RE:接收器輸出使能端。當(dāng)

為低電平時(shí),RO才有效;當(dāng)

為高電平時(shí),RO處于高阻態(tài)。DI:發(fā)送器輸入端。DE:發(fā)送器輸出使能端。當(dāng)DE為高電平時(shí),可以正常發(fā)送。在接收時(shí),應(yīng)將DE拉低,使DI輸出驅(qū)動(dòng)器的兩輸出端呈現(xiàn)高阻態(tài),不影響接收。A:同向接收器輸入和同向驅(qū)動(dòng)器輸出端。B:反向接收器輸入和反向驅(qū)動(dòng)器輸出端。67在發(fā)送時(shí)應(yīng)將DE拉高,/RE拉低,接收時(shí)應(yīng)將DE、/RE都拉低。RS-485的總線可以采用雙絞線傳輸信號(hào),Rt為終端電阻,可以吸收空間電磁波的干擾,標(biāo)準(zhǔn)值為120Ω。RS-485典型的通信電路如圖所示688.10SPI串行接口概述當(dāng)前有很多類器件(如存儲(chǔ)器、A/D轉(zhuǎn)換器、LCD驅(qū)動(dòng)器等)具有SPI通信接口;STC12C5A60S2等系列單片機(jī)為了滿足與這些類別器件通信的需要,內(nèi)部集成了SPI接口電路;STC12C5A60S2單片機(jī)的SPI接口是一種全雙工同步傳輸?shù)母咚偻ㄐ趴偩€,有主模式和從模式兩種工作方式;被設(shè)置為主模式時(shí),可以提供給從機(jī)的最高時(shí)鐘頻率為fosc/4。698.10.1SPI接口電路STC12C5A60S2單片機(jī)的SPI接口電路如圖所示。MOSI:SPI同步串行接口的主機(jī)的輸出和從機(jī)的輸入引腳,用于實(shí)現(xiàn)主機(jī)到從機(jī)的串行數(shù)據(jù)傳輸。在該線上,從機(jī)需配置為僅為輸入模式,作為傳輸數(shù)據(jù)的入口。根據(jù)SPI通信協(xié)議,主機(jī)在時(shí)鐘信號(hào)的前半周期通過(guò)該線輸出數(shù)據(jù),從機(jī)在時(shí)鐘信號(hào)的控制下獲取數(shù)據(jù)。MISO:SPI同步串行接口的主機(jī)的輸入和從機(jī)的輸出引腳,用于實(shí)現(xiàn)從機(jī)到主機(jī)的數(shù)據(jù)傳輸。在該線上,主機(jī)配置成輸入模式,作為傳輸數(shù)據(jù)的入口。根據(jù)SPI通信協(xié)議,當(dāng)主機(jī)與多個(gè)從機(jī)中的某一從機(jī)通信時(shí),其他從機(jī)總線被禁止,被禁止通信從機(jī)的MISO引腳為高阻狀態(tài)。SCLK:串行時(shí)鐘的輸入、輸出信號(hào)。SCLK時(shí)鐘用以控制主機(jī)和從機(jī)同步的時(shí)鐘信號(hào),控制主機(jī)和從機(jī)之間在MOSI和MISO線上的串行數(shù)據(jù)傳輸。當(dāng)主機(jī)啟動(dòng)一次數(shù)據(jù)傳輸時(shí),自動(dòng)產(chǎn)生8個(gè)SCLK時(shí)鐘周期信號(hào)給從機(jī)。在SCLK的每個(gè)上升沿或下降沿處移出一位數(shù)據(jù)。所以,主機(jī)啟動(dòng)一次可以連續(xù)傳輸一個(gè)字節(jié)的數(shù)據(jù)。

SCLK信號(hào)在主模式時(shí)為輸出,在從模式時(shí)為輸入。/SS:從機(jī)選擇信號(hào)。主機(jī)通過(guò)控制

引腳的電平來(lái)選擇處于多從機(jī)中的某一從機(jī),主機(jī)的

引腳(P1.4)可以作為I/O口使用,在從機(jī)模式下,無(wú)論是發(fā)送還是接收信息,

引腳必須處于低電平。在只有一主一從的情況下,SPI接口可以由3根線構(gòu)成,從機(jī)的/SS

引腳直接接地。708.10.2SPI串行通信的特殊功能寄存器1.控制寄存器SPCTL(字節(jié)地址為0CEH)復(fù)位后的值為00000100B;SSIG:/SS引腳忽略位。SSIG=1時(shí),由MSTR位確定器件是主機(jī)還是從機(jī);SSIG=0時(shí),

/SS引腳與MSTR位共同確定器件是主機(jī)還是從機(jī)。SPEN:SPI串行通信接口使能位。SPEN=1,SPI串行通信功能有效;SPEN=0,SPI通信功能被禁止,此時(shí),所有SPI串行通信引腳都可作為I/O口或其他功能使用。DORD:設(shè)定SPI數(shù)據(jù)發(fā)送和接收的位順序。DORD=1時(shí),數(shù)據(jù)字的最高位(D7)最先發(fā)送及接收;DORD=0時(shí),數(shù)據(jù)字的最低位(D0)最先發(fā)送及接收。MSTR:主/從模式選擇位。該位置1時(shí),被選擇為主機(jī)模式;該位置0時(shí),被選擇為從機(jī)模式。CPOL:SPI時(shí)鐘極性選擇位。該位為1時(shí),SCLK空閑時(shí)為高電平,SCLK的時(shí)鐘前沿為下降沿而后沿為上升沿;該位為0時(shí),SCLK空閑時(shí)為低電平,SCLK的時(shí)鐘前沿為上升沿而后沿為下降沿。CPHA:SPI時(shí)鐘相位的選擇控制位。該位為1時(shí),從機(jī)輸出給主機(jī)的首位數(shù)據(jù)在

引腳的下降沿時(shí)被驅(qū)動(dòng)輸出,主機(jī)輸出給從機(jī)的首位數(shù)據(jù)由寫(xiě)入數(shù)據(jù)寄存器SPDAT的指令控制輸出,在SCLK的時(shí)鐘后沿改變主、從機(jī)的位數(shù)據(jù)輸出,由時(shí)鐘前沿控制采樣輸入;該位為0時(shí),位數(shù)據(jù)在SCLK的時(shí)鐘前沿控制輸出,在時(shí)鐘后沿采樣輸入。在CPHA位為1時(shí),SSIG位必須為0才能有效。SPR1、SPR0:SPI時(shí)鐘速率選擇控制位。718.10.2SPI串行通信的特殊功能寄存器2.狀態(tài)寄存器SPSTAT(字節(jié)地址為0CDH)復(fù)位后的值為00××××××B;SPIF:SPI傳輸完成標(biāo)志位。當(dāng)一個(gè)字節(jié)的數(shù)據(jù)串行輸出完成時(shí),硬件電路將SPIF位置1。此時(shí),如果SPI中斷被允許,則產(chǎn)生中斷。當(dāng)單片機(jī)處于主模式且SSIG=0時(shí),如果/ss引腳出現(xiàn)由高變低的下降沿,硬件也將SPIF位置1,表示模式改變,由主模式強(qiáng)行改變?yōu)閺哪J?。在SPIF標(biāo)志位為1的情況下,只有通過(guò)指令向其寫(xiě)入1才能將其清零。WCOL:SPI寫(xiě)沖突標(biāo)志位。當(dāng)數(shù)據(jù)正在傳輸過(guò)程中,如果又向數(shù)據(jù)寄存器SPDAT執(zhí)行寫(xiě)操作,WCOL位將被置位。只有通過(guò)指令對(duì)WCOL標(biāo)志位寫(xiě)入1才能清零。728.10.2SPI串行通信的特殊功能寄存器3.數(shù)據(jù)寄存器SPDAT(字節(jié)地址為0CFH)復(fù)位后的值為00000000B;SPI串行通信的發(fā)送數(shù)據(jù)寄存器SPDAT與接收數(shù)據(jù)寄存器SPDAT屬于兩個(gè)寄存器,地址都是CFH,通過(guò)讀、寫(xiě)指令加以區(qū)分。4.輔助功能寄存器AUXR1(字節(jié)地址為0A2H)

當(dāng)SPI_P4位為0時(shí),SPI在P1口;當(dāng)SPI_P4位為1時(shí),SPI從P1口切換到P4口:SCLK從P1.7切換到P4.3引腳、MISO從P1.6切換到P4.2引腳、MOSI從P1.5切換到P4.1引腳、

從P1.4切換到P4.0引腳。738.11SPI串行數(shù)據(jù)通信當(dāng)單片機(jī)之間進(jìn)行SPI串行通信時(shí),主機(jī)可以給從機(jī)發(fā)送數(shù)據(jù),從機(jī)也可以給主機(jī)發(fā)送數(shù)據(jù)主機(jī)給從機(jī)發(fā)送數(shù)據(jù)是將發(fā)送數(shù)據(jù)寄存器SPDAT中的數(shù)據(jù)經(jīng)MOSI引腳在SCLK的控制之下,一位一位的移出;而從機(jī)在SCLK的控制之下,將主機(jī)移出的數(shù)據(jù)一位一位的移入從機(jī)的移位數(shù)據(jù)寄存器。從機(jī)的發(fā)送數(shù)據(jù)寄存器中的數(shù)據(jù)在SCLK的控制之下一位一位的從MISO引腳送出,輸入給主機(jī)的移位寄存器。即一個(gè)8位字節(jié)數(shù)據(jù)從輸出引腳移出的同時(shí),另一個(gè)8位字節(jié)數(shù)據(jù)從輸入引腳輸入,一條串行時(shí)鐘線上的時(shí)鐘信號(hào)控制著兩條串行數(shù)據(jù)線上的信息移位與采樣同步進(jìn)行。SPI的核心是一個(gè)8位移位寄存器和數(shù)據(jù)緩沖器,數(shù)據(jù)可以同時(shí)發(fā)送和接收。STC12C5A60S2單片機(jī)之間的SPI接口的數(shù)據(jù)通信方式有3種:?jiǎn)沃鲉螐摹⒒橹鲝?、單主多從?48.11.1單主單從通信方式

在單主單從的通信方式中,主機(jī)將SPCTL寄存器中的SSIG及MSTR位置1,選擇成主機(jī)模式,從機(jī)將SSIG及MSTR位清0,選擇成從機(jī)模式,此時(shí)主機(jī)可使用任何一個(gè)I/O引腳來(lái)控制從機(jī)的

引腳,當(dāng)從機(jī)的

引腳被拉為低電平時(shí),從機(jī)被選中。

單主單從數(shù)據(jù)通信方式的連接如圖所示。當(dāng)主機(jī)向SPDAT寫(xiě)入一個(gè)字節(jié)數(shù)據(jù)時(shí),立即啟動(dòng)一個(gè)連續(xù)的8位字節(jié)數(shù)據(jù)移位通信過(guò)程,即主機(jī)的SCLK向從機(jī)的SCLK的引腳連續(xù)發(fā)出8個(gè)脈沖,在這串脈沖的控制下,寫(xiě)入主機(jī)SPDAT寄存器的數(shù)據(jù)從MOSI引腳移出,發(fā)送到從機(jī)的MOSI引腳,同時(shí)從機(jī)SPDAT寄存器的數(shù)據(jù)從MISO引腳移出發(fā)送到主機(jī)的MISO引腳。當(dāng)傳輸完一個(gè)字節(jié)后,SPI時(shí)鐘發(fā)生器停止,主機(jī)及從機(jī)的輸出完成標(biāo)志位SPIF由硬件自動(dòng)置1并產(chǎn)生中斷請(qǐng)求。通過(guò)字節(jié)指令MOVSPSTAT,#0C0H將SPIF位清0。發(fā)送與接收的過(guò)程都由主機(jī)控制,只有主機(jī)向數(shù)據(jù)寄存器寫(xiě)入數(shù)據(jù),啟動(dòng)主機(jī)發(fā)送過(guò)程的同時(shí),從機(jī)才能實(shí)現(xiàn)向主機(jī)發(fā)送數(shù)據(jù)

758.11.2互為主從通信方式互為主從數(shù)據(jù)通信方式的連接如圖所示。在互為主從的通信方式中,通常情況下,初始化時(shí)甲乙雙方都將各自設(shè)置成忽略

引腳的主模式,即將各自的控制寄存器SPCTL中的MSTR、SPEN位置1,SSIG位清0,P1.4引腳配置為準(zhǔn)雙向(復(fù)位模式)并輸出高電平。在某一時(shí)刻,甲方要向乙方發(fā)送數(shù)據(jù)時(shí),首先檢測(cè)/SS引腳的狀態(tài),如果/SS引腳是高電平,說(shuō)明乙方?jīng)]有行動(dòng),這時(shí)將自己的SSIG位置1,設(shè)置成忽略/SS引腳的主模式,并將/SS引腳拉低,將乙方設(shè)置成從模式,這時(shí)的配置方式已成為單主單從數(shù)據(jù)通信方式。甲機(jī)同乙機(jī)的通信完畢后,甲機(jī)再次將/SS引腳置高,將SSIG位清0,回到初始狀態(tài)。乙機(jī)要發(fā)送數(shù)據(jù)時(shí),可采用同樣的方法將自己設(shè)置成主機(jī)。在SPI被配置為主機(jī)(MSTR=1),并且P1.4引腳配置為輸入且SSIG=0的情況下,只要/SS引腳被拉低,即可實(shí)現(xiàn)模式的轉(zhuǎn)變,成為從機(jī),并將狀態(tài)寄存器SPSTAT中的中斷標(biāo)志位SPIF置1。注意:互為主/從模式時(shí),雙方的SPI通信速率必須相同,使用相同的外部晶體振蕩器。768.11.3單主多從通信方式

在這種方式下,各個(gè)從機(jī)將SSIG位清0,主機(jī)要同某一從機(jī)通信時(shí),只要將對(duì)應(yīng)從機(jī)的/SS引腳拉低,該從機(jī)即被選中。其他從機(jī)的

引腳保持高電平,這時(shí)主機(jī)與該從機(jī)的通信已成為單主單從的通信。通信完畢,再將該從機(jī)的/SS引腳置高。778.11.4SPI通信的具體過(guò)程

在以上SPI的三種通信方式中,/SS引腳的使用在主模式和從模式下是有區(qū)別的。

對(duì)于主模式來(lái)說(shuō),當(dāng)發(fā)送一字節(jié)數(shù)據(jù)時(shí),只需將數(shù)據(jù)寫(xiě)到SPDAT寄存器中,即可啟動(dòng)發(fā)送過(guò)程,此時(shí)/SS信號(hào)不是必需的,可作任何的I/O口使用。

在從模式下,/SS引腳必須在被主機(jī)驅(qū)動(dòng)為低電平的情況下,才可進(jìn)行數(shù)據(jù)傳輸,/SS引腳變?yōu)楦唠娖綍r(shí),表示通信結(jié)束。788.11.4SPI通信的具體過(guò)程

STC12C5A60S2單片機(jī)的SPI串行通信接口的模式配置,由SPEN、SSIG、MSTR位和

/SS引腳的狀態(tài)共同決定。

主/從模式的配置及使用如表8-4所示。798.11.4SPI通信的具體過(guò)程在SPI數(shù)據(jù)通信的過(guò)程中,應(yīng)明確以下兩個(gè)問(wèn)題:

(1)在SPI串行數(shù)據(jù)通信過(guò)程中,傳輸總是由主機(jī)啟動(dòng)。主機(jī)向數(shù)據(jù)寄存器SPDAT執(zhí)行一次寫(xiě)操作,將啟動(dòng)SPI時(shí)鐘發(fā)生器和數(shù)據(jù)的傳輸。(2)SPI串行通信接口在發(fā)送數(shù)據(jù)時(shí)為單緩沖,接收數(shù)據(jù)時(shí)為雙緩沖。在上一次數(shù)據(jù)尚未發(fā)送完成前,不能將新的數(shù)據(jù)寫(xiě)入移位寄存器。在發(fā)送過(guò)程中若對(duì)SPDAT進(jìn)行寫(xiě)操作時(shí),SPSTAT寄存器中的寫(xiě)沖突標(biāo)志位WCOL置1,以表明此時(shí)數(shù)據(jù)沖突。在這種情況下,當(dāng)前發(fā)送的數(shù)據(jù)將繼續(xù)發(fā)送,而新寫(xiě)入的數(shù)據(jù)將丟失。接收到一個(gè)字節(jié)的數(shù)據(jù)后,將其保存到SPDAT,此時(shí)將釋放移位寄存器并繼續(xù)進(jìn)行下一個(gè)數(shù)據(jù)的接收,但必須在下個(gè)字節(jié)數(shù)據(jù)完全移入之前,將接收的數(shù)據(jù)從數(shù)據(jù)寄存器中讀取,否則,前一次接收的數(shù)據(jù)將被覆蓋。808.11.5SPI通信時(shí)序各種外部設(shè)備的SPI通信協(xié)議是不完全相同的;

STC12C5A60S2單片機(jī)為了能夠適應(yīng)各種外部設(shè)備SPI通信的要求,設(shè)定了多種通信協(xié)議;SPI總線數(shù)據(jù)傳輸時(shí)序(CPHA=0)818.11.5SPI通信時(shí)序SPI總線數(shù)據(jù)傳輸時(shí)序(CPHA=1)828.12

SPI接口的應(yīng)用SPI串行通信初始化主要分為以下幾個(gè)步驟:(1)設(shè)置SPI的控制寄存器SPCTL:/SS引腳的控制、SPI使能位、數(shù)據(jù)傳送的位順序、主/從模式的設(shè)置、SPI時(shí)鐘極性、SPI時(shí)鐘相位、SPI時(shí)鐘速率的選擇;(2)對(duì)SPI的狀態(tài)寄存器SPSTAT寫(xiě)入0C0H,使SPIF和WCOL標(biāo)志位清0;(3)根據(jù)需要確定開(kāi)放總中斷EA,開(kāi)放SPI中斷ESPI。83【例8-4】假設(shè)系統(tǒng)的時(shí)鐘頻率為12MHz,利用STC12C5A60S2單片機(jī)的SPI接口功能從溫度傳感器ADT7301中讀取溫度數(shù)據(jù)存入片內(nèi)RAM30H、31H單元中,接口電路如圖8-24所示。84

ADT7301是AD公司生產(chǎn)的13位數(shù)字溫度傳感器芯片,采用+2.7V-+5.5V的電源供電,在芯片內(nèi)部集成了一個(gè)用于溫度檢測(cè)的帶隙溫度傳感器和一個(gè)13位AD轉(zhuǎn)換器,14位溫度值寄存器,其最小溫度分辨率為0.03125℃,具有SPI串行通信接口。ADT7301內(nèi)部集成有振蕩器,不需要再提供A/D轉(zhuǎn)換時(shí)鐘。該芯片具有兩種工作模式,即正常工作模式和節(jié)電工作模式。在正常作模式,芯片每秒鐘自動(dòng)進(jìn)行一次溫度轉(zhuǎn)換。完成一次溫度轉(zhuǎn)換一般需800μs。因此,溫度值寄存器中的溫度數(shù)據(jù)每秒刷新一次。在節(jié)電模式下,片內(nèi)振蕩器被關(guān)閉,ADT7301不進(jìn)行溫度轉(zhuǎn)換,直到恢復(fù)正常模式。

向ADT7301寫(xiě)入數(shù)據(jù)時(shí),只能寫(xiě)入0000H或2000H。寫(xiě)入0000H后ADT7301進(jìn)入正常工作模式,寫(xiě)入2000H后進(jìn)入節(jié)電工作模式。在向ADT7301寫(xiě)入數(shù)據(jù)的同時(shí),該芯片輸出在此之前已轉(zhuǎn)換完成的溫度值,并且每次寫(xiě)入數(shù)據(jù),都啟動(dòng)一次溫度轉(zhuǎn)換。85對(duì)ADT7301的讀寫(xiě)操作是同步進(jìn)行的,ADT7301的通信時(shí)序如上圖所示。若在ADT7301溫度轉(zhuǎn)換過(guò)程中執(zhí)行讀寫(xiě)操作,則會(huì)使其自動(dòng)停止轉(zhuǎn)換,并在串行通信結(jié)束后又重新開(kāi)始,而讀取的溫度值是前一次的轉(zhuǎn)換結(jié)果。

溫度值寄存器用于存儲(chǔ)ADC的13位二進(jìn)制補(bǔ)碼及1位符號(hào)位的溫度轉(zhuǎn)換結(jié)果(最高位為符號(hào)位),溫度轉(zhuǎn)換公式如下:正溫度值=ADC轉(zhuǎn)換的結(jié)果/32;負(fù)溫度值=(ADC轉(zhuǎn)換的結(jié)果(包括符號(hào)位)-16384)/32;

負(fù)溫度值=(ADC轉(zhuǎn)換的結(jié)果(不包括符號(hào)位)-8192)/32;86溫度值(℃)

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論