單片機35個實例_第1頁
單片機35個實例_第2頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1閃爍燈1實驗任務(wù)如圖4.1.1所示:在端口上接一個發(fā)光二極管L1,使L1在不停地一亮一滅,一亮一滅的時間間隔為秒。2電路原理圖圖4.1.13系統(tǒng)板上硬件連線把“單片機系統(tǒng)”區(qū)域中的端口用導(dǎo)線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的L1端口上。4程序設(shè)計內(nèi)容(1)延時程序的設(shè)計方法作為單片機的指令的執(zhí)行的時間是很短,數(shù)量大微秒級,因此,我們要求的閃爍時間間隔為秒,相對于微秒來說,相差太大,所以我們在執(zhí)行某一指令時,插入延時程序,來達到我們的要求,但這樣的延時程序是如何設(shè)計呢?下面具體介紹其原理:如圖4.1.1所示的石英晶體為12MHz,因此,1個機器周期為1微秒機器周期微秒MOVR6,#202

2、個2D1:MOVR7,#2482個22+2X248=49820XDJNZR7,$2個2X248(498DJNZR6,D12個2X20=4010002因此,上面的延時程序時間為。由以上可知,當(dāng)R6=10、R7=248時,延時5ms,R6=20、R7=248時,延時10ms,以此為基本的計時單位。如本實驗要求秒=200ms,10msXR5=200ms,則R5=20,延時子程序如下:DELAY:MOVR5,#20D1:MOVR6,#20D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5,D1RET2)輸出控制如圖1所示,當(dāng)端口輸出高電平,即=1時,根據(jù)發(fā)光二極管的單向?qū)щ娦钥芍?/p>

3、,這時發(fā)光二極管L1熄滅;當(dāng)端口輸出低電平,即=0時,發(fā)光二極管L1亮;我們可以使用SETB指令使端口輸出高電平,使用CLR指令使端口輸出低電平。5程序框圖如圖4.1.2所示圖4.1.26匯編源程序ORG0START:CLRLCALLDELAYSETBLCALLDELAYLJMPSTARTDELAY:MOVR5,#20;延時子程序,延時秒D1:MOVR6,#20D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5,D1RETEND7.C語言源程序#include<>sbitL1二P0;voiddelay02s(void)4.2.14.2.14.2.24.3.14

