《單片機C語言程序設計》課件第五部分 單片機中斷系統(tǒng)_第1頁
《單片機C語言程序設計》課件第五部分 單片機中斷系統(tǒng)_第2頁
《單片機C語言程序設計》課件第五部分 單片機中斷系統(tǒng)_第3頁
《單片機C語言程序設計》課件第五部分 單片機中斷系統(tǒng)_第4頁
《單片機C語言程序設計》課件第五部分 單片機中斷系統(tǒng)_第5頁
已閱讀5頁,還剩85頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第五部分單片機中斷系統(tǒng)中斷的定義:中斷系統(tǒng)由4部分組成:中斷源、中斷標志位、中斷控制位、優(yōu)先級控制位組成。51系列的單片機的5個中斷源分別是:外部中斷0()、定時/計數器0(/C0)、外部中斷1()、定時/計數器1(/C1)、串行口中斷(TXD、RXD);中斷標志位由:IE0、TF0、IE1、TF1、TI和RI組成;中斷控制位由:EA、EX0、ET0、EX1、ET1、ES組成;中斷優(yōu)先級控制位由:PX0、PT0、PX1、PT1、PS組成。5.1中斷系統(tǒng)總框架單片機在執(zhí)行main函數時系統(tǒng)出現隨機產生的突發(fā)事件,單片機暫停main函數的程序轉而去處理突發(fā)事件,處理完后再返回到剛才暫停的位置繼續(xù)執(zhí)行main函數中的程序。中斷系統(tǒng)總框架5.1.1中斷源

中斷源是引起中斷的原因和申請中斷的來源。51系列單片機有2個外部中斷源、2個定時/計數器和1個串行口中斷。(1)外部中斷0和外部中斷1:分別由P3.2、P3.3輸入;有下降沿、低電平兩種觸發(fā)方式,分別由IT0和IT1控制。(2)定時/計數器0(C/0)和定時/計數器1(C/1):定時方式時由單片機晶振分頻和定時模式及初值決定定時時間;計數方式時由P3.4和P3.5輸入計數脈沖。(3)串行口中斷(TXD、RXD):串行口中斷來源有兩個分別是:接收中斷RXD和發(fā)送中斷TXD組成;分別從P3.0和P3.1輸入輸出。5.1.2中斷請求標志位(1)TCON:定時器/計數器的控制寄存器如表5.1.1所示(可位尋址)。

