版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
項目三電子鐘的設(shè)計能力目標1、能夠使用單片機的定時/計數(shù)器實現(xiàn)定時、計數(shù)等應(yīng)用。2、能夠完成電子鐘硬件電路與控制程序的設(shè)計、制作與調(diào)試。知識目標1、了解單片機定時器/計數(shù)器的內(nèi)部結(jié)構(gòu)。2、掌握單片機定時器的各種工作方式及特點、應(yīng)用場合。3、掌握定時器中斷服務(wù)程序的編寫。項目三電子鐘的設(shè)計1任務(wù)一、認識單片機的定時器/計數(shù)器一、定時器/計數(shù)器及其應(yīng)用在單片機應(yīng)用系統(tǒng)中,定時或計數(shù)是必不可少的。例如:測量一個脈沖信號的頻率、周期,或者統(tǒng)計一段時間里電機轉(zhuǎn)動了多少圈等。常用的定時方法有:1、軟件定時軟件定時是依靠執(zhí)行一段程序來實現(xiàn)的,這段程序本身沒有具體的意義,通過選擇恰當?shù)闹噶罴把h(huán)次數(shù)實現(xiàn)所需的定時,由于執(zhí)行每條指令都需一定的時間,執(zhí)行這段程序所需總的時間就是定時時間。軟件定時的特點是無需硬件電路,但定時期間CPU被占用,增加了CPU的開銷,因此定時時間不宜過長,而且定時期間如果發(fā)生中斷,定時時間就會出現(xiàn)誤差。任務(wù)一、認識單片機的定時器/計數(shù)器一、定時器/計數(shù)器及其應(yīng)用23、可編程定時器定時這種定時方法是通過對系統(tǒng)時鐘脈沖的計數(shù)來實現(xiàn)的。通過程序來設(shè)置計數(shù)初值,改變計數(shù)初值也就改變了定時時間,使用起來非常靈活。由于定時器可以與CPU并行工作,因此不影響CPU的效率,且定時時間精確。2、硬件定時
硬件定時通常由小規(guī)模集成電路555外加電阻、電容構(gòu)成,電路簡單,不占CPU資源,但定時時間的調(diào)節(jié)不夠靈活方便。單片機電子鐘設(shè)計課件3(一)定時器/計數(shù)器概述在51系列單片機中有兩個16位的加法計數(shù)器,分別叫做T0和T1。在計數(shù)脈沖的作用下,其計數(shù)值不斷加1,在此過程中,計數(shù)器可能產(chǎn)生溢出,產(chǎn)生溢出后,可以向CPU發(fā)出中斷請求。如果計數(shù)脈沖來自系統(tǒng)時鐘,稱之為“定時器”,每個機器周期計數(shù)器加1;如果計數(shù)脈沖來自外部電路,稱之為“計數(shù)器”一旦計數(shù)器產(chǎn)生溢出,TF0變?yōu)?,向CPU發(fā)出中斷請求(一)定時器/計數(shù)器概述如果計數(shù)脈沖來自系統(tǒng)時鐘,稱之為“定4二、定時器/計數(shù)器的控制寄存器
1、定時器控制寄存器TCONTF0/TF1:定時器/計數(shù)器T1和T0的溢出中斷標志。為1,表示定時器/計數(shù)器的計數(shù)值已由全1變?yōu)槿?,正向CPU發(fā)中斷請求。TR0/TR1:定時器/計數(shù)器T0和T1的啟??刂莆唬簽?時,定時器/計數(shù)器停止工作;為1時,啟動定時器/計數(shù)器工作。
二、定時器/計數(shù)器的控制寄存器
1、定時器控制寄存器TCON52、定時方式寄存器TMOD
選擇定時/計數(shù)器的工作方式,M1M0=00,方式001,方式110,方式211,方式3定時方式/計數(shù)方式的選擇控制位。為0,選定時方式,計數(shù)脈沖來自系統(tǒng)時鐘的12分頻;為1,選計數(shù)方式,計數(shù)脈沖來自外部電路當GATE=0時,只要TR0=1,與門的輸出就為1,計數(shù)開始。如果GATE為1,只有TR0=1,并且/INT0=1時,才允許計數(shù)。2、定時方式寄存器TMOD選擇定時/計數(shù)器的工作方式,M16C/T=0,選擇定時方式C/T=1,選擇計數(shù)方式GATE=0時,由TR0控制計數(shù)器啟停GATE=1時,由TR0和INT0一同控制啟停TR0=1時,啟動定時器定時器溢出時,TF0置1C/T=0,選擇定時方式C/T=1,選擇計數(shù)方式GATE=07三、T0、T1的工作方式1、方式0方式0的計數(shù)器由13位構(gòu)成,其中高8位在TH中,低5位在TL中。當計數(shù)器產(chǎn)生溢出時,TF位被置1,向CPU發(fā)出中斷請求。在方式0下,計數(shù)器產(chǎn)生溢出時,不能進行初始計數(shù)值的自動重裝(有關(guān)自動重裝的問題參見方式2),所以方式0不能用于精確定時。方式0的所有功能都可以用方式1代替,方式0的存在,是因為兼容早期的MCS-48單片機的原因,所以一般不使用方式0。三、T0、T1的工作方式1、方式082、方式1方式1與方式0工作形態(tài)基本相同,只是方式1的計數(shù)器由16位構(gòu)成,其中高8位在TH中,低8位在TL中,當計數(shù)器產(chǎn)生溢出時,TF位被置1,向CPU發(fā)出中斷請求。在方式1下,計數(shù)器產(chǎn)生溢出時,也不能進行初始計數(shù)值的自動重裝所以方式1也不能用于精確定時。2、方式193、方式2方式2是可以自動重裝的工作方式:初始化時一般將8位計數(shù)初值同時放入TH、TL中,其中,TH存放的是初值的備份,TL用來計數(shù),當8位計數(shù)器TL產(chǎn)生溢出時,除了可以向CPU發(fā)中斷請求外,單片機的硬件部分還立即把TH中的備份送入TL中。由于重新賦值是硬件自動進行的,所以避免了重新賦值的時間不一,所以方式2可以用于精確定時。3、方式2104、方式3
T1經(jīng)常用于串行口的波特率發(fā)生器,為了讓系統(tǒng)中保持兩個計數(shù)器,可以讓T0工作在方式3,這時,T0被分成兩個8位計數(shù)器,分別位于TH0和TL0中,其中TL0使用T0的中斷、啟動控制資源,而TH0則借用T1的中斷、啟動控制資源,而且TH0只能工作在定時方式下,不能工作在計數(shù)方式下。4、方式311(四)時間常數(shù)的計算如果單片機需要進行周期性的工作,就應(yīng)該讓定時器/計數(shù)器T0或T1工作在定時方式,并且給T0或T1賦以一個初始計數(shù)值,在T0或T1被啟動后,每個機器周期使計數(shù)器中的計數(shù)值加1,計數(shù)器產(chǎn)生溢出后,將再次給計數(shù)器賦值(該值被稱為時間常數(shù))。顯然計數(shù)器溢出時間(又稱定時時間)與時間常數(shù)直接相關(guān):時間常數(shù)越大,定時時間就越短;時間常數(shù)越小,定時時間就越長。同時系統(tǒng)時鐘的頻率也直接影響定時時間的長短,時鐘的頻率越高,定時時間越短;時鐘的頻率越低,定時時間越長。(四)時間常數(shù)的計算12設(shè)系統(tǒng)時鐘的頻率為fosc,計數(shù)器的初始值為N,定時器工作于方式1,則定時時間:
T=(216-N)×12/fosc(1)如果定時器工作于方式2或方式3,定時時間為:
T=(28-N)×12/fosc(2)
當初始值N=0時,如果fosc=12MHZ,最大定時時間為:方式1為:Tmax=216×12/fosc=65536us=65.536ms方式2、方式3為:Tmax=28×12/fosc=256us根據(jù)定時時間T,及公式(1)、(2)分別可以求出初值N為:方式1:N=216-T×fosc/12(3)方式2、方式3:N=28-T×fosc/12(4)如果fosc=12MHZ,以上公式可簡化為方式1:N=216-T
方式2、方式3:N=28-T設(shè)系統(tǒng)時鐘的頻率為fosc,計數(shù)器的初始值為N,13
例如:系統(tǒng)的時鐘頻率是12MHz,在方式1下,如果希望定時器/計數(shù)器T0的定時時間T為10ms,則初值N=216-T=65536-10000=55536如何將55536給兩個8位寄存器TH0、TL0賦值呢?可將十進制數(shù)55536轉(zhuǎn)換成四位十六進制數(shù),將高2位送TH0,低2位送TL0。更簡單的方法是:對于16位計數(shù)器來講,216等效為0,對于8位計數(shù)器,28等效為0,這樣公式(3)、(4)可簡化為N=-T,直接用下面兩條語句就可以完成計數(shù)器初值的設(shè)置:TH0=-10000/256;//取-N的高8位TL0=-10000%256;//取-N的低8位
例如:設(shè)系統(tǒng)的時鐘頻率是12MHz,定時器工作于方式2,定時時間200us。根據(jù)前面分析,N=-T=-200,可直接用以下語句實現(xiàn):TH0=-200;TL0=-200;例如:系統(tǒng)的時鐘頻率是12MHz,在方式1下,如14任務(wù)二、定時器應(yīng)用[案例1]設(shè)時鐘頻率fosc=12MHz,用定時器T0在P1.0腳產(chǎn)生頻率為20Hz的方波。
設(shè)計思想:在使用定時器/計數(shù)器時,首先應(yīng)根據(jù)要求對工作方式進行初始化,然后計算出初始值。初始化的步驟通常是:
(1)向TMOD寄存器寫入工作方式控制字。
(2)將計數(shù)器的初值寫入TH0、TL0/TH1、TL1。
(3)啟動定時器/計數(shù)器:將TR0/TR1置1。(4)如果采用中斷方式,還應(yīng)將ET0/ET1、EA置1。
任務(wù)二、定時器應(yīng)用[案例1]設(shè)時鐘頻率fosc=15本題中,方波的頻率為20HZ,對應(yīng)的周期為50ms,如果將定時時間設(shè)置為25ms,每隔25ms將P1.0腳取反即可產(chǎn)生如圖3-3所示的方波。因為定時時間為25ms,如果采用方式2或方式3,其定時的最大時間不超過256us,因此選方式1比較恰當,根據(jù)前面的分析,計數(shù)器初值N=-25000。本例題是定時而非計數(shù),且無需腳參與啟停控制,故C/=0,GATE為0,這樣TMOD取0x01。本題中,方波的頻率為20HZ,對應(yīng)的周期為50m16voidmain(void){TMOD=0x01; TH0=-25000/256; TL0=-25000%256;TR0=1; ET0=1; EA=1; while(1);}voidtimer0(void)interrupt1{TH0=-25000/256; TL0=-25000%256;P10=~P10;}T0工作于定時方式1定時時間為25ms啟動定時器T0允許定時器T0中斷單片機開中斷定時器T0中斷服務(wù)程序重新裝入時間常數(shù)P1.0求反voidmain(void)T0工作于定時方式1定時時間為17[案例2]如圖所示,P0口接8只發(fā)光二極管,編程使發(fā)光管輪流點亮,點亮?xí)r間為500ms,要求使用定時器T0來控制,設(shè)晶振為12MHz[案例2]如圖所示,P0口接8只發(fā)光二極管,編程使發(fā)18
設(shè)計思想
我們可將P0口的初值設(shè)置為0xFE,對應(yīng)于發(fā)光管D1亮,每隔500ms將P0的值循環(huán)左移一位,這一周期性的定時作業(yè)用T0來完成。當時鐘頻率為12MHZ時,在定時器的4種工作方式中,方式1的最大溢出時間最長,但即使在方式1,最大的溢出時間也只有65.536ms,所以我們不能在每次中斷時都執(zhí)行上述移位操作,可以這樣處理:將定時器T0的溢出時間設(shè)定為50ms,累計滿10次中斷正好500ms,才允許程序執(zhí)行1次移位動作,設(shè)計思想19
主函數(shù)ucharcount=0;//50ms定時中斷次數(shù)計數(shù)器voidmain(void){led=0xfe;TMOD=0x01;//T0工作于方式1TH0=-50000/256;//定時時間為50msTL0=-50000%256;ET0=1;//允許T0中斷TR0=1;//啟動T0定時EA=1;//CPU開中斷while(1);}主函數(shù)20voidtime0(void)interrupt1{TH0=-50000/256;TL0=-50000%256;count++;if(count==10){count=0;led=_crol_(led,1);P0=led;}}定時器T0中斷服務(wù)程序重新裝入時間常數(shù)每中斷一次,計數(shù)器加110次中斷為0.5秒滿10次變量led左移1位送P0口voidtime0(void)interrupt1定21[案例3]用定時器的計數(shù)方式實現(xiàn)外部中斷。如圖所示,P0口控制8只發(fā)光管輪流點亮,發(fā)光管點亮?xí)r間為500ms,單脈沖電路控制發(fā)光管的移動方向,按下單脈沖按鈕,發(fā)光管左移,再按下發(fā)光管右移。[案例3]用定時器的計數(shù)方式實現(xiàn)外部中斷。如圖所示,22設(shè)計思想:當定時器/計數(shù)器工作于計數(shù)方式2時,如果將計數(shù)器的初值設(shè)置為全1,只要在計數(shù)輸入端(T0或T1)送入一個計數(shù)脈沖,就可使計數(shù)器產(chǎn)生溢出中斷。如果將外部中斷請求作為計數(shù)脈沖輸入,就可利用計數(shù)中斷的名義去完成外部中斷服務(wù)。當應(yīng)用中外部中斷請求較多時,而單片機內(nèi)部的定時器/計數(shù)器還有富余時,可采用這種方法來擴展外部斷。因此本例的實質(zhì)是將定時器的計數(shù)輸入端T1擴展為外部中斷請求輸入,來控制發(fā)光管的移動方向。
設(shè)計思想:23具體方法:
1、初始化定時器/計數(shù)器T1計數(shù)工作方式2,即每次溢出中斷后能自動裝入計數(shù)初值。2、計數(shù)器TH1、TL1的初值預(yù)置為0FFH。3、程序中設(shè)置一個位變量,每當計數(shù)器T1產(chǎn)生溢出中斷時求反,發(fā)光管左移還是右移取決于該變量是0還是1。具體方法:1、初始化定時器/計數(shù)器T1計數(shù)24
voidmain(void){DIR=0;led=0xfe;TMOD=0x61;TH0=-50000/256;TL0=-50000%256;TH1=0xff; TL1=0xff;ET0=1;ET1=1; TR0=1;TR1=1; EA=1;while(1);}T0為定時方式0,T1為計數(shù)方式2定時時間為50msT1的初值為0xff允許T0、T1中斷啟動T0定時啟動T1計數(shù)CPU開中斷voidmain(void)T0為定時方式0,T1為計數(shù)25
voidtime0(void)interrupt1{TH0=-50000/256;TL0=-50000%256;count++;if(count==10){count=0; if(DIR==1) led=_crol_(led,1); else led=_cror_(led,1); P0=led;}}重新裝入時間常數(shù)滿10次為0.5秒計數(shù)器清0DIR為1左移DIR為0右移每中斷一次,計數(shù)器加1定時器T0中斷服務(wù)程序voidtime0(void)interrupt126
voidtime1(void)interrupt3{DIR=~DIR; }每次按下按鈕產(chǎn)生T1的溢出中斷,將DIR求反定時器T1中斷服務(wù)程序voidtime1(void)interrupt327[案例4]用定時器來控制數(shù)碼管的動態(tài)顯示。設(shè)計思想:
前面我們介紹LED動態(tài)顯示程序時,每一位點亮后都需延時1ms左右,由于使用的是軟件延時,大大降低了CPU的效率,而且當CPU因處理某件事務(wù)在一段時間內(nèi)無法調(diào)用顯示程序時,LED顯示器將會出現(xiàn)黑屏或產(chǎn)生閃爍現(xiàn)象。用定時器控制數(shù)碼管的動態(tài)顯示的方法:設(shè)定時器的定時時間為1ms,每次產(chǎn)生溢出中斷,就根據(jù)位選變量bsel(主程序中將其初值設(shè)置為0xfe)送位選口,點亮一位數(shù)碼管,并將bsel左移一位,為下一位的顯示做好準備,4次定時中斷分別完成4位數(shù)碼管的顯示,之后將bsel的值再次初始化為0xfe,準備下一輪顯示。
因此這種顯示方式由定時中斷自動完成,無需在主程序中調(diào)用。[案例4]用定時器來控制數(shù)碼管的動態(tài)顯示。28主程序ucharbsel,n;voidmain(void){n=0;bsel=0xfe;//首先顯示數(shù)碼管的最低位TMOD=0x01;//T0工作于定時方式2TH0=-1000/256;//T0的定時時間為1000usTL0=-1000%256;ET0=1;//允許T0中斷TR0=1;//啟動定時EA=1;//開中斷while(1);}主程序29voidtime0(void)interrupt1{TH0=-1000/256;TL0=-1000%256;P0=0xff;P2=bsel;P0=segtab[dbuf[n]];bsel=_crol_(bsel,1);n++; if(n==4) {n=0; bsel=0xfe; }}重新裝入時間常數(shù)定時器T0中斷服務(wù)程序熄滅數(shù)碼管,防止上一位字符在當前位置顯示出來。點亮當前位根據(jù)顯示緩存查字段碼準備顯示下一位指向下一位要顯示的數(shù)據(jù)如果四位已顯示完,重新從最低位開始voidtime0(void)interrupt130[案例5]如圖3-8所示,設(shè)計一個電子秒表,每隔一秒加1,用三位數(shù)碼管顯示秒表的當前值(0-255),單脈沖按鍵用于啟動、停止、清0控制,第一次按下該按鍵時啟動秒表,第二次按鍵將暫停秒表,第三次按鍵將秒表清0,設(shè)置晶振頻率為12MHZ。[案例5]如圖3-8所示,設(shè)計一個電子秒表,每31設(shè)計思想:我們可用一個變量記錄秒表的當前值,為了提高秒表精度,我們可令定時器T0工作于定時方式2,定時時間為250us,4000次溢出中斷正好滿1秒,讓變量加1,同時將該變量轉(zhuǎn)換為三位BCD碼送到顯示緩存,供顯示程序顯示。單脈沖直接和外部中斷0的輸入端INT0相連,每次按鍵產(chǎn)生中斷請求,程序中設(shè)置一個變量,對按鍵動作進行計數(shù),取值為1-3,分別對應(yīng)于啟動、停止和清0,程序根據(jù)該變量的值進行相應(yīng)的控制。設(shè)計思想:32主程序voidmain(void){count=0;sec=0;mode=0;IT0=1; //外部中斷負跳變觸發(fā)EX0=1;//允許外部中斷0中斷TMOD=0x02;//T0工作于定時方式2TH0=-250;//T0的定時時間為250usTL0=-250;ET0=1;//允許T0中斷TR0=0;//停止定時器EA=1;//開中斷while(1)disp();}主程序33定時器T0中斷服務(wù)程序voidtime0(void)interrupt1{count++;//中斷次數(shù)加1if(count==4000){count=0; sec++; dbuf[2]=sec/100;//將秒數(shù)計換成三位BCD碼dbuf[1]=(sec%100)/10;dbuf[0]=sec%10;}}定時器T0中斷服務(wù)程序34voidint0(void)interrupt0{mode++; //每次產(chǎn)生中斷,mode加1if(mode==1) //mode為1,啟動定時器工作TR0=1;elseif(mode==2)//如果mode等于2,停止定時器工作TR0=0;elseif(mode==3)//如果mode為3,{mode=0;TR0=0;sec=0; //將秒計數(shù)器清0 dbuf[0]=0;dbuf[1]=0; dbuf[2]=0; } }外部中斷0中斷服務(wù)程序voidint0(void)interrupt0外部35[案例6]用單片機演奏歌曲《蘭花草》
設(shè)計思想:單片機可以根據(jù)音符產(chǎn)生不同頻率的脈沖信號,經(jīng)驅(qū)動后來控制蜂鳴器,讓蜂鳴器產(chǎn)生與音符相應(yīng)的聲音,再把它們有機地組合起來,就可以發(fā)出一段音樂。[案例6]用單片機演奏歌曲《蘭花草》設(shè)計思想:單36
1、要產(chǎn)生與某音符相應(yīng)的脈沖信號,只要算出該音頻的頻率和周期,然后將該周期除2,即為半周期的時間。將定時器的定時時間設(shè)定為這半周期時間,一旦定時器溢出,就將P1.6腳求反,這樣就能產(chǎn)生與音符頻率對應(yīng)的脈沖信號。設(shè)單片機定時器工作在定時方式1,改變時間常數(shù)TH0、TL0就可以產(chǎn)生與各種音符頻率相應(yīng)的脈沖信號。
設(shè)要產(chǎn)生的頻率為fr,單片機機器周期的頻率為fi,則對應(yīng)定時器時間常數(shù)為N。N=65536-fi÷2÷fr1、要產(chǎn)生與某音符相應(yīng)的脈沖信號,只要算出該音37
2、用單片機演奏音樂時,可以這樣來表示樂譜:樂譜由多個簡譜碼組成,以00結(jié)束,每個簡譜碼用一個字節(jié)來表示,字節(jié)的高4位為音符碼,代表音符的高低,低4位為節(jié)拍碼,表示音符的節(jié)拍,下表3-2為節(jié)拍與節(jié)拍碼的對照。如果1拍為0.4秒,則1/4拍為0.1秒,2/4拍為0.2秒,所以只要根據(jù)節(jié)拍來設(shè)定延時時間。設(shè)定時器T1的定時時間為50ms,二次溢出中斷正好為1/4拍,將節(jié)拍碼乘2即為該節(jié)拍所需溢出中斷的次數(shù)。2、用單片機演奏音樂時,可以這樣來表示樂譜:38
程序中,定時器T0用于控制音調(diào)的高低,定時器T1用于控制節(jié)拍的長短,各音符對應(yīng)的時間常數(shù)放在數(shù)組tab1中,樂譜以簡譜碼的形式存儲在數(shù)組tab3中,高四位為音符碼,低四位為節(jié)拍碼,0x00表示樂譜結(jié)束。變量m指向tab3中當前需演奏的簡譜碼,從中分解出高四位的音符碼,并從tab1中取出時間常數(shù)控制定時器T0產(chǎn)生與音符頻率相應(yīng)的方波;從簡譜碼的低四位分解出節(jié)拍碼,控制定時器T1延時節(jié)拍所需的時間。程序中,定時器T0用于控制音調(diào)的高低,定39程序流程圖程序流程圖40voidmain(void){ucharm;//用于指向音符的下標變量ucharc;TMOD=0x11;//定時器設(shè)定為方式1ET0=1;//允許T0中斷ET1=1;//允許T1中斷TH1=-50000/256;//50ms定時,節(jié)拍長短控制TL1=-50000%256;TR1=1;EA=1;}voidmain(void)41
while(1){m=0; //指向音符的下標變量while(tab3[m]) //如果樂譜末結(jié)束{c=tab3[m]>>4; //取高四位的音符if(c!=0) //音符不為0{th=tab1[c-1]>>8;//根據(jù)音符取出時間常數(shù)tl=tab1[c-1]&0xff;TH0=th;TL0=tl;//重新設(shè)置時間常數(shù) TR0=1;} //啟動定時器,開啟中斷else{TR0=0;} //如果音符為0,不發(fā)聲,time=(tab3[m]&0x0f)*2;//確定延時時間 while(time!=0);//延時規(guī)定節(jié)拍m++; //指向下個音符}
TR0=0;//暫停5S后,重新開始time=100;while(time!=0);}
while(1)TR0=0;42voidtimer0(void)interrupt1using1{TH0=th;//裝入時間常數(shù)TL0=tl;SOUND=~SOUND;//產(chǎn)生方波}voidtimer1(void)interrupt3{TH1=-50000/256;//重新裝入50ms的時間常數(shù)TL1=-50000%256;time--;//溢出中斷次數(shù)減1}定時器T0中斷服務(wù)程序,用于產(chǎn)生產(chǎn)生與音符頻率相應(yīng)的方波定時器T1中斷服務(wù)程序,延時當前節(jié)拍所需的時間voidtimer0(void)interrupt143
[案例7]調(diào)節(jié)發(fā)光二極管的亮度。亮度分為0-7共8級,亮度等級為0時,發(fā)光管熄滅;亮度等級為7時,發(fā)光管最亮。用KINC、KDEC兩個按鍵調(diào)節(jié)當前的亮度。
設(shè)計思想:如圖所示,如果在P0.0引腳產(chǎn)生一個周期為2ms的脈沖,如果每個周期內(nèi)脈沖的低電平時間少,高電平時間長,發(fā)光管的亮度顯然暗些,反之發(fā)光管要亮些,當P0.0輸出全為高,發(fā)光管就熄滅了。因此只要調(diào)節(jié)脈沖低電平的時間就可改變發(fā)光管的亮度。[案例7]調(diào)節(jié)發(fā)光二極管的亮度。亮度分為0-7共44程序中變量light表示亮度等級,取值在0-7之間,用KINC、KDEC按鍵對其加減調(diào)整,當light為0時,P0.0始終輸出高電平。定時器T0的定時時間為250us,變量count對定時中斷進行計數(shù),取值也在0-7之間,當count<light時,是發(fā)光管點亮?xí)r間,P0.0輸出低電平;當count≥light時,P0.0輸出高電平,發(fā)光管熄滅。發(fā)光管熄滅發(fā)光管亮度最低發(fā)光管亮度最高程序中變量light表示亮度等級,取值在0-745voidmain(void){TMOD=0x02;//T0工作于方式2TH0=-250;TL0=-250;;//定時時間為250usET0=1;//允許T0中斷TR0=1;//啟動定時EA=1;//CPU開中斷while(1){while((P2&0x30)==0x30);//等待按鍵delay(10);//去抖動延時if(KINC==0)//是KINC鍵,亮度等級加1light=(ligh+1)&0x7;elseif(KDEC==0)//是KDEC鍵,亮度等級減1light=(ligh-1)&0x7;while((P2&0x30)!=0x30);//等待按鍵釋放delay(10);//去抖動}voidmain(void)46voidtime0(void)interrupt1{count++;//定時中斷計數(shù)器加1count=count&0x7;//計數(shù)器的值在0~0x07之間if(count<light)//如果計數(shù)器的值小于當前亮度等級 LED=0;//點亮LEDelse LED=1;//否則,關(guān)閉發(fā)光管}定時器T0中斷服務(wù)程序voidtime0(void)interrupt1定47任務(wù)四、電子鐘的設(shè)計
設(shè)計一個電子鐘,用四位LED顯示器顯示當前時、分,時、分之間用閃爍的‘.’分隔,按KSET鍵設(shè)置當前時間,長按KSET鍵設(shè)置鬧鈴時間,進入設(shè)置方式后,用KSET鍵來選擇對時、分進行修改,當前修改的對象閃爍,KINC、KDEC分別對修改對象加/減1,長按KSET鍵結(jié)束設(shè)置。如果當前時間與鬧鈴時間一致,蜂鳴器發(fā)出“嘟”、“嘟”的鬧鈴聲,LED顯示器閃爍,鬧鈴時按任意一鍵,關(guān)閉蜂鳴器。任務(wù)四、電子鐘的設(shè)計設(shè)計一個電子鐘,用四位LE48設(shè)計思想
根據(jù)設(shè)計要求,我們可以將電子鐘分為三種工作狀態(tài),用變量state表示:
正常走時狀態(tài)LED顯示器顯示當前時間,系統(tǒng)上電后自動進入該方式。
鬧鈴狀態(tài)如果當前時、分與鬧鈴時、分相同,進入鬧鈴狀態(tài),此時蜂鳴器發(fā)出“嘟”、“嘟”的鬧鈴聲,LED顯示器閃爍,鬧鈴時按任意一鍵,關(guān)閉蜂鳴器,LED顯示器停止閃爍,返回正常走時狀態(tài)。設(shè)置狀態(tài)在走時狀態(tài)用戶按下kSET鍵則進入設(shè)置狀態(tài),用戶通過KINC、KDEC鍵對當前時間或鬧鈴時間進行修改,最后長按KSET鍵退出設(shè)置狀態(tài),并返回到正常走時方式。在設(shè)置當前時間時應(yīng)將定時器關(guān)閉,否則LED顯示器上的顯示值將被定時中斷服務(wù)程序刷新;在設(shè)置鬧鈴時間時,當前時間仍需被定時中斷服務(wù)程序刷新,只是不在LED顯示器上顯示出來。設(shè)計思想
正常走時狀態(tài)
鬧鈴狀態(tài)設(shè)置狀態(tài)49
定時器T0用來產(chǎn)生時鐘和方波,程序中每隔250uS就產(chǎn)生一次定時中斷,4000次中斷正好滿1秒。定時器T0每兩次中斷(500us)就令計數(shù)變量n加1,n滿2000正好是1S,當n<500時,每500us就將P1.0求反一次,產(chǎn)生250個頻率為1KHZ的方波,控制蜂鳴器鳴叫,當n>500后,令P1.0保持高電平,鳴叫停止,這樣在1秒鐘內(nèi)“嘟”持續(xù)1/4秒,停頓3/4秒,整個鬧鈴狀態(tài)將產(chǎn)生60次“嘟”,除非用戶按鍵關(guān)閉蜂鳴器。定時器T0用來產(chǎn)生時鐘和方波,50單片機電子鐘設(shè)計課件51單片機電子鐘設(shè)計課件52調(diào)試方法與步驟1、仔細檢查硬件電路,確認硬件連接無誤后,開始軟件調(diào)試。2、在Keil下新建項目,選擇硬件仿真,設(shè)置好串口號及波特率,輸入源程序,編譯成功后進入調(diào)試狀態(tài)。3、全速運行程序,此時數(shù)碼管應(yīng)顯示初始時間“12.25”,如果沒有顯示,應(yīng)檢查電路中的顯示端口與程序中的定義是否一致,顯示程序是否有問題。
4、按下(或長按)KSET鍵,顯示器的高2位應(yīng)該閃爍,如果按鍵后無反應(yīng),應(yīng)重點檢查鍵盤電路的連接以及鍵盤程序getkey(),直到按下各鍵時,能得到對應(yīng)的鍵值返回。調(diào)試方法與步驟1、仔細檢查硬件電路,確認硬件連接無誤后,開始535、如果按下(或長按)KSET鍵后,程序能夠進入當前時間或鬧鈴時間設(shè)置方式,應(yīng)仔細檢查KSET、KINC、KDEC鍵的功能是否與設(shè)計要求一致,最后長按KSET鍵能否退出設(shè)置方式。如果有問題,應(yīng)進入set_time()仔細調(diào)試。6、顯示程序、鍵盤處理程序調(diào)試好后,全速運行程序,此時數(shù)碼管顯示的時間應(yīng)每分鐘更新一次,如果時間始終不變,可檢查程序是否能進入定時器中斷服務(wù)程序,如果不能,說明定時器及中斷的初始化可能有問題,否則可進一步觀察當前時間time[3]及update標志是否相應(yīng)變化。5、如果按下(或長按)KSET鍵后,程序能夠進入當前時間或鬧547、如果能夠正常走時,需進一步檢測到了鬧鈴時間,數(shù)碼管是否閃爍,蜂鳴器有無鳴叫,以及鳴叫時按鍵能否關(guān)閉聲音。7、如果能夠正常走時,需進一步檢測到了鬧鈴時間,數(shù)碼管是否閃55項目三電子鐘的設(shè)計能力目標1、能夠使用單片機的定時/計數(shù)器實現(xiàn)定時、計數(shù)等應(yīng)用。2、能夠完成電子鐘硬件電路與控制程序的設(shè)計、制作與調(diào)試。知識目標1、了解單片機定時器/計數(shù)器的內(nèi)部結(jié)構(gòu)。2、掌握單片機定時器的各種工作方式及特點、應(yīng)用場合。3、掌握定時器中斷服務(wù)程序的編寫。項目三電子鐘的設(shè)計56任務(wù)一、認識單片機的定時器/計數(shù)器一、定時器/計數(shù)器及其應(yīng)用在單片機應(yīng)用系統(tǒng)中,定時或計數(shù)是必不可少的。例如:測量一個脈沖信號的頻率、周期,或者統(tǒng)計一段時間里電機轉(zhuǎn)動了多少圈等。常用的定時方法有:1、軟件定時軟件定時是依靠執(zhí)行一段程序來實現(xiàn)的,這段程序本身沒有具體的意義,通過選擇恰當?shù)闹噶罴把h(huán)次數(shù)實現(xiàn)所需的定時,由于執(zhí)行每條指令都需一定的時間,執(zhí)行這段程序所需總的時間就是定時時間。軟件定時的特點是無需硬件電路,但定時期間CPU被占用,增加了CPU的開銷,因此定時時間不宜過長,而且定時期間如果發(fā)生中斷,定時時間就會出現(xiàn)誤差。任務(wù)一、認識單片機的定時器/計數(shù)器一、定時器/計數(shù)器及其應(yīng)用573、可編程定時器定時這種定時方法是通過對系統(tǒng)時鐘脈沖的計數(shù)來實現(xiàn)的。通過程序來設(shè)置計數(shù)初值,改變計數(shù)初值也就改變了定時時間,使用起來非常靈活。由于定時器可以與CPU并行工作,因此不影響CPU的效率,且定時時間精確。2、硬件定時
硬件定時通常由小規(guī)模集成電路555外加電阻、電容構(gòu)成,電路簡單,不占CPU資源,但定時時間的調(diào)節(jié)不夠靈活方便。單片機電子鐘設(shè)計課件58(一)定時器/計數(shù)器概述在51系列單片機中有兩個16位的加法計數(shù)器,分別叫做T0和T1。在計數(shù)脈沖的作用下,其計數(shù)值不斷加1,在此過程中,計數(shù)器可能產(chǎn)生溢出,產(chǎn)生溢出后,可以向CPU發(fā)出中斷請求。如果計數(shù)脈沖來自系統(tǒng)時鐘,稱之為“定時器”,每個機器周期計數(shù)器加1;如果計數(shù)脈沖來自外部電路,稱之為“計數(shù)器”一旦計數(shù)器產(chǎn)生溢出,TF0變?yōu)?,向CPU發(fā)出中斷請求(一)定時器/計數(shù)器概述如果計數(shù)脈沖來自系統(tǒng)時鐘,稱之為“定59二、定時器/計數(shù)器的控制寄存器
1、定時器控制寄存器TCONTF0/TF1:定時器/計數(shù)器T1和T0的溢出中斷標志。為1,表示定時器/計數(shù)器的計數(shù)值已由全1變?yōu)槿?,正向CPU發(fā)中斷請求。TR0/TR1:定時器/計數(shù)器T0和T1的啟??刂莆唬簽?時,定時器/計數(shù)器停止工作;為1時,啟動定時器/計數(shù)器工作。
二、定時器/計數(shù)器的控制寄存器
1、定時器控制寄存器TCON602、定時方式寄存器TMOD
選擇定時/計數(shù)器的工作方式,M1M0=00,方式001,方式110,方式211,方式3定時方式/計數(shù)方式的選擇控制位。為0,選定時方式,計數(shù)脈沖來自系統(tǒng)時鐘的12分頻;為1,選計數(shù)方式,計數(shù)脈沖來自外部電路當GATE=0時,只要TR0=1,與門的輸出就為1,計數(shù)開始。如果GATE為1,只有TR0=1,并且/INT0=1時,才允許計數(shù)。2、定時方式寄存器TMOD選擇定時/計數(shù)器的工作方式,M161C/T=0,選擇定時方式C/T=1,選擇計數(shù)方式GATE=0時,由TR0控制計數(shù)器啟停GATE=1時,由TR0和INT0一同控制啟停TR0=1時,啟動定時器定時器溢出時,TF0置1C/T=0,選擇定時方式C/T=1,選擇計數(shù)方式GATE=062三、T0、T1的工作方式1、方式0方式0的計數(shù)器由13位構(gòu)成,其中高8位在TH中,低5位在TL中。當計數(shù)器產(chǎn)生溢出時,TF位被置1,向CPU發(fā)出中斷請求。在方式0下,計數(shù)器產(chǎn)生溢出時,不能進行初始計數(shù)值的自動重裝(有關(guān)自動重裝的問題參見方式2),所以方式0不能用于精確定時。方式0的所有功能都可以用方式1代替,方式0的存在,是因為兼容早期的MCS-48單片機的原因,所以一般不使用方式0。三、T0、T1的工作方式1、方式0632、方式1方式1與方式0工作形態(tài)基本相同,只是方式1的計數(shù)器由16位構(gòu)成,其中高8位在TH中,低8位在TL中,當計數(shù)器產(chǎn)生溢出時,TF位被置1,向CPU發(fā)出中斷請求。在方式1下,計數(shù)器產(chǎn)生溢出時,也不能進行初始計數(shù)值的自動重裝所以方式1也不能用于精確定時。2、方式1643、方式2方式2是可以自動重裝的工作方式:初始化時一般將8位計數(shù)初值同時放入TH、TL中,其中,TH存放的是初值的備份,TL用來計數(shù),當8位計數(shù)器TL產(chǎn)生溢出時,除了可以向CPU發(fā)中斷請求外,單片機的硬件部分還立即把TH中的備份送入TL中。由于重新賦值是硬件自動進行的,所以避免了重新賦值的時間不一,所以方式2可以用于精確定時。3、方式2654、方式3
T1經(jīng)常用于串行口的波特率發(fā)生器,為了讓系統(tǒng)中保持兩個計數(shù)器,可以讓T0工作在方式3,這時,T0被分成兩個8位計數(shù)器,分別位于TH0和TL0中,其中TL0使用T0的中斷、啟動控制資源,而TH0則借用T1的中斷、啟動控制資源,而且TH0只能工作在定時方式下,不能工作在計數(shù)方式下。4、方式366(四)時間常數(shù)的計算如果單片機需要進行周期性的工作,就應(yīng)該讓定時器/計數(shù)器T0或T1工作在定時方式,并且給T0或T1賦以一個初始計數(shù)值,在T0或T1被啟動后,每個機器周期使計數(shù)器中的計數(shù)值加1,計數(shù)器產(chǎn)生溢出后,將再次給計數(shù)器賦值(該值被稱為時間常數(shù))。顯然計數(shù)器溢出時間(又稱定時時間)與時間常數(shù)直接相關(guān):時間常數(shù)越大,定時時間就越短;時間常數(shù)越小,定時時間就越長。同時系統(tǒng)時鐘的頻率也直接影響定時時間的長短,時鐘的頻率越高,定時時間越短;時鐘的頻率越低,定時時間越長。(四)時間常數(shù)的計算67設(shè)系統(tǒng)時鐘的頻率為fosc,計數(shù)器的初始值為N,定時器工作于方式1,則定時時間:
T=(216-N)×12/fosc(1)如果定時器工作于方式2或方式3,定時時間為:
T=(28-N)×12/fosc(2)
當初始值N=0時,如果fosc=12MHZ,最大定時時間為:方式1為:Tmax=216×12/fosc=65536us=65.536ms方式2、方式3為:Tmax=28×12/fosc=256us根據(jù)定時時間T,及公式(1)、(2)分別可以求出初值N為:方式1:N=216-T×fosc/12(3)方式2、方式3:N=28-T×fosc/12(4)如果fosc=12MHZ,以上公式可簡化為方式1:N=216-T
方式2、方式3:N=28-T設(shè)系統(tǒng)時鐘的頻率為fosc,計數(shù)器的初始值為N,68
例如:系統(tǒng)的時鐘頻率是12MHz,在方式1下,如果希望定時器/計數(shù)器T0的定時時間T為10ms,則初值N=216-T=65536-10000=55536如何將55536給兩個8位寄存器TH0、TL0賦值呢?可將十進制數(shù)55536轉(zhuǎn)換成四位十六進制數(shù),將高2位送TH0,低2位送TL0。更簡單的方法是:對于16位計數(shù)器來講,216等效為0,對于8位計數(shù)器,28等效為0,這樣公式(3)、(4)可簡化為N=-T,直接用下面兩條語句就可以完成計數(shù)器初值的設(shè)置:TH0=-10000/256;//取-N的高8位TL0=-10000%256;//取-N的低8位
例如:設(shè)系統(tǒng)的時鐘頻率是12MHz,定時器工作于方式2,定時時間200us。根據(jù)前面分析,N=-T=-200,可直接用以下語句實現(xiàn):TH0=-200;TL0=-200;例如:系統(tǒng)的時鐘頻率是12MHz,在方式1下,如69任務(wù)二、定時器應(yīng)用[案例1]設(shè)時鐘頻率fosc=12MHz,用定時器T0在P1.0腳產(chǎn)生頻率為20Hz的方波。
設(shè)計思想:在使用定時器/計數(shù)器時,首先應(yīng)根據(jù)要求對工作方式進行初始化,然后計算出初始值。初始化的步驟通常是:
(1)向TMOD寄存器寫入工作方式控制字。
(2)將計數(shù)器的初值寫入TH0、TL0/TH1、TL1。
(3)啟動定時器/計數(shù)器:將TR0/TR1置1。(4)如果采用中斷方式,還應(yīng)將ET0/ET1、EA置1。
任務(wù)二、定時器應(yīng)用[案例1]設(shè)時鐘頻率fosc=70本題中,方波的頻率為20HZ,對應(yīng)的周期為50ms,如果將定時時間設(shè)置為25ms,每隔25ms將P1.0腳取反即可產(chǎn)生如圖3-3所示的方波。因為定時時間為25ms,如果采用方式2或方式3,其定時的最大時間不超過256us,因此選方式1比較恰當,根據(jù)前面的分析,計數(shù)器初值N=-25000。本例題是定時而非計數(shù),且無需腳參與啟??刂?,故C/=0,GATE為0,這樣TMOD取0x01。本題中,方波的頻率為20HZ,對應(yīng)的周期為50m71voidmain(void){TMOD=0x01; TH0=-25000/256; TL0=-25000%256;TR0=1; ET0=1; EA=1; while(1);}voidtimer0(void)interrupt1{TH0=-25000/256; TL0=-25000%256;P10=~P10;}T0工作于定時方式1定時時間為25ms啟動定時器T0允許定時器T0中斷單片機開中斷定時器T0中斷服務(wù)程序重新裝入時間常數(shù)P1.0求反voidmain(void)T0工作于定時方式1定時時間為72[案例2]如圖所示,P0口接8只發(fā)光二極管,編程使發(fā)光管輪流點亮,點亮?xí)r間為500ms,要求使用定時器T0來控制,設(shè)晶振為12MHz[案例2]如圖所示,P0口接8只發(fā)光二極管,編程使發(fā)73
設(shè)計思想
我們可將P0口的初值設(shè)置為0xFE,對應(yīng)于發(fā)光管D1亮,每隔500ms將P0的值循環(huán)左移一位,這一周期性的定時作業(yè)用T0來完成。當時鐘頻率為12MHZ時,在定時器的4種工作方式中,方式1的最大溢出時間最長,但即使在方式1,最大的溢出時間也只有65.536ms,所以我們不能在每次中斷時都執(zhí)行上述移位操作,可以這樣處理:將定時器T0的溢出時間設(shè)定為50ms,累計滿10次中斷正好500ms,才允許程序執(zhí)行1次移位動作,設(shè)計思想74
主函數(shù)ucharcount=0;//50ms定時中斷次數(shù)計數(shù)器voidmain(void){led=0xfe;TMOD=0x01;//T0工作于方式1TH0=-50000/256;//定時時間為50msTL0=-50000%256;ET0=1;//允許T0中斷TR0=1;//啟動T0定時EA=1;//CPU開中斷while(1);}主函數(shù)75voidtime0(void)interrupt1{TH0=-50000/256;TL0=-50000%256;count++;if(count==10){count=0;led=_crol_(led,1);P0=led;}}定時器T0中斷服務(wù)程序重新裝入時間常數(shù)每中斷一次,計數(shù)器加110次中斷為0.5秒滿10次變量led左移1位送P0口voidtime0(void)interrupt1定76[案例3]用定時器的計數(shù)方式實現(xiàn)外部中斷。如圖所示,P0口控制8只發(fā)光管輪流點亮,發(fā)光管點亮?xí)r間為500ms,單脈沖電路控制發(fā)光管的移動方向,按下單脈沖按鈕,發(fā)光管左移,再按下發(fā)光管右移。[案例3]用定時器的計數(shù)方式實現(xiàn)外部中斷。如圖所示,77設(shè)計思想:當定時器/計數(shù)器工作于計數(shù)方式2時,如果將計數(shù)器的初值設(shè)置為全1,只要在計數(shù)輸入端(T0或T1)送入一個計數(shù)脈沖,就可使計數(shù)器產(chǎn)生溢出中斷。如果將外部中斷請求作為計數(shù)脈沖輸入,就可利用計數(shù)中斷的名義去完成外部中斷服務(wù)。當應(yīng)用中外部中斷請求較多時,而單片機內(nèi)部的定時器/計數(shù)器還有富余時,可采用這種方法來擴展外部斷。因此本例的實質(zhì)是將定時器的計數(shù)輸入端T1擴展為外部中斷請求輸入,來控制發(fā)光管的移動方向。
設(shè)計思想:78具體方法:
1、初始化定時器/計數(shù)器T1計數(shù)工作方式2,即每次溢出中斷后能自動裝入計數(shù)初值。2、計數(shù)器TH1、TL1的初值預(yù)置為0FFH。3、程序中設(shè)置一個位變量,每當計數(shù)器T1產(chǎn)生溢出中斷時求反,發(fā)光管左移還是右移取決于該變量是0還是1。具體方法:1、初始化定時器/計數(shù)器T1計數(shù)79
voidmain(void){DIR=0;led=0xfe;TMOD=0x61;TH0=-50000/256;TL0=-50000%256;TH1=0xff; TL1=0xff;ET0=1;ET1=1; TR0=1;TR1=1; EA=1;while(1);}T0為定時方式0,T1為計數(shù)方式2定時時間為50msT1的初值為0xff允許T0、T1中斷啟動T0定時啟動T1計數(shù)CPU開中斷voidmain(void)T0為定時方式0,T1為計數(shù)80
voidtime0(void)interrupt1{TH0=-50000/256;TL0=-50000%256;count++;if(count==10){count=0; if(DIR==1) led=_crol_(led,1); else led=_cror_(led,1); P0=led;}}重新裝入時間常數(shù)滿10次為0.5秒計數(shù)器清0DIR為1左移DIR為0右移每中斷一次,計數(shù)器加1定時器T0中斷服務(wù)程序voidtime0(void)interrupt181
voidtime1(void)interrupt3{DIR=~DIR; }每次按下按鈕產(chǎn)生T1的溢出中斷,將DIR求反定時器T1中斷服務(wù)程序voidtime1(void)interrupt382[案例4]用定時器來控制數(shù)碼管的動態(tài)顯示。設(shè)計思想:
前面我們介紹LED動態(tài)顯示程序時,每一位點亮后都需延時1ms左右,由于使用的是軟件延時,大大降低了CPU的效率,而且當CPU因處理某件事務(wù)在一段時間內(nèi)無法調(diào)用顯示程序時,LED顯示器將會出現(xiàn)黑屏或產(chǎn)生閃爍現(xiàn)象。用定時器控制數(shù)碼管的動態(tài)顯示的方法:設(shè)定時器的定時時間為1ms,每次產(chǎn)生溢出中斷,就根據(jù)位選變量bsel(主程序中將其初值設(shè)置為0xfe)送位選口,點亮一位數(shù)碼管,并將bsel左移一位,為下一位的顯示做好準備,4次定時中斷分別完成4位數(shù)碼管的顯示,之后將bsel的值再次初始化為0xfe,準備下一輪顯示。
因此這種顯示方式由定時中斷自動完成,無需在主程序中調(diào)用。[案例4]用定時器來控制數(shù)碼管的動態(tài)顯示。83主程序ucharbsel,n;voidmain(void){n=0;bsel=0xfe;//首先顯示數(shù)碼管的最低位TMOD=0x01;//T0工作于定時方式2TH0=-1000/256;//T0的定時時間為1000usTL0=-1000%256;ET0=1;//允許T0中斷TR0=1;//啟動定時EA=1;//開中斷while(1);}主程序84voidtime0(void)interrupt1{TH0=-1000/256;TL0=-1000%256;P0=0xff;P2=bsel;P0=segtab[dbuf[n]];bsel=_crol_(bsel,1);n++; if(n==4) {n=0; bsel=0xfe; }}重新裝入時間常數(shù)定時器T0中斷服務(wù)程序熄滅數(shù)碼管,防止上一位字符在當前位置顯示出來。點亮當前位根據(jù)顯示緩存查字段碼準備顯示下一位指向下一位要顯示的數(shù)據(jù)如果四位已顯示完,重新從最低位開始voidtime0(void)interrupt185[案例5]如圖3-8所示,設(shè)計一個電子秒表,每隔一秒加1,用三位數(shù)碼管顯示秒表的當前值(0-255),單脈沖按鍵用于啟動、停止、清0控制,第一次按下該按鍵時啟動秒表,第二次按鍵將暫停秒表,第三次按鍵將秒表清0,設(shè)置晶振頻率為12MHZ。[案例5]如圖3-8所示,設(shè)計一個電子秒表,每86設(shè)計思想:我們可用一個變量記錄秒表的當前值,為了提高秒表精度,我們可令定時器T0工作于定時方式2,定時時間為250us,4000次溢出中斷正好滿1秒,讓變量加1,同時將該變量轉(zhuǎn)換為三位BCD碼送到顯示緩存,供顯示程序顯示。單脈沖直接和外部中斷0的輸入端INT0相連,每次按鍵產(chǎn)生中斷請求,程序中設(shè)置一個變量,對按鍵動作進行計數(shù),取值為1-3,分別對應(yīng)于啟動、停止和清0,程序根據(jù)該變量的值進行相應(yīng)的控制。設(shè)計思想:87主程序voidmain(void){count=0;sec=0;mode=0;IT0=1; //外部中斷負跳變觸發(fā)EX0=1;//允許外部中斷0中斷TMOD=0x02;//T0工作于定時方式2TH0=-250;//T0的定時時間為250usTL0=-250;ET0=1;//允許T0中斷TR0=0;//停止定時器EA=1;//開中斷while(1)disp();}主程序88定時器T0中斷服務(wù)程序voidtime0(void)interrupt1{count++;//中斷次數(shù)加1if(count==4000){count=0; sec++; dbuf[2]=sec/100;//將秒數(shù)計換成三位BCD碼dbuf[1]=(sec%100)/10;dbuf[0]=sec%10;}}定時器T0中斷服務(wù)程序89voidint0(void)interrupt0{mode++; //每次產(chǎn)生中斷,mode加1if(mode==1) //mode為1,啟動定時器工作TR0=1;elseif(mode==2)//如果mode等于2,停止定時器工作TR0=0;elseif(mode==3)//如果mode為3,{mode=0;TR0=0;sec=0; //將秒計數(shù)器清0 dbuf[0]=0;dbuf[1]=0; dbuf[2]=0; } }外部中斷0中斷服務(wù)程序voidint0(void)interrupt0外部90[案例6]用單片機演奏歌曲《蘭花草》
設(shè)計思想:單片機可以根據(jù)音符產(chǎn)生不同頻率的脈沖信號,經(jīng)驅(qū)動后來控制蜂鳴器,讓蜂鳴器產(chǎn)生與音符相應(yīng)的聲音,再把它們有機地組合起來,就可以發(fā)出一段音樂。[案例6]用單片機演奏歌曲《蘭花草》設(shè)計思想:單91
1、要產(chǎn)生與某音符相應(yīng)的脈沖信號,只要算出該音頻的頻率和周期,然后將該周期除2,即為半周期的時間。將定時器的定時時間設(shè)定為這半周期時間,一旦定時器溢出,就將P1.6腳求反,這樣就能產(chǎn)生與音符頻率對應(yīng)的脈沖信號。設(shè)單片機定時器工作在定時方式1,改變時間常數(shù)TH0、TL0就可以產(chǎn)生與各種音符頻率相應(yīng)的脈沖信號。
設(shè)要產(chǎn)生的頻率為fr,單片機機器周期的頻率為fi,則對應(yīng)定時器時間常數(shù)為N。N=65536-fi÷2÷fr1、要產(chǎn)生與某音符相應(yīng)的脈沖信號,只要算出該音92
2、用單片機演奏音樂時,可以這樣來表示樂譜:樂譜由多個簡譜碼組成,以00結(jié)束,每個簡譜碼用一個字節(jié)來表示,字節(jié)的高4位為音符碼,代表音符的高低,低4位為節(jié)拍碼,表示音符的節(jié)拍,下表3-2為節(jié)拍與節(jié)拍碼的對照。如果1拍為0.4秒,則1/4拍為0.1秒,2/4拍為0.2秒,所以只要根據(jù)節(jié)拍來設(shè)定延時時間。設(shè)定時器T1的定時時間為50ms,二次溢出中斷正好為1/4拍,將節(jié)拍碼乘2即為該節(jié)拍所需溢出中斷的次數(shù)。2、用單片機演奏音樂時,可以這樣來表示樂譜:93
程序中,定時器T0用于控制音調(diào)的高低,定時器T1用于控制節(jié)拍的長短,各音符對應(yīng)的時間常數(shù)放在數(shù)組tab1中,樂譜以簡譜碼的形式存儲在數(shù)組tab3中,高四位為音符碼,低四位為節(jié)拍碼,0x00表示樂譜結(jié)束。變量m指向tab3中當前需演奏的簡譜碼,從中分解出高四位的音符碼,并從tab1中取出時間常數(shù)控制定時器T0產(chǎn)生與音符頻率相應(yīng)的方波;從簡譜碼的低四位分解出節(jié)拍碼,控制定時器T1延時節(jié)拍所需的時間。程序中,定時器T0用于控制音調(diào)的高低,定94程序流程圖程序流程圖95voidmain(void){ucharm;//用于指向音符的下標變量ucharc;TMOD=0x11;//定時器設(shè)定為方式1ET0=1;//允許T0中斷ET1=1;//允許T1中斷TH1=-50000/256;//50ms定時,節(jié)拍長短控制TL1=-50000%256;TR1=1;EA=1;}voidmain(void)96
while(1){m=0; //指向音符的下標變量while(tab3[m]) //如果樂譜末結(jié)束{c=tab3[m]>>4; //取高四位的音符if(c!=0) //音符不為0{th=tab1[c-1]>>8;//根據(jù)音符取出時間常數(shù)tl=tab1[c-1]&0xff;TH0=th;TL0=tl;//重新設(shè)置時間常數(shù) TR0=1;} //啟動定時器,開啟中斷else{TR0=0;} //如果音符為0,不發(fā)聲,time=(tab3[m]&0x0f)*2;//確定延時時間 while(time!=0);//延時規(guī)定節(jié)拍m++; //指向下個音符}
TR0=0;//暫停5S后,重新開始time=100;while(time!=0);}
while(1)TR0=0;97voidtimer0(void)interrupt1using1{TH0=th;//裝入時間常數(shù)TL0=tl;SOUND=~SOUND;//產(chǎn)生方波}voidtimer1(void)interrupt3{TH1=-50000/256;//重新裝入50ms的時間常數(shù)TL1=-50000%256;time--;//溢出中斷次數(shù)減1}定時器T0中斷服務(wù)程序,用于產(chǎn)生產(chǎn)生與音符頻率相應(yīng)的方波定時器T1中斷服務(wù)程序,延時當前節(jié)拍所需的時間voidtimer0(void)interrupt198
[案例7]調(diào)節(jié)發(fā)光二極管的亮度。亮度分為0-7共8級,亮度等級為0時,發(fā)光管熄滅;亮度等級為7時,發(fā)光管最亮。用KINC、KDEC兩個按鍵調(diào)節(jié)當前的亮度。
設(shè)計思想:如圖所示,如果在P0.0引腳產(chǎn)生一個周期為2ms的脈沖,如果每個周期內(nèi)脈沖的低電平時間少,高電平時間長,發(fā)光管的亮度顯然暗些,反之發(fā)光管要亮些,當P0.0輸出全為高,發(fā)光管就熄滅了。因此只要調(diào)節(jié)脈沖低電平的時間就可改變發(fā)光管的亮度。[案例7]調(diào)節(jié)發(fā)光二極管
溫馨提示
- 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年銷售員績效考核與獎懲制度勞務(wù)用工協(xié)議3篇
- 建筑工程供貨合同
- 2025年校園運動場地設(shè)施采購及施工合同2篇
- 機房優(yōu)先施工方案
- 二零二五年度5G通信技術(shù)應(yīng)用合同4篇
- 2025年度個人旅游規(guī)劃師雇傭服務(wù)協(xié)議4篇
- 二零二五版美發(fā)店合伙人創(chuàng)業(yè)投資合作合同4篇
- 齒輪鍛件課程設(shè)計
- 課課程設(shè)計要寫哪幾步
- 基礎(chǔ)土方回填施工方案
- 餐飲行業(yè)智慧餐廳管理系統(tǒng)方案
- 2025年度生物醫(yī)藥技術(shù)研發(fā)與許可協(xié)議3篇
- 電廠檢修安全培訓(xùn)課件
- 殯葬改革課件
- 2024企業(yè)答謝晚宴會務(wù)合同3篇
- 雙方個人協(xié)議書模板
- 車站安全管理研究報告
- 瑪米亞RB67中文說明書
- 中華人民共和國文物保護法
- 五年級數(shù)學(xué)(小數(shù)四則混合運算)計算題專項練習(xí)及答案
- NB_T 10533-2021 采煤沉陷區(qū)治理技術(shù)規(guī)范_(高清最新)
評論
0/150
提交評論