【教學(xué)】第八章 8051內(nèi)部資源的C編程_第1頁
【教學(xué)】第八章 8051內(nèi)部資源的C編程_第2頁
【教學(xué)】第八章 8051內(nèi)部資源的C編程_第3頁
【教學(xué)】第八章 8051內(nèi)部資源的C編程_第4頁
【教學(xué)】第八章 8051內(nèi)部資源的C編程_第5頁
已閱讀5頁,還剩75頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第八章8051內(nèi)部資源的C編程.8.1 中斷8.2 定時器/計數(shù)器8.3 串行口.8.1 中斷中斷的基本概念所謂中斷是指CPU對系統(tǒng)中或系統(tǒng)外發(fā)生的某個事件的一種響應(yīng)過程,即CPU暫時停止現(xiàn)行程序的執(zhí)行,而自動轉(zhuǎn)去執(zhí)行預(yù)先安排好的處理該事件的服務(wù)子程序。當(dāng)處理結(jié)束后,再返回到被暫停程序的斷點處,繼續(xù)執(zhí)行原來的程序。實現(xiàn)這種中斷功能的硬件系統(tǒng)和軟件系統(tǒng)稱為中斷系統(tǒng)。.8.1.1中斷源1、8051中斷源中斷源說明

外部中斷0由P3.2腳輸入,低電平/負跳變觸發(fā)外部中斷1由P3.3腳輸入,低電平/負跳變觸發(fā)定時器/計數(shù)器0中斷定時器T0溢出觸發(fā)定時器/計數(shù)器1中斷定時器T1溢出觸發(fā)串行口中斷接收或發(fā)送一幀數(shù)據(jù)觸發(fā)

.2、定時器/計數(shù)器控制寄存器(TCON)TCONIT0IE0IT1IE1TR0TF0TR1TF1D7D6D5D4D3D2D1D0字節(jié)地址98HIT0(IT1):外部中斷0(或1)觸發(fā)方式控制位。IT0(或IT1)被設(shè)置為0,則選擇外部中斷為電平觸發(fā)方式;IT0(或IT1)被設(shè)置為1,則選擇外部中斷為邊沿觸發(fā)方式。電平觸發(fā)方式:

CPU在每個機器周期的S5P2采樣INTx引腳,若INTx引腳為低電平,將直接觸發(fā)外部中斷。邊沿觸發(fā)方式:若第一個機器周期采樣到INTx引腳為高電平,第二個機器周期采樣到INTx引腳為低電平時,向CPU請求中斷。.IE0(IE1):外部中斷0(或1)的中斷請求標志位。當(dāng)CPU響應(yīng)中斷轉(zhuǎn)向中斷服務(wù)程序時由硬件將IE0(或IE1)清零。TCONIT0IE0IT1IE1TR0TF0TR1TF1D7D6D5D4D3D2D1D0字節(jié)地址98HTF0(TF1):定時器中斷0(或1)的中斷請求標志位。當(dāng)CPU響應(yīng)中斷轉(zhuǎn)向中斷服務(wù)程序時由硬件將TF0(或TF1)清零。.3、串行口控制寄存器(SCON)

SM0SM1SM2RENTB8RB8TIR1SCONRI,TI:串行口收/發(fā)數(shù)據(jù)申請中斷標志位 =1申請中斷; =0不申請中斷.8.1.2中斷的控制1、中斷允許寄存器(IE)MCS-51單片機中沒有專設(shè)的開中斷和關(guān)中斷指令,對各中斷源的中斷開放或關(guān)閉是由內(nèi)部的中斷允許寄存器IE的各位來控制的。EX0ET0EX1ET1ESEAD7D6D5D4D3D2D1D0IE字節(jié)地址A8HEA:中斷允許總控位。

EA=0,屏蔽所有的中斷請求;

EA=1,開放中斷。

EA的作用是使中斷允許形成兩級控制。即各中斷源首先受EA位的控制;其次還要受各中斷源自己的中斷允許總控位控制。.EX0ET0EX1ET1ESEAD7D6D5D4D3D2D1D0IE字節(jié)地址A8H

