單片機原理與應(yīng)用基于匯編、C51與混合編程第7章中斷控制定時計數(shù)器與PCAPWM應(yīng)用_第1頁
單片機原理與應(yīng)用基于匯編、C51與混合編程第7章中斷控制定時計數(shù)器與PCAPWM應(yīng)用_第2頁
單片機原理與應(yīng)用基于匯編、C51與混合編程第7章中斷控制定時計數(shù)器與PCAPWM應(yīng)用_第3頁
單片機原理與應(yīng)用基于匯編、C51與混合編程第7章中斷控制定時計數(shù)器與PCAPWM應(yīng)用_第4頁
單片機原理與應(yīng)用基于匯編、C51與混合編程第7章中斷控制定時計數(shù)器與PCAPWM應(yīng)用_第5頁
已閱讀5頁,還剩84頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

系統(tǒng)擴展設(shè)計及例題的介紹與實際應(yīng)用相結(jié)合,原理圖中給出了各元器件的實際應(yīng)用參數(shù)。在第7-12章中的每一道例題都采用匯編、C51兩種語言分別編程實現(xiàn)。第12章中數(shù)字顯示溫度計、RLC測量儀兩個應(yīng)用實例的電路及程序都通過了驗證。2第7章中斷控制、定時/計數(shù)器及PCA/PWM的應(yīng)用3主要內(nèi)容7.1中斷的概念7.2中斷系統(tǒng)的結(jié)構(gòu)7.3中斷寄存器7.4低壓檢測中斷7.5外部中斷7.6定時/計數(shù)器T0、T1的工作方式7.7定時/計數(shù)器T0、T1的應(yīng)用舉例7.8定時/計數(shù)器T2的工作方式及應(yīng)用7.9PCA/PWM模塊的結(jié)構(gòu)及應(yīng)用47.1中斷的概念1.中斷源及中斷請求中斷請求RETI主程序響應(yīng)中斷中斷服務(wù)子程序返主程序繼續(xù)執(zhí)行主程序中斷請求PC斷點PC斷點對于一個中斷源,中斷請求信號產(chǎn)生一次,CPU中斷一次,而不能出現(xiàn)中斷請求一次,CPU響應(yīng)多次的情況,所以要求中斷信號及時撤除。產(chǎn)生中斷請求的事件,稱為中斷源。STC12C5A60S2單片機有10個中斷源:外部中斷0、定時/計數(shù)器T0、外部中斷1、定時/計數(shù)器T1、串行口1(UART1)、A/D轉(zhuǎn)換、串行口2(UART2)、低壓檢測(LVD)中斷、PCA中斷和SPI中斷。57.1中斷的概念1.中斷源及中斷請求

對突發(fā)事故,做出緊急處理。根據(jù)現(xiàn)場隨時變化的各種參數(shù)、信息,做出實時監(jiān)控。

CPU與外部設(shè)備并行工作,以中斷方式相聯(lián)系,提高工作效率。在多項外部設(shè)備同時提出中斷請求情況下,CPU能根據(jù)輕重

緩急響應(yīng)外設(shè)的中斷請求。

中斷的作用:67.1中斷的概念2.中斷優(yōu)先權(quán)控制3.中斷允許與中斷屏蔽4.中斷響應(yīng)與中斷返回當(dāng)有中斷請求時,如果CPU正在執(zhí)行某一條指令,需要執(zhí)行完當(dāng)前指令后再響應(yīng)中斷,如果正在執(zhí)行RETI,或者是訪問IE、IP寄存器指令時,需要執(zhí)行完當(dāng)前指令后,再執(zhí)行一條指令才響應(yīng)中斷。CPU同一時間只能響應(yīng)一個中斷請求。若同時來了兩個或兩個以上中斷請求,就必須有先有后。

