第3章單片機中斷與定時_第1頁
第3章單片機中斷與定時_第2頁
第3章單片機中斷與定時_第3頁
第3章單片機中斷與定時_第4頁
第3章單片機中斷與定時_第5頁
已閱讀5頁,還剩130頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 3.1單片機中斷與定時系統(tǒng)單片機中斷與定時系統(tǒng)知識第第3章章 單片機中斷與定時單片機中斷與定時1.什么是中斷? 比如,你正在家中做作業(yè),突然門鈴響了,有快遞,你放下書,去接快遞的同時,廚房煤氣灶上湯燒開了,這時,你會先去關了煤氣灶,再去接快遞,然后繼續(xù)做作業(yè)。這就是生活中的“中斷”的現(xiàn)象,就是正常的過程被外部的事件打斷了。 “有快遞”、“湯燒開了”等是中斷源; “湯燒開了”比“有快遞”急,所以要先去響應,這就是中斷優(yōu)先級; “關煤氣灶”、“接快遞”等就是中斷響應。2.中斷源中斷源(哪些信號可以引起單片機中斷?)中斷源數(shù)量和種類越多,中斷源數(shù)量和種類越多,MCU處理突發(fā)事件的能力就越強。處理突

2、發(fā)事件的能力就越強。80C51單片機共有單片機共有5種中斷源。種中斷源。中斷源分為三類:2個外部中斷,2個定時器/計數(shù)器中斷,1個串行口中斷。(1)外部中斷INT0:外部中斷0,由引腳P3.2輸入,可選擇低電平或者下降沿觸發(fā)。INT1:外部中斷1,由引腳P3.3輸入,可選擇低電平或者下降沿觸發(fā)。(2)定時器/計數(shù)器中斷 T0:定時器/計數(shù)器0中斷,定時器0提供片內(nèi)計數(shù)溢出觸發(fā),或者P3.4引腳提供片外計數(shù)觸發(fā)。 T1:定時器/計數(shù)器1中斷,定時器1提供片內(nèi)計數(shù)溢出觸發(fā),或者P3.5引腳提供片外計數(shù)觸發(fā)。(3)RX、TX為串行口中斷所用,由片內(nèi)串口提供,分為發(fā)送中斷和接收中斷,當串口完成一幀發(fā)送

3、或接收時,觸發(fā)中斷。3.中斷請求標志中斷請求標志(單片機如何知道中斷信號出現(xiàn)了?)(單片機如何知道中斷信號出現(xiàn)了?)當中斷信號出現(xiàn)時,單片機中的某些位寄存器當中斷信號出現(xiàn)時,單片機中的某些位寄存器(中斷請求標志位中斷請求標志位)可被硬件置)可被硬件置1。CPU通過定期查看中斷請求標志位是否為通過定期查看中斷請求標志位是否為1,便可,便可知道有無中斷請求。知道有無中斷請求。 TCON寄存器寄存器定時定時/計數(shù)器的控制寄存器計數(shù)器的控制寄存器(Timer/Counter Control Register),),可位尋址??晌粚ぶ?。 SCON寄存器寄存器IE寄存器寄存器51單片機復位,IE各位清0,

4、所有中斷被禁止。每個位開關賦值為1則開中斷,賦值為0則關中斷。只有打開總中斷位開關,其它各位的開關才可以開啟??梢哉w賦值,如:IE=0 x81;表示開啟總中斷,打開外部中斷0可以單獨賦值:如:EA=1;EX0=1;也表示開啟總中斷,打開外部中斷0。 IP 寄存器寄存器51單片機復位,IP各位清0,所有中斷同為低優(yōu)先級。每位可賦值為1,則高優(yōu)先級,賦值為0,則低優(yōu)先級,同級按自然優(yōu)先級排序執(zhí)行。自然優(yōu)先級順序由高到低排列為:外部中斷0、定時器/計數(shù)器0中斷、外部中斷1、定時器/計數(shù)器1中斷、個串行口中斷。可以整體賦值,如:IP=0 x02;表示定時器/計數(shù)器0中斷為高優(yōu)先級中斷??梢詥为氋x值:

5、如:PT0=1;也表示定時器/計數(shù)器0中斷為高優(yōu)先級中斷。優(yōu)先級原則小結:優(yōu)先級原則小結:1)高級中斷請求可以打斷正在執(zhí)行的低級中斷;)高級中斷請求可以打斷正在執(zhí)行的低級中斷;2)同級或低級中斷請求不能打斷正在執(zhí)行的中斷;)同級或低級中斷請求不能打斷正在執(zhí)行的中斷;3)同級中斷源同時提出請求時按自然優(yōu)先級響應:)同級中斷源同時提出請求時按自然優(yōu)先級響應: INT0 T0 INT1T1TI/RI4)單片機復位時,)單片機復位時,IP各位都被置各位都被置0, 所有中斷源為低級中斷所有中斷源為低級中斷4.中斷系統(tǒng)的組成中斷系統(tǒng)的組成(影響中斷的因素?)5.中斷系統(tǒng)的組成中斷系統(tǒng)的組成(影響中斷的因素

6、?)定時定時/計數(shù)器的結構與原理計數(shù)器的結構與原理 8051單片機內(nèi)部有兩個16位的可編程定時/計數(shù)器,稱為T0(T0)和T1(T1) 應用1:T0/T1用作計數(shù)對芯片對芯片引腳引腳T0/T1上上輸入的脈沖計數(shù),輸入的脈沖計數(shù),每輸入一個脈沖,每輸入一個脈沖,加法計數(shù)器加加法計數(shù)器加120VSS19XTAL118XTAL217/P3.716/P3.615T1/P3.514T0/P3.413/P3.312/P3.211TXD/P3.110RXD/P3.09RST/VPD8P1.77P1.66P1.55P1.44P1.33P1.22P1.11P1.0P2.021P2.122P2.223P2.324