4、.3.14.3.20F0F4.4.14.4.1如圖13所示,利用AT89S51單片機的P0端口的一連接到一個共陰數(shù)碼管的ah的筆段上,數(shù)碼管的公共端接地。在數(shù)碼管上循環(huán)顯示09數(shù)字,時間間隔秒。2. 電路原理圖圖4.7.13. 系統(tǒng)板上硬件連線把“單片機系統(tǒng)”區(qū)域中的AD0AD7端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個數(shù)碼管的ah端口上;要求:AD0與a相連,AD1與b相連,AD2與c相連,,AD7與h相連。4. 程序設(shè)計內(nèi)容(1.LED數(shù)碼顯示原理七段LED顯示器內(nèi)部由七個條形發(fā)光二極管和一個小圓點發(fā)光二極管組成,根據(jù)各管的極管的接線形式,可分成共陰極型和共陽極型。LED數(shù)

5、碼管的ga七個發(fā)光二極管因加正電壓而發(fā)亮,因加零電壓而不以發(fā)亮,不同亮暗的組合就能形成不同的字形,這種組合稱之為字形碼,下面給出共陰極的字形碼見表2“0”3FH“8”7FH“1”06H“9”6FH“2”5BH“A”77H“3”4FH“b”7CH“4”66H“C”39H“5”6DH“d”5EH“6”7DH“E”79H“7”07H“F”71H2由于顯示的數(shù)字09的字形碼沒有規(guī)律可循,只能采用查表的方式來完成我們所需的要求了。這樣我們按著數(shù)字09的順序,把每個數(shù)字的筆段代碼按順序排好!建立的表格如下所示:TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH5程

6、序框圖圖4.7.26匯編源程序ORG0START:MOVR1,#00HNEXT:MOVA,R1MOVDPTR,#TABLEMOVCA,A+DPTRMOVP0,ALCALLDELAYINCR1CJNER1,#10,NEXTLJMPSTARTDELAY:MOVR5,#20D2:MOVR6,#20D1:MOVR7,#248DJNZR7,$DJNZR6,D1DJNZR5,D2RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND7.C語言源程序#include<>unsignedcharcodetable=0x3f,0x06,0x5b,0

7、x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;unsignedchardispcount;voiddelay02s(void)unsignedchari,j,k;for(i=20;i>0;i-)for(j=20;j>0;j-)for(k=248;k>0;k-);voidmain(void)while(1)for(dispcount=0;dispcount<10;dispcount+)P0=tabledispcount;delay02s();8按鍵識別方法之一1實驗任務(wù)每按下一次開關(guān)SP1,計數(shù)值加1,通過AT89S51單片機的P1端口的到顯示出其的

8、二進制計數(shù)值。2電路原理圖圖4.8.13系統(tǒng)板上硬件連線(1.把“單片機系統(tǒng)”區(qū)域中的RD端口連接到“獨立式鍵盤”區(qū)域中的SP1端口上;(2.把“單片機系統(tǒng)”區(qū)域中的端口用8芯排線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的“L1-L8”端口上;要求,連接到L1,連接到L2,連接到L3,連接到L4上。4.程序設(shè)計方法(1其實,作為一個按鍵從沒有按下到按下以及釋放是一個完整的過程,也就是說,當(dāng)我們按下一個按鍵時,總希望某個命令只執(zhí)行一次,而在按鍵按下的過程中,不要有干擾進來,因為,在按下的過程中,一旦有干擾過來,可能造成誤觸發(fā)過程,這并不是我們所想要的。因此在按鍵按下的時候,圖4.8.2要把我們手上

9、的干擾信號以及按鍵的機械接觸等干擾信號給濾除掉,一般情況下,我們可以采用電容來濾除掉這些干擾信號,但實際上,會增加硬件成本及硬件電路的體積,這是我們不希望,總得有個辦法解決這個問題,因此我們可以采用軟件濾波的方法去除這些干擾信號,一般情況下,一個按鍵按下的時候,總是在按下的時刻存在著一定的干擾信號,按下之后就基本上進入了穩(wěn)定的狀態(tài)。具體的一個按鍵從按下到釋放的全過程的信號圖如上圖所示:從圖中可以看出,我們在程序設(shè)計時,從按鍵被識別按下之后,延時5ms以上,從而避開了干擾信號區(qū)域,我們再來檢測一次,看按鍵是否真得已經(jīng)按下,若真得已經(jīng)按下,這時肯定輸出為低電平,若這時檢測到的是高電平,證明剛才是由

10、于干擾信號引起的誤觸發(fā),CPU就認為是誤觸發(fā)信號而舍棄這次的按鍵識別過程。從而提高了系統(tǒng)的可靠性。由于要求每按下一次,命令被執(zhí)行一次,直到下一次再按下的時候,再執(zhí)行一次命令,因此從按鍵被識別出來之后,我們就可以執(zhí)行這次的命令,所以要有一個等待按鍵釋放的過程,顯然釋放的過程,就是使其恢復(fù)成高電平狀態(tài)。(1.對于按鍵識別的指令,我們依然選擇如下指令JBBIT,REL指令是用來檢測BIT是否為高電平,若BIT=1,則程序轉(zhuǎn)向REL處執(zhí)行程序,否則就繼續(xù)向下執(zhí)行程序?;蛘呤荍NBBIT,REL指令是用來檢測BIT是否為低電平,若BIT=0,則程序轉(zhuǎn)向REL處執(zhí)行程序,否則就繼續(xù)向下執(zhí)行程序。(2.但對

11、程序設(shè)計過程中按鍵識別過程的框圖如右圖所示:圖4.8.35. 程序框圖圖4.8.46. 匯編源程序ORG0START:MOVR1,#00H;初始化R7為0,表示從0開始計數(shù)MOVA,R1;CPLA;取反指令MOVP1,A;送出Pl端口由發(fā)光二極管顯示REL:JNB,REL;判斷SP1是否按下LCALLDELAY10MS;若按下,則延時10ms左右JNB,REL;再判斷SP1是否真得按下INCR7;若真得按下,則進行按鍵處理,使MOVA,R7;計數(shù)內(nèi)容加1,并送出P1端口由CPLA;發(fā)光二極管顯示MOVP1,A;JNB,$;等待SP1釋放SJMPREL;繼續(xù)對K1按鍵掃描DELAY10MS:MO

12、VR6,#20;延時10ms子程序L1:MOVR7,#248DJNZR7,$DJNZR6,L1RETEND7.C語言源程序#include<>unsignedcharcount;voiddelay10ms(void)unsignedchari,j;for(i=20;i>0;i-)for(j=248;j>0;j-);voidmain(void)while(1)if(P3_7=0)delay10ms();if(P3_7=0)count+;if(count=16)count=0;P1=count;while(P3_7=0);9一鍵多功能按鍵識別技術(shù)1實驗任務(wù)如圖4.9.1所示

13、,開關(guān)SP1接在RD管腳上,在AT89S51單片機的P1端口接有四個發(fā)光二極管,上電的時候,L1接在管腳上的發(fā)光二極管在閃爍,當(dāng)每一次按下開關(guān)SP1的時候,L2接在管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1的時候,L3接在管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1的時候,L4接在管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1的時候,又輪到L1在閃爍了,如此輪流下去。2電路原理圖圖4.9.13系統(tǒng)板上硬件連線(1.把“單片機系統(tǒng)”區(qū)域中的RD端口連接到“獨立式鍵盤”區(qū)域中的SP1端口上;(2.把“單片機系統(tǒng)”區(qū)域中的端口用8芯排線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的“L1-L8”端口上;要求,連

14、接到L1,連接到L2,連接到L3,連接到L4上。4程序設(shè)計方法(1設(shè)計思想由來在我們生活中,我們很容易通過這個叫張三,那個叫李四,另外一個是王五;那是因為每個人有不同的名子,我們就很快認出,同樣,對于要通過一個按鍵來識別每種不同的功能,我們給每個不同的功能模塊用不同的ID號標(biāo)識,這樣,每按下一次按鍵,ID的值是不相同的,所以單片機就很容易識別不同功能的身份了。(2設(shè)計方法從上面的要求我們可以看出,L1到L4發(fā)光二極管在每個時刻的閃爍的時間是受開關(guān)SP1來控制,我們給L1到L4閃爍的時段定義出不同的ID號,當(dāng)L1在閃爍時,ID=0;當(dāng)L2在閃爍時,ID=1;當(dāng)L3在閃爍時,ID=2;當(dāng)L4在閃爍

15、時,ID=3;很顯然,只要每次按下開關(guān)K1時,分別給出不同的ID號我們就能夠完成上面的任務(wù)了。下面給出有關(guān)程序設(shè)計的框圖。5程序框圖圖4.9.26匯編源程序IDEQU30HSP1BITP3.7L1BITP1.0L2BITP1.1L3BITP1.2L4BITORG0MOVID,#00HSTART:JBK1,RELLCALLDELAY10MSJBK1,RELINCIDMOVA,IDCJNEA,#04,RELMOVID,#00HREL:JNBK1,$MOVA,IDCJNEA,#00H,IS0CPLL1LCALLDELAYSJMPSTARTIS0:CJNEA,#01H,IS1CPLL2LCALLDEL

16、AYSJMPSTARTIS1:CJNEA,#02H,IS2CPLL3LCALLDELAYSJMPSTARTIS2:CJNEA,#03H,IS3CPLL4LCALLDELAYSJMPSTARTIS3:LJMPSTARTDELAY10MS:MOVR6,#20LOOP1:MOVR7,#248DJNZR7,$DJNZR6,LOOP1RETDELAY:MOVR5,#20LOOP2:LCALLDELAY10MSDJNZR5,LOOP2RETEND7.C語言源程序#include<>unsignedcharID;voiddelay10ms(void)unsignedchari,j;for(i=2

17、0;i>0;i-)for(j=248;j>0;j-);voiddelay02s(void)unsignedchari;for(i=20;i>0;i-)delay10ms();voidmain(void)while(1)if(P3_7=0)delay10ms();if(P3_7=0)ID+;if(ID=4)ID=0;while(P3_7=0);switch(ID)case0:P1_0=P1_0;delay02s();break;case1:P1_1=P1_1;delay02s();break;case2:P1_2=P1_2;delay02s();break;case3:P1_3

18、=P1_3;delay02s();break;100099計數(shù)器1實驗任務(wù)利用AT89S51單片機來制作一個手動計數(shù)器,在AT89S51單片機的管腳接一個輕觸開關(guān),作為手動計數(shù)的按鈕,用單片機的接一個共陰數(shù)碼管,作為0099計數(shù)的個位數(shù)顯示,用單片機的接一個共陰數(shù)碼管,作為0099計數(shù)的十位數(shù)顯示;硬件電路圖如圖19所示。2電路原理圖圖4.10.13系統(tǒng)板上硬件連線(1.把“單片機系統(tǒng)”區(qū)域中的AD0AD7端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個ah端口上;要求:AD0對應(yīng)著a,AD1對應(yīng)著b,AD7對應(yīng)著h。(2.把“單片機系統(tǒng)”區(qū)域中的A8A15端口用8芯排線連接到“四路

19、靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個數(shù)碼管的ah端口上;(3.把“單片機系統(tǒng)”區(qū)域中的RD端口用導(dǎo)線連接到“獨立式鍵盤”區(qū)域中的SP1端口上;4.程序設(shè)計內(nèi)容(1.單片機對按鍵的識別的過程處理(2.單片機對正確識別的按鍵進行計數(shù),計數(shù)滿時,又從零開始計數(shù);(3.單片機對計的數(shù)值要進行數(shù)碼顯示,計得的數(shù)是十進數(shù),含有十位和個位,我們要把十位和個位拆開分別送出這樣的十位和個位數(shù)值到對應(yīng)的數(shù)碼管上顯示。如何拆開十位和個位我們可以把所計得的數(shù)值對10求余,即可個位數(shù)字,對10整除,即可得到十位數(shù)字了。(4通過查表方式,分別顯示出個位和十位數(shù)字。5程序框圖圖4.10.26匯編源程序CountEQU30HSP

20、1BITORG0START:MOVCount,#00HNEXT:MOVA,CountMOVB,#10DIVABMOVDPTR,#TABLEMOVCA,A+DPTRMOVP0,AMOVA,BMOVCA,A+DPTRMOVP2,AWT:JNBSP1,WTWAIT:JBSP1,WAITLCALLDELY10MSJBSP1,WAITINCCountMOVA,CountCJNEA,#100,NEXTLJMPSTARTDELY10MS:MOVR6,#20D1:MOVR7,#248DJNZR7,$DJNZR6,D1RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,

21、6FHEND7.C語言源程序#include<>unsignedcharcodetable=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;unsignedcharCount;voiddelay10ms(void)unsignedchari,j;for(i=20;i>0;i-)for(j=248;j>0;j-);voidmain(void)Count=0;P0=tableCount/10;P2=tableCount%10;while(1)if(P3_7=0)delay10ms();if(P3_7=0)Count+;if

22、(Count=100)Count=0;P0=tableCount/10;P2=tableCount%10;while(P3_7=0);110059秒計時器(利用軟件延時)1實驗任務(wù)如下圖所示,在AT89S51單片機的P0和P2端口分別接有兩個共陰數(shù)碼管,P0口驅(qū)動顯示秒時間的十位,而P2口驅(qū)動顯示秒時間的個位。2電路原理圖圖4.11.13系統(tǒng)板上硬件連線(1.把“單片機系統(tǒng)”區(qū)域中的AD0-AD7端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個a-h端口上;要求:AD0對應(yīng)著a,AD1對應(yīng)著b,AD7對應(yīng)著h。(2.把“單片機系統(tǒng)”區(qū)域中的A8-A15端口用8芯排線連接到“四路靜態(tài)數(shù)

23、碼顯示模塊”區(qū)域中的任一個a-h端口上;要求:A8對應(yīng)著a,A9對應(yīng)著b,A15對應(yīng)著h。4.程序設(shè)計內(nèi)容(1.在設(shè)計過程中我們用一個存儲單元作為秒計數(shù)單元,當(dāng)一秒鐘到來時,就讓秒計數(shù)單元加1,當(dāng)秒計數(shù)達到60時,就自動返回到0,從新秒計數(shù)。(2對于秒計數(shù)單元中的數(shù)據(jù)要把它十位數(shù)和個數(shù)分開,方法仍采用對10整除和對10求余。(3在數(shù)碼上顯示,仍通過查表的方式完成。(4一秒時間的產(chǎn)生在這里我們采用軟件精確延時的方法來完成,經(jīng)過精確計算得到1秒時間為秒。DELY1S:MOVR5,#100D2:MOVR6,#20D1:MOVR7,#248DJNZR7,$DJNZR6,D1DJNZR5,D2RET5程

24、序框圖圖4.11.26匯編源程序SecondEQU30HORG0START:MOVSecond,#00HNEXT:MOVA,SecondMOVB,#10DIVABMOVDPTR,#TABLEMOVCA,A+DPTRMOVP0,AMOVA,BMOVCA,A+DPTRMOVP2,ALCALLDELY1SINCSecondMOVA,SecondCJNEA,#60,NEXTLJMPSTARTDELY1S:MOVR5,#100D2:MOVR6,#20D1:MOVR7,#248DJNZR7,$DJNZR6,D1DJNZR5,D2RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,

25、07H,7FH,6FHEND7.C語言源程序#include<>unsignedcharcodetable=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;unsignedcharSecond;voiddelay1s(void)unsignedchari,j,k;for(k=100;k>0;k-)for(i=20;i>0;i-)for(j=248;j>0;j-);voidmain(void)Second=0;P0=tableSecond/10;P2=tableSecond%10;while(1)delay1s()

26、;Second+;if(Second=60)Second=0;P0=tableSecond/10;P2=tableSecond%10;12可預(yù)置可逆4位計數(shù)器1實驗任務(wù)利用AT89S51單片機的一接四個發(fā)光二極管L1L4,用來指示當(dāng)前計數(shù)的數(shù)據(jù);用一作為預(yù)置數(shù)據(jù)的輸入端,接四個撥動開關(guān)K1K4,用WR和RD端口接兩個輕觸開關(guān),用來作加計數(shù)和減計數(shù)開關(guān)。具體的電路原理圖如下圖所示2電路原理圖圖4.12.13系統(tǒng)板上硬件連線(1把“單片機系統(tǒng)”區(qū)域中的端口用8芯排線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的L1L4上;要求:對應(yīng)著L1,對應(yīng)著L2,對應(yīng)著L3,對應(yīng)著L4;(2把“單片機系統(tǒng)”區(qū)域中的RXD,TXD,INT0,IN

溫馨提示

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

評論

0/150

提交評論