?。。≡谥袛嘞到y(tǒng)中,有一個總中斷使能位控制所有中斷是否允許,另外每個中斷源還有各自的中斷使能位控制該中斷是否允許,只有在總的中斷允許及相應(yīng)中斷也允許時,CPU才能響應(yīng)中斷。另外,當(dāng)有高優(yōu)先級中斷正在響應(yīng)時,也會屏蔽同級中斷和低優(yōu)先級中斷。77.2中斷系統(tǒng)的結(jié)構(gòu)中斷源、中斷請求中斷允許寄存器IE和IE287.3中斷寄存器1.中斷允許寄存器IEIE寄存器的地址為A8H,可進行位尋址D7D6D5D4D3D2D1D0EAELVDEADCESET1EX1ET0EX0CPU的中斷允許控制位,當(dāng)EA=0時,所有的中斷源請求均被屏蔽;當(dāng)EA=1時,允許CPU檢測中斷源的標(biāo)志位。EA的作用使中斷允許形成兩級控制,即各中斷源首先受EA控制,其次還受各中斷源自己的中斷允許控制位控制。低壓檢測中斷允許位。當(dāng)ELVD=0時,禁止低壓檢測中斷;當(dāng)ELVD=1,允許低壓檢測中斷。A/D轉(zhuǎn)換中斷允許位。當(dāng)EADC=0時,禁止A/D轉(zhuǎn)換中斷;當(dāng)EADC=1時,允許A/D轉(zhuǎn)換結(jié)束時中斷。串行口1中斷允許控制位。當(dāng)ES=0時,禁止串行口1中斷;當(dāng)ES=1時,允許串行口1中斷。定時/計數(shù)器T1溢出中斷允許控制位。當(dāng)ET1=0時,禁止T1中斷;當(dāng)ET1=1時,允許T1中斷外部中斷1中斷允許控制位。當(dāng)EX1=0時,禁止外部中斷1中斷;當(dāng)EX1=1時,允許外部中斷1中斷定時/計數(shù)器T0溢出中斷允許控制位。當(dāng)ET0=0時,禁止T0中斷;當(dāng)ET0=1時,允許T0中斷外部中斷0中斷允許控制位。當(dāng)EX0=0時,禁止外部中斷0中斷;當(dāng)EX0=1時,允許外部中斷0中斷97.3中斷寄存器1.中斷允許寄存器IE2IE2的地址為AFH,不能進行位尋址D7D6D5D4D3D2D1D0------ESPIES2SPI串行通信中斷允許位。ESPI=0時,禁止SPI中斷;當(dāng)ESPI=1,允許SPI中斷串行口2中斷允許控制位。當(dāng)ES2=0時,禁止串行口2中斷;當(dāng)ES2=1時,允許串行口2中斷107.2中斷系統(tǒng)的結(jié)構(gòu)STC系列單片機復(fù)位后,IE和IE2寄存器的各位均被清0,即所有中斷源均處于禁止?fàn)顟B(tài),由用戶程序?qū)拇嫫鱅E和IE2相應(yīng)的位置1或清0,實現(xiàn)允許或禁止各中斷源的中斷請求。要改變IE寄存器各控制位的狀態(tài)既可以用字節(jié)操作指令MOVIE,#DATA來實現(xiàn),也可用位操作指令SETB或CLR實現(xiàn)。改變IE2寄存器的各控制位,只能用字節(jié)操作指令來實現(xiàn),如:MOVIE2,#DATA。

117.2中斷系統(tǒng)的結(jié)構(gòu)127.2中斷系統(tǒng)的結(jié)構(gòu)中斷優(yōu)先級控制寄存器IP、IP2和IPH、IP2H137.3中斷寄存器2.中斷優(yōu)先級控制寄存器IP、IP2和IPH、IP2HD7D6D5D4D3D2D1D0PPCAPLVDPADCPSPT1PX1PT0PX0IP寄存器的地址為B8H,可進行位尋址D7D6D5D4D3D2D1D0PPCAHPLVDHPADCHPSHPT1HPX1HPT0HPX0HIPH寄存器的地址為B7H,不能進行位尋址PPCAH、PPCA為PCA中斷優(yōu)先級的高、低位PLVDH、PLVD為低壓檢測中斷優(yōu)先級的高、低位PADCH、PADC為A/D轉(zhuǎn)換中斷優(yōu)先級的高、低位PSH、PS為串行口1中斷優(yōu)先級的高、低位PT1H、PT1為定時/計數(shù)器1中斷優(yōu)先級的高、低位PX1H、PX1為外部中斷1中斷優(yōu)先級的高、低位PT0H、PT0為定時/計數(shù)器T0中斷優(yōu)先級的高、低位PX0H、PX0為外部中斷0中斷優(yōu)先級高、低位147.3中斷寄存器2.中斷優(yōu)先級控制寄存器IP、IP2和IPH、IP2HD7D6D5D4D3D2D1D0------PSPIPS2D7D6D5D4D3D2D1D0------PSPIHPS2HIP2寄存器的地址為B5H,不能進行位尋址IP2H寄存器的地址為B6H,不能進行位尋址PSPIH,PSPI為SPI串行口中斷優(yōu)先級的高、低位PS2H、PS2為串行口2中斷優(yōu)先級的高、低位157.2中斷系統(tǒng)的結(jié)構(gòu)IPH.X、IP.X或IP2H.X、IP2.X為11時為最高優(yōu)先級中斷IPH.X、IP.X或IP2H.X、IP2.X為10時為2級中斷IPH.X、IP.X或IP2H.X、IP2.X為01時為1級中斷IPH.X、IP.X或IP2H.X、IP2.X為00時為最低優(yōu)先級中斷167.3中斷寄存器2.中斷優(yōu)先級控制寄存器IP、IP2和IPH、IP2HD7D6D5D4D3D2D1D0PPCAPLVDPADCPSPT1PX1PT0PX0PPCAPLVDPADCPSPT1PX1PT0PX0------PSPIPS2------PSPIPS2上電復(fù)位后,中斷優(yōu)先級控制寄存器IP、IP2、IPH和IP2H中的各位均為0IP寄存器的內(nèi)容可通過位操作指令或字節(jié)操作指令來改變,而IP2、IPH和IP2H寄存器的內(nèi)容只能通過字節(jié)操作指令來改變。177.3中斷寄存器各中斷源中斷優(yōu)先查詢次序中斷查詢序號中斷源中斷服務(wù)程序的入口地址0INT00003H1T0000BH2INT10013H3T1001BH4URAT10023H5ADC002BH6LVD0033H7PCA003BH8UART20043H9SPI004BH使用C語言編程,中斷查詢次序號就是中斷號當(dāng)幾個中斷源都在同一個優(yōu)先級,其中的幾個中斷源同時產(chǎn)生中斷請求,響應(yīng)中斷的次序取決于內(nèi)部的查詢次序。18中斷處理的流程圖19中斷服務(wù)程序的流程圖