A、TF1和TF0:定時器/計數器溢出中斷請求標志位。THx、TLx(x代表0、1)從初值加“1”計數,直至計數器全滿產生溢出時,TFx自動為1。此時可通過中斷法或查詢法檢測TFx位。若ETx=1、EA=1,即可向單片機請求中斷。單片機響應中斷后,TFx由硬件自動清零。若ETx、EA中有一個不為1,則不能響應中斷,只能查詢TF1位。76543210TCONTF1TR1TF0TR0IE1IT1IE0IT0B、IT1和IT0:外部中斷的觸發(fā)方式選擇位。ITx=0,外部中斷的中斷請求信號為低電平觸發(fā)。當單片機檢測到P3.3(外部中斷0)、P3.4(外部中斷1)引腳的輸入信號為低電平時,置位IEx;當P3.3、P3.4輸入信號為高電平時,IEx自動清零。IT1=1,外部中斷中斷請求信號為下降沿觸發(fā)。連續(xù)兩個機器周期先檢測到高電平后檢測到低電平時,置位IEx;執(zhí)行中斷服務函數后,IEx自動清零。C、IE1和IE0:外部中斷的中斷請求標志位。外部中斷(P3.3或P3.4)輸入引腳有低電平觸發(fā)或下降沿觸發(fā)信號時,IEx自動為1。若外部中斷是開啟的,則單片機響應外部中斷的中斷服務請求。D、TR1和TR0:定時/計數器1和0的啟動控制位。只有TRx=1才有機會開啟相應的定時/計數器,此后THx、TLx加“1”計數到溢出,從而置位TFx。(2)SCON:串口中斷控制寄存器如表5.1.2所示。SCON主要用于串行口的模式控制,這里與中斷請求標志相關的只有TI和RI(可位尋址)。A、TI:串行口發(fā)送完中斷標志位。當單片機將一個數據寫入串行口發(fā)送緩沖區(qū)SBUF后,啟動發(fā)送。每發(fā)送完一個串行幀,由硬件置位TI。此時,若ES=1、EA=1,則單片機響應串行口發(fā)送中斷請求。若EA、ES中有一個不為1,則不允許中斷,此時只能通過查詢方式判斷發(fā)送結束。76543210TCONSM0SM1SM2RENTB8RB8TIRIB、RI:串行口接收完中斷標志位。當允許串行口接收數據時,每接收完一個串行幀,由硬件置位RI。若EA=1、ES=1,則單片機響應串行口接收中斷請求;若EA、ES中有一個不為1,則不允許中斷,此時只能通過查詢方式判斷接收結束。IE為單片機中斷的使能控制寄存器,中斷使能開關分為兩級:第1級為總開關EA,用于所有中斷的控制;第2級為分級開關,分別對單片機的5個中斷源進行控制。5.1.3中斷使能寄存器IE5.1.3中斷使能寄存器IE76543210IEEAESET1EX1ET0EX0(1)EA:使能所有中斷的總開關。若EA=0,所有中斷請求均被禁止;若EA=1,是否允許中斷由各個中斷控制寄存器決定。(3)外部中斷1控制位EX1若EX1=1,允許外部中斷1申請中斷;若EX1=0,禁止外部中斷1申請中斷。(4)定時器/計數器0中斷控制位ET0若ET0=1,允許定時器/計數器0申請中斷;若ET0=0,禁止定時器/計數器0申請中斷。(2)外部中斷0控制位EX0若EX0=1,允許外部中斷0申請中斷;若EX0=0,禁止外部中斷0申請中斷。(5)定時器/計數器1中斷控制位ET1若ET1=1,允許定時器/計數器1申請中斷;若ET1=0,禁止定時器/計數器1申請中斷。(6)串行口中斷控制位ES若ES=1,允許串行口申請中斷;若ES=0,禁止串行口申請中斷。。5.1.4中斷優(yōu)先級別控制位IPC51的5個中斷源有默認的中斷優(yōu)先級別,從高到低分別為:外部中斷0、定時/計數器0、外部中斷1、定時/計數器1、串行口中斷。當單片機同時拉收到幾個中斷請求時,首先響應優(yōu)先級高的中斷請求;正在進行的中斷服務程序可以被高優(yōu)先級中斷請求中斷,但不被低優(yōu)先級中斷請求中斷。如圖5.1.0中斷系統(tǒng)框架中斷優(yōu)先級有2個,可以用軟件設置中斷優(yōu)先級別。表5.1.4為中斷優(yōu)先級別控制位IP(可位尋址):(1)外部中斷0優(yōu)先級控制位PX0若PX0=1,外部中斷0被設定為高優(yōu)先級中斷;若PX0=0,外部中斷0被設定為低優(yōu)先級中斷。(2)外部中斷1優(yōu)先級控制位PX1若PX1=1,外部中斷1被設定為高優(yōu)先級中斷;若PX1=0,外部中斷1被設定為低優(yōu)先級中斷。(3)定時器/計數器0中斷優(yōu)先級控制位PT0若PT0=1,定時器/計數器0被設定為高優(yōu)先級中斷;若PT0=0,定時器/計數器0被設定為低優(yōu)先級中斷。76543210IPPSPT1PX1PT0PX0(4)定時器/計數器1中斷優(yōu)先級控制位PT1若PT1=1,定時器/計數器1被設定為高優(yōu)先級中斷;若PT1=0,定時器/計數器1被設定為低優(yōu)先級中斷。(5)串行口中斷優(yōu)先級控制位PS若PS=1,串行口中斷被設定為高優(yōu)先級中斷;若PS=0,串行口中斷被設定為低優(yōu)先級中斷。

中斷服務函數是當中斷源申請中斷后,單片機中斷main函數的程序轉而去執(zhí)行的函數。中斷服務函數優(yōu)先于main函數。中斷服務函數的格式:5.2中斷服務函數void函數名(void)interrupt中斷編號using工作寄存器組編號{中斷服務程序}其中:中斷編號如表5.2.0,是C51語句為方便使用而對中斷源進行的編號。工作寄存器組編號從0~2任選。中斷編號中斷源0外部中斷01定時/計數器02外部中斷13定時/計數器14串口中斷【例5.2.1】編寫一個外部中斷0的中斷服務函數,在外部中斷0服務函數中,P2.7取反。voidINT_0(void)interrupt0using0{P2_7=!P2_7;}中斷服務函數編寫,應特注意以下幾點:(1)中斷服務服務函數優(yōu)先于main函數,不能直接被main函數調用,否則將導致編譯錯誤。(2)中斷服務函數沒有返回值,即應將中斷服務函數定義為void類型。(3)中斷服務函數為無參函數,中斷服務函數即不能有傳參列表,否則將導致編譯錯誤。(5)若中斷服務函數中調用了其他函數,則被調用函數使用的寄存器組編號必須與中斷函數相同,也就是using后面的數字必須一樣。(6)中斷服務服務函數使用浮點運算時要保存浮點寄存器的狀態(tài)。51系列的單片機有2個外部中斷:外部中斷0和外部中斷1,輸入引腳分別是:P3.2和P3.3。從中斷系統(tǒng)框架圖5.1.0可看到外部中斷的觸發(fā)方式有2種:下降沿觸發(fā)和低電平觸發(fā)。當設為低電平觸發(fā)時(ITx=0),單片機在每個機器周期都檢查中斷源引腳,只要有低電平,中斷請求標志位置位,向CPU申請中斷;當設為下降沿觸發(fā)時(ITx=1),單片機在上一機器周期檢測到中斷源引腳為高電平,下一機器周期檢測到低電平,即置位中斷請求標志位,向CPU申請中斷。5.3外部中斷