7、P2.425P2.526P2.627P2.72829ALE/ 30 /VPP31P0.732P0.633P0.534P0.435P0.336P0.237P0.138P0.039VCC401INTW RRDEAPROGPSEN80318051875189C510INTT0外部計數(shù)應用應用2:T0/T1用作內(nèi)部定時用作內(nèi)部定時對內(nèi)部機器周期脈沖計數(shù),由于機器對內(nèi)部機器周期脈沖計數(shù),由于機器周期是定值,所以可周期是定值,所以可設定初值設定初值進行定進行定時。時。內(nèi)部定時內(nèi)部定時/ /計數(shù)器的啟動計數(shù)器的啟動 INT1 0INT 或啟動定時/計數(shù)器 根據(jù)設置的定時/計數(shù)器啟動方式,啟動定時/計數(shù)器。

8、如果采用軟件啟動: 1.TR0或TR1置1; 如果采用硬軟共同啟動方式: 1.控制寄存器中的TR0或TR1置1, 2.外部啟動信號 為高電平。INT1 0INT 或定時/計數(shù)器的初值 設置計數(shù)初值pT0T0、T1T1是是1616位加法計數(shù)器,分別由兩個位加法計數(shù)器,分別由兩個8 8位專用寄存器組成,位專用寄存器組成,T0T0由由TH0TH0和和TL0TL0組成,組成,T1T1由由TH1TH1和和TL1TL1組成。組成。p在計數(shù)器允許的計數(shù)范圍內(nèi),計數(shù)器可以從任何值開始計數(shù),在計數(shù)器允許的計數(shù)范圍內(nèi),計數(shù)器可以從任何值開始計數(shù),對于加對于加1 1計數(shù)器,當計到最大值時(對于計數(shù)器,當計到最大值時

9、(對于8 8位計數(shù)器,當計數(shù)值位計數(shù)器,當計數(shù)值從從255255再加再加1 1時,計數(shù)值變?yōu)闀r,計數(shù)值變?yōu)? 0),產(chǎn)生溢出。),產(chǎn)生溢出。p定時定時/ /計數(shù)器允許用戶編程設定開始計數(shù)的數(shù)值,稱為賦初值。計數(shù)器允許用戶編程設定開始計數(shù)的數(shù)值,稱為賦初值。初值不同,則計數(shù)器產(chǎn)生溢出時,計數(shù)個數(shù)也不同。初值不同,則計數(shù)器產(chǎn)生溢出時,計數(shù)個數(shù)也不同。 1 定時器工作方式寄存器(定時器工作方式寄存器(TMOD,89H)作用:設置兩個定時器作用:設置兩個定時器/計數(shù)器工作方式。計數(shù)器工作方式。但但TMOD寄存器不能位尋址,只能用字節(jié)傳送指令設置寄存器不能位尋址,只能用字節(jié)傳送指令設置其內(nèi)容。其內(nèi)容。位

10、序號位序號 D7D6D5D4 D3D2D1D0位符號位符號 GATEC/TM1M0GATEC/TM1M0 T1 T0 M1、M0工作方式選擇位。工作方式選擇位。M1 M0工作方式工作方式功功 能能 描描 述述0 00 11 01 1方式方式 0方式方式1方式方式2方式方式313位計數(shù)器位計數(shù)器16位計數(shù)器位計數(shù)器自動再裝入自動再裝入8位計數(shù)器位計數(shù)器定時器定時器0:分成兩個:分成兩個8位計數(shù)器位計數(shù)器定時器定時器1:停止計數(shù):停止計數(shù) 定時方式或計數(shù)方式選擇位定時方式或計數(shù)方式選擇位 0定時工作方式定時工作方式1計數(shù)工作方式計數(shù)工作方式T/CT/CT/C位序號位序號 D7D6D5D4 D3D2

11、D1D0位符號位符號 GATEC/TM1M0GATEC/TM1M0 GATE門控位門控位 GATE0 以運行控制位以運行控制位TR0(TR1)啟動定時器)啟動定時器 GATE1 以外中斷請求信號以外中斷請求信號 啟動定時器啟動定時器 INT1 0INT 或 復位后,復位后,TMOD0。位序號位序號 D7D6D5D4 D3D2D1D0位符號位符號GATE 0C/T0M11M00GATE0C/T1M10M01例例: 設定時器設定時器1為定時工作方式,要求由為定時工作方式,要求由TR1啟動定時器啟動定時器1,按方式按方式2工作。定時器工作。定時器0為計數(shù)方式,要求由為計數(shù)方式,要求由TR0啟動定時啟