在低優(yōu)先級中斷服務(wù)程序中,保護現(xiàn)場和恢復(fù)現(xiàn)場的過程,不允許高優(yōu)先級的中斷源中斷,以免現(xiàn)場遭到破壞。

20以外部中斷1為例,其中斷服務(wù)處理程序ORG0013H;外部中斷1的入口地址LJMPINT1;在中斷入口處放一條長轉(zhuǎn)移指令……INT1:CLREAPUSHPSWPUSHACCPUSHDPHPUSHDPL……SETBEA……;執(zhí)行中斷任務(wù)CLREA……POPDPLPOPDPHPOPACCPOPPSWSETBEARETI保護現(xiàn)場恢復(fù)現(xiàn)場217.4低壓檢測中斷燒寫程序時可以將P4.6引腳設(shè)置為第二復(fù)位引腳RST2,若燒寫程序時沒有將P4.6引腳設(shè)置為第二復(fù)位引腳RST2,P4.6為低壓檢測中斷引腳EX_LVD----LVD_P4.6ALE_P4.5NA_P4.4----P4SW功能切換寄存器LVD_P4.6

=0時P4.6為低壓檢測中斷引腳EX_LVDLVD_P4.6

=1時P4.6為I/O引腳227.4低壓檢測中斷若燒寫程序時沒有將P4.6引腳設(shè)置為第二復(fù)位引腳RST2,P4.6為低壓檢測中斷引腳EX_LVDD7D6D5D4D3D2D1D0SMODSMOD0LVDFPOFGF1GF0PDIDL電源控制寄存器PCONEX_LVD引腳輸入的電壓低于低壓檢測電壓門檻值1.33V時,LVDF位自動置1請求中斷,注意:上電復(fù)位后,電源控制寄存器PCON中的外部低壓檢測標(biāo)志位LVDF為1,要由軟件清零(注意該位不可位尋址),建議清零后,再讀一次該位,若仍然為1,說明電源還未達到正常值,應(yīng)再次將該位清零,直至檢測到該位為0時再轉(zhuǎn)入正常運行

當(dāng)外部供電電壓產(chǎn)生波動時,無法保證單片機正常工作,可以在單片機的外部低壓檢測中斷服務(wù)程序中保存相關(guān)數(shù)據(jù),避免掉電后數(shù)據(jù)丟失。

237.5外部中斷外部中斷0輸入引腳外部中斷1輸入引腳247.5外部中斷TCON寄存器的地址為88H,可進行位尋址D7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0IT1:外部中斷1觸發(fā)方式選擇位。若IT1=0,引腳輸入低電平信號觸發(fā)中斷;若IT1=1,引腳為下降沿觸發(fā)方式外部中斷1請求中斷標(biāo)志。若外部中斷1輸入引腳產(chǎn)生外部觸發(fā)信號時,硬件將IE1位置1,外部中斷1設(shè)置為下降沿觸發(fā)方式時,CPU響應(yīng)該中斷時由硬件自動將IE1位清0,如果設(shè)置為低電平觸發(fā)方式,必須在程序中通過指令清0外部中斷0觸發(fā)方式選擇位。若IT0=0,引腳輸入低電平信號觸發(fā)外部中斷;若IT0=1,引腳為下降沿觸發(fā)方式外部中斷0請求中斷標(biāo)志。若外部中斷0輸入引腳產(chǎn)生外部觸發(fā)信號時,硬件將IE0位置1,外部中斷0設(shè)置為下降沿觸發(fā)方式時,當(dāng)CPU響應(yīng)該中斷時由硬件自動將IE0清0,如果設(shè)置為低電平觸發(fā)方式,必須在程序中通過指令清0257.5外部中斷IT0IE0IT1IE1注意:如果外部中斷設(shè)置為下降沿觸發(fā)方式時,必須在該外部中斷輸入引腳至少保持1個系統(tǒng)時鐘周期的高電平及1個時鐘周期的低電平,才能保證CPU檢測到該下降沿。同樣,如果外部中斷為低電平觸發(fā),則須在該引腳至少保持2個系統(tǒng)時鐘周期的低電平,這樣才能保證CPU能夠檢測到該低電平信號。267.6定時/計數(shù)器T0、T1的工作方式定時/計數(shù)器T0和T1工作方式寄存器TMOD的地址為89HT1工作方式控制T0工作方式控制計數(shù)、定時方式的選擇位。為0時,定時/計數(shù)器工作在定時方式;為1時,定時/計數(shù)器工作在計數(shù)方式,對外部T0、T1引腳輸入的脈沖計數(shù)定時/計數(shù)器門控方式選擇位M1、M0:定時/計數(shù)器工作方式的選擇位M1M0工作方式00方式001方式110方式211方式3D7D6D5D4D3D2D1D0GATEM1M0GATEM1M027TCON寄存器的地址為88H,可進行位尋址D7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0定時/計數(shù)器T1的溢出中斷標(biāo)志。當(dāng)T1從初值開始加1計數(shù)計滿產(chǎn)生溢出時,由硬件使該位置1。中斷響應(yīng)后由內(nèi)部硬件電路自動清0。定時/計數(shù)器T1的運行控制位。由軟件置位或清0,置位時,定時/計數(shù)器T1開始工作;清0時,T1停止工作。定時/計數(shù)器T0的運行控制位。由軟件置位或清0,置位時,定時/計數(shù)器T0開始工作;清0時,T0停止工作。定時/計數(shù)器T0的溢出中斷標(biāo)志。當(dāng)T0從初值開始加1計數(shù)計滿產(chǎn)生溢出時,由硬件使該位置1,中斷響應(yīng)后由內(nèi)部硬件電路自動清0。7.6定時/計數(shù)器T0、T1的工作方式287.6定時/計數(shù)器T0、T1的工作方式7.6.1方式013位的定時/計數(shù)器的低5位13位的定時/計數(shù)器的高8位輔助寄存器AUXR的T0x12位D7D6D5D4D3D2D1D0T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRST0x12D7D6D5D4D3D2D1D0GATEM1M0GATEM1M0T0和T1工作方式寄存器TMODD7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0T0和T1控制寄存器TCOND7D6D5D4D3D2D1D0GATEM1M0GATEM1M0297.6定時/計數(shù)器T0、T1的工作方式7.6.2方式116位的定時/計數(shù)器的低8位16位的定時/計數(shù)器的高8位307.6定時/計數(shù)器T0、T1的工作方式7.6.3方式2輔助寄存器AUXR的T1x12位D7D6D5D4D3D2D1D0T0x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRST1x12D7WAKED6D5D4D3D2D1D0PCAWAKEUPRXD_PIN_IET1_PIN_IET0_PIN_IELVD_WAKEBRTCLKOT1CLKOT0CLKO喚醒控制寄存器WAKE_CLKOT0、T1工作在方式2時均有可編程時鐘輸出功能,在該模式—P3.4、P3.5作為時鐘輸出引腳CLKOUT0、CLKOUT1。