與外部中斷相關的特殊寄存器如表5.3.1所示,當對外部中斷進行初始化和中斷服務函數編寫時時這些特殊寄存器都要考慮上。5.3.1與外部中斷相關的特殊寄存器序號寄存器功能0IT0、IT1設置外部中斷觸發(fā)方式:0為低電平,1為下降沿觸發(fā)。1EX0、EX1使能外部中斷:0為關斷,1為開啟。2IE0、IE1外部中斷的中斷請求標志位:1為有中斷請求。3PX0、PX1外部中斷的優(yōu)先級設置:0為默認級,1為高級優(yōu)先級。4EA所有中斷的總開關:0為關斷,1為開啟。

在開啟任何中斷前都必須對中斷做相應的設置,外部中斷只須設置5.3.1小節(jié)中相關的寄存器即可?!纠?.3.1】開啟外部中斷0,設置其為下降沿觸發(fā),采用默認優(yōu)先級。voidINIT(void){IT0=1;//設置外部中斷0為下降沿觸發(fā)。EX0=1;//使能外部中斷0。PX0=0;//可以省略,默認為0。EA=1;//開啟總中斷。}5.3.2外部中斷產初始化【例5.3.2】開啟兩個外部中斷,設置外部中斷0為低電平觸發(fā)、外部中斷1為下降沿觸發(fā),且外部中斷1的優(yōu)先級比外部中斷0優(yōu)先級高。

voidINIT(void)

{

IT0=0;IT1=1;

EX0=1;EX1=1;

PX0=0;PX1=1;

EA=1;

}

中斷服務函數在5.2節(jié)有介紹過,不同的中斷服務函數只要滿足中斷編號對應,函數名合法,其它的規(guī)則都大同小異。5.3.3外部中斷服務函數

設計一個程序通過外部中斷0控制P2.7取反。綜合例5.2.1的中斷服務函數和例5.3.1的中斷初始化,編寫程序如下:【例5.3.3】硬件電路如圖5.3.3所示,此硬件電路中P3.2接按鍵模擬外部中斷0的中斷源。因為外部中斷觸發(fā)方式只有兩種:低電平、下降源觸發(fā),所以按鍵的一端必須接地。#include<REGX51.H>voidINIT(void)//外部中斷開啟步驟有4條。{IT0=1;//設置外部中斷0為下降沿觸發(fā)。EX0=1;//使能外部中斷0。PX0=0;//可以省略,默認為0。EA=1;//開啟總中斷。}voidmain(){INIT();//調用INIT函數。while(1);}voidINT_0(void)interrupt0using0//外部中斷0中斷服務函數。{P2_7=!P2_7;//P2.7取非。}

51系列單片機至少有兩個16位的定時/計數器。如圖5.4.0所示,可以通過編程使其工作在定時狀態(tài)或計數狀態(tài)。定時器是采用內部晶振分頻后的時鐘脈沖為基準的。計數則是通過單片機的P3.4和P3.5引腳獲得外部脈沖信號。由此可見定時/計數器的本質其實是計數器。(1)當做定時器使用時:定時器對晶振12分頻后的脈沖計數。若晶振采用12M,12分頻后為1MHz(1us),計數多少個脈沖就是多少us。5.4定時/計數器工作原理(2)當做計數器使用時:計數器對單片機的P3.4、P3.5的脈沖進行加1計數。理論上51系列單片機可計數脈沖最高頻率為500kHz。5.4.1與定時/計數器相關的特殊寄存器序號寄存器功能1TMOD定時/計數器的工作模式寄存器2TR0、TR1定時/計數器的啟動標志位3ET0、ET1定時/計數器中斷使能:0為關斷,1為開啟。4TH0、TL0、TH1、TL1定時/計數器初值寄存器5TF0、TF1定時/計數器的中斷請求標志位:1為有中斷請求。6PT0、PT1定時/計數器的優(yōu)先級設置:0為默認級,1為高級優(yōu)先級。7EA所有中斷的總開關:0為關斷,1為開啟。(1)定時計數器模式控制寄存器如表5.4.2,TMOD(不可位尋址)的高四位用于對定時/計數器1進行設置,低四位用于對定時/計數器0進行設置。TMODGATEM1M0GATEM1M0

定時/計數器1定時/計數器0A、當GATE等于1時,定時/計數器的啟動需要TRx=1和INTx引腳為高電平。當GATE等于0時,定時/計數器的啟動只TRx=1,一般都采用此模式。B、:等于0時單片機工作于定時器模式,等于1時工作于計數器模式。C、M1M0:為單片機定時/計數器的工作方式選擇位M1M0工作方式00方式0,最大計數213,不自動重裝初值。01方式1,最大計數216,不自動重裝初值。10方式2,最大計數28,自動重裝初值。11TL0為定時器/計數器,TH0只能定時。5.4.2定時/計數器的工作方式及編程方式0,如圖5.4.1所示為定時/計數器0的方式0工作框圖。A、當TMOD中的M1=0、M0=0時,單片機定時/計數器0工作于方式0。方式0中定時/計數器的初值為13位,即THx提供高8位,TLx提供低5位。B、當定時/計數器工作于定時模式時:THx=(213-X)*12/fosc/32;TLx=(213-X)*12/fosc%32;X為定時時間,即Xus后定時/計數時溢出。C、當定時/計數器工作于計數模式時:THx=(213-X)/32;TLx=(213-X)%32;X為脈沖個數,即X個脈沖后定時/計數器溢出。D、上訴公式X對32求整求余,其實是將X轉化成2進制,取其高8位給THx,低5位給TLx?!纠?.4.1】硬件電路如圖5.4.2所示(晶振12MHz),此時定時/計數器可定時最大時間為8192us,計數脈沖為8192個?,F設置定時/計數器0工作于方式0,定時1ms,讓P2.0產生2ms周期的方波。初值計算:12/fosc=1;1ms=1000us;TH0=(8192-1000)/32;TL0=(8192-1000)%32;或:TH0=(8192-1000)>>5;TL0=(8192-1000);或:TH0=0xe0;TL0=0x18;。采用查詢定時/計數器0的溢出標志位的方法編程:#include<REGX51.H>voidINIT(){TMOD=0X00;//設置定時器為定時模式,方式0;TR0=1;TH0=(8192-1000)/32;TL0=(8192-1000)%32;}voidmain(){INIT();//調用INIT函數,初始化中斷。while(1){TH0=(8192-1000)/32;TL0=(8192-1000)%32;//初值重裝;while(!TF0);TF0=0;//等待TF0=1;P1_0=!P1_0;//取非P1_0;產生方波;}}采用查詢法,只需最少條件讓TH0、TL0自加1,即TR0=1,GATE=0。此后,TH0、TL0從初值自加到8192溢出后,置位TF0。上訴程序中采用while(!TF0)等待TF0為1后程序才往下執(zhí)行,但TF0只有執(zhí)行定時計數器0的中斷服務函數后才會自動清零,而程序中但沒有中斷服務函數,所以要人為清零TF0。采用中斷法編程:#include<REGX51.H>voidINIT()//定時計數器初始化的6條程序;{TMOD=0X00; //設置定時器為定時模式,方式0;TR0=1;//啟動定時計數器;ET0=1; //使能定時計數器中斷;TH0=(8192-1000)>>5;//初值計數;TL0=(8192-1000);EA=1;//中斷總開關;}voidmain(){INIT();//調用INIT函數,初始化中斷。while(1);}voidTimer0()interrupt1//定時計數器0中斷服務函數;{TH0=(8192-1000)>>5;TL0=(8192-1000);//初值重裝;P1_0=!P1_0;//取非P1.0;產生方波;}采用中斷法,初始化定時計數器的程序有6條。此時必須使能定時計數器中斷和中斷總開關。Timer0函數并沒有在main函數中出現,因為中斷函數比main函數高級不被其調用;Timer0函數僅做重裝初值和取非P1.0兩件事。采用中斷法編程:A、當TMOD中的M1=0、M0=1時,單片機定時/計數器工作于方式1。方式1中定時/計數器的初值為16位,即THx提供高8位,TLx提供低8位。B、當定時/計數器工作于定時模式時:THx=(216-X)*12/fosc/256;TLx=(216-X)*12/fosc%256;X為定時時間,即Xus后定時/計數時溢出。C、當定時/計數器工作于計數模式時:THx=(216-X)/256;TLx=(216-X)%256;X為脈沖個數,即X個脈沖后定時/計數器溢出。解析:使用方式1可以直接定時10ms,但不能一次性定時100ms。所以程序中要定時變量t用于計算定時計數器的溢出10次后對P1.0取非。初值計算:12/fosc=1;1ms=10000us;TH0=(65536-10000)/256;TL0=(65536-10000)%256;或:TH0=(65536-10000)>>8;TL0=65536-10000;(THx為高8位,TLx為低8位,晶振為12MHz)或:TH0=0xd8;TL0=0xf0;【例5.4.2】硬件電路如圖5.4.2所示(晶振12MHz),此時定時/計數器可定時最大時間為65536us,計數脈沖為65536個?,F設置定時/計數器0工作于方式1,定時10ms,讓P1.0產生100ms周期的方波。采用查詢定時/計數器0的溢出標志位的方法編程:#include<REGX51.H>voidINIT(){TMOD=0X01;//設置定時器0為定時模式,方式1;TR0=1;TH0=(65536-10000)/256;TL0=(65536-10000)%256;}voidmain(){unsignedchart;//定義t;INIT();//調用INIT函數;while(1){TH0=(65536-10000)/256;TL0=(65536-10000)%256;//初值重裝;while(!TF0);TF0=0;//等待TF0=1;if(t++>=9)//t用于計算定時計數器的溢出次數;{ t=0;//溢出10后清零;P1_0=!P1_0;//取非P1_0;產生方波;}}}采用中斷法編程:#include<REGX51.H>voidINIT()//定時計數器初始化的6條程序;{TMOD=0X01; //設置定時器為定時模式,方式1;TR0=1;//啟動定時計數器;ET0=1; //使能定時計數器中斷;TH0=(65536-10000)>>8;//初值10ms;TL0=(65536-10000);EA=1;//中斷總開關;}voidmain(){INIT();//調用INIT函數,初始化中斷。while(1);}voidTimer0()interrupt1//定時計數器0中斷服務函數;{TH0=(65536-10000)>>8;//初值10ms;TL0=(65536-10000);P1_0=!P1_0;//取反P1.0;產生方波;}方式1的定時10ms,其它方法不能直接定時這么長時間。(3)方式2,如圖5.4.4所示為定時計數器0的方式2工作框圖。A、當TMOD中的M1=1、M0=0時,單片機定時/計數器工作于方式2。方式2中定時/計數器的初值為8位,即THx和TLx都8位。每次溢出后,THx的值會自動加載到TLx中。B、當定時/計數器工作于定時模式時:THx=TLx=(28-X)*12/fosc;X為定時時間,即Xus后定時/計數時溢出。C、當定時/計數器工作于計數模式時:THx=TLx=(28-X);X為脈沖個數,即X個脈沖后定時/計數器溢出?!纠?.4.3】硬件電路如圖5.4.5所示(晶振12MHz),此時定時/計數器可定時最大時間為256us,計數脈沖為256個?,F設置定時/計數器1計數脈沖10個溢出,讓P1.0取非。初值計算:12/fosc=1;TH1=TL1=256-10;采用查詢定時/計數器1的溢出標志位的方法編程:#include<REGX51.H>voidINIT(){TMOD=0X60;//設置定時器1為計數模式,方式2;TR1=1;TH1=TL1=256-10;}voidmain(){INIT();//調用INIT函數;while(1){while(!TF1);TF1=0;//等待TF1=1;P1_0=!P1_0;//取非P1_0;}此時定時計數器1對TMOD的設置集中在高4位如表5.4.2,設置GATE=0,=1;M1=1,M0=0;即:TMOD=0x60;方式2中初值是自動重裝的,當TL1從初值自加到256溢出后,TH1將本身的值傳輸給TL1。采用中斷法編程:#include<REGX51.H>voidINIT()//定時計數器初始化的6條程序;{TMOD=0X60; //設置定時器為定時模式,方式1;TR1=1;//啟動定時計數器;ET1=1; //使能定時計數器中斷;TH1=TL1=256-10;EA=1;//中斷總開關;}voidmain(){INIT();//調用INIT函數,初始化中斷。while(1);}voidTimer1()interrupt3//定時計數器0中斷服務函數;{P1_0=!P1_0;//取反P1.0;產生方波;}采用中斷法必須讓ET1=1、EA=1,當中斷標志位置位后,中斷服務函數才有機會執(zhí)行。定時計數器1的中斷編號:3。(3)方式2,如圖5.4.4所示為定時計數器0的方式2工作框圖。A、當TMOD中的定時計數器0的M1=1、M0=1時,單片機定時/計數器0工作于方式3。方式3中定時/計數器0被分成兩部分:TH0占用了定時計數器1的中斷溢出標志位和中斷源,只用于定時,開啟受控于TR1。TL0占用了定時計數器0的中斷溢出標志位和中斷源,即可定時又可計數。定時計數器1仍可工作于方式0~2,但不能產生中斷。。B、當定時/計數器工作于定時模式時,初值不能自動重裝:TH0=(28-X)*12/fosc;TL0=(28-X)*12/fosc;X為定時時間,即Xus后定時/計數時溢出。C、當定時/計數器工作于計數模式時:TL0=(28-X);X為脈沖個數,即X個脈沖后定時/計數器溢出?!纠?.4.4】硬件電路如圖5.4.7所示(晶振12MHz),單片機定時計數器0工作于方式3,此時定時/計數器可定時最大時間為256us,計數脈沖為256個?,F設置定時/計數器0定時時間為100us讓P1.0產生200us的方波,按鍵按5次后計數脈沖溢出讓P1.7的LED取非,TMOD=0x07。初值計算:12/fosc=1;TL0=256-100;TH1=256-5;采用中斷法編程:#include<REGX51.H>voidINIT()//定時計數器初始化的6條程序;{TMOD=0X07; //設置定時器方式3;TH0為定時器,TL0為計數。TR0=1;TR1=1;//啟動定時計數器;ET0=1;ET1=1; //使能定時計數器中斷;TH0=256-100;//只能定時;TL0=256-5;EA=1;//中斷總開關;}voidmain(){INIT();//調用INIT函數,初始化中斷。while(1);}voidTimer0()interrupt3//定時計數器0的TF0占用定時計數器1的中斷服務函數;{TH0=256-100;//只能定時;P1_0=!P1_0;}voidCounter0()interrupt1//定時計數器0中斷服務函數;{TL0=256-5;P1_7=!P1_7;}

51系列單片機有定時計數器2個,定時計數器0和定時計數器1,工作方式有2種,模式有4種。模式1下的定時計數最大;模式2的初值可以自動重裝;模式3下定時計數器1的中斷服務函數被占用,一般僅用于為串行口生成波特率。5.4.3定時計數器小結(1)一般通信可分為2種:串行通信和并行通信如圖5.5.0所示。5.5串行口中斷(2)串行通信按數據傳送方向可分為:單工通信、半雙工通信、全雙工通信3種如圖5.5.1。A、單工通信:數據傳輸是單向的。當通信一方為發(fā)送方時,另一方只能固定為接收方。單工通信僅需一根數據線。B、半雙工通信:數據傳輸是準雙向的。當通信任一方為發(fā)送時,另一方只能接收對方的數據;反之,當一方為接收端時,另一方只能作為發(fā)送端。任一方的發(fā)送或接收不能同時進行,但可以通過編程改變收發(fā)方向。通信一般采用兩根數據線。C、全雙工通信:數據傳輸是雙向的。通信雙向均可同時收發(fā)數據。通信采用兩根數據線。(3)同步通信和異步通信串行通信按時鐘控制方式和信息組成格式可分為:同步通信和異步通信。A、同步通信:一次傳輸一幀數據中,可包含多個的字符。傳輸時應在數據前加上同步字符,后面加上校驗字符,如圖5.5.2所示。同步通信傳輸的速度快,但對接收和發(fā)送時鐘要求嚴格同步。同步字符數據塊1~n校驗字符B、異步通信:一次傳輸一幀數據中,一般包含1個字符。一幀數據內包含:起始位、數據位、校驗位、停止位,如圖5.5.3所示。傳輸時先發(fā)送一個低電平的起始位,再發(fā)送數據位(低位在前高位在后),接著發(fā)送校驗位和一個高電平的停止位。異步通信中接收端和發(fā)送端的時鐘是獨立的,不需要同步。C、波特率:波特率是指每秒中傳輸二進制的位數,單位為bps(b/s)。波特率是衡量串行通信速度的標準。5.5.2串行口的工作原理串行口主要由發(fā)送數據緩沖器、接收數據緩沖器、發(fā)送控制器TI、接收控制器RI、波特率生成器、輸入移位寄存器、串行口控制寄存器SCON、輸出控制門電路、TXD發(fā)送端、RXD接收端等組成,如圖5.5.4所示。(1)發(fā)送數據將數據寫入發(fā)送緩沖串SBUF中,在定時器1的波特率產生器的時鐘控制下,SBUF的內容按低位在前,高位在后的順序通過P3.1逐位發(fā)送出去。發(fā)送一幀數據后,TI硬件置1。(TI必須人為清零后才能發(fā)送下一幀數據)(2)接收數據當串行口控制寄存器SCON中的REN為1、RI(接收中斷標志位)為0時,串行口可接收數據。串行數據從P3.0(RXD)按波特率時鐘要求按位進入移位寄存器,完成接收到一個完整的字節(jié)后存入SBUF中,此時RI硬件置1(RI必須人為清零后才能接收下一幀數據)。5.5.3與串行口相關的特殊寄存器與串行口相關的特殊寄存器有兩個:SCON和PCON。SCON是串行口控制寄存器,用于設置串行口工作方式。PCON為電源控制寄存器,用于設置單片機電源相關控制。(1)SCON:如表5.5.1所示,為SCON串行口控制寄存器各相關位(可位尋址)。SCONSM0SM1SM2RENTB8RB8TIRI地址9FH9EH9DH9CH9BH9AH99H98HA、SM0和SM1為串行口方式選擇位,有4種方式供設計者選擇如表5.5.2所示。工作方式SM0SM1波特率功能方式000fosc/12移位寄存器,主要用于IO擴展。方式101可變10位幀結構的UART,無校驗位。方式210fosc/32或fosc/6411位幀結構的UART,有校驗位。方式311可變11位幀結構的UART,有校驗位。B、SM2為多機通信控制位。方式0時:SM2必須為0。方式1時:使能接收REN=1時,若SM2=1,只有接收到有效停止位時,RI才置1。方式2和方式3時:若SM2=1且RB8=1,RI置1;若SM2=1但RB8=0,即使接收完數據RI也不置1。若SM2=0,不論RB8為0還是為1,接收完數據后RI置1。C、REN為接收使能控制位:當REN=1時,允許接收;當REN=0時,禁止接收。D、TB8和RB8:TB8為發(fā)送數據的第9位,RB8為接收數據的第9位。在方式2和方式3中,TB8和RB8一般用于奇偶校驗位。在多機通信時,可用于區(qū)分是地址或數據。E、TI為發(fā)送中斷標志位:發(fā)送完一幀數據后由硬件自動置1。當串行口工作于方式0做IO擴展時,TI由硬件自動清零;當串行口工作于其它3種狀態(tài)時,TI由軟件清零。當TI置1時,可申請中斷,軟件清零后可發(fā)送下一幀數據。F、RI為接收中斷標志位:接收完一幀數據后由硬件自動置1。當串行口工作于方式0做IO擴展時,RI由硬件自動清零;當串行口工作于其它3種狀態(tài)時,RI由軟件清零。當RI置1時,可申請中斷,軟件清零后可接收下一幀數據。(2)PCON:如表5.5.2所示,為PCON電源控制寄存器各相關位(不可位尋址)。PCONSMOD

GF1GF0PDIDL地址8EH8DH8CH8BH8AH89H88H87HA、SMOD為波特率倍頻位:當串行口工作于方式1~3時,若SMOD=1,波特率*2;若SMOD=0,波特率不變。當串行口工作于方式0時,與SMOD無關。B、GF1和GF0:用戶自定義位,無具體用途。C、PD為掉電方式位:PD=0單片機處于正常工作狀態(tài)。PD=1單片機進入掉電(PowerDown)模式,可由外部中斷或硬件復位模式喚醒,進入掉電模式后,外部晶振停振,CPU、定時器、串行口全部停止工作,只有外部中斷工作。D、IDL為待機方式位:IDL=0單片機處于正常工作狀態(tài)。IDL=1單片機進入空閑模式,除CPU不工作外,其余的振蕩器、中斷系統(tǒng)仍繼續(xù)工作,在空閑模式下可由任一個中斷或硬件復位喚醒。5.5.4串行口的工作方式及編程串行口有4種工作方式:方式0用于IO擴展;方式1~3用于通信。方式0和方式2的波特率是固定的,方式1和方式3的波特率由定時器1的溢出率決定。(1)方式0方式0工作方式下,串行口相當于一個8位的移位寄存器,波特率為晶振的12分頻。P3.0(RXD)為數據的輸入輸出端,P3.1(TXD)為移位寄存器的時鐘脈沖輸出端。接收和發(fā)送數據的順序都是低位在前,高位在后。A、發(fā)送數據:將數據寫入SBUF,串行口將數據以波特率(fosc/12)的速度送入移位寄存器中轉換成串行數據,通過RXD(P3.0)輸入或輸出。TXD(P3.1)作為移位寄存器的同步時鐘輸出。發(fā)送完一幀數據后,硬件置位TI并向單片機申請中斷。執(zhí)行完上訴過程后,若想再發(fā)送數據必須軟件清零TI。B、接收數據:接收數據的前提必須使REN=1。此時串行數據通過RXD接收進入移位寄存器變成并行數據后,存入SBUF中;TXD作為移位寄存器的同步時鐘。接收完一幀數據后,硬件置位RI并向單片機申請中斷。執(zhí)行完上訴過程后,若想再接收數據必須軟件清零RI?!纠?.5.1】硬件電路如圖5.5.5所示(晶振12MHz),RXD接094的D(串行輸入)端,TXD接4096的CLK(時鐘)端。當單片機串行口工作于方式0時,使用CD4094設計一流水燈程序。采用查詢法編程:查詢TI。#include<REGX51.H>unsignedcharnum[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};voiddelay()//延時函數;{unsignedinta=50000;while(a--);}voidmain(){unsignedchari;//定義i;SCON=0x00;while(1){SBUF=num[i++];//將數據寫入SBUF中;delay();//延時;if(i>=8)i=0;//當i大于等于8時,清零i;while(!TI);//等待數據發(fā)送完;其實當延時時間足夠長時,此句可省略,即:等待法。TI=0;//軟件清零TI,準備下一幀數據的發(fā)送。}}采用中斷法編程:#include<REGX51.H>unsignedcharnum[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};voiddelay()//延時函數;{unsignedinta=50000;while(a--);}voidmain(){unsignedchari;//定義i;SCON=0x00;ES=1;//使能串行口中斷;EA=1;//中斷總開關;while(1){SBUF=num[i++];//將數據寫入SBUF中;delay();//延時;if(i>=8)i=0;//當i大于等于8時,清零i;}}voidSerial(void)interrupt4{TI=0;//軟件清零TI,準備下一幀數據的發(fā)送。}【例5.5.2】硬件電路如圖5.5.6所示(晶振12MHz),RXD接4014的Q7端,TXD接4014的串行時鐘信號端CLK,P3.2接4014的P/S方式控制端。當單片機串行口工作于方式0時,擴展8個IO8接個按鍵用于控制對應的LED燈。采用查詢法編程:查詢RI。#include<REGX51.H>sbitPS4014=P3^2;voidmain(){SCON=0x10;while(1){PS4014=1;PS4014=0;while(!RI);RI=0;P2=SBUF; }}4014為并入串出芯片:當P/S=1時,4014的D7~D0的數據將鎖存在內部的寄存器中;當P/S=0時,在CLK作用在,內部寄存器的內容按高位在前低位在后的原則,依次輸出至Q7~Q5。RXD讀取Q7的串行數據,存入SBUF中。(2)方式1方式1下,串行口為一個波特率可調的10位異步串行通信口。10位的幀結構由1位起始位、8位數據位和1位結束位組成。此時的特波率公式如下:其中:SMOD為PCOND的波特率倍頻位,其值只能為1或0;波特波晶振SMOD定時器1初值19200bps11.0592MHz00xfe9600bps11.0592MHz00xfd9600bps11.0592MHz10xfa19200bps22.1184MHz00xfd9600bps22.1184MHz00xfa4800bps22.1184MHz00xf4【例5.5.3】硬件電路如圖5.5.7所示(晶振11.0592MHz),串行口工作于方式1,波特率為9600bps,編寫程序從串口發(fā)送字符“Guilinuniversityofelectronictechnology”。選擇串口仿真模塊VirtualTerminal,并設置波特率為9600bps;仿真中單片機的晶振也應改為11.0592MHz。采用查詢法編程:#include<REGX51.H>unsignedcharnum[]={'G','u','i','l','i','n','','u','n','i','v','e','r','s','i','t','y','','o','f','','e','l','e','c','t','r','o','n','i','c','','t','e','c','h','n','o','l','o','g','y',''};voidINIT()//初始化串口;{TMOD=0x20;//定時計數器1工作于方式2,初值自動重裝;TR1=1;TH1=0xfd;TL1=0xfd;//波特率為9600bpsSCON=0x40;//串行口工作于方式1,REN=0不接收;}voidmain(){unsignedchari;INIT();//調用函數,初始化串口;while(1){for(i=0;i<43;i++)//發(fā)送43個字符;{SBUF=num[i];//將num數組的值傳入SBUF中發(fā)送; while(!TI);//查詢TI是否為1,不為1則等待; TI=0;//TI為1后,軟件清零,準備發(fā)送下一個數據。}while(1);//發(fā)送完43個字符后停止發(fā)送。}}采用中斷法編程:#include<REGX51.H>unsignedcharnum[]={'G','u','i','l','i','n','','u','n','i','v','e','r','s','i','t','y','','o','f','','e','l','e','c','t','r','o','n','i','c','',t','e','c','h','n','o','l','o','g','y',''};voiddelay(unsignedinta){while(a--);}voidINIT(){TMOD=0x20;//設置定時計數器1工作于方式2;TR1=1;TH1=0xfd;TL1=0xfd;//波特率為9600bpsSCON=0x40;//方式1,REN=0;ES=1; //使能串口中斷;EA=1; //中斷總開關開啟。}voidmain(){unsignedchari;INIT();//調用函數,初始化串口;while(1){for(i=0;i<43;i++)//發(fā)送43個字符;{SBUF=num[i];//將num數組的值傳入SBUF中發(fā)送;delay(1000);//延時}while(1);}}voidSerial()interrupt4//串行口中斷服務程序。{TI=0;//TI為1后,軟件清零,準備發(fā)送下一個數據。}(2)方式1方式1下,串行口為一個波特率可調的10位異步串行通信口。10位的幀結構由1位起始位、8位數據位和1位結束位組成。此時的特波率公式如下:【例5.5.4】設單片機晶振12MHz,串行口工作于方式2(odd奇校驗),SMOD=0,波特率為:12M/64bps=19.2Kbps,編寫程序從串口發(fā)送字符“Guilinuniversityofelectronictechnology”。Proteus的串口仿真模塊VirtualTerminal最高波特率為5.76Kbps,接收不到正確數據,只能用Keil仿真。采用查詢法:#include<REGX51.H>unsignedcharnum[]={'G','u','i','l','i','n','','u','n','i','v','e','r','s','i','t','y','','o','f','','e','l','e','c','t','r','o','n','i','c','','t','e','c','h','n','o','l','o','g','y',''};voidINIT()//初始化串口;{SCON=0X80;//串行口工作于方式1,REN=0不接收;}voidmain(){unsignedchari;INIT();//調用函數,初始化串口;while(1){for(i=0;i<43;i++)//發(fā)送43個字符;{ACC=num[i];//將num數組的值傳入SBUF中發(fā)送; TB8=P;//奇校驗; SBUF=ACC; while(!TI);//查詢TI是否為1,不為1則等待; TI=0;//TI為1后,軟件清零,準備發(fā)送下一個數據。}while(1);//發(fā)送完43個字符后停止發(fā)送。}}采用中斷法:#include<REGX51.H>unsignedcharnum[]={'G','u','i','l','i','n','','u','n','i','v','e','r','s','i','t','y','','o','f','','e','l','e','c','t','r','o','n','i','c','','t','e','c','h','n','o','l','o','g','y',''};voiddelay(unsignedinta){while(a--);}voidINIT()//初始化串口;{SCON=0X80;//串行口工作于方式1,REN=0不接收;ES=1;EA=1;}voidmain(){unsignedchari;INIT();//調用函數,初始化串口;while(1){for(i=0;i<43;i++)//發(fā)送43個字符;{ACC=num[i];//將num數組的值傳入SBUF中發(fā)送; TB8=P;//奇校驗; SBUF=ACC; delay(1000);//速度太快,所以加延時以免通信出錯。}while(1);//發(fā)送完43個字符后停止發(fā)送。}}voidSerial()interrupt4{TI=0;//TI為1后,軟件清零,準備發(fā)送下一個數據。}【例5.5.5】硬件電路如圖

溫馨提示

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

評論

0/150

提交評論