12、動定時器器0,按方式,按方式1工作。工作。TMOD=0 x25定時器控制寄存器(定時器控制寄存器(TCON,88H)位地址位地址8F8E8D8C8B8A8988位符號位符號TF1TR1TF0TR0IE1IT1IE0IT0位地址位地址8F8E8D8C8B8A8988位符號位符號TF1TR1TF0TR0IE1IT1IE0IT0TR0(TR1): 定時器運行控制位。定時器運行控制位。定時器的初始值的計算對于不同的工作方式,計數(shù)器位數(shù)不同,故最大計數(shù)值對于不同的工作方式,計數(shù)器位數(shù)不同,故最大計數(shù)值M也不同:也不同: 方式方式0:M=213=8192 方式方式1:M=216=65536 方式方式2:M

13、=28=256 方式方式3:定時器:定時器0分為分為2個個8位計數(shù)器,每個位計數(shù)器,每個M均為均為256。因為定時因為定時/計數(shù)器是作加計數(shù)器是作加1計數(shù),并在計滿溢出時產(chǎn)生中斷,因此初計數(shù),并在計滿溢出時產(chǎn)生中斷,因此初值值X的計算如下:的計算如下: X = M 計數(shù)值計數(shù)值 計算出來的結果計算出來的結果X轉換為轉換為16進制數(shù)后分別寫入進制數(shù)后分別寫入TL0(TL1)、)、TH0(TH1)。)。注意!方式注意!方式0時初始值寫入時,對于時初始值寫入時,對于TL不用的高不用的高3位應填入位應填入0!舉例1 用用T1、工作方式、工作方式1實現(xiàn)實現(xiàn)1秒延時函數(shù),晶振秒延時函數(shù),晶振頻率為頻率為1

14、2MHz。 方式方式1采用采用16位計數(shù)器,其最大定時時間為:位計數(shù)器,其最大定時時間為:655361 s = 65.536ms,因此,定時時間選擇定時時間為,因此,定時時間選擇定時時間為50ms,再循環(huán),再循環(huán)20次。次。 定時時間為定時時間為50ms,則計數(shù)值為,則計數(shù)值為50ms/1 s =50000,T1的初的初值為:值為: X = M 計數(shù)值計數(shù)值= 65536 50000 = 15536 = 0 x3CB0 = 所以:所以: TH1=0 x3C ;TL1=0 xB0;TMOD=0 x10;用用T1T1、工作方式、工作方式2 2實現(xiàn)實現(xiàn)1 1秒延時,晶振頻率為秒延時,晶振頻率為12M

15、Hz12MHz。因工作方式因工作方式2 2是是8 8位計數(shù)器,其最大定時時間為:位計數(shù)器,其最大定時時間為:2562561 1 s s = 256= 256 s s,為實現(xiàn),為實現(xiàn)1 1秒延時,可選擇定時時間為秒延時,可選擇定時時間為250250 s s,再,再循環(huán)循環(huán)40004000次。次。 定時時間選定后,可確定計數(shù)值為定時時間選定后,可確定計數(shù)值為250250,則,則T1T1的初值的初值為:為:X = M X = M 計數(shù)值計數(shù)值=256 =256 250 = 6 = 0 x6 250 = 6 = 0 x6。采用。采用T1T1方式方式2 2工作,因此,工作,因此,TMOD =0 x20T

16、MOD =0 x20。舉 例2 3.2 簡易秒表項目設計簡易秒表項目設計項目動手做動手做畫出硬件電路圖畫出硬件電路圖 簡易秒表的程序設計如下。#include #define uchar unsigned char void delay(uchar); void watch(uchar,uchar);uchar i,l,msecond,second; uchar led=0 x3f,0 x6,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x7,0 x7f,0 x6f; /09碼表/*主程序*/void main()TMOD=0 x01; /T0,工作方式1,16位TL0=-5

17、0000%256; /T0初值低8位,定時50毫秒TH0=-50000/256; /T0初值高8位,定時50毫秒IE=0 x82; /T0允許,總中斷允許TR0=1; /運行T0while(1) watch(i,l); /秒表數(shù)碼管顯示/*秒表數(shù)碼管顯示*/void watch(uchar m,uchar n)P2=0 x08; P0=ledm; /數(shù)碼管1顯示十位delay(5);P2=0 x09; P0=ledn; /數(shù)碼管2顯示個位 delay(5);/*T0中斷服務程序,中斷號為1*/ void Time0() interrupt 1 TL0=-50000%256; /T0初值低8位,

18、定時50毫秒TH0=-50000/256; /T0初值高8位,定時50毫秒msecond+;if(msecond=20) /1秒時間到msecond=0;second+;if(second=60) /等于60秒歸零second=0;i=second/10; /十位:整除求商 l=second%10; /個位:整除求余/*延時函數(shù)t(ms)*/void delay(uchar t ) uchar j,k; for(j=0;jt;j+) for(k=0;k255;k+) 語句“TL0=-50000%256;”,完整的表達為“TL0=(65536-50000)%256;”。由于T0工作方式為1,是十

19、六位,所以最大為216,即65536,語句中50000表示計數(shù)次數(shù),實現(xiàn)50毫秒。將十進制換成十六進制,采用余運算,即%256,得到T0初值低8位。 同理,求商運算,即/256,得到T0初值高8位。 語句“i=second/10;”表示整除求商,得到秒時間的十位,語句“l(fā)=second%10;”表示整除求余,得到個位。 同理,可以利用“整除求商求余”來拆分提取一個數(shù)的個十百千位。 求商求余運算符,不僅能用在數(shù)學運算中,還可以用來拆分提取一個數(shù)的個十百千位。在單片機顯示程序中,不管是液晶屏還是數(shù)碼管,必須用到這種提取算法,先把一個數(shù)的個十百千位一個個拆分提取出來,然后再送到顯示屏上顯示,所以這種