當(dāng)T0CLKO或T1CLKO位置1后,工作在方式2的T0或T1的溢出將對CLKOUT0或CLKOUT1引腳取反,即輸出的時鐘頻率=T0(或T1)溢出率/2。317.6定時/計數(shù)器T0、T1的工作方式7.6.4方式3327.7定時/計數(shù)器T0、T1的應(yīng)用舉例在應(yīng)用定時/計數(shù)器資源時,按照以下幾個步驟進行:(1)確定工作方式,對方式控制寄存器TMOD賦值D7D6D5D4D3D2D1D0GATEM1M0GATEM1M0(2)根據(jù)要求計算初值并裝入寄存器THx、TLx337.7定時/計數(shù)器T0、T1的應(yīng)用舉例在應(yīng)用定時/計數(shù)器資源時,按照以下幾個步驟進行:(1)確定工作方式,對方式控制寄存器TMOD賦值(2)根據(jù)要求計算初值并裝入寄存器THx、TLx實際定時時間Tc=(M-X)×Tp計數(shù)初值:X=M-(3)根據(jù)需要開放定時/計數(shù)器中斷,即EA、ETx置1(4)啟動定時/計數(shù)器開始工作,即TRx位置1(5)編寫中斷服務(wù)程序或查詢處理方式程序34【例7-1】設(shè)STC12C5A60S2單片機的系統(tǒng)時鐘頻率為12MHz,利用定時/計數(shù)器T0編程實現(xiàn)從P3.4引腳輸出周期為500μs的方波。分析:從P3.4引腳輸出周期為500μs的方波,即只需P3.4每250μs取反一次。由于方式2中有時鐘輸出功能,fosc=12MHz時,最大的定時時間為256μs,滿足250μs的定時要求,選擇定時/計數(shù)器T0工作于方式2。T0x12位置0,初值X=M-=256-250=6,即TH0=TL0=06H。35WAKE_CLKOEQU8FHORG0000H LJMPMAINORG0100HMAIN:MOVSP,#0BFHMOVTMOD,#02H;T0工作在方式2ORLWAKE_CLKO,#01H;T0工作在時鐘輸出方式MOVTH0,#06H;給T0的高8位賦初值MOVTL0,#06H;給T0的低8位賦初值SETBTR0;定時/計數(shù)器T0開始計數(shù)SJMP$END(1)匯編程序:D7D6D5D4D3D2D1D0GATEM1M0GATEM1M0D7D6D5D4D3D2D1D0PCAWAKEUPRXD_PIN_IET1_PIN_IET0_PIN_IELVD_WAKEBRTCLKOT1CLKOT0CLKO36(2)C51程序:#include<STC12C5A.h>/*STC12C5Axx系列單片機片內(nèi)資源的頭文件*/ voidmain(){ TMOD=0x02;//工作在方式2 WAKE_CLKO=(WAKE_CLKO|0x01);//時鐘輸出方式 TL0=0x06;//給T0裝入初值 TH0=0x06; TR0=1;//啟動T0計數(shù) while(1);}37【例7-2】利用STC12C5A60S2單片機的定時/計數(shù)器T0功能,在P1.0引腳輸出周期為2ms的方波,假設(shè)系統(tǒng)時鐘頻率為6MHz,編寫相應(yīng)的程序。分析:若要產(chǎn)生2ms的方波,只需要每1ms對P1.0引腳的輸出取反一次,1ms的定時超過方式2的最大計數(shù)值256,故可采用方式1定時中斷的方式實現(xiàn)。計數(shù)初值X=216-500=65036=1111111000001100B,即TH0=FEH,TL0=0CH初值計算:T0x12位為0,Tp===2μs,計數(shù)次數(shù)N===500(1) 匯編程序:38ORG0000HLJMPMAIN

