c51定時器中斷_第1頁
c51定時器中斷_第2頁
c51定時器中斷_第3頁
c51定時器中斷_第4頁
c51定時器中斷_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、3.2單片機(jī)定時器/計數(shù)器應(yīng)用,3.2.1利用Timer0中斷產(chǎn)生1秒延時,讓數(shù)1個碼管顯示秒計數(shù) 本案例主要目的是熟練掌握單片機(jī)內(nèi)部Timer0或Timer1的編程控制方法,會利用Timer0或Timer1中斷精確定時。同時掌握數(shù)碼管動態(tài)顯示原理,學(xué)會6位數(shù)字顯示的程序設(shè)計。本案例使用的電路為圖3-1-3。,一、程序設(shè)計,#include code unsigned char seven_seg10 = 0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90; unsigned char cp,i; /聲明全局變量 void t

2、imer0_isr(void) interrupt 1 / timer0中斷服務(wù)函數(shù) TR0 = 0; /停止計數(shù) TL0 = 0 x11; / TL0重新預(yù)置 TH0 = 0 xee; / TH0重新預(yù)置 TR0 = 0; /開始計數(shù) cp+; / timer0中斷1次,變量cp加1 if(cp = 200) /中斷200次,時間剛好為1秒 cp = 0;i +; if(i = 10) i = 0; P0 = seven_segi / P0輸出顯示數(shù)據(jù) ,void timer0_initialize(void) / timer0中斷初始化函數(shù) EA = 0; /設(shè)置中斷允許寄存器IE中的 E

3、A位, /關(guān)閉中斷總開關(guān) TMOD = 0 x01; /設(shè)置計時器模式控制寄存器, /Time0工作在定時方式1 TR0 = 0; /設(shè)置計時器控制寄存器TCON寄存器 /的TR0位為0,Timer0 /停止計數(shù) TL0 = 0 x11; TH0 = 0 xee; / Timer0的16位計數(shù)器初始值為 /0 xee11,12MHz晶體振 /頻率,單片機(jī)的機(jī)器周期為1微妙, /Timer0每1微秒加1計數(shù), /加滿溢出變產(chǎn)生中斷, /從計數(shù)到中斷剛好為5毫秒 PT0 = 1; /設(shè)置中斷優(yōu)先次序寄存器IP中的 /PT0位,Timer0中斷優(yōu)先 ET0 = 1; /設(shè)置中斷允許寄存器IE中ET0

4、的 /位,開啟中斷小開關(guān) EA = 1; /打開中斷總開關(guān) TR0 = 1; /開始計數(shù),void main (void) timer0_initialize() / timer0初始化,為中斷做好準(zhǔn)備 while (1); /等待中斷 ,二、程序說明,1.中斷服務(wù)函數(shù)名中,interruput為關(guān)鍵字,1為timer0中斷號。在reg51.h頭文件中已經(jīng)定義,表3.2.1為單片機(jī)常用中斷的中斷號。在使用中斷服務(wù)函數(shù)時,直接在名后加interruput和中斷號即可。,表3.2.1 REG51.H中單片機(jī)常用中斷號定義,2.timer0可以用作計數(shù),也可以用來定時,由由TMOD寄存器中 為決定,

5、作為計數(shù)器使用時,接受單片機(jī)外部引腳P3.4輸入的脈沖加計數(shù);作為定時器使用時,接受單片機(jī)內(nèi)部的機(jī)器周期脈沖。如果單片機(jī)的振蕩頻率為 ,振蕩周期為 ,則機(jī)器周期為 。本案例中 MHz,則 微秒,timer0工作在模式1為16為加計數(shù)器,當(dāng)計數(shù)器初始值為0 xee11時,則從開始計數(shù)到產(chǎn)生中斷需要的時間為0 xffff 0 xee11個微秒,剛好為5000微秒,也即5毫秒。,本案例TIMER0的初裝也可以利用下面語句完成:,#defined TEMOR0_COUNT 0 xee11 TL0 = TEMOR0_COUNT / TEMOR0_COUNT左移8位,并將低字節(jié)裝入TEMOR0_COUNT