20、算法很常見和實用。“個,十,百,千”位只是一個虛數(shù),具體是多少應該根據(jù)實際項目而定,也有可能是“個,十,百,千,萬,十萬,百萬.”等位,但是處理的思路和方法都是一致的。 拆分提取的思路。比如97532這個數(shù),萬位是9,千位是7,百位是5,十位是3,個位是2??梢砸来芜M行如下運算。9=97532/10000;7=7532/1000;5=532/100;3=32/10;2=2/1; 上述用到了整除求商,但是7532、532、32、2又是如何通過97532分解得到的呢?需要用到整除求余,運算如下。7532=97532%10000;532=97532%1000;32=97532%100;2=97532

21、%10; 最后綜合在一起,連在一起寫:9=97532/10000;7=(97532%10000)/1000;5=(97532%1000)/100;3=(97532%100)/10;2=(97532%10)/1;因為,預先知道了這個數(shù)最大位是萬位,所以萬位直接整除10000求商就可以了。實際項目中,只是用某個變量,而這個變量的大小并不知道具體是什么,它的最大位可能并不止萬位,也有可能是十萬位,所以需要把上述最高位的萬位也做一下100000整除余數(shù),然后在整除10000求商,計算如下。9=(97532%100000)/10000;7=(97532%10000)/1000;5=(97532%1000

22、)/100;3=(97532%100)/10;2=(97532%10)/1;以此類推,如果求十萬,百萬,也是用一樣的方法。有一些單片機的C編譯器可能不支持long類型數(shù)據(jù)的求余求商連寫在一起,那么就要用一個中間變量分兩步走,先求余,再求商,分開來操作,表達如下。9=(97532%100000)/10000;分成如下兩步走。a=97532%100000;a=a/10000;上述的變量a就是引入的中間變量。以5位數(shù)x為例,拆分得到各位數(shù)字的程序如下。unsigned char a,b,c,d,e; unsigned long int x; a=(x%100000)/10000; /拆分提取萬位b=

23、(x%10000)/1000; /拆分提取千位c=(x%1000)/100; /拆分提取百位d=(x%100)/10; /拆分提取十位e=(x%10)/1; /拆分提取個位由于x是5位數(shù),必須是unsigned long int類型以上。x不能是unsigned char類型,它的最大范圍是255,不夠;也不能是unsigned int,最大范圍為65536,也不夠。仿真運行圖 3.3 時分秒的計時項目設計時分秒的計時項目設計項目動手做動手做畫出硬件電路圖畫出硬件電路圖 時分秒的計時程序設計如下。#include #define uchar unsigned charvoid delay(uc

24、har);void watch(uchar,uchar,uchar,uchar,uchar,uchar); /數(shù)碼管顯示函數(shù)聲明uchar s1,s2,m1,m2,h1,h2,msecond,second,minute,hour; uchar led=0 x3f,0 x6,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x7,0 x7f,0 x6f; /09段碼/*主程序*/void main()TMOD=0 x01; /T0工作方式1TL0=-50000%256; /50ms初值低8位TH0=-50000/256; /50ms初值高8位 IE=0 x82; /定時中斷允許TR

25、0=1; /啟動定時中斷while(1) watch(s1,s2,m1,m2,h1,h2); /數(shù)碼管顯示時分秒/*數(shù)碼管顯示時分秒*/void watch(uchar ss1,uchar ss2,uchar mm1,uchar mm2,uchar hh1,uchar hh2)P2=0 x08; P0=ledhh1; delay(1);P2=0 x09; P0=ledhh2; /數(shù)碼管顯示時delay(1);P2=0 x0a; P0=ledmm1; delay(1);P2=0 x0b; P0=ledmm2; /數(shù)碼管顯示分delay(1);P2=0 x0c; P0=ledss1; delay(

26、1);P2=0 x0d; P0=ledss2; /數(shù)碼管顯示秒delay(1);/*定時器0中斷函數(shù)*/void Time0() interrupt 1TL0=-50000%256; /T0初值重置TH0=-50000/256;msecond+;if(msecond=20) /1000ms為1秒msecond=0;second+;if(second=60) /60秒為1分second=0;minute+;s1=second/10; /秒十位s2=second%10; /秒個位if(minute=60) /60分為1小時minute=0;hour+;m1=minute/10; /分十位 m2=m

27、inute%10; /分十位 if(hour=24) hour=0; h1=hour/10; /時十位 h2=hour%10; /時十位 /*延時函數(shù)t(ms)*/void delay(uchar t ) uchar j,k; for(j=0;jt;j+) for(k=0;k255;k+) 仿真運行圖 3.4 光電計時項目設計光電計時項目設計項目 光電開關是利用被檢測物對光束的遮擋或反射,從而檢測物體的有無。光電計時硬件電路使用兩個對射式光電開關,其中對射式光電開關0作為外中斷0,當有物體經(jīng)過時,阻擋光路,觸發(fā)控制單片機定時器開始;對射式光電開關1作為外中斷1,當有物體經(jīng)過時,阻擋光路,觸發(fā)控

28、制單片機定時器結束,根據(jù)開始和結束間隔來完成計時,并用數(shù)碼管顯示讀秒,動手做動手做畫出硬件電路圖畫出硬件電路圖 光電計時程序設計如下。#include #define uchar unsigned char void delay(uchar); void init(void);void display(void); /數(shù)碼管顯示計數(shù)unsigned long int t_ms;uchar led=0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F; /09段碼 uchar wan,qian,bai,shi ,ge; /計時的萬