ORG0100HMAIN:MOVSP,#0BFH;初始化堆棧指針

MOVTMOD,#01H;T0工作在方式1MOVTL0,#0CH;給T0裝入初值MOVTH0,#0FEHSETBEA;開放總中斷SETBET0;T0的溢出中斷允許SETBTR0;T0開始計數(shù)SJMP$ORG000BH;T0的中斷入口地址LJMPT0_INTT0_INT:MOVTL0,#0CH;重新給T0賦初值MOVTH0,#0FEHCPLP1.0;P1.0引腳取反RETI;中斷返回END39(2)C51程序:#include<STC12C5A.h>//STC12C5Axx頭文件sbitP1_0=P1^0;voidmain(){TMOD=0x01;//T0工作在方式1TL0=0x0C; //給T0裝入初值TH0=0xFE;EA=1;//開放總中斷ET0=1;//T0溢出中斷允許TR0=1;//啟動T0計數(shù)while(1);}voidT0_INT()interrupt1//T0中斷服務(wù)程序{TL0=0xC0;//給T0置入初值TH0=0xFE;P1_0=!P1_0;}//對P1.0引腳取反

40【例7-3】設(shè)STC12C5A60S2單片機的系統(tǒng)時鐘頻率為12MHz,編程實現(xiàn)從P1.1引腳輸出周期為1s的方波。分析:根據(jù)題目要求知,P1.1引腳的輸出應(yīng)每隔500ms取反一次,即定時時間為500ms。用一個定時/計數(shù)器無法實現(xiàn),可用定時/計數(shù)器T1進行10ms的定時,然后用寄存器R7對10ms定時中斷次數(shù)計數(shù)50次來實現(xiàn)。定時/計數(shù)器T1定時10ms,選擇對系統(tǒng)時鐘的12分頻模式,T1x12位為0,Tc=10ms,fosc=12MHz,可知計數(shù)次數(shù)N=10000,選擇方式1。初值X=216-10000=55536=D8F0H,則TH1=D8H,TL1=F0H。(1)匯編程序:41ORG0000HLJMPMAINORG001BH;T1的中斷向量入口地址LJMPT1_INTORG0100HMAIN:MOVSP,#0BFH;初始化堆棧指針MOVTMOD,#10H;T1工作在方式1MOVTL1,#0F0H;給T1寫入初值MOVTH1,#0D8HMOVR7,#50;利用寄存器R7計數(shù)50次SETBEA;開放總中斷SETBET1;T1溢出中斷允許SETBTR1;啟動T1開始工作SJMP$T1_INT:MOVTL1,#0F0H;重新賦初值 MOVTH1,#0D8H42DJNZR7,NEXT;R7減1不為0,中斷次數(shù)未到50次,;跳轉(zhuǎn)到NEXT處返回CPLP1.1;已定時中斷50次,P1.1引腳取反MOVR7,#50;重新賦給R7值50NEXT:RETIEND43(2)C51程序:#include<STC12C5A.h>/*STC12C5Axx系列單片機片頭文件*/sbitP1_1=P1^1;unsignedchari=0;voidmain(){TMOD=0x10;//T1工作在方式1TL1=0xF0;//給T1裝入初值TH1=0xD8;EA=1;//開放總中斷ET1=1;//T1溢出中斷允許TR1=1;//啟動T1開始工作while(1);}44

voidT1_INT()interrupt3//T1中斷服務(wù)程序{ TH1=0xD8; TL1=0xF0;//重新置入初值 i++;if(i==50) { P1_1=!P1_1;//已定時中斷50次,對P1.1取反 i=0;}}45【例7-4】用T0作為計數(shù)器計數(shù)一生產(chǎn)流水線上的工件,每生產(chǎn)100個工件,發(fā)出一包裝命令,包裝成一箱,并記錄其箱數(shù),45100個包裝命令46【例7-4】用T0作為計數(shù)器計數(shù)一生產(chǎn)流水線上的工件,每生產(chǎn)100個工件,發(fā)出一包裝命令,包裝成一箱,并記錄其箱數(shù),分析:根據(jù)題目要求,設(shè)單片機的系統(tǒng)時鐘頻率為12MHz,可選擇T0工作在方式2的計數(shù)狀態(tài),每計數(shù)100個工件中斷一次,計數(shù)初值為256-100=156=9CH,在中斷服務(wù)程序中輸出包裝命令。D7D6D5D4D3D2D1D0GATEM1M0GATEM1M0用R4、R5組成16位箱數(shù)計數(shù)器,每中斷一次,對R4、R5組成的計數(shù)器加1。顯示電路及顯示程序在此省略。(1)匯編程序:48ORG0000HLJMPMAINORG000BH;T0的中斷入口地址LJMPT0_INT;轉(zhuǎn)向中斷服務(wù)程序 ORG0100HMAIN:MOVSP,#0AFH;初始化堆棧指針

