《單片機(jī)C語(yǔ)言程序設(shè)計(jì)》課件第五部分 單片機(jī)中斷系統(tǒng)_第1頁(yè)
《單片機(jī)C語(yǔ)言程序設(shè)計(jì)》課件第五部分 單片機(jī)中斷系統(tǒng)_第2頁(yè)
《單片機(jī)C語(yǔ)言程序設(shè)計(jì)》課件第五部分 單片機(jī)中斷系統(tǒng)_第3頁(yè)
《單片機(jī)C語(yǔ)言程序設(shè)計(jì)》課件第五部分 單片機(jī)中斷系統(tǒng)_第4頁(yè)
《單片機(jī)C語(yǔ)言程序設(shè)計(jì)》課件第五部分 單片機(jī)中斷系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩85頁(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)介

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

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

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

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

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

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

voidINIT(void)

{

IT0=0;IT1=1;

EX0=1;EX1=1;

PX0=0;PX1=1;

EA=1;

}

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

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

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

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

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

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

溫馨提示

  • 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)論