29、、千、百、十、個位。/*主程序*/void main()init();while(1) display(); /*定時器0外中斷0、1初始化*/void init(void)TMOD=0 x01; /定時器0方式1,16位TH0=(65536-1000)/256; /定時器0的1ms初值高8位 TL0=(65536-1000)%256; /定時器0的1ms初值低8位IT0=1; /外部中斷0下降沿觸發(fā)IT1=1; /外部中斷1下降沿觸發(fā)ET0=1; /允許定時0中斷EA=1; /總中斷允許EX0=1; /允許外部中斷 0,EX1=1; /允許外部中斷 1,/*外中斷0函數(shù)*/void int0

30、(void) interrupt 0 /外部中斷0服務程序:計時開始TR0=1; /開定時中斷0,開始計時t_ms=0;/*定時器0中斷函數(shù)*/void time0(void) interrupt 1 /定時器中斷0TH0=(65536-1000)/256; /定時器0的1ms初值高8位 TL0=(65536-1000)%256; /定時器0的1ms初值低8位t_ms=t_ms+1;if(t_ms=100000) t_ms=0; /超過100秒歸0/*外部中斷1函數(shù)*/void int1(void) interrupt 2 /外部中斷1服務程序:計時結束 TR0=0; /關定時中斷0,結束計時

31、/*數(shù)碼管顯示計數(shù)*/void display()wan= (t_ms%100000)/10000; /萬位qian=(t_ms%10000)/1000; /千位bai= (t_ms%1000)/100; /百位shi= (t_ms%100)/10; /十位ge= (t_ms%10)/1; /個位P2=0 x8; P0=ledwan; /顯示萬位(秒十位)在第1個數(shù)碼管delay(1);P2=0 x9; P0=ledqian; /顯示千位(秒個位)在第2個數(shù)碼管delay(1);P2=0 xa; P0=0 x80; /顯示.在第3個數(shù)碼管delay(1); P2=0 xb; P0=ledbai

32、; /顯示百位(毫秒百位)在第4個數(shù)碼管 delay(1);P2=0 xc; P0=ledshi; /顯示十位(毫秒十位)在第5個數(shù)碼管 delay(1);P2=0 xd; P0=ledge; /顯示個位(毫秒個位)在第6個數(shù)碼管delay(1);/*延時函數(shù)t(ms)*/void delay(uchar t ) uchar j,k; for(j=0;jt;j+) for(k=0;k255;k+) 仿真運行圖 3.5 定時器計數(shù)項目設計定時器計數(shù)項目設計項目單片機定時/計時器具有計數(shù)功能,可以對管腳P3.4/T0或P3.5/T1的脈沖下降沿計數(shù),在由高電平變成低電平的時候計數(shù)一次,直到再次檢測

33、到下降沿。動手做動手做畫出硬件電路圖畫出硬件電路圖 1. 采用中斷方式 按鈕按鍵作為計數(shù),計5次改變LED狀態(tài),采用中斷方式計數(shù)的程序如下。#includesbit LED=P14; /LED接口端/*定時器0初始化*/void timer0_init(void)TMOD=0X06; /定時器0,計數(shù),方式2TH0=-5; /計數(shù)5次為上限TL0=-5; /計數(shù)5次為上限IE=0X82; /允許中斷TR0=1; /啟動中斷/*定時器0中斷函數(shù)*/void Timer0_int() interrupt 1 using 0 /定時器0計數(shù)中斷 LED=!LED; /*主程序*/void main(

34、)LED=0;timer0_init();while(1) ;2. 采用查詢方式 按鈕按鍵作為計數(shù),計5次改變LED狀態(tài),采用查詢方式計數(shù)的程序如下。#includesbit LED=P14; /LED接口端/*定時器0初始化*/void time0_init(void)TMOD=0X06; /定時器0,計數(shù),方式2TH0=-5; /計數(shù)5次為上限TL0=-5; /計數(shù)5次為上限TR0=1; /啟動計數(shù)器0/*主程序*/void main()LED=0;time0_init(); /定時器0計數(shù)中斷while(1)while(TF0=0); /等待定時器0中斷TF0=0; /定時器0中斷到,清

35、標記LED=!LED; 仿真運行圖 3.6 模擬交通信號燈項目設計模擬交通信號燈項目設計項目 用51單片機設計一交通信號燈模擬控制系統(tǒng),采用12MHz晶振。具體要求如下。(1)南北方向為主道,東西方向為支道,輪流放行,南北綠燈放行25s,黃燈延時5s,紅燈20s;東西綠燈放行15s,黃燈延時5s,紅燈30s。(2)有緊急車輛通過時,均為紅燈。(3)要求由數(shù)碼管顯示紅綠燈倒計時時間。動手做動手做畫出硬件電路圖畫出硬件電路圖 模擬交通燈項目的程序設計如下。#include #define uchar unsigned charuchar a10=0 x3F,0 x06,0 x5B,0 x4F,0

36、x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F; /09段碼uchar b4=0 x0D,0 x0E,0 x07,0 x0B;/P2口控制數(shù)碼管顯示位:南北個、十位,東西個、十位。uchar c4=0 x3A,0 x36,0 x5C,0 x6C;/4個狀態(tài):東西紅,南北綠;東西紅,南北黃燈閃;東西綠,南北紅;東西黃閃,南北紅。uchar NS=25,EW=30; /NS表示南北向25秒綠燈亮,EW表示東西向30秒紅燈亮。uchar NS_G=25,EW_G=15,Y=5; /NS向綠燈亮25秒,東西綠15秒,黃燈5秒。uchar i,k=0,count=0; void de