SETBP1.0;P1.0為高電平MOVR5,#0;箱數(shù)計數(shù)器清“0”MOVR4,#0MOVTMOD,#6;T0工作在方式2的計數(shù)狀態(tài)MOVTL0,#9CH;計數(shù)初值送計數(shù)器MOVTH0,#9CHSETBEA;CPU開放總中斷SETBET0;T0溢出允許中斷SETBTR0;啟動T0計數(shù)

SJMP$

49T0_INT:PUSHPSW;保護現(xiàn)場PUSHACC

CLRP1.0;輸出包裝命令MOVA,R5;箱計數(shù)器加“1”ADDA,#1MOVR5,AMOVA,R4ADDCA,#0MOVR4,A......;延遲5ms,讓包裝命令可靠有效

SETBP1.0;包裝命令結(jié)束POPACC;恢復(fù)現(xiàn)場POPPSWRETI;中斷返回END50(2)C51程序:#include<STC12C5A.h>/*STC12C5Axx系列單片機頭文件*/#include<intrins.h>//聲明本征函數(shù)庫unsignedintj=0;sbitP1_0=P1^0;voidmain(){P1_0=1;//P1.0為高電平TMOD=0x06;//T0工作在方式2的計數(shù)狀態(tài)TL0=0x9C;//給T0置入初值TH0=0x9C;EA=1;//開放總中斷ET0=1;//T0溢出中斷允許TR0=1;//啟動T0開始工作while(1);//等待}51voidT0_INT()interrupt1//中斷服務(wù)程序{j++;

P1_0=0;//P1.0為低電平unsignedchara,b,c;for(c=4;c>0;c--)//延時5msfor(b=212;b>0;b--)for(a=140;a>0;a--)_nop_();

P1_0=1;//P1.0為高電平}52【例7-5】利用定時/計數(shù)器T1門控信號GATE功能,測量P3.3引腳上正脈沖信號的寬度(單位為μs)。INT1INT1為高時T開始計數(shù)INT1為低時T1停止計數(shù)12MHz100111閉合16位計數(shù)保存到R6R700計數(shù)值

即μs數(shù)寬度≤65ms53(1)匯編程序:ORG0000HLJMPMAIN ;跳到主程序入口ORG0100HMAIN:MOVSP,#0BFH;初始化堆棧指針SPMOVTMOD,#90H;方式1,GATE、TR1控制T1MOVTL1,#00H ;計數(shù)器初值為0MOVTH1,#00HWAITL:JBP3.3,WAITL ;若P3.3引腳為高電平,則等待,SETBTR1 ;當(dāng)P3.3引腳為低電平時,置位TR1WAITH:JNBP3.3,WAITH ;等待P3.3引腳變高電平WAITHL:JBP3.3,WAITHL;等待P3.3引腳的下降沿CLRTR1 ;下降沿到來,關(guān)閉定時/計數(shù)器T1MOVR6,TH1;測量結(jié)束,讀取數(shù)據(jù)MOVR7,TL1SJMP$END54(2)C51程序:#include<STC12C5A.h>//STC12C5Axx系列單片機頭文件sbitP3_3=P3^3;unsignedinttemp=0;voidmain(){TMOD=0x90;//T1工作在方式1

TH1=0x00;//計數(shù)器初值為0TL1=0x00;while(P3_3==1);//P3.3為高電平時,等待TR1=1; //P3.3為低電平時,啟動T1工作while(P3_3==0);//P3.3為低電平時,等待while(P3_3==1);//P3.3為高電平時,等待TR1=0;//P3.3出現(xiàn)下降沿時,T1停止工作temp=TH1;//讀出定時/計數(shù)器T1的值temp=(temp<<8)|TL1;while(1);}557.9PCA/PWM模塊的結(jié)構(gòu)及應(yīng)用在STC12Cxx、STC15Fxx等各系列單片機中,沒有定時/計數(shù)器T2,而是增加了2-4路可編程計數(shù)器陣列(PCA)模塊每個PCA模塊均可以設(shè)置為4種工作模式:邊沿觸發(fā)捕獲、時鐘輸出、軟件定時及脈寬調(diào)制(PWM)輸出本節(jié)主要以具有2路可編程計數(shù)器陣列的STC12C5A60S2單片機為例介紹PCA/PWM模塊567.9.1PCA/PWM模塊的結(jié)構(gòu)由CL、CH兩個8位寄存器組成PCA單元電路內(nèi)的兩個模塊共用一個16位的定時/計數(shù)器(CH和CL)作為公共時間基準(zhǔn)