6、 利用定時器/計數(shù)器定時時,需要現(xiàn)設(shè)置工作模式,并計算它的初裝值,計算初裝值不好計算,常利用計算機(jī)中的計算器工具輔助。timer0工作在模式1可以最大65535微秒中斷1次,如工作模式2,最大256微秒中斷1次。 3.當(dāng)程序中只涉及一個中斷時,可以不對中斷的優(yōu)先級進(jìn)行設(shè)置,因此在本案例中語句PT0 = 1 可以省略。程序中有多個中斷但沒有進(jìn)行優(yōu)先級設(shè)定的情況下,單片機(jī)中斷優(yōu)先級默認(rèn)按終端號遞增而依次降低。 4.數(shù)碼管顯示語句放在了timer0中斷服務(wù)函數(shù)里面,由于5毫秒中斷1次,因此數(shù)碼管顯示的數(shù)據(jù)會每5毫秒更新1次。1秒內(nèi)更新200次,更新過程是把原來的數(shù)據(jù)覆蓋,但顯示數(shù)據(jù)1秒內(nèi)變化1次。,

7、3.2.2利用4個數(shù)碼管,實現(xiàn)秒信號加計數(shù),一、電路原理 圖3-2-1所示的電路中,4位七段數(shù)碼管采用4只單個數(shù)碼管組成,可以顯示00009999,數(shù)據(jù)輸入端并聯(lián)后接P0口,位選即每個數(shù)碼管的陽極分別接P2口,中間加非門驅(qū)動。因為P2口反相驅(qū)動,因此,如果千位數(shù)碼管顯示,P2.7輸出低電平,P2的其它端口輸出高電平,并且此時P0輸出千位數(shù)據(jù)。,在利用Proteuse軟件仿真時,數(shù)碼管SEVEN_SEG使用7SEG-MPX4-CA,非門NOT選用74 HC series類型中Gates code uchar seg_scan4 = 0 xef,0 xdf,0 xbf,0 x7f; /各個數(shù)碼管對

8、應(yīng)的位選數(shù)據(jù) uchar counter4 = 0,0,0,0; /個位、十位、百位和千位數(shù) uint cp,i; void timer0_isr(void) interrupt 1 / timer0中斷服務(wù)函數(shù) uchar j; TR0 = 0; /停止計數(shù) TL0 = 0 x11; / TL0重新預(yù)置 TH0 = 0 xee; / TH0重新預(yù)置 TR0 = 0; /開始計數(shù) cp+; / timer0中斷1次,變量cp加1 if(cp = 200) /中斷200次,時間剛好為1秒 cp = 0; counter0+; /個位數(shù),1秒加1 ,if(counter0 = 10) counte

9、r0= 0; counter1+; if(counter1 = 10) counter1= 0; counter2+; if(counter2 = 10) counter2= 0; counter3+; if(counter3 = 10) counter3= 0; P0 = seven_segcounterj; / P0輸出數(shù)據(jù)編碼 P2 = seg_scanj; /P2輸出位選信號 j+; if(j = 4) j = 0; void timer0_initialize(void) / timer0中斷初始化函數(shù) EA = 0; TMOD = 0 x01; TR0 = 0; TL0 = 0 x

10、11; TH0 = 0 xee; PT0 = 1; ET0 = 1; EA = 1; TR0 = 1; void main (void) timer0_initialize() while (1); ,三、程序說明,1imer0第1次中斷,j = 0,顯示個位,顯示5毫秒后,timer0第2次中斷,j = 1,顯示十位,以后隨著中斷依次顯示百位和千位,最后重新顯示個位。每位顯示停留的時間為5毫秒。中斷4次才能讓4為依次掃描顯示完,占用的時間為20毫秒,1秒鐘內(nèi),4位數(shù)碼管掃描顯示50遍,根據(jù)人眼視覺暫留特點,你看到的結(jié)果是4位數(shù)據(jù)同時顯示,這種顯示方法為動態(tài)掃描顯示。 2變量j = 0時,co

11、unter0是個位十進(jìn)制數(shù),執(zhí)行P0 = seven_segcounter0,P0口輸出個位顯示數(shù)據(jù)編碼;數(shù)碼管的位選信號只利用了P2的高4位,執(zhí)行P2 = seg_scan0,P2 = 0 xef,經(jīng)過非門反相,加在數(shù)碼管上的位選信號只有個位是高電平,此時只顯示個位。 3數(shù)組counterj也可以用1個變量代替,在顯示時需做下面處理,uint x; P0 = seven_segx/1000; / P0輸出千位數(shù)據(jù)編碼 P2 = seg_scan3; /千位數(shù)碼管共陽極設(shè)置為高電平 P0 = seven_segx%1000/100; / P0輸出百位數(shù)據(jù)編碼 P2 = seg_scan2; /

