單片機原理及應(yīng)用-基于匯編、C51及混合編程第8章串行口通信_第1頁
單片機原理及應(yīng)用-基于匯編、C51及混合編程第8章串行口通信_第2頁
單片機原理及應(yīng)用-基于匯編、C51及混合編程第8章串行口通信_第3頁
單片機原理及應(yīng)用-基于匯編、C51及混合編程第8章串行口通信_第4頁
單片機原理及應(yīng)用-基于匯編、C51及混合編程第8章串行口通信_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

而當為高時,并行輸入禁止,移位寄存器的數(shù)據(jù)在CP引腳輸入的時鐘脈沖上升沿的控制下,向右移動一位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;清除中斷標志RISETBREN;允許接收LOOP:JNBRI,LOOP;等待CLRRIMOVA,SBUF45(2)C語言程序#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;//清除接收中斷標志RIREN=1;//允許接收while(!RI);//等待接收數(shù)據(jù)RI=0;//清除接收中斷標志RItemp=SBUF;//讀入數(shù)據(jù)while(1);}46【例8-3】在圖8-10所示的甲、乙兩機間的串行通信中,單片機系統(tǒng)的時鐘頻率為11.0592MHz,要求波特率為1200bps,編程實現(xiàn)將甲機片內(nèi)的30H-3FH單元的數(shù)據(jù)傳送到乙機片內(nèi)40H-4FH單元中。(1)匯編子程序:分析:甲、乙兩機都選擇串行口1工作在方式3,9位異步通信方式,TB8用作奇偶校驗位,甲機串口控制寄存器SCON的初值為0C0H,乙機的控制字0D0H。D7D6D5D4D3D2D1D0SM0/FESM1SM2RENTB8RB8TIRI47【例8-3】在圖8-10所示的甲、乙兩機間的串行通信中,單片機系統(tǒng)的時鐘頻率為11.0592MHz,要求波特率為1200bps,編程實現(xiàn)將甲機片內(nèi)的30H-3FH單元的數(shù)據(jù)傳送到乙機片內(nèi)40H-4FH單元中。(1)匯編子程序:分析:甲、乙兩機都選擇串行口1工作在方式3,9位異步通信方式,TB8用作奇偶校驗位,甲機串口控制寄存器SCON的初值為0C0H,乙機的控制字0D0H。定時/計數(shù)器T1工作在方式2作為波特率發(fā)生器,TMOD為20H;波特率=2SMOD[(定時/計數(shù)器T1的溢出率)/32],T1的溢出率=(波特率×32)/2SMOD,T1的重裝初值=256-(fosc/12)/T1的溢出率=256-(fosc/12)×2SMOD/(波特率×32)=256-(11059200/12)/(1200×32)=232=E8H甲機的發(fā)送子程序:48TRA_UART:MOVTMOD,#20H;T1工作在方式2ANLAUXR,#0BFH;T1計數(shù)工作在系統(tǒng)時鐘的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ā)送計數(shù)器

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

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

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

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

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

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

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

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

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

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

j=S2CON;

}

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

{

pf=0;//校驗和變量賦初值為0

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

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

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

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

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

}do

{

j=S2CON;

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

S2BUF=0x00;

do{

j=S2CON;

}

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

S2CON=(S2CON&0xFD);break;

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

do{

j=S2CON;

}

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

S2CON=(S2CON&0xFD);

}}while(1);}618.8RS-232串行標準

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

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

63

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

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

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

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

為低電平時,RO才有效;當

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

SCLK信號在主模式時為輸出,在從模式時為輸入。/SS:從機選擇信號。主機通過控制

引腳的電平來選擇處于多從機中的某一從機,主機的

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

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

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

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

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

當SPI_P4位為0時,SPI在P1口;當SPI_P4位為1時,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ù)通信當單片機之間進行SPI串行通信時,主機可以給從機發(fā)送數(shù)據(jù),從機也可以給主機發(fā)送數(shù)據(jù)主機給從機發(fā)送數(shù)據(jù)是將發(fā)送數(shù)據(jù)寄存器SPDAT中的數(shù)據(jù)經(jīng)MOSI引腳在SCLK的控制之下,一位一位的移出;而從機在SCLK的控制之下,將主機移出的數(shù)據(jù)一位一位的移入從機的移位數(shù)據(jù)寄存器。從機的發(fā)送數(shù)據(jù)寄存器中的數(shù)據(jù)在SCLK的控制之下一位一位的從MISO引腳送出,輸入給主機的移位寄存器。即一個8位字節(jié)數(shù)據(jù)從輸出引腳移出的同時,另一個8位字節(jié)數(shù)據(jù)從輸入引腳輸入,一條串行時鐘線上的時鐘信號控制著兩條串行數(shù)據(jù)線上的信息移位與采樣同步進行。SPI的核心是一個8位移位寄存器和數(shù)據(jù)緩沖器,數(shù)據(jù)可以同時發(fā)送和接收。STC12C5A60S2單片機之間的SPI接口的數(shù)據(jù)通信方式有3種:單主單從、互為主從、單主多從。748.11.1單主單從通信方式

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

引腳,當從機的

引腳被拉為低電平時,從機被選中。

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

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

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

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

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

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

對于主模式來說,當發(fā)送一字節(jié)數(shù)據(jù)時,只需將數(shù)據(jù)寫到SPDAT寄存器中,即可啟動發(fā)送過程,此時/SS信號不是必需的,可作任何的I/O口使用。

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論