577.9.2PCA16位定時/計數(shù)器由CL、CH兩個8位寄存器組成,其地址分別為0E9H、0F9HPCA方式寄存器CMOD設(shè)定其工作方式PCA控制寄存器CCON控制其工作587.9.2PCA16位定時/計數(shù)器由CL、CH兩個8位寄存器組成,其地址分別為0E9H、0F9HPCA方式寄存器CMOD設(shè)定其工作方式PCA控制寄存器CCON控制其工作CIDL:空閑模式下是否停止PCA計數(shù)的控制位CIDL=0空閑模式下PCA計數(shù)器繼續(xù)工作CIDL=1空閑模式下PCA計數(shù)器停止工作PCA計數(shù)器溢出中斷使能位ECF=0禁止計數(shù)器溢出中斷ECF=1允許計數(shù)器溢出中斷PCA計數(shù)器的時鐘來源由CPS2、CPS1、CPS0三位控制單片機是否處于空閑模式597.9.2PCA16位定時/計數(shù)器由CL、CH兩個8位寄存器組成,其地址分別為0E9H、0F9HPCA方式寄存器CMOD設(shè)定其工作方式PCA控制寄存器CCON控制其工作單片機是否處于空閑模式PCA計數(shù)器溢出中斷標(biāo)志位PCA計數(shù)器啟動控制位CCF1、CCF0:PCA模塊1及模塊0的中斷標(biāo)志位607.9.2PCA16位定時/計數(shù)器1.PCA工作方式寄存器CMOD地址為D9H計數(shù)器的時鐘來源CPS2CPS1CPS0計數(shù)器的時鐘源000fosc/12(系統(tǒng)時鐘12分頻)001fosc/2010定時/計數(shù)器T0的溢出脈沖011ECI(P1.2)引腳輸入的外部時鐘100fosc101fosc/4110fosc/6111fosc/82.PCA控制寄存器CCON地址為D8H,可以進行位尋址617.9.3PCA/PWM各個模塊的特殊功能寄存器1.PCA各模塊的工作方式寄存器CCAPM0和CCAPM1地址分別為DAH和DBH627.9.3PCA/PWM各個模塊的特殊功能寄存器D7D6D5D4D3D2D1D0-ECOMnCAPPnCAPNnMATnTOGnPWMnECFFn比較器允許/禁止控制位,ECOMn=1時有效1.PCA各模塊的工作方式寄存器CCAPM0和CCAPM1地址分別為DAH和DBH上升沿捕獲允許/禁止控制位,CAPPn=1時允許下降沿捕獲允許/禁止控制位,CAPNn=1時允許匹配允許/禁止控制位,MATn=1時允許反轉(zhuǎn)允許/禁止控制位,TOGn=1時允許脈沖寬度調(diào)制允許/禁止位,PWMn=1時允許模塊n中斷使能位,ECFFn=1時,允許模塊n的CCFn標(biāo)志位被置1后產(chǎn)生中斷。637.9.3PCA/PWM各個模塊的特殊功能寄存器2.PCA各模塊的比較/捕獲寄存器—CCAPnL(低位字節(jié))CCAPnH(高位字節(jié))地址分別為:CCAP0L:EAH;CCAP0H:FAH;CCAP1L:EBH;CCAP1H:FBH647.9.3PCA/PWM各個模塊的特殊功能寄存器3.PCA模塊中PWM方式輔助寄存器PCA_PWM0和PCA_PWM1地址分別為F2H和F3H657.9.3PCA/PWM各個模塊的特殊功能寄存器3.PCA模塊中PWM方式輔助寄存器PCA_PWM0和PCA_PWM1地址分別為F2H和F3HD7D6D5D4D3D2D1D0------EPCnHEPCnL在PWM方式下,與CCAPnH組成9位數(shù),EPCnH為最高位在PWM方式下,與CCAPnL組成9位數(shù),EPCnL為最高位由CL、CH兩個8位寄存器PCA方式寄存器CMODPCA控制寄存器CCON工作方式寄存器:CCAPM0和CCAPM1比較/捕獲寄存器CCAPnL和CCAPnHPWM方式輔助寄存器PCA_PWM0和PCA_PWM1677.9.4PCA/PWM模塊的工作方式及應(yīng)用1.捕獲方式11100000可在中斷服務(wù)程序中判斷哪一個模塊產(chǎn)生了中斷,注意中斷標(biāo)志位必須由軟件清零68【例7-7】采用STC12C5A60S2單片機PCA的捕獲方式測量低頻矩形波的周期及占空比,假設(shè)系統(tǒng)時鐘頻率為12MHz。PCA的模塊0輸入引腳P1.3作為信號輸入端剛開始測量時為高電平,需要等待檢測到為低電平時需要繼續(xù)等待PULSE_W1EQU51H;保存CH值PULSE_W2EQU52H;保存CL值;脈寬計時PULSE_T1EQU54H;保存CH值PULSE_T2EQU55H;保存CL值;周期計時如果脈寬大于CH、CL的最大計時周期該怎么辦?PULSE_W0EQU50H;脈寬計時最高字節(jié)PULSE_T0EQU53H;周期計時最高字節(jié)69(1)匯編程序:CCONEQU0D8H;PCA控制寄存器CMODEQU0D9H;PCA模式寄存器CLEQU0E9H;PCA定時/計數(shù)器的低8位CHEQU0F9H;PCA定時/計數(shù)器的高8位CCAPM0EQU0DAH;PCA模塊0的模式寄存器CCAP0LEQU0EAH;PCA模塊0的捕獲寄存器低8位CCAP0HEQU0FAH;PCA模塊0的捕獲寄存器的高8位CRBITCCON.6;PCA定時控制位CFBITCCON.7;PCA溢出標(biāo)志位CCF0BITCCON.0;PCA模塊0的中斷標(biāo)志位70PULSE_W0EQU50H;脈寬計時的最高字節(jié)PULSE_W1EQU51HPULSE_W2EQU52H;脈寬計時的最低字節(jié)PULSE_T0EQU53H;周期計時的最高字節(jié)PULSE_T1EQU54HPULSE_T2EQU55H;周期計時的最低字節(jié)ORG0000HLJMPMAINORG003BH;PCA中斷入口地址LJMPPCA_INT71ORG0100HMAIN:MOVSP,#0BFH;初始化堆棧指針CLRAMOVCL,A;PCA計數(shù)寄存器清0MOVCH,AMOVPULSE_W0,AMOVPULSE_T0,AMOVCCON,A;初始化PCA控制寄存器MOVCMOD,#01H;系統(tǒng)時鐘的12分頻為PCA時鐘源,;允許PCA計數(shù)器溢出中斷MOVCCAPM0,#31H;允許上升沿、下降沿捕獲中斷SETBP1.3NOP;等待P1.3引腳輸出穩(wěn)定NOPNOPNOPD7D6D5D4D3D2D1D0CFCR----CCF1CCF0D7D6D5D4D3D2D1D0CIDL---CPS2CPS1CPS0ECFD7D6D5D4D3D2D1D0-ECOMnCAPPnCAPNnMATnTOGnPWMnECCFn72WAIT1:JBP1.3,WAIT1;若P1.3引腳處在高電平,則等待低電平WAIT2:JNBP1.3,WAIT2;若P1.3引腳為低,則等待上升沿SETBCR;上升沿到來,啟動16位定時/計數(shù)器工作CLRCF;清中斷標(biāo)志CLRCCF0NOPSETBEA;開放總中斷SJMP$73PCA_INT:PUSHPSWCLRCF;清溢出中斷標(biāo)志JNBP1.3,PLUSET;P1.3引腳為低PLUSET:INCPULSE_T0;周期高字節(jié)加1CAP_CCF0:JNBCCF0,EXIT;無邊沿觸發(fā),退出CLRCCF0;清邊沿觸發(fā)中斷標(biāo)志JBP1.3,CAP_UP;上升沿捕獲,結(jié)束MOVPULSE_W2,CCAP0L;是下降沿捕獲,MOVPULSE_W1,CCAP0H;脈寬計時讀出LJMPEXITJNBCF,CAP_CCF0;如果不是計數(shù)器溢出,則轉(zhuǎn)移INCPULSE_W0;為高,脈寬高字節(jié)加1CAP_UP:CLRCR;一個周期檢測結(jié)束,計數(shù)器停止工作MOVPULSE_T2,CCAP0L;將一個周期寬度讀出來MOVPULSE_T1,CCAP0H74……;計算部分略EXIT:POPPSWRETIEND75(2)C51程序:#include<STC12C5A.h>//STC12C5Axx系列單片機頭文件#include<intrins.h>//聲明本征函數(shù)庫#defineucharunsignedcharsbitP1_3=P1^3;ucharPULSE_W0,PULSE_W1,PULSE_W2,PULSE_T0,PULSE_T1,PULSE_T2;voidmain(){CL=0x00;//計數(shù)器初值復(fù)位CH=0x00;CCON=0x00;CMOD=0x01;//選擇時鐘源為12分頻,允許計數(shù)溢出中斷CCAPM0=0x31;//允許上升沿、下降沿捕獲中斷76P1_3=1;_nop_();//等待P1.3引腳輸出穩(wěn)定_nop_();_nop_();_nop_();while(P1_3==1);//若P1.3引腳為高,則等待低電平while(P1_3==0);//若P1.3引腳為低,則等待上升沿CR=1;//檢測到P1.3引腳為上升沿,啟動計數(shù)器工作CF=0;//清溢出中斷標(biāo)志CCF0=0;//清捕獲中斷標(biāo)志_nop_();EA=1;//開放總中斷while(1);}77voidPCA_INT()interrupt7{if(CF==1)//若計數(shù)器溢出{

CF=0;//清溢出標(biāo)志CFif(P1_3==1)//P1.3引腳為高電平時{PULSE_W0++;//脈寬計數(shù)的最高字節(jié)加1PULSE_T0++;//周期計數(shù)的最高字節(jié)加1}elsePULSE_T0++;//P1.3引腳為低,只對周期最高字節(jié)加1}78if(CCF0==1)//若捕獲中斷溢出{CCF0=0;//清捕獲中斷標(biāo)志CCF0if(P1_3==0)//檢測到P1.3引腳為下降沿捕獲時{PULSE_W2=CCAP0L;//讀出脈沖寬度PULSE_W1=CCAP0H;}{CR=0;PULSE_T2=CCAP0L;

溫馨提示

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

最新文檔

評論

0/150

提交評論