12、千位數(shù)碼管共陽極設(shè)置為高電平 P0 = seven_segx%1000%100/10; / P0輸出十位數(shù)據(jù)編碼 P2 = seg_scan1; /千位數(shù)碼管共陽極設(shè)置為高電平 P0 = seven_segx%1000%100%10; / P0輸出千位數(shù)據(jù)編碼 P2 = seg_scan0; /千位數(shù)碼管共陽極設(shè)置為高電平,思考題,(1)要讓數(shù)碼管在電路加電開始就顯示1230,怎樣更改有關(guān)數(shù)據(jù)? (2)為什么不用P2口直接驅(qū)動數(shù)碼管? (3)本案例如果200微秒中斷1次,也可以實現(xiàn)1定時,顯示結(jié)果會怎樣?,3.2.3設(shè)計一個6位數(shù)碼管時間顯示程序,本案例使用6位數(shù)碼管顯示時間,能顯示時/分/秒

13、,顯示格式是00.00.00到23.59.59。其中小時和分鐘之間的小數(shù)點常亮,分鐘和秒之間的小數(shù)點進(jìn)行秒閃爍。 參考程序: #include #defined unsigned char uchar code uchar seven_seg10 = 0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90; code uchar seg_scan6 = 0 xfb,0 xf7,0 xef,0 xdf,0bf,0 x7f; /各個數(shù)碼管對應(yīng)的位選數(shù)據(jù) uchar counter3 = 0,0,0; /時位、分位和秒位 uchar t

14、ick,cp,i,j; /tick:秒信號,cp:中斷次數(shù)累計,void dispaly(void) uchar d; d = d * tick; /d 的值1秒內(nèi)改變1次,要么0 x00,要么0 xff d = d | 0 x7f; /d 的值1秒內(nèi)改變1次,要么0 x7f, 要么0 xff swich(i) case 0 : P0 = seven_segcounter0%10; break; /顯示秒個位 case 1 : P0 = seven_segcounter0/10; break; /顯示秒十位 case 2 : P0 = d ,void timer0_isr(void) inte

15、rrupt 1 / timer0中斷服務(wù)函數(shù) TR0 = 0; /停止計數(shù) TL0 = 0 x11; / TL0重新預(yù)置 TH0 = 0 xee; / TH0重新預(yù)置 TR0 = 0; /開始計數(shù) cp+; / timer0中斷1次,變量cp加1 if(cp = 100) /中斷100次,時間剛好為0.5秒 cp = 0; tick = tick; /秒脈沖信號 j+; if(j = 2) /剛好1秒 j = 0; counter0+; /個位數(shù),1秒加1 if(counter0 = 60) counter0= 0; counter1+; if(counter1 = 60) counter1=

16、 0; counter2+; if(counter2 = 24) counter2= 0; display(); ,void timer0_initialize(void) / timer0中斷初始化函數(shù) EA = 0; TMOD = 0 x01; TR0 = 0; TL0 = 0 x11; TH0 = 0 xee; PT0 = 1; ET0 = 1; EA = 1; TR0 = 1; void main (void) timer0_initialize() / timer0初始化,為中斷做好準(zhǔn)備 while (1); ,三、程序說明,1.利用counter2、counter1 和counte

17、r0變量分別表示時、分和秒位的數(shù)值大小,也可以利用結(jié)構(gòu)體定義這些變量,如: typedef struct ucar hour; ucar min; ucar sec; time; time now;/now是數(shù)據(jù)類型為time的變量 然后就可以用now.hour,now.min和now.sec分別代替counter2、counter1 和counter0.變量,2.執(zhí)行timer0中斷服務(wù)函數(shù)時調(diào)用了dispaly()函數(shù),直接把dispaly()的函數(shù)體程序?qū)懺谥袛嗪瘮?shù)體內(nèi)也行,但中斷服務(wù)函數(shù)會顯得臃腫。timer0每5毫秒中斷1次,調(diào)用dispaly()函數(shù)執(zhí)行1次,在執(zhí)行dispaly()過程中,當(dāng)i = 0時,只顯示秒個位,當(dāng)i = 1時,只顯示秒十位,依次類推。為了讓小時的個位小數(shù)點常亮,讓小時個位顯示時,把顯示編碼數(shù)據(jù)的高8位設(shè)置為0;為了分個位小數(shù)點秒閃爍,把分個位小數(shù)點位設(shè)置一個周期變化的量即可。 3.程序與復(fù)雜,使用的變量就愈多,在程序分析和設(shè)計時,需要注意使用的變量最好使用有一定含義的字符表示。,思考題,1.利用模式2最大好處在于在timer0中斷服務(wù)函數(shù)中不再對TL0和TH0預(yù)置,程序變得簡單一些,下面是利用timer0實現(xiàn)1秒定時局部程序,試分析并補(bǔ)寫完整,讓這個程序完成與本案

溫馨提示

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

評論

0/150

提交評論