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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1

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

方式2與方式3唯一的區別在于方式2的波特率是固定的,而方式3的波特率與波特率發生器有關

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

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

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

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

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

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

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

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

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

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

當并行輸入允許引腳輸入為低時,從D0至D7引腳并行輸入的數據被輸入到內部移位寄存器內,

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

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

50;P與RB8位異或,出錯時跳轉,

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

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

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

甲機收到0AAH后,說明地址發送正確開始發送16個字節的數據。數據緩沖區為數組buf,數據發送完成后發送校驗和的低字節。

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

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

{

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

for(i=0;i﹤16;i++)//接收16個字節的數據

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

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

buf[i]=S2BUF;//保存接收數據

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

}do

{

j=S2CON;

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

S2BUF=0x00;

do{

j=S2CON;

}

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

S2CON=(S2CON&0xFD);break;

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

do{

j=S2CON;

}

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

S2CON=(S2CON&0xFD);

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

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

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

63

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

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

口,能夠很好的解決上述問題。RS-485采用電流驅動,接口處的電平比RS-232電平低,不易損壞接口處芯片,且與TTL電平兼容;傳輸的最大速率為10Mbps由于采用了差分驅動器,提高了抗干擾能力,傳輸距離可達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處于高阻態。DI:發送器輸入端。DE:發送器輸出使能端。當DE為高電平時,可以正常發送。在接收時,應將DE拉低,使DI輸出驅動器的兩輸出端呈現高阻態,不影響接收。A:同向接收器輸入和同向驅動器輸出端。B:反向接收器輸入和反向驅動器輸出端。67在發送時應將DE拉高,/RE拉低,接收時應將DE、/RE都拉低。RS-485的總線可以采用雙絞線傳輸信號,Rt為終端電阻,可以吸收空間電磁波的干擾,標準值為120Ω。RS-485典型的通信電路如圖所示688.10SPI串行接口概述當前有很多類器件(如存儲器、A/D轉換器、LCD驅動器等)具有SPI通信接口;STC12C5A60S2等系列單片機為了滿足與這些類別器件通信的需要,內部集成了SPI接口電路;STC12C5A60S2單片機的SPI接口是一種全雙工同步傳輸的高速通信總線,有主模式和從模式兩種工作方式;被設置為主模式時,可以提供給從機的最高時鐘頻率為fosc/4。698.10.1SPI接口電路STC12C5A60S2單片機的SPI接口電路如圖所示。MOSI:SPI同步串行接口的主機的輸出和從機的輸入引腳,用于實現主機到從機的串行數據傳輸。在該線上,從機需配置為僅為輸入模式,作為傳輸數據的入口。根據SPI通信協議,主機在時鐘信號的前半周期通過該線輸出數據,從機在時鐘信號的控制下獲取數據。MISO:SPI同步串行接口的主機的輸入和從機的輸出引腳,用于實現從機到主機的數據傳輸。在該線上,主機配置成輸入模式,作為傳輸數據的入口。根據SPI通信協議,當主機與多個從機中的某一從機通信時,其他從機總線被禁止,被禁止通信從機的MISO引腳為高阻狀態。SCLK:串行時鐘的輸入、輸出信號。SCLK時鐘用以控制主機和從機同步的時鐘信號,控制主機和從機之間在MOSI和MISO線上的串行數據傳輸。當主機啟動一次數據傳輸時,自動產生8個SCLK時鐘周期信號給從機。在SCLK的每個上升沿或下降沿處移出一位數據。所以,主機啟動一次可以連續傳輸一個字節的數據。

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

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

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

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

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

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

引腳的下降沿時被驅動輸出,主機輸出給從機的首位數據由寫入數據寄存器SPDAT的指令控制輸出,在SCLK的時鐘后沿改變主、從機的位數據輸出,由時鐘前沿控制采樣輸入;該位為0時,位數據在SCLK的時鐘前沿控制輸出,在時鐘后沿采樣輸入。在CPHA位為1時,SSIG位必須為0才能有效。SPR1、SPR0:SPI時鐘速率選擇控制位。718.10.2SPI串行通信的特殊功能寄存器2.狀態寄存器SPSTAT(字節地址為0CDH)復位后的值為00××××××B;SPIF:SPI傳輸完成標志位。當一個字節的數據串行輸出完成時,硬件電路將SPIF位置1。此時,如果SPI中斷被允許,則產生中斷。當單片機處于主模式且SSIG=0時,如果/ss引腳出現由高變低的下降沿,硬件也將SPIF位置1,表示模式改變,由主模式強行改變為從模式。在SPIF標志位為1的情況下,只有通過指令向其寫入1才能將其清零。WCOL:SPI寫沖突標志位。當數據正在傳輸過程中,如果又向數據寄存器SPDAT執行寫操作,WCOL位將被置位。只有通過指令對WCOL標志位寫入1才能清零。728.10.2SPI串行通信的特殊功能寄存器3.數據寄存器SPDAT(字節地址為0CFH)復位后的值為00000000B;SPI串行通信的發送數據寄存器SPDAT與接收數據寄存器SPDAT屬于兩個寄存器,地址都是CFH,通過讀、寫指令加以區分。4.輔助功能寄存器AUXR1(字節地址為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串行數據通信當單片機之間進行SPI串行通信時,主機可以給從機發送數據,從機也可以給主機發送數據主機給從機發送數據是將發送數據寄存器SPDAT中的數據經MOSI引腳在SCLK的控制之下,一位一位的移出;而從機在SCLK的控制之下,將主機移出的數據一位一位的移入從機的移位數據寄存器。從機的發送數據寄存器中的數據在SCLK的控制之下一位一位的從MISO引腳送出,輸入給主機的移位寄存器。即一個8位字節數據從輸出引腳移出的同時,另一個8位字節數據從輸入引腳輸入,一條串行時鐘線上的時鐘信號控制著兩條串行數據線上的信息移位與采樣同步進行。SPI的核心是一個8位移位寄存器和數據緩沖器,數據可以同時發送和接收。STC12C5A60S2單片機之間的SPI接口的數據通信方式有3種:單主單從、互為主從、單主多從。748.11.1單主單從通信方式

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

引腳,當從機的

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

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

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

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

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

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

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

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

在從模式下,/SS引腳必須在被主機驅動為低電平的情況下,才可進行數據傳輸,/SS引腳變為高電平時,表示通信結束。788.11.4SPI通信的具體過程

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

/SS引腳的狀態共同決定。

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

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

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論