37、lay(uchar);void trafic_light(); /四個交通燈狀態(tài)函數(shù)聲明void led_display(); /數(shù)碼管顯示函數(shù)聲明sbit key_end=P35; /結束緊急狀態(tài)/*定時器0初始化函數(shù)*/void init(void)TMOD=0 x01; /定時器0方式1,16位TH0=(65536-50000)/256; /定時器0的50ms初值高8位 TL0=(65536-50000)%256; /定時器0的50ms初值低8位ET0=1; /允許定時0中斷TR0=1; /運行定時0中斷EX1=1; /允許外中斷1EA=1; /總中斷允許/*外部中斷1中斷函數(shù)*/voi

38、d int1(void) interrupt 2 /外部中斷1,P3.3,,緊急狀態(tài)P1=0 x3C,P0=a9; /東南西北紅燈,數(shù)碼管顯示99EA=0; /關中斷TR0=!TR0; /停定時器0中斷while(1)for(i=0;i4;i+)P2=bi;delay(1);if(key_end=0) /緊急狀態(tài)結束,繼續(xù)delay(10); if(key_end=0)while(!key_end) for(i=0;i=20) /20*50ms=1秒NS-; EW-; count=0; if(NS=0|EW=0) /NS或EW減到零k+;if(k3) k=0;switch(k) case 0:

39、NS=NS_G;EW=NS_G+Y;break; /狀態(tài)0:東西紅,南北綠的時間case 1:NS=Y;EW=Y;break; /狀態(tài)1:東西紅,南北黃閃時間 case 2:NS=EW_G+Y;EW=EW_G;break; /狀態(tài)2:東西綠,南北紅的時間case 3:NS=Y;EW=Y;break; /狀態(tài)3:東西黃閃,南北紅時間/*延時函數(shù)t(ms)*/void delay(uchar t ) uchar j,k; for(j=0;jt;j+) for(k=0;k255;k+) /*交通燈狀態(tài)函數(shù)*/void trafic_light() /4個亮燈狀態(tài)P1=ck; /燈狀態(tài)0或狀態(tài)2if(

40、P1=c1&count=0) /狀態(tài)1、 1秒時間到,滅黃燈,形成閃爍 P1=0 x3E; elseif(P1=c3&count=0) /狀態(tài)3、1秒時間到,滅黃燈,形成閃爍 P1=0 x7C; /*數(shù)碼管倒計時*/void led_display() P2=b0;P0=aNS%10; /南北個位delay(5); P2=b1;P0=aNS/10; /南北十位delay(5);P2=b2;P0=aEW%10; /東西個位delay(5); P2=b3;P0=aEW/10; /東西十位delay(5); /*主程序*/void main(void)init(); /定時器0初始化

41、while(1)trafic_light(); /交通燈狀態(tài)變化led_display(); /數(shù)碼管倒計時顯示仿真運行圖 3.7 帶設置功能的交通燈項目設計帶設置功能的交通燈項目設計項目 用51單片機設計一交通信號燈模擬控制系統(tǒng),采用12MHz晶振。具體要求如下。(1)南北方向為主道,東西方向為支道,輪流放行,南北綠燈放行25s,黃燈延時5s,紅燈20s;東西綠燈放行15s,黃燈延時5s,紅燈30s。(2)有緊急車輛通過時,均為紅燈。(3)要求由數(shù)碼管顯示紅綠燈倒計時時間。(4)可以對南北、東西的交通燈時間進行設置。動手做動手做畫出硬件電路圖畫出硬件電路圖 帶設置功能的交通燈項目源程序如下。

42、#include #define uchar unsigned char uchar a10=0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F; /09段碼uchar b4=0 x0D,0 x0E,0 x07,0 x0B; /P2口控制數(shù)碼管顯示位:南北個、十位,東西個、十位。uchar c4=0 x3A,0 x36,0 x5C,0 x6C; /4個狀態(tài):東西紅,南北綠;東西紅,南北黃燈閃;東西綠,南北紅;東西黃閃,南北紅。uchar NorthSouth=25,EastWest=30;/NorthSouth表示南北向25秒

43、綠燈亮,EastWest表示東西向30秒紅燈亮。uchar NorthSouth_G=25,EastWest_G=15,Y=5; /NorthSouth向綠燈亮25秒,東西綠15秒,黃燈5秒。uchar i,k=0,count=0; void delay(uchar);void trafic_light(); /四個交通燈狀態(tài)函數(shù)聲明void led_display(); /數(shù)碼管顯示函數(shù)聲明void led_set(); /數(shù)碼管設置sbit NorthSouth_up=P30; /南北綠燈設置時間加1,或重新開始sbit EastWest_up1=P36; /東西綠燈設置時間加1,或重新開

44、始sbit key_end=P35; /結束設置時間,或結束緊急狀態(tài)sbit NorthSouth_down=P31; /南北綠燈設置時間減1sbit EastWest_down1=P37; /東西綠燈設置時間減1/*定時器0,外部中斷0、1初始化函數(shù)*/void init(void)TMOD=0 x01; /定時器0方式1,16位TH0=(65536-50000)/256; /定時器0的50ms初值高8位 TL0=(65536-50000)%256; /定時器0的50ms初值低8位IT0=1; /外部中斷0下降沿觸發(fā)ET0=1; /允許定時0中斷TR0=1; /運行定時0中斷EA=1; /總

45、中斷允許EX0=1; /允許外部中斷 0,EX1=1; /允許外部中斷 1,/*外部中斷0服務程序:時間設置,P3.2*/void int0(void) interrupt 0 EA=0; /關中斷P1=0 x3C; /東西、南北紅LEDTR0=!TR0; /關定時中斷0while(1)led_set(); if(NorthSouth_up=0) /南北綠燈設置時間加1delay(10); if(NorthSouth_up=0)while(!NorthSouth_up) led_set(); NorthSouth_G+; if(NorthSouth_G+Y)=100) NorthSouth_G

46、=1; if(NorthSouth_down=0) /南北綠燈設置時間減1delay(10); if(NorthSouth_down=0)while(!NorthSouth_down) led_set(); NorthSouth_G-; if(NorthSouth_G+Y)=5) NorthSouth_G=94; if(EastWest_up1=0) /東西綠燈設置時間加1delay(10); if(EastWest_up1=0)while(!EastWest_up1) led_set(); EastWest_G+; if(EastWest_G+Y)=100) EastWest_G=1; if

47、(EastWest_down1=0) /東西綠燈設置時間減1delay(10); if(EastWest_down1=0) while(!EastWest_down1) led_set(); EastWest_G-; if(EastWest_G+Y)=5) EastWest_G=94; if(key_end=0) /結束設置時間delay(10); if(key_end=0)while(!key_end) led_set(); TR0=!TR0; EA=1; break; /*外部中斷1,P3.3,緊急狀態(tài)*/void int1(void) interrupt 2 P1=0 x3C,P0=a9

48、; /東南西北紅燈,數(shù)碼管顯示99EA=0; /關中斷TR0=!TR0; /停定時器0中斷while(1)for(i=0;i4;i+)P2=bi;delay(1);if(key_end=0) /緊急狀態(tài)結束,繼續(xù)delay(10); if(key_end=0)while(!key_end) for(i=0;i=20) /20*50ms=1秒NorthSouth-; EastWest-; count=0; if(NorthSouth=0|EastWest=0) /NorthSouth或EastWest減到零k+;if(k3) k=0;switch(k) case 0:NorthSouth=Nor

49、thSouth_G;EastWest=NorthSouth_G+Y;break; /狀態(tài)0:東西紅,南北綠的時間case 1:NorthSouth=Y;EastWest=Y;break; /狀態(tài)1:東西紅,南北黃燈閃的時間 case 2:NorthSouth=EastWest_G+Y;EastWest=EastWest_G;break; /狀態(tài)2:東西綠,南北紅的時間case 3:NorthSouth=Y;EastWest=Y;break; /狀態(tài)3:東西黃閃,南北紅的時間/*延時函數(shù)t(ms)*/void delay(uchar t ) uchar j,k; for(j=0;jt;j+) f

50、or(k=0;k255;k+) /*交通燈狀態(tài)函數(shù)*/void trafic_light() /4個亮燈狀態(tài)P1=ck; /燈狀態(tài)0或狀態(tài)2if(P1=c1&count=0) /狀態(tài)1,同時1秒時間到,滅黃燈,形成閃爍 P1=0 x3E; elseif(P1=c3&count=0) /狀態(tài)3、 1秒時間到,滅黃燈,閃爍 P1=0 x7C; /*數(shù)碼管倒計時*/void led_display() P2=b0;P0=aNorthSouth%10; /南北個位delay(5); P2=b1;P0=aNorthSouth/10; /南北十位delay(5);P2=b2;P0=aEas

51、tWest%10; /東西個位delay(5); P2=b3;P0=aEastWest/10; /東西十位delay(5); /*數(shù)碼管設置值顯示*/void led_set() P2=b0;P0=a(NorthSouth_G+Y)%10; /南北設置時間個位delay(5); P2=b1;P0=a(NorthSouth_G+Y)/10; /南北設置時間十位delay(5); P2=b2;P0=a(EastWest_G+Y)%10; /東西設置時間個位delay(5); P2=b3;P0=a(EastWest_G+Y)/10; /東西設置時間十位delay(5); /*主程序*/void ma

52、in(void)init(); while(1)key(); trafic_light(); led_display(); 仿真運行圖 3.8 直流電機的直流電機的PWM控制項目設計控制項目設計項目 設計一個直流電機控制系統(tǒng),控制功能要求實現(xiàn)電機的正轉啟動、反轉啟動、停止、加速、減速共五種功能,使用按鍵和數(shù)碼管,實現(xiàn)人機交互。 K1控制正轉啟動、K2控制反轉啟動、K3停止控制、K4加速控制、K5減速控制,用3個發(fā)光二極管顯示狀態(tài):正轉時紅燈亮,反轉時黃燈亮,不轉時綠燈亮。并利用1位LED數(shù)碼管顯示電機轉速檔位動手做動手做畫出硬件電路圖畫出硬件電路圖 電機屬于大功率的器件,而單片機的I/O口所提

53、供的電流往往十萬有限,所以必須外加驅(qū)動電路。 由于專用的驅(qū)動芯片由于結構簡單、價格便宜、可靠性高等特點,因而被廣泛的應用實現(xiàn)電機的驅(qū)動。電機的驅(qū)動芯片很多如L298N、BST7970、MC33886等。 電機屬于L298可驅(qū)動2個電動機,2、3、13、14腳OUT1,OUT2和OUT3,OUT4之間可分別接電動機。5、7、10、12腳的IN1、IN2、IN3、IN4接輸入控制電平,控制電機的正反轉。EnA,EnB接控制使能端,控制電機的停轉。IN1 IN2 IN3IN4轉向轉向PWM調(diào)調(diào)速速EnAPWM調(diào)調(diào)速速EnB直流電機直流電機110- -正矩形波-01- -反矩形波-00- -停矩形波-

54、直流電機直流電機2-10 正-矩形波-01 反-矩形波-00 停-矩形波直流電機的PWM調(diào)速 所謂PWM就是脈寬調(diào)制器,通過調(diào)制器給電機提供一個具有一定頻率的脈沖寬度可調(diào)的脈沖電。脈沖寬度越大即占空比越大,提供給電機的平均電壓越大,電機轉速就高。反之脈沖寬度越小,則占空比越越小。提供給電機的平均電壓越小,電機轉速就低。 PWM不管是高電平還是低電平時電機都是轉動的,電機的轉速取決于平均電壓。 PWM調(diào)速程序中,可以使用軟件延時的方法,也可以使用定時器的方法,在單片機I/O口實現(xiàn)高低電平的延時翻轉,輸出不同占空比的PWM信號。直流電機的PWM控制項目程序設計如下。#include#define

55、uchar unsigned charuchar m; /用來標志速度檔位uchar num; /計數(shù)標志uchar led=0 x3f,0 x6,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x7,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71; /七段碼表 sbit LE=P20; sbit k1=P21; /正轉按鈕 sbit k2=P22; /反轉按鈕sbit k3=P23; /停按鈕sbit k4=P27; /加速按鈕sbit k5=P26; /減速按鈕sbit PWM=P15; /PWM信號從P14輸出sbit IN

56、2=P16; /直流電機正反轉控制sbit IN1=P17; /直流電機正反轉控制/*定時器的初始化函數(shù)*/ void init() /定時器的初始化 TMOD=0X01; /定時器0工作方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256; /裝載初值TR0=1; /開始計數(shù)ET0=1; /開啟定時器中斷使能EA=1; /開啟總中斷IN1=0;IN2=0; /IN1=0,IN2=0;控制電動機停m=0; /開啟電動機為0檔/*延時t(ms)函數(shù)*/ void delay(uchar t ) unsigned char j,k; for(j=0;jt;j

57、+) for(k=0;k3) m=3;while(!k4); /松開后繼續(xù)執(zhí)行if(P1=0 x01) P1=0 x01; if(P1=0 x10) P1=0 x10; if(k5=0) /檢測減速按鈕delay(10); /消抖10msif(k5=0) /如果減速按鈕按下 if(m1)m-; /檔位減一if(m=1)m=1;while(!k5); /松開后繼續(xù)執(zhí)行if(P1=0 x01) P1=0 x01; if(P1=0 x10) P1=0 x10;if(m3)m=3; /檔位最大為3檔if(m0)m=0; /檔位最小為0檔LE=1; /鎖存器數(shù)據(jù)透明P0=ledm;LE=0; /鎖存器數(shù)

58、據(jù)鎖存/*定時器0中斷函數(shù)*/ void Time0_Int() interrupt 1 /中斷程序TH0=(65536-50000)/256;TL0=(65536-50000)%256; /裝載初值num+;if(num = m) /對應的脈寬值輸出低電平 PWM = 0;if(num = 3) /3段一個周期到達后PWM = 1; /輸出高電平num = 0; 仿真運行圖 3.9 紅外遙控項目設計紅外遙控項目設計項目 按下遙控器的某一個鍵,遙控器會發(fā)出一連串經(jīng)過調(diào)制后的信號,這個信號經(jīng)過紅外一體化模塊接收后,輸出解調(diào)后的數(shù)字脈沖,每個按鍵對應不同的脈沖,故識別出不同的脈沖就能識別出不同的按

59、鍵。 紅外遙控是以調(diào)制的方式發(fā)射數(shù)據(jù),就是把數(shù)據(jù)和一定頻率的載波進行“與”操作,這樣既可以提高發(fā)射效率又可以降低電源功耗。 原始信號就是要發(fā)送的一個數(shù)據(jù)“0”位或者一位數(shù)據(jù)“1”位。 調(diào)制載波頻率一般在30khz到60khz之間,大多數(shù)使用的是38kHz,占空比1:3的方波。這是由發(fā)射端所使用的455kHz晶振決定的。在發(fā)射端要對晶振進行整數(shù)分頻,分頻系數(shù)一般取12,所以455kHz1237.9 kHz38kHz。 數(shù)據(jù)“0”位或 “1”位調(diào)制后波形如下: 根據(jù)紅外發(fā)射的NEC協(xié)議,數(shù)據(jù)“1”為2.25ms,脈沖時間560us;數(shù)據(jù)“0”為1.12ms,脈沖時間560us。根據(jù)脈沖時間長短來解

60、碼。38kHz調(diào)制后的數(shù)據(jù)1與數(shù)據(jù)0的表示遙控是以調(diào)制的方式發(fā)射數(shù)據(jù),就是把數(shù)據(jù)和一定頻率的載波進行“與”操作,這樣既可以提高發(fā)射效率又可以降低電源功耗。 根據(jù)紅外發(fā)射的NEC協(xié)議,首次發(fā)送的是9ms的高電平脈沖,其后是4.5ms的低電平,接下來就是8bit的地址碼,從低有效位開始發(fā),而后是8bit的地址碼的反碼,主要是用于校驗是否出錯。然后是8bit 的命令碼,也是從低有效位開始發(fā),而后也是8bit 的命令碼的反碼。 一個完整的全碼 = 引導碼 +用戶地址碼 +用戶地址碼反碼 + 命令碼 + 命令碼反碼 + 數(shù)據(jù)反碼。 數(shù)據(jù)格式包括了引導碼、用戶地址碼、用戶地址碼反碼、命令碼和命令碼反碼,編碼總占32位。反碼是地址碼、數(shù)據(jù)碼反相后的

溫馨提示

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

評論

0/150

提交評論