ET1:定時器/計數(shù)器T1的溢出中斷允許位。 ET1=0禁止T1中斷; ET1=1允許T1中斷。ES:串行口中斷允許位。 ES=0禁止串行口中斷; ES=1允許串行口中斷。EX1:外部中斷1中斷允許位。 EX1=0禁止外部中斷1中斷; EX1=1允許外部中斷1中斷。.2、中斷優(yōu)先級寄存器(IP)MCS-51單片機的中斷源有兩個用戶可控的中斷優(yōu)先級,從而可實現(xiàn)二級中斷嵌套。中斷系統(tǒng)遵循如下三條規(guī)則:(1)正在進行的中斷過程不能被新的同級或低優(yōu)先級的中斷請求所中斷,一直到該中斷服務(wù)程序結(jié)束,返回了主程序且執(zhí)行了主程序中的一條指令后,CPU才響應(yīng)新的中斷請求。(2)正在進行的低優(yōu)先級中斷服務(wù)程序能被高優(yōu)先級中斷請求所中斷,實現(xiàn)兩級中斷嵌套。(3)CPU同時接收到幾個中斷請求時,首先響應(yīng)優(yōu)先級最高的中斷請求。.PT2PSPT1PX1PT0PX0D7D6D5D4D3D2D1D0IP字節(jié)地址B8HPT2:定時器/計數(shù)器T2的中斷優(yōu)先級控制位,只用于52子系列。PS:串行口的中斷優(yōu)先級控制位。PT1:定時器/計數(shù)器T1的中斷優(yōu)先級控制位。PX1:外部中斷1的中斷優(yōu)先級控制位。PT0:定時器/計數(shù)器T0的中斷優(yōu)先級控制位。PX0:外部中斷0的中斷優(yōu)先級控制位。.表8.2中斷優(yōu)先級中斷源同級的中斷優(yōu)先級

外部中斷0定時器/計數(shù)器0中斷外部中斷1定時器/計數(shù)器1中斷串行口中斷定時器/計數(shù)器2中斷最高

最低..8.1.3中斷響應(yīng)

單片機響應(yīng)中斷的條件為中斷源有請求(中斷允許寄存器IE相應(yīng)位置1),且CPU開中斷(即EA=1)。這樣,在每個機器周期的S5P2期間,對所有中斷源按用戶設(shè)置的優(yōu)先級和內(nèi)部規(guī)定的優(yōu)先級進行順序檢測,并可在S6期間找到所有有效的中斷請求。如有中斷請求,且滿足下列條件,則在下一個機器周期的S1期間響應(yīng)中斷,否則將丟棄中斷采樣的結(jié)果。(1)無同級或高級中斷正在處理。(2)現(xiàn)行指令執(zhí)行到最后1個機器周期且已結(jié)束。(3)若現(xiàn)行指令為RETI或訪問IE、IP的指令時,執(zhí)行完該指令且緊隨其后的另一條指令也已執(zhí)行完畢。1.中斷響應(yīng)的條件.

CPU響應(yīng)中斷后,由硬件自動執(zhí)行如下的功能操作:(1)根據(jù)中斷請求源的優(yōu)先級高低,對相應(yīng)的優(yōu)先級狀態(tài)觸發(fā)器置1。(2)保護斷點,即把程序計數(shù)器PC的內(nèi)容壓入堆棧保存。(3)清內(nèi)部硬件可清除的中斷請求標志位(IE0、IE1、TF0、TF1)。(4)把被響應(yīng)的中斷服務(wù)程序入口地址送入PC,從而轉(zhuǎn)入相應(yīng)的中斷服務(wù)程序執(zhí)行。各中斷服務(wù)程序的入口地址見表。2.中斷響應(yīng)過程.中斷服務(wù)程序入口地址表編號中斷源入口地址0外部中斷00003H1定時器/計數(shù)器0000BH2外部中斷10013H3定時器/計數(shù)器1001BH4串行口中斷0023H.中斷服務(wù)程序的函數(shù)定義的語法格式如下:

void函數(shù)名()interruptm[usingn]{

}3.中斷服務(wù)程序C51編譯器支持在C源程序中直接開發(fā)中斷程序。中斷服務(wù)程序是通過按規(guī)定語法格式定義的一個函數(shù)。interrupt屬性的參數(shù)為0到31的整常數(shù)值。帶操作數(shù)的表達式在函數(shù)原型中是不允許的。.interrupt屬性影響如下函數(shù)的目標代碼特殊功能寄存器ACCBDPHDPL和PSW的內(nèi)容需要時在函數(shù)調(diào)用時保存在堆棧中。在中斷函數(shù)中所用的寄存器如果不用using屬性指定一個寄存器組就保存在堆棧中。保存在堆棧中的寄存器和SFR在退出函數(shù)前恢復(fù)。函數(shù)由指令RETI終止。另外Cx51編譯器自動產(chǎn)生中斷矢量。.linelevel source 1 externbitalarm; 2 intalarm_count; 3 4 5 voidfalarm(void)interrupt1using3 {6 1 alarm_count*=2; 7 1 alarm=1; 8 1 } 下面的例子程序說明了如何使用interrupt屬性。程序同時顯示進入和退出中斷函數(shù)的代碼。using函數(shù)屬性用來選擇和非中斷程序不同的寄存器組。.ASSEMBLYLISTINGOFGENERATEDOBJECTCODE

0000C0E0 PUSH ACC 0002C0D0 PUSH PSW

;SOURCELINE#5 ;SOURCELINE#6 0004E500 R MOV A,alarm_count+01H 000625E0 ADD A,ACC 0008F500 R MOV alarm_count+01H,A 000AE500 R MOV A,alarm_count 000C33 RLC A 000DF500 R MOV alarm_count,A ;SOURCELINE#7 000FD200 E SETB alarm ;SOURCELINE#8 0011D0D0 POP PSW 0013D0E0 POP ACC 001532 RETI 但是因為在本函數(shù)中不需要工作寄存器為切換寄存器組而產(chǎn)生的代碼被優(yōu)化排除了。.4.中斷服務(wù)函數(shù)應(yīng)用注意

中斷函數(shù)沒有函數(shù)參數(shù)。如果中斷函數(shù)聲明中帶參數(shù),編譯器就產(chǎn)生錯誤信息。

中斷函數(shù)聲明不能包含返回值,必須聲明為VOID

。如果定義了一個返回值,編譯器就產(chǎn)生一個錯誤。暗含的int

返回值被編譯器忽略。

編譯器不允許直接的對中斷函數(shù)的調(diào)用。對中斷函數(shù)的直接調(diào)用是無意義的。

編譯器對每個中斷函數(shù)產(chǎn)生一個中斷矢量。矢量的代碼是跳轉(zhuǎn)到中斷函數(shù)的起始

從一個中斷程序中調(diào)用函數(shù)必須和中斷使用相同的寄存器組。.8.1.5中斷編程圖所示是利用優(yōu)先權(quán)解碼芯片,在單片機8031的一個外部中斷INT1上擴展多個中斷源的原理電路圖。.#include<reg51.h>unsignedcharstatus;bitflag;voidservice_int1()interrupt2using2/*INT1中斷服務(wù)程序*/{flag=1; /*設(shè)置標志*/status=p1; /*存輸入口狀態(tài)*/}

在中斷服務(wù)程序中僅設(shè)置標志,并保存I/O口輸入狀態(tài)。.voidmain(void){IP=0x04; /*置INT1為高優(yōu)先級中斷,等價PX1=1*/IE=-0x84; /*INT1開中斷,CPU開中斷

等價EA=1,EX1=1*/

for(;;) {if(flag) /*有中斷*/ {switch(status) /*根據(jù)中斷源分支*/ {case0:break; /*處理IN0*/ case1:break; /*處理IN1*/ case2:break; /*處理IN2*/ case3:break; /*處理IN3*/ default:; } flag=0; /*處理完成清標志*/ }}}.8.2 定時器/計數(shù)器

2個16位定時器/計數(shù)器定時器:對片內(nèi)機器時鐘(周期方波)進行計數(shù)計數(shù)器:對Tx引腳輸入的負脈沖進行計數(shù)

與Timer工作有關(guān)的特殊功能寄存器:

TCON、TMOD、THx

和TLx8.2.0定時器概述

TIMER的作用:定時操作:定時采樣,定時掃描,定時中斷測量外部信號:累加統(tǒng)計,測量周期等定時輸出:PWM等監(jiān)視系統(tǒng)正常工作與否.

定時器的一般結(jié)構(gòu)和工作原理+1計數(shù)器溢出中斷脈沖控制開關(guān)

實質(zhì)是計數(shù)器,脈沖每一次下降沿,計數(shù)寄存器數(shù)值將加1.計數(shù)的脈沖如果來源于單片機內(nèi)部的晶振,由于其周期極為準確,這時稱為定時器。計數(shù)的脈沖如果來源于單片機外部的引腳,由于其周期一般不確定,可表示事件發(fā)生,這時稱為計數(shù)器。.1、計數(shù)寄存器TH與TL2、定時器控制寄存器TCON

(88H)

TF1TR1TF0TR0IE1IT1IE0IT0TRx:Timer0/1運行控制位。

=1啟動計數(shù);=0停止計數(shù)8.2.1與定時器有關(guān)的特殊功能寄存器.TF1TR1TF0TR0IE1IT1IE0IT0TFx:

Timer0/1計數(shù)溢出標志位。

=1計數(shù)溢出; =0計數(shù)未滿

TFx標志位可用于申請中斷或供CPU查詢。

在進入中斷服務(wù)程序時會自動清零;但在查詢方式時必須軟件清零。定時器T0/T1中斷申請過程

在已經(jīng)開放T0/T1中斷允許且已被啟動的前提下:T0/T1加滿溢出時TF0/TF1標志位自動置“1”

檢測到TCON中TF0/TF1變“1”后,將產(chǎn)生指令:

LCALL000BH/LCALL001BH

執(zhí)行中斷服務(wù)程序,TF0/TF1標志位會自動清“0”,以備下次中斷申請。

.3、定時器方式寄存器TMOD(89H)GATEC/TM1M0GATEC/TM1M0T1T0C/T:計數(shù)器/定時器選擇位

=1

外部事件計數(shù)器。對Tx引腳的脈沖計數(shù);=0片內(nèi)時鐘定時器。對機器周期脈沖計數(shù)定時.GATE門控位:

Timer可由軟件與硬件兩者控制

GATE=0——普通用法Timer的啟/停由軟件對TRx位寫“1”/“0”控制

GATE=1——門控用法

Timer的啟/停由軟件對TRx位寫“1”/“0”

和在INTx引腳上出現(xiàn)的信號的高/低共同控制

(INTx引腳高電平允許定時/計數(shù))GATEC/TM1M0GATEC/TM1M0T1T0.GATEC/TM1M0GATEC/TM1M0T1T0M1,M0:工作方式定義位(定義4種方式):00:13位Timer01:16位Timer——經(jīng)常用到。10:可自動重裝的8位Timer——經(jīng)常用到。11:T0分為2個8位Timer;T1此時不工.4、定時器/計數(shù)器2控制寄存器TMOD(89H)

TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2T2CONAddress=0C8HResetValue=00000000BTF2:溢出標志位,必須由軟件清零。EXF2:外部標志,當(dāng)EXEN2=1,且當(dāng)T2EX引腳上出現(xiàn)負跳變而出現(xiàn)捕獲或重裝時,EXF2置位,申請中斷。EXF2必須由軟件清零。RCLK:接收時鐘標志。 1——用定時器2溢出作為串行口的接收時鐘; 0——用定時器1溢出作為串行口的接收時鐘。TCLK:發(fā)送時鐘標志。 1——用定時器2溢出作為串行口的發(fā)送時鐘; 0——用定時器1溢出作為串行口的發(fā)送時鐘。.TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2EXEN2:定時器2外部允許標志。 1——若定時器2未作串行口波特率發(fā)生器,則T2EX端的負跳變引起定時器2的捕獲或重裝。 0——T2EX端的外部信號不起作用。TR2:定時器2運行控制位。 1——啟動。 0——停止。C/T2:計數(shù)器/定時器選擇位。 1——計數(shù)器。 0——定時器。.CP/RL2:捕獲/重裝標志。 1——當(dāng)EXEN2=1,且T2EX端的信號負跳變時,發(fā)生捕獲操作。 0——當(dāng)定時器2溢出,或在EXEN2=1條件下T2EX端的信號負跳變時,發(fā)生自動重裝操作。TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2.1、工作方式1:——16位的定時/計數(shù)器振蕩器12TLx

THx(8位)(8位)TFx申請中斷Tx端TRx位GATE位INTx端≥1&C/T=0C/T=1控制=1開關(guān)接通或門與門最大計數(shù)脈沖個數(shù):65536(216)8.2.2定時器/計數(shù)器的工作方式.

THx/TLx賦初值:THx賦高8位,TLx賦低8位工作方式1的編程要點:

TMOD選方式:寫“M1,M0”=01b選方式1若不用門控位,直接用軟件寫TRx控制啟/停若使用門控位,先置位TRx,然后由INTx端的高/低電平來控制其啟/停若要允許中斷,還須先置位ETx、EA等中斷允許控制位,并編寫中斷服務(wù)程序若不用中斷,可查詢“計數(shù)溢出標志TFx”的方式工作,但溢出標志TFx須軟件清0.定時器的計數(shù)單元每個機器周期自動加1直到溢出

T=(12/fosc)*(2^16-a)us方式1:定時初值/定時時間計算.2、工作方式2:——8位自動重裝的定時/計數(shù)器振蕩器12TLx(8位)TFx申請中斷Tx端TRx位GATE位INTx端≥1&C/T=0C/T=1控制=1開關(guān)接通或門與門THx(8位)溢出位門開用于需要重復(fù)定時和計數(shù)的場合。最大計數(shù)值:256(28).

THx/TLx賦相同初值在TLx計數(shù)達到0FFH再加“1”時,TL0將溢出,“TFx”置1去申請中斷,同時THx中的值自動重裝(Copy)進TLx工作方式2的編程:

TMOD寄存器選方式:寫“M1,M0”=10b選中方式2

其他用法與各種方式1完全相同.3、工作方式3方式3只適用于定時器0。此時,定時器0的TH0、TL0成為兩個獨立的計數(shù)器。

TL0可作為定時器/計數(shù)器,占用T0在TCON和TMOD中的控制位和標志位。

TH0只能作為定時器使用,占用T1在TCON和TMOD中的控制位TR1和標志位TF1。.4、定時器2的工作方式第一種:捕捉方式。設(shè)置為捕捉方式時和定時器0或定時器1一樣以16位方式工作。這種方式通過復(fù)位EXEN2來選擇。當(dāng)置位EXEN2時,如果T2EX有負跳變電平將把當(dāng)前的數(shù)鎖存在RCAP2H和RCAP2L中,這個事件可用來產(chǎn)生中斷。通過軟件設(shè)置T2CON,可使定時/計數(shù)器2以三種基本工作方式之一工作。.用來產(chǎn)生串行口通訊所需的波特率。這通過同時或分別置位RCLK和TCLK來實現(xiàn)。第二種工作方式:為自動重裝方式。其中包含的兩個子功能由EXEN2來選擇。當(dāng)EXEN2復(fù)位時,16位定時器溢出將觸發(fā)一個中斷,并將RCAP2H和RCAP2L中的數(shù)裝入定時器中。當(dāng)EXEN2置位時,除上述功能外T2EX引腳的負跳變將產(chǎn)生一次重裝操作。第三種工作方式:.8.2.3定時器/計數(shù)器的初始化1、初始化步驟(2)計算定時器/計數(shù)器的計數(shù)初值,并裝載到TH和TL寄存器。(1)確定定時器/計數(shù)器的工作方式——編程TMOD寄存器。(3)定時器/計數(shù)器工作中斷方式時,開CPU中斷和源中斷,——編程IE寄存器(4)啟動定時器/計數(shù)器——編程TCON寄存器中的TR0/TR1位。.2、計數(shù)初值的計算(1)定時器的計數(shù)初值在定時器方式下,是對機器周期脈沖進行計數(shù)。如果系統(tǒng)時鐘為6MHz,一個機器周期為12/fosc=2us.方式0,13位定時器最大定時間隔=213×2us=16.384ms.方式1,16位定時器最大定時間隔=216×2us=131.072ms.方式2,8位定時器最大定時間隔=28×2us=512us.初值計算方法:T=(12/fosc)*(216-X)us.(2)計數(shù)器的計數(shù)器初值方式0,13位計數(shù)器最大計數(shù)值=213=8192.方式1,16位計數(shù)器最大計數(shù)值=216=65536.方式2,8位計數(shù)器最大計數(shù)值=28=256.初值計算方法:cnt=216-X.8.2.4定時器/計數(shù)器的應(yīng)用實例例1在頻率為12MHz的標準51單片機上,用timer1產(chǎn)生10khz定時器滴答中斷。P187解:1、確定timer1工作方式:

工作方式2——8位自動重裝方式

TMOD中的M1M0=10

2、確定timer1計數(shù)初值:X=256-100=156。3、中斷方式控制字設(shè)定。EA=1(總開關(guān)),ET1=1(分開關(guān))。.4、啟動定時器。TR1=1。5、編程(1)流程圖:主函數(shù)流程圖中斷函數(shù)流程圖(2)代碼編寫:中斷函數(shù)主函數(shù).#include<reg51.h>sbitLED=P1^0;sbitWAVE=P1^1;staticunsignedlongoverflow_count=0;/*定時器1中斷服務(wù)程序;每100個時鐘周期執(zhí)行一次*/voidtimer1_ISR(void)interrupt3{ overflow_count++; WAVE=!WAVE;}./*主函數(shù):定時器1設(shè)置為方式28位重裝方式*/voidmain(void){ TMOD=(TMOD&0X0F)|0X20; //設(shè)置定時器1工作方式 TH1=256-100; //定時器1賦初值 TL1=TH1; EA=1; //開定時器1中斷 ET1=1; TR1=1; //啟動定時器1 while(1) { if(overflow_count==100)

{overflow_count=0; LED=!LED; } }}.例2在頻率為12MHz的標準51單片機上,輸出周期為2ms的方波。P1881、用定時器0的方式1編程,采用查詢方式。#include<reg51.h>sbitP10=P1^0;由P1^0輸出波形voidmain(void){ TMOD=0x01; //定時器工作方式0 TR0=1; //啟動定時器0 for(;;) { TH0=(65536-1000)/256;//裝載計數(shù)初值 TL0=(65536-1000)%256; do{}while(!TF0); //查詢等待定時中斷信號 P10=!P10; //取反 TF0=0; //軟件清零TF0 }}.2、用定時器0的方式1編程,采用中斷方式。#include<reg51.h>sbitP10=P1^0;voidtimer0_isr(void)interrupt1{ P10=!P10; TH0=(65536-1000)/256;//表達式的數(shù)學(xué)意義?初值恢復(fù) TL0=(65536-1000)%256;}voidmain(void){ TMOD=0x01; TH0=(65536-1000)/256; TL0=(65536-1000)%256; EA=1; ET0=1; TR0=1; while(1){;}}.例3在頻率為12MHz的標準51單片機上,使LED閃爍,周期為2s。p189.#include<reg51.h>sbitLED=P2^0;sbitWAVE=P1^1;staticunsignedlongoverflow_count=0;/*定時器1中斷服務(wù)程序;每50ms執(zhí)行一次,*/voidtimer1_ISR(void)interrupt3{ TH1=(65536–50000)/256; //定時器1賦初值 TL1=(65536–50000)%256;//

50ms/1us=5000,晶振? overflow_count++; WAVE=!WAVE;

}./*主函數(shù):定時器1設(shè)置為方式1*/voidmain(void){

TMOD=(TMOD&0X0F)|0X10;//設(shè)置定時器1工作方式1,//別的方式TMOD=? TH1=(65536–50000)/256; //定時器1賦初值 TL1=(65536–50000)%256; EA=1; //開定時器1中斷 ET1=1; TR1=1; //啟動定時器1 while(1) { if(overflow_count==20)//50ms*20=1000ms

{ overflow_count=0; LED=!LED;} }}//T1的中斷系列,20個中斷為1系列,每個中斷50ms.例4在頻率為12MHz的標準51單片機上,在P1.0引腳上輸出周期為2.5S,占空比為20%的脈沖信號。P190中斷次數(shù)加1次數(shù)=高電平?次數(shù)=周期?P1.0=0P1.0=1返回#include<reg51.h>#defineduncharunsignedcharsbitWAVE=P1^0;ucharperiod=250;ucharhigh=50;ucharoverflow_count=0;voidtimer1_ISR(void)interrupt1{TH0=(65536–10000)/256; TL0=(65536–10000)%256;if(++overflow_count==high) WAVE=0;elseif(overflow_count==period){overflow_count=0; WAVE=1;}}.8.3 串行口串行通訊:數(shù)據(jù)逐位順序傳送。傳輸線僅需1-2根。8.3.0基本概念串行通信的基本特征是數(shù)據(jù)逐位順序進行傳送。串行通信的格式及約定(如:同步方式、通訊速率、數(shù)據(jù)塊格式、信號電平……等)不同,形成了多種串行通信的協(xié)議與接口標準。常見的有:?通用異步收發(fā)器(UART)——本課程介紹的串口?通用串行總線(USB)?I2C總線?CAN總線:控制器局域網(wǎng)CAN(ControllerAreaNet)是一種現(xiàn)場總線?SPI總線,

"SerialPeripheralInterface",串行外圍接口?RS-485,……等等.全雙工串行接口(UART)?全雙工:(串行通信)收/發(fā)可同時進行(手機,電話)?半雙工:(串行通信)收/發(fā)不可同時進行(對講機)?單工:數(shù)據(jù)單向傳送?異步串行通信:以字符為單位進行傳送?同步串行通信:以數(shù)據(jù)塊為單位進行傳送?波特率(bps.):每秒鐘傳輸?shù)臄?shù)據(jù)位數(shù)。Bitspersecond異步串行通信數(shù)據(jù)格式(低位先行)D0D1D2D3D4D5D6D7停止位起始位.SBUF(發(fā))SBUF(收)發(fā)送控制器

TI接收控制器

RI移位寄存器波特率發(fā)生器T11A累加器(門)移位寄存器RxDTxD去申請中斷引腳引腳串行接口的組成(發(fā)送完TI才置1或接收完RI才置1).8.3.1與串行口有關(guān)的SFRp194

SM0SM1SM2RENTB8RB8TIR1SCONSM0,SM1:串行口4種工作方式的選擇位。

00方式0:8位移位寄存器I/O,波特率固定為fosc/1201方式1:8位UART(1+8+1位),

波特率可變,按公式計算;10方式2:9位UART(1+8+1+1位),波特率固定=fosc/32或1/6411方式3:9位UART(1+8+1+1位),

波特率可變,按公式計算;SM2:串行口多機通信控制位

(作為方式2、方式3的附加控制位)1、串行口控制寄存器SCON(98H).?RI,TI:串行口收/發(fā)數(shù)據(jù)申請中斷標志位=1申請中斷;=0不申請中斷?TB8:方式2、3中,是要發(fā)送的第9位數(shù)據(jù)。多機通信中,TB8=0表示發(fā)送的是數(shù)據(jù);TB8=1表示發(fā)送的是地址。(奇偶校驗)?RB8:在方式2、3中,是收到的第9位數(shù)據(jù)。在多機通信中,用作區(qū)別地址幀/數(shù)據(jù)幀的標志。(奇偶校驗)

SM0SM1SM2RENTB8RB8TIR1?REN:串行口接收允許控制位=1表示允許接收;=0禁止接收。SCON.SMOD———GF1GF0PD1DL2、電源控制寄存器PCON(97H)P.152——特殊功能寄存器PCON不能按位尋址——??SMOD:在串行口工作方式1、2、3中是波特率加倍位=1時,波特率加倍=0時,波特率不加倍。(在PCON中只有這一個位與串口有關(guān))

?GF1,GF0:用戶可自行定義使用的通用標志位PCON.8.3.2串行口的工作方式1、工作方式0:8位移位寄存器I/O方式?發(fā)送:SBUF中的串行數(shù)據(jù)由RxD逐位移出;

TxD輸出移位時鐘,波特率=fosc/12;

每送出8位數(shù)據(jù)TI就自動置1;

需要用軟件清零TI。?接收:串行數(shù)據(jù)由RxD逐位移入SBUF中;

TxD輸出移位時鐘,波特率=fosc/12;

每接收8位數(shù)據(jù)RI就自動置1;

需要用軟件清零RI。.方式0時序圖并入串出寫入SBUFRXD數(shù)據(jù)輸出TXD同步移位脈沖TI中斷標志D0D1D2D3D4D5D6D7寫REN=1RI=0RXD輸入RI接收時序發(fā)送時序TXD.串行口方式0的擴展應(yīng)用——經(jīng)常用到串行口常用工作方式0擴展出并行I/O口,工作方式1、2、3則常用于串行通信ABCLKhgfedcbaCLRABCLKCLRABCLKCLR+5V74LS16474LS16474LS16474LS164是串入并出芯片;hgfedcbahgfedcba+5V共陽LED數(shù)碼管VCCTxDRxD51單片機.2、串行口工作方式1串行口為波特率可調(diào)的8位通用異步串行通信口。發(fā)送或接收一幀信息,包括1位起始位0,8位數(shù)據(jù)位和1位停止位1。其幀格式如圖所示。

方式1工作時:發(fā)送端自動添加一個起始位和一個停止位;接收端自動去掉一個起始位和一個停止位。.(1)方式1輸出

發(fā)送時,數(shù)據(jù)從TXD端輸出,當(dāng)數(shù)據(jù)寫入發(fā)送緩沖器SBUF后,啟動發(fā)送器發(fā)送。當(dāng)發(fā)送完一幀數(shù)據(jù)后,停止工作,置中斷標志TI為1。(2)方式1輸入

接收時,由REN置1,允許接收,串行口采樣RXD,當(dāng)采樣由1到0跳變時,確認是起始位“0”,開始接收一幀數(shù)據(jù)。當(dāng)RI=0,且停止位為1或SM2=0時,停止位進入RB8位,同時置中斷標志RI;否則信息將丟失。所以,方式1接收時,應(yīng)先用軟件清除RI或SM2標志。.(a)發(fā)送時序圖(b)接收時序圖采樣RXD輸入數(shù)據(jù)D0D1D2D3D4D5D6D7停止位起始位RI檢測負跳變,說明起始位有效寫入SBUFTXD數(shù)據(jù)輸出TID0D1D2D3D4D5D6D7停止位起始位.3、串行口工作方式2方式2下,串行口為9位UART。發(fā)送或接收一幀數(shù)據(jù)包括1位起始位0,8位數(shù)據(jù)位,1位可編程位(TB8/RB8)(用于奇偶校驗)和1位停止位。其幀格式如圖所示。.(1)方式2的輸出寫SBUF的指令,除了將8位數(shù)據(jù)送入SBUF外,同時還將TB8裝入發(fā)送移位寄存器的第9位,并通知發(fā)送控制器進行一次發(fā)送。發(fā)送時,先根據(jù)通信協(xié)議由軟件設(shè)置TB8,然后用指令將要發(fā)送的數(shù)據(jù)寫入SBUF,啟動發(fā)送器。在送完一幀信息后,TI被自動置1,在發(fā)送下一幀信息之前,TI必須由中斷服務(wù)程序或查詢程序清0。.

當(dāng)REN=1時,允許串行口接收數(shù)據(jù)。數(shù)據(jù)由RXD端輸入,接收11位的信息。當(dāng)接收器采樣到RXD端的負跳變,并判斷起始位有效后,開始接收一幀信息。(2)方式2的輸入

當(dāng)接收器接收到第9位數(shù)據(jù)后,若同時滿足以下兩個條件:RI=0和SM2=0或接收到的第9位數(shù)據(jù)為1,則接收數(shù)據(jù)有效,8位數(shù)據(jù)送入SBUF,第9位送入RB8,并置RI=1。若不滿足上述兩個條件,則信息丟失。.方式3為波特率可變的11位UART通信方式,除了波特率以外,方式3和方式2完全相同。4、串行口工作方式串行口的初始化1、串行口的波特率波特率為每秒鐘傳送二進制數(shù)碼的位數(shù),也叫比特數(shù),單位為b/s,即位/秒。波特率用于表征數(shù)據(jù)傳輸?shù)乃俣?,波特率越高,?shù)據(jù)傳輸速度越快。(1)方式0波特率

在方式0中,波特率為時鐘頻率的1/12,即fosc/12,固定不變。(2)方式2波特率

在方式2中,波特率取決于PCON中的SMOD值,當(dāng)SMOD=0時,波特率為fosc/64;當(dāng)SMOD=1時,波特率為fosc/32..波特率=2SMOD

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論