版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第9章 51單片機(jī)實(shí)現(xiàn)狀態(tài)機(jī) 9.1 有限狀態(tài)機(jī) 有限狀態(tài)機(jī)(FSM)與流程圖很相似,具有一組按照一定路徑排列的狀態(tài),依據(jù)于狀態(tài)中的事件和動(dòng)作,一個(gè)狀態(tài)可以轉(zhuǎn)移到其他狀態(tài)。 狀態(tài)是時(shí)間中的一個(gè)點(diǎn),例如,當(dāng)你等火車的時(shí)候,你在等待狀態(tài)。一種狀態(tài)在一個(gè)狀態(tài)機(jī)中,只能出現(xiàn)一次。 事件是某時(shí)發(fā)生的事情,例如火車到達(dá),火車運(yùn)行。 動(dòng)作是當(dāng)事件出現(xiàn)時(shí),實(shí)現(xiàn)的任務(wù),例如,火車到達(dá)后,上車 轉(zhuǎn)移是兩個(gè)狀態(tài)之間的聯(lián)系,可以從一個(gè)狀態(tài)移動(dòng)到另外一個(gè)狀態(tài)。 狀態(tài)圖就是對(duì)一個(gè)事物在某個(gè)事件發(fā)生后從一個(gè)源狀態(tài)到另外一個(gè)目的狀態(tài)轉(zhuǎn)移的圖形描述。 狀態(tài)圖中,使用圓圈表示狀態(tài),圓圈中的文字或數(shù)字表示該狀態(tài)的名字或是編碼,狀態(tài)
2、轉(zhuǎn)移方向用箭頭表示,在箭頭旁寫的文字是轉(zhuǎn)移條件。對(duì)于梅里狀態(tài)圖,在箭頭旁用“輸入/輸出”的格式表示轉(zhuǎn)移條件與滿足該轉(zhuǎn)移條件下的輸出;而對(duì)于摩爾狀態(tài)機(jī),常將輸出放在狀態(tài)圓圈中。,由圖可知,當(dāng)k=0時(shí),狀態(tài)從a0轉(zhuǎn)移到a1,若是k0=1,從狀態(tài)a1轉(zhuǎn)移到a2,等等,若是reset=0,則無(wú)論在什么狀態(tài),都將轉(zhuǎn)移到a0狀態(tài)。,一個(gè)狀態(tài)機(jī)描述需要五個(gè)要素:狀態(tài)、輸入、輸出、狀態(tài)轉(zhuǎn)移函數(shù)、輸出函數(shù)。 如果在一個(gè)狀態(tài)中包含著另一個(gè)狀態(tài)序列,則稱該狀態(tài)為復(fù)合狀態(tài)。 狀態(tài)機(jī)就是能夠根據(jù)狀態(tài)轉(zhuǎn)移條件進(jìn)行狀態(tài)轉(zhuǎn)換和輸出狀態(tài)活動(dòng)的自動(dòng)機(jī)。狀態(tài)機(jī)可以使用數(shù)字電路實(shí)現(xiàn),或是單片機(jī)通過(guò)軟件編程實(shí)現(xiàn)。 如果狀態(tài)數(shù)量有限、輸
3、入數(shù)量有限、輸出數(shù)量有限,則稱為有限狀態(tài)機(jī)(FSM)。 在數(shù)字電路中,有兩類基本的電路,它們是組合電路和時(shí)序電路,它們之間的區(qū)別是組合電路的結(jié)構(gòu)中沒有反饋、輸入值直接決定輸出值,而時(shí)序電路的結(jié)構(gòu)中具有反饋,其輸出由狀態(tài)和輸入決定。狀態(tài)機(jī)是時(shí)序電路的一種。,9.1.1 時(shí)鐘同步有限狀態(tài)機(jī) 如果一個(gè)時(shí)序電路中的觸發(fā)器都使用同一個(gè)時(shí)鐘信號(hào),則稱為同步狀態(tài)機(jī) 1. 結(jié)構(gòu) 時(shí)鐘同步狀態(tài)機(jī)的結(jié)構(gòu)如圖所示。 其中次態(tài)邏輯由現(xiàn)態(tài)和輸入形成。狀態(tài)記憶是n個(gè)觸發(fā)器,用于記憶2n狀態(tài)。輸出邏輯由現(xiàn)在狀態(tài)和輸入形成。 在時(shí)鐘的上升沿或是下降沿(取決于觸發(fā)器結(jié)構(gòu)),觸發(fā)器在次態(tài)邏輯的控制下動(dòng)作。,2. 輸出邏輯 如果一
4、個(gè)時(shí)序電路的輸出與現(xiàn)在狀態(tài)和輸入都有關(guān),則稱為梅里狀態(tài)機(jī),就是說(shuō),在某狀態(tài)下,滿足某輸入條件的輸出就是梅里輸出。值得注意的是梅里狀態(tài)機(jī)的輸入變化直接引起輸出的變化,而不是等到下一個(gè)狀態(tài)到來(lái)時(shí)輸出才變化。就是梅里狀態(tài)機(jī)。,與輸入無(wú)關(guān),輸出只與狀態(tài)有關(guān)的狀態(tài)機(jī),稱為摩爾狀態(tài)機(jī),所以摩爾狀態(tài)機(jī)的輸出與狀態(tài)變化同步。摩爾狀態(tài)機(jī)是使用廣泛的狀態(tài)機(jī),如圖所示。,3. 狀態(tài)編碼 具有n個(gè)狀態(tài)變量的狀態(tài)機(jī)具有2n個(gè)狀態(tài)。究竟一個(gè)狀態(tài)用什么樣的二進(jìn)制數(shù)表示,就是狀態(tài)編碼問(wèn)題。狀態(tài)與它的編碼之間不是唯一關(guān)系。最簡(jiǎn)單的狀態(tài)編碼就是采用自然二進(jìn)制整數(shù)順序來(lái)表示狀態(tài),這樣的編碼雖然簡(jiǎn)單,但是最終的電路未必是最簡(jiǎn)單的。如
5、果要得到最簡(jiǎn)單的結(jié)果,最好把各種編碼都試一試,但是太累人,一般情況下采用經(jīng)驗(yàn)編碼方法。 在狀態(tài)編碼時(shí)應(yīng)該考慮的一些因素: (1)選擇初始狀態(tài)的編碼與狀態(tài)機(jī)的復(fù)位狀態(tài)相同,這樣就會(huì)使?fàn)顟B(tài)機(jī)復(fù)位時(shí)就回到狀態(tài)機(jī)的初始狀態(tài)。 (2)每一次狀態(tài)變化,應(yīng)該使發(fā)生的狀態(tài)變量最少。 (3)如果有未使用的狀態(tài),則盡量選擇可以達(dá)到簡(jiǎn)化邏輯設(shè)計(jì)的狀態(tài)編碼。設(shè)計(jì)中應(yīng)該保證從未使用狀態(tài)一定可以進(jìn)入初始狀態(tài)。,4. 主從狀態(tài)機(jī) 一個(gè)大的狀態(tài)機(jī)設(shè)計(jì)是非常復(fù)雜的,一般情況下,最好將大的狀態(tài)機(jī)分解成小狀態(tài)機(jī)的集合。一般劃分的原則是按照功能劃分,主要輸入、輸出和控制算法由主狀態(tài)機(jī)完成,而輔助的、在主狀態(tài)機(jī)控制下的算法由子狀態(tài)機(jī)完
6、成,就是說(shuō)主狀態(tài)機(jī)完成頂層算法,子狀態(tài)機(jī)完成底層算法。 最常見的劃分就是將計(jì)數(shù)器作為子狀態(tài)機(jī),這時(shí),主狀態(tài)機(jī)只要發(fā)出啟動(dòng)信號(hào),而等待計(jì)數(shù)器返回的計(jì)數(shù)完成信號(hào)。雖然主狀態(tài)機(jī)增加了啟動(dòng)計(jì)數(shù)器的輸出信號(hào)和來(lái)自計(jì)數(shù)器的計(jì)數(shù)完成信號(hào),但是該計(jì)數(shù)器就可以為主狀態(tài)機(jī)節(jié)省n1個(gè)狀態(tài)。 主從狀態(tài)機(jī)的一般結(jié)構(gòu)如圖所示。,5. 狀態(tài)轉(zhuǎn)移條件 狀態(tài)轉(zhuǎn)移的條件和輸入的信號(hào)數(shù)有關(guān),n個(gè)輸入信號(hào),將有2n個(gè)轉(zhuǎn)移條件,這些條件之間應(yīng)該是互斥的,只能有一個(gè)轉(zhuǎn)移條件有效。也就是只能轉(zhuǎn)移到另外一個(gè)狀態(tài),而不是一個(gè)以上的狀態(tài)。 在狀態(tài)機(jī)設(shè)計(jì)過(guò)程中,對(duì)于狀態(tài)轉(zhuǎn)移的條件是容易給出的,但是使多個(gè)狀態(tài)轉(zhuǎn)移條件滿足互斥條件確是比較難的,因?yàn)檫@
7、需要更深刻的考慮狀態(tài)、轉(zhuǎn)移條件之間的關(guān)系。 一個(gè)狀態(tài)只向另外一個(gè)狀態(tài)轉(zhuǎn)移的狀態(tài)機(jī)是最簡(jiǎn)單的狀態(tài)機(jī),因?yàn)橹挥幸粋€(gè)狀態(tài)轉(zhuǎn)移條件。 有些狀態(tài)圖只給出本狀態(tài)向外狀態(tài)的轉(zhuǎn)移條件,而向自己轉(zhuǎn)移的條件未給出,這種情況可以理解為只要不向外狀態(tài)轉(zhuǎn)移就保持在本狀態(tài)不動(dòng)。,6. 狀態(tài)機(jī)的輸入信號(hào) 狀態(tài)機(jī)的輸入信號(hào)往往使是按鍵信號(hào),既然是按鍵信號(hào),則按下去的時(shí)間長(zhǎng)短是隨機(jī)的,可能是一個(gè)或幾個(gè)時(shí)鐘脈沖的時(shí)間,如果狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)移是在某輸入信號(hào)的作用之下連續(xù)轉(zhuǎn)移,例如,在狀態(tài)1,當(dāng)按鍵第一次為0時(shí),轉(zhuǎn)移到狀態(tài)2,第二次為0時(shí)轉(zhuǎn)移到狀態(tài)1,則會(huì)因?yàn)榘存I一直保持在0,引起狀態(tài)不斷的轉(zhuǎn)換,不能實(shí)現(xiàn)每按一次按鍵,轉(zhuǎn)換一次狀態(tài)的目
8、的。 解決的方法是設(shè)計(jì)邊沿微分電路,使按鍵按下時(shí),只在下降沿輸出一個(gè)時(shí)鐘周期的低電平,保證只有一個(gè)狀態(tài)轉(zhuǎn)移。 7. 上電狀態(tài)機(jī)初始化 在狀態(tài)機(jī)上電時(shí),無(wú)論為何種輸入條件,都應(yīng)該進(jìn)入到一個(gè)確定的狀態(tài),該狀態(tài)稱為上電初始狀態(tài)。有些狀態(tài)機(jī)可以在上電時(shí),自動(dòng)進(jìn)入上電初始狀態(tài),有些狀態(tài)機(jī)則不能,需要復(fù)位信號(hào)的幫助才能進(jìn)入上電初始狀態(tài)。 9.1.2狀態(tài)圖 狀態(tài)圖是用于小型、中型狀態(tài)機(jī)設(shè)計(jì)的一種方法,該方法的特點(diǎn)是簡(jiǎn)單。 狀態(tài)圖中的狀態(tài)轉(zhuǎn)移是用一根弧線表示的,所以不管有多少輸入變量,也只能有一個(gè)轉(zhuǎn)移條件表達(dá)式,應(yīng)該使現(xiàn)在狀態(tài)到所有次態(tài)的轉(zhuǎn)移條件互斥,也就是說(shuō)只能轉(zhuǎn)移到一個(gè)次態(tài)。 另外需要說(shuō)明的是用于控制器的
9、狀態(tài)機(jī)大部分都是摩爾狀態(tài)機(jī),就是說(shuō)這些狀態(tài)機(jī)的輸出僅僅與狀態(tài)有關(guān)。,例題9-1 設(shè)計(jì)一個(gè)順序開關(guān)裝置,該開關(guān)裝置在按鍵k第一次按下時(shí),三盞燈x、y和z同時(shí)點(diǎn)亮,當(dāng)k 再次按下時(shí),x燈立刻熄滅;y燈15s后熄滅,在y燈熄滅后18s后,z燈熄滅。,例題9-2 試設(shè)計(jì)一個(gè)交通信號(hào)燈控制器,該交通燈的紅、黃、綠燈亮滅順序是如下:,9.2.1 C語(yǔ)言描述狀態(tài)機(jī)的語(yǔ)句 int state=S0; /初始狀態(tài) while(1) /無(wú)限循環(huán) switch (state) case S0: If( T0轉(zhuǎn)移條件滿足) 狀態(tài)轉(zhuǎn)移到滿足T0條件的次態(tài);操作; If( T1轉(zhuǎn)移條件滿足) 狀態(tài)轉(zhuǎn)移到滿足T1條件的次態(tài)
10、;操作; If( TN轉(zhuǎn)移條件滿足) 狀態(tài)轉(zhuǎn)移到滿足TN條件的次態(tài);操作; break; case S1: /插入S1的操作; /插入離開S1的轉(zhuǎn)移; break; case SN: /插入SN的操作; /插入離開SN的轉(zhuǎn)移; break; 通常將表示狀態(tài)轉(zhuǎn)移的一系列通常將表示狀態(tài)轉(zhuǎn)移的多個(gè)if語(yǔ)句寫成if-else語(yǔ)句,這樣可以使轉(zhuǎn)移條件形成互斥。,當(dāng)然也可以直接使用if 語(yǔ)句描寫狀態(tài)機(jī),例如: if( state =S0) if(T0轉(zhuǎn)移條件滿足) 狀態(tài)轉(zhuǎn)移到滿足T0條件的次態(tài);操作; else if(T1轉(zhuǎn)移條件滿足) 狀態(tài)轉(zhuǎn)移到滿足T1條件的次態(tài);操作; else if(TN轉(zhuǎn)移條件滿
11、足) 狀態(tài)轉(zhuǎn)移到滿足TN條件的次態(tài);操作; if( state =S1) /插入離開該狀態(tài)的條件語(yǔ)句 /插入要轉(zhuǎn)移的次態(tài) /插入S1狀態(tài)的操作語(yǔ)句 if( state =SN) /插入離開該狀態(tài)的條件語(yǔ)句 /插入要轉(zhuǎn)移的次態(tài) /插入SN狀態(tài)的操作語(yǔ)句 ,9.2.2 描述狀態(tài)機(jī)的完整C程序格式 #include 數(shù)碼管的譯碼表格 設(shè)置定時(shí)器的定時(shí)變量 設(shè)置狀態(tài)變量 設(shè)置其他全局變量 主程序: 局部變量初始化 定時(shí)器初始化語(yǔ)句 中斷允許語(yǔ)句 主程序無(wú)限循環(huán)中: (1)輸入信號(hào)處理語(yǔ)句 獲得所有的輸入信號(hào)狀態(tài),(2)狀態(tài)機(jī)描述語(yǔ)句 主要是描述狀態(tài)轉(zhuǎn)移、轉(zhuǎn)移條件、定時(shí)變量清零等 該狀態(tài)下的輸出語(yǔ)句 顯
12、示該狀態(tài)的發(fā)光二極管(不是必須的,用于調(diào)試) (3)顯示處理語(yǔ)句 將定時(shí)數(shù)據(jù)送到數(shù)碼管顯示(不是必須的,用于調(diào)試) (4)其他語(yǔ)句 (5)若是在狀態(tài)描述語(yǔ)句中沒有描述輸出,可單獨(dú)將各個(gè)狀態(tài)下的輸出描述 定時(shí)器中斷服務(wù)程序中: 設(shè)置靜態(tài)局部變量 根據(jù)定時(shí)器工作模式確定是否設(shè)置初值,若是需要精確定時(shí),選擇不需要預(yù)置初值的工作方式2 每中斷一次就增加數(shù)值的語(yǔ)句,獲得確定的中斷時(shí)間(例如1s)。 按照確定的中斷時(shí)間,增加定時(shí)變量 ,9.3 示例程序 在狀態(tài)機(jī)描述中,除了直接描述狀態(tài)機(jī)的語(yǔ)句外,還需要按鍵(鈕)輸入語(yǔ)句、定時(shí)器描述等語(yǔ)句,本節(jié)通過(guò)示例對(duì)按鍵、定時(shí)等的C描述給予介紹。 示例程序1 按鍵處理
13、程序。 P3口全部連接按鍵,P0口連接的數(shù)碼管顯示按鍵的值,程序中變量kk是按鍵的值,不同的按鍵按下,數(shù)碼管顯示不同的值。,源程序如下: #include AT89X51.h unsigned int code table=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90; unsigned int kk=0 x08; void main() unsigned int nn; while(1) P3=0 xff; /P3口連接8個(gè)按鍵作為輸入 if(P3|0 x00)!=0 xff) /如果有按鍵按下 for(nn=0; n
14、n1000;nn+); /延時(shí) if(P3|0 x00)!=0 xff) /按鍵還在按下狀態(tài) switch (P3) case 0 xfe: /P3_0=0, fe=1111 1110 kk=0; break; case 0 xfd: /P3_1=0, fd=1111 1101 kk=1; break;,case 0 xfb: /P3_2=0, fb=1111 1011 kk=2; break; case 0 xf7: /P3_3=0 f7=1111 0111 kk=3; break; case 0 xef: /P3_4=0, ef=1110 1111 kk=4; break; case 0
15、xdf: /P3_5=0, df=1101 1111 kk=5; break; case 0 xbf: /P3_6=0, bf=1011 1111 kk=6; break; case 0 x7f: /P3_7=0 7f=0111 1111 kk=7; break; default: kk=8; while(P3!=0 xff) ; /如果按鍵還在按下時(shí),則停留在此,等待按鍵抬起 P0=tablekk; /將鍵值送到P0口連接的數(shù)碼管顯示 ,示例程序2 按鍵控制秒計(jì)數(shù)(定時(shí)器0工作在方式1)。 P3口引腳連接按鍵,按鍵按下后,P0口連接的數(shù)碼管顯示按鍵號(hào),P1口循環(huán)顯示0按鍵號(hào)之間的值,P2_0
16、連接的LED燈亮1s,滅1s。如下程序采用定時(shí)器0,方式1工作,由于預(yù)裝初值需要時(shí)間,所以不是精確計(jì)數(shù)。,源程序如下: #include AT89X51.h /文件夾名yuzuo2 unsigned int code table=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90; unsigned int kk=0 x08; unsigned int t0; void main() unsigned int nn; TMOD=0 x01; /定時(shí)器0,M1M0=01(模式1),gate=0(外中斷不起作用),C/T=0 TH
17、0=0 x3c; /設(shè)置TH初值 0 x3cb0=65536-50000=15536,50ms中斷一次,每秒中斷20次 TL0=0 xb0; /設(shè)置TL初值 TR0=1; /啟動(dòng)定時(shí)器0 ET0=1; /設(shè)置中斷使能寄存器,允許定時(shí)器0中斷 EA=1; /允許所有中斷源中斷 while(1) P3= 0 xff; /P3口連接8個(gè)按鍵作為輸入 if(P3)!=0 xff) /如果有鍵按下 for(nn=0; nn1000;nn+); /延時(shí)消除抖動(dòng) if(P3)!=0 xff) /如果按鍵抬起,執(zhí)行如下語(yǔ)句。, switch (P3) case 0 xfe: /P3_0=0, fe=1111
18、1110 kk=0; break; case 0 xfd: /P3_1=0, fd=1111 1101 kk=1; break; case 0 xfb: /P3_2=0, fb=1111 1011 kk=2; break; case 0 xf7: /P3_3=0 f7=1111 0111 kk=3; break; case 0 xef: /P3_4=0, ef=1110 1111 kk=4; break; case 0 xdf: /P3_5=0, df=1101 1111 kk=5; break; case 0 xbf: /P3_6=0, bf=1011 1111 kk=6; break; c
19、ase 0 x7f: /P3_7=0 7f=0111 1111 kk=7; break; default: kk=8; ,while(P3!=0 xff) ; /如果按鍵還在按下時(shí),則停留在此,等待按鍵抬起 P0=tablekk; /P0口連接的數(shù)碼管顯示按鍵值 P1=tablet0; /P1口連接的數(shù)碼管顯示t0值 void timer0() interrupt 1 /定時(shí)器0中斷服務(wù)程序 static unsigned int nn; /設(shè)置局部靜態(tài)變量 TH0=0 x3c; /重置初值 TL0=0 xb0; /重置初值 nn+; if (nn=20) /如果中斷20次,執(zhí)行如下語(yǔ)句 nn
20、=0; t0+; P2_0=!P2_0; /P2_0相連的LED燈閃爍 if(t0kk) /由于kk是按鍵值,所以按鍵不同,kk不同,因此延遲時(shí)間也不同。 t0=0; ,示例程序3 按鍵控制定時(shí)時(shí)間的程序(定時(shí)器0工作在方式2)。 按鍵值kk不同,則t0值的循環(huán)周期不同,因此可以通過(guò)kk改變t0,進(jìn)而改變與t0相關(guān)的周期長(zhǎng)度。,源程序如下: #include AT89X51.h unsigned int code table=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90; unsigned int kk=0 x08; u
21、nsigned int t0; void main() unsigned int nn; TMOD=0 x02; /定時(shí)器0,工作模式M1,M0=2 (0000,0010),8位、自動(dòng)重裝定時(shí)模式 / gate=0(外中斷不起作用),C/T=0(取時(shí)鐘信號(hào)) TH0=0 x06; /預(yù)置初值6到定時(shí)器TH,預(yù)置250微秒溢出一次(12MHz) /0.25ms,若是需要定時(shí)1s,則需要乘以4000, TL0=0 x06; /預(yù)置TL0值 TR0=1; /啟動(dòng)定時(shí)器0 ET0=1; /允許定時(shí)器中斷 EA=1; /允許總中斷,while(1) P3= 0 xff; /P3口連接8個(gè)按鍵作為輸入 i
22、f(P3)!=0 xff) /有鍵按下 for(nn=0; nn1000;nn+); /循環(huán)延時(shí)語(yǔ)句 if(P3)!=0 xff) /如果按鍵處于按下狀態(tài) switch (P3) case 0 xfe: /P3_0=0 kk=0; break; case 0 xfd: /P3_1=0 kk=1; break; case 0 xfb: /P3_2=0 kk=2; break; case 0 xf7: /P3_3=0 kk=3; break; case 0 xef: /P3_4=0 kk=4; break; case 0 xdf: /P3_5=0 kk=5; break; case 0 xbf:
23、/P3_6=0 kk=6; break;,case 0 x7f: /P3_7=0 kk=7; break; default: kk=8; while(P3!=0 xff) ; /如果按鍵還在按下時(shí),則停留在此,等待按鍵抬起 P0=tablekk; /P0口連接的數(shù)碼管顯示按鍵值 P1=tablet0; /P1口連接的數(shù)碼管顯示t0值 void timer0() interrupt 1 /定時(shí)器0中斷服務(wù)程序 /中斷后應(yīng)產(chǎn)生時(shí)間標(biāo)志,0.25ms中斷一次(12MHz), /延時(shí)1s,需要中斷4000次,由于自動(dòng)重裝,所以定時(shí)精確 static unsigned int nn; /設(shè)置局部靜態(tài)變量
24、 nn+; if (nn=4000) /如果中斷4000次,相當(dāng)于1s nn=0; t0+; P2_0=!P2_0; /使P2_0連接的LED燈閃爍 if(t0kk) /kk改變t0的循環(huán)周期 t0=0; ,示例程序4 在使用如下的按鍵檢測(cè)程序時(shí),可以根據(jù)需要按鍵的多少裁減程序。如果需要按鍵按下時(shí)起作用,則應(yīng)該去掉等待按鍵抬起的語(yǔ)句,但是應(yīng)該注意,若是在狀態(tài)轉(zhuǎn)移條件中,連續(xù)兩個(gè)轉(zhuǎn)移條件具有相同的鍵值,這可能引起狀態(tài)連續(xù)變化。P3口連接按鍵,P0口連接的數(shù)碼管顯示按鍵值。,源程序如下: #include AT89X51.h unsigned int code table=0 xC0,0 xF9,
25、0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90; unsigned int n0,n1,n2,n3,n4,n5,n6,n7; unsigned int kk=8; void main() unsigned int nn; while(1) P3=0 xff; /P3口連接8個(gè)按鍵作為輸入 if(P3_0=0) /P3_0 鍵按下 for(nn=0; nn1000;nn+); /延時(shí) if(P3_0=0) /如果還在按下狀態(tài),則n0=1,kk=0;否則n0=0,kk=8; n0=1;kk=0; P2_0=0; else n0=0; while(!P
26、3_0); /等待按鍵抬起 ,if(P3_1=0) /P3_1連接的按鍵處理程序 for(nn=0; nn1000;nn+); if(P3_1=0) n1=1;kk=1; else n1=0; while(!P3_1); if(P3_2=0) /P3_2連接的按鍵處理程序 for(nn=0; nn1000;nn+); if(P3_2=0) n2=1;kk=2; else n2=0; while(!P3_2); if(P3_3=0) /P3_3連接的按鍵處理程序 for(nn=0; nn1000;nn+); if(P3_3=0) n3=1;kk=3; /P3_3連接的按鍵處理程序 else n3
27、=0; while(!P3_3); if(P3_4=0) for(nn=0; nn1000;nn+); if(P3_4=0) n4=1;kk=4; /P3_4連接的按鍵處理程序 else n4=0; while(!P3_4); ,if(P3_5=0) /P3_5連接的按鍵處理程序 for(nn=0; nn1000;nn+); if(P3_5=0) n5=1;kk=5; else n5=0; while(!P3_5); if(P3_6=0) /P3_6連接的按鍵處理程序 for(nn=0; nn1000;nn+); if(P3_6=0) n6=1;kk=6; else n6=0; while(!
28、P3_6); if(P3_7=0) /P3_7連接的按鍵處理程序 for(nn=0; nn1000;nn+); if(P3_7=0) n7=1;kk=7; else n7=0; while(!P3_7); P0=tablekk; /P0口連接的數(shù)碼管顯示按鍵值 ,9.4 燈開關(guān)類例題 例題9-3 設(shè)計(jì)一個(gè)開關(guān)燈裝置,該開關(guān)燈裝置在按鍵k(P3_0引腳)第一次按下時(shí),三盞燈a、b和c同時(shí)點(diǎn)亮,當(dāng)k再次按下時(shí),a燈立刻熄滅;b燈15s后熄滅,在b燈熄滅18s后,c燈熄滅,源程序如下: #include AT89X51.h /文件夾名yuzuo2 unsigned int code table=0
29、xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90; unsigned int kk=0 x08,state=0; unsigned int t0; void main() unsigned int nn; TMOD=0 x01; /定時(shí)器0,M1,M0=01(模式1),gate=0(外中斷不起作用),C/T=0 /單片機(jī)時(shí)鐘12MHz TH0=0 x3c; /TH初值 0 x3cb0=65536-50000=15536 50ms中斷一次,每秒20次 TL0=0 xb0; /設(shè)置TL初值 TR0=1; /啟動(dòng)定時(shí)器0 ET0=1; /設(shè)置中斷使能寄存器,允許定時(shí)器0中斷 EA=1; /允許所有中斷,while(1) P3= 0 xff; /P3口連接8個(gè)按鍵作為輸入 if(P3)!=0 xff) /如果有鍵按下 for(nn=0; nn1000;nn+); /循環(huán)延時(shí)語(yǔ)句 if(P3)!=0 xff) /如果按鍵抬起 switch (key) case 0 xfe: /P3_0=0 kk=0; break; ca
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 壓縮天然氣場(chǎng)站運(yùn)行工安全生產(chǎn)能力模擬考核試卷含答案
- 耐火配混料工崗前創(chuàng)新思維考核試卷含答案
- 洗衣粉制造工崗前內(nèi)部考核試卷含答案
- 送配電線路工安全文明競(jìng)賽考核試卷含答案
- 2024年江蘇科技大學(xué)輔導(dǎo)員招聘考試真題匯編附答案
- 化學(xué)農(nóng)藥生產(chǎn)工安全實(shí)操能力考核試卷含答案
- 野生植物采集工操作知識(shí)強(qiáng)化考核試卷含答案
- 2025安徽淮南市三和鎮(zhèn)城市社區(qū)專職網(wǎng)格員招聘?jìng)淇碱}庫(kù)附答案
- 光學(xué)鏡頭裝配調(diào)試工崗前技術(shù)管理考核試卷含答案
- 固堿工安全管理模擬考核試卷含答案
- 2026年榆能集團(tuán)陜西精益化工有限公司招聘?jìng)淇碱}庫(kù)完整答案詳解
- 2026廣東省環(huán)境科學(xué)研究院招聘專業(yè)技術(shù)人員16人筆試參考題庫(kù)及答案解析
- 邊坡支護(hù)安全監(jiān)理實(shí)施細(xì)則范文(3篇)
- 6.1.3化學(xué)反應(yīng)速率與反應(yīng)限度(第3課時(shí) 化學(xué)反應(yīng)的限度) 課件 高中化學(xué)新蘇教版必修第二冊(cè)(2022-2023學(xué)年)
- 生產(chǎn)技術(shù)部主要職責(zé)及流程
- 廣東高中高考英語(yǔ)聽說(shuō)考試故事速記復(fù)述技巧
- GB/T 32065.5-2015海洋儀器環(huán)境試驗(yàn)方法第5部分:高溫貯存試驗(yàn)
- GB/T 20033.3-2006人工材料體育場(chǎng)地使用要求及檢驗(yàn)方法第3部分:足球場(chǎng)地人造草面層
- 2023年牡丹江市林業(yè)系統(tǒng)事業(yè)單位招聘筆試模擬試題及答案解析
- 數(shù)字電子技術(shù)說(shuō)課課件
- 天然氣加氣站安全事故的案例培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論