51單片機(jī)實(shí)例(含詳細(xì)代碼說明)_第1頁
51單片機(jī)實(shí)例(含詳細(xì)代碼說明)_第2頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1.閃爍燈1. 實(shí)驗(yàn)任務(wù)如圖4.1.1所示:在P1.0端口上接一個(gè)發(fā)光二極管L1,使L1在不停地一亮滅,一亮一滅的時(shí)間間隔為0.2秒。2. 電路原理圖VCCh_-i=-2-D21OKI-崔工尼4二.&.-7111AIX11141-.1rppr*F尸戶P斗ia:111212141耳i?pcnmooPC.lJA口1PCi3JAO31=0斗ZA匸3口口HO血FADCSFO.7/AD7ME12.7/A1.3.535Z3口jamP3LJX51F2.O/AE白gg-gNiATiJSSlC7Z3FaG肅t圖4.1.13. 系統(tǒng)板上硬件連線把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0端口用導(dǎo)線連接到“八路發(fā)光二極管指示模

2、塊”區(qū)域中的L1端口上。4. 程序設(shè)計(jì)內(nèi)容(1).延時(shí)程序的設(shè)計(jì)方法作為單片機(jī)的指令的執(zhí)行的時(shí)間是很短,數(shù)量大微秒級(jí),因此,我們要求的閃爍時(shí)間間隔為0.2秒,相對(duì)于微秒來說,相差太大,所以我們?cè)趫?zhí)行某一指令時(shí),插入延時(shí)程序,來達(dá)到我們的要求,但這樣的延時(shí)程序是如何設(shè)計(jì)呢?下面具體介紹其原理:如圖4.1.1所示的石英晶體為12MHz,因此,1個(gè)機(jī)器周期為1微秒機(jī)器周期微秒MOVR6,#202個(gè)2D1:M0VR7,#2482個(gè)22+2X248=49820X(498DJNZR7,$2個(gè)2X248DJNZR6,D12個(gè)2X20=4010002因此,上面的延時(shí)程序時(shí)間為10.002ms。由以上可知,當(dāng)R

3、6=10、R7=248時(shí),延時(shí)5ms,R6=20、R7=248時(shí),延時(shí)10ms,以此為基本的計(jì)時(shí)單位。如本實(shí)驗(yàn)要求0.2秒=200ms,10msXR5=200ms,則R5=20,延時(shí)子程序如下:DELAY:MOVR5,#20D1:MOVR6,#20D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5,D1RET2)輸出控制如圖1所示,當(dāng)P1.0端口輸出高電平,即P1.0=1時(shí),根據(jù)發(fā)光二極管的單向?qū)щ娦钥芍@時(shí)發(fā)光二極管L1熄滅;當(dāng)P1.0端口輸出低電平,即P1.0=0時(shí),發(fā)光二極管L1亮;我們可以使用SETBP1.0指令使P1.0端口輸出高電平,使用CLRP1.0指令使

4、P1.0端口輸出低電平。5程序框圖如圖4.1.2所示圖4.1.26. 匯編源程序ORG0START:CLRP1.0LCALLDELAYSETBP1.0LCALLDELAYLJMPSTARTDELAY:MOVR5,#20;延時(shí)子程序,延時(shí)0.2秒D1:MOVR6,#20D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5,D1RETEND7. C語言源程序#includesbitL1二P0;voiddelay02s(void)/延時(shí)0.2秒子程序unsignedchari,j,k;for(i=20;i0;i)for(j=20;j0;j)for(k=248;k0;k-);voi

5、dmain(void)while(1)L1=0;delay02s();L1=1;delay02s();2.模擬開關(guān)燈1. 實(shí)驗(yàn)任務(wù)如圖4.2.1所示,監(jiān)視開關(guān)K1(接在P3.0端口上),用發(fā)光二極管L1(接在單片機(jī)P1.0端口上)顯示開關(guān)狀態(tài),如果開關(guān)合上,L1亮,開關(guān)打開,L1熄滅。2. 電路原理圖圖4.2.1:;:-以贏卜;匸尸冷糾鞋V2.;.-tija.mr-Tm氓一MGdwgEdKTAMgfgdd辰目帝gicmiJ20C2引爭(zhēng)fGNEU1AT5?S5(1).3. 系統(tǒng)板上硬件連線把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0端口用導(dǎo)線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的L1端口上;把“單片機(jī)系統(tǒng)

6、”區(qū)域中的P3.0端口用導(dǎo)線連接到“四路撥動(dòng)開關(guān)”區(qū)域中的K1端口上;4. 程序設(shè)計(jì)內(nèi)容開關(guān)狀態(tài)的檢測(cè)過程單片機(jī)對(duì)開關(guān)狀態(tài)的檢測(cè)相對(duì)于單片機(jī)來說,是從單片機(jī)的P3.0端口輸入信號(hào),而輸入的信號(hào)只有高電平和低電平兩種,當(dāng)撥開開關(guān)K1撥上去,即輸入高電平,相當(dāng)開關(guān)斷開,當(dāng)撥動(dòng)開關(guān)K1撥下去,即輸入低電平,相當(dāng)開關(guān)閉合。單片機(jī)可以采用JBBIT,REL或者是JNBBIT,REL指令來完成對(duì)開關(guān)狀態(tài)的檢測(cè)即可。(2).輸出控制如圖3所示,當(dāng)P1.0端口輸出高電平,即P1.0=1時(shí),根據(jù)發(fā)光二極管的單向?qū)щ娦钥芍?,這時(shí)發(fā)光二極管L1熄滅;當(dāng)P1.0端口輸出低電平,即P1.0=0時(shí),發(fā)光二極管L1亮;我們

7、可以使用SETBP1.0指令使P1.0端口輸出高電平,使用CLRP1.0指令使P1.0端口輸出低電平。5. 程序框圖圖4.2.26. 匯編源程序ORG00HSTART:JBP3.0,LIGCLRP1.0SJMPSTARTLIG:SETBP1.0SJMPSTARTEND7. C語言源程序#includesbitK1=P30;sbitL1二P0;voidmain(void)while(1)if(K1=0)L1=0;/燈亮elseL1=1;/燈滅3. 多路開關(guān)狀態(tài)指示1. 實(shí)驗(yàn)任務(wù)如圖4.3.1所示,AT89S51單片機(jī)的P1.0P1.3接四個(gè)發(fā)光二極管L1L4,P1.4P1.7接了四個(gè)開關(guān)K1K4

8、,編程將開關(guān)的狀態(tài)反映到發(fā)光二極管上。(開關(guān)閉合,對(duì)應(yīng)的燈亮,開關(guān)斷開,對(duì)應(yīng)的燈滅)。2. 電路原理圖40JIGNDT諮7Kli7KThinuFiriKmxlGKw闍口WE_-害lYWEPWLZiiN:一臣,自2d寸口w寸ndM-zrv西記ndIIIIXd”ilInr-1isELdCLdCL住L僮u(yù)g口E養(yǎng)空口0禹仇ULAT眄MLVCCFJi01so7R.922D1./.圖4.3.13. 系統(tǒng)板上硬件連線(1.把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0P1.3用導(dǎo)線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的L1L4端口上;(2.把“單片機(jī)系統(tǒng)”區(qū)域中的P1.4P1.7用導(dǎo)線連接到“四路撥動(dòng)開關(guān)”區(qū)域中的K

9、1K4端口上;4. 程序設(shè)計(jì)內(nèi)容(1.開關(guān)狀態(tài)檢測(cè)對(duì)于開關(guān)狀態(tài)檢測(cè),相對(duì)單片機(jī)來說,是輸入關(guān)系,我們可輪流檢測(cè)每個(gè)開關(guān)狀態(tài),根據(jù)每個(gè)開關(guān)的狀態(tài)讓相應(yīng)的發(fā)光二極管指示,可以采用JBP1.X,REL或JNBP1.X,REL指令來完成;也可以一次性檢測(cè)四路開關(guān)狀態(tài),然后讓其指示,可以采用MOVA,P1指令一次把P1端口的狀態(tài)全部讀入,然后取高4位的狀態(tài)來指示。(2.輸出控制根據(jù)開關(guān)的狀態(tài),由發(fā)光二極管L1-L4來指示,我們可以用SETBP1.X和CLRP1.X指令來完成,也可以采用MOVP1,#1111XXXXB方法一次指示。5. 程序框圖讀P1口數(shù)據(jù)到A中CCAcc內(nèi)容右移4次A內(nèi)容與F0H相或C

10、C、A內(nèi)容送入P1口CC圖4.3.26. 方法一(匯編源程序)ORG00HSTART:MOVA,P1ANLA,#0F0HRRARRARRARRAORLA,#0F0HMOVP1,ASJMPSTARTEND7. 方法一(C語言源程序)#includeunsignedchartemp;voidmain(void)while(1)temp=P14;temp=temp|0xf0;P1=temp;8. 方法二(匯編源程序)ORG00HSTART:JBP1.4,NEXT1CLRP1.0SJMPNEX1NEXT1:SETBP1.0NEX1:JBP1.5,NEXT2CLRP1.1SJMPNEX2NEXT2:SE

11、TBP1.1NEX2:JBP1.6,NEXT3CLRP1.2SJMPNEX3NEXT3:SETBP1.2NEX3:JBP1.7,NEXT4CLRP1.3SJMPNEX4NEXT4:SETBP1.3NEX4:SJMPSTARTEND9. 方法二(C語言源程序)#includevoidmain(void)while(1)if(P1_4=0)P1_0=0;elseP1_0=1;if(P1_5=0)P1_1=0;elseP1_1=1;if(P1_6=0)P1_2=0;elseP1_2=1;if(P1_7=0)P1_3=0;elseP1_3=1;4. 廣告燈的左移右移1.實(shí)驗(yàn)任務(wù)做單一燈的左移右移,硬件

12、電路如圖4.4.1所示,八個(gè)發(fā)光二極管L1L8分別接在單片機(jī)的P1.0P1.7接口上,輸出“0”時(shí),發(fā)光二極管亮,開始時(shí)P1.0-P1.1fP1.2fP1.3f-P1.7P1.6f-P1.0亮,重復(fù)循環(huán)。2.電路原理圖II2022DFl6Pl7220R5P3.7220R7220iZ2Q1-6IME導(dǎo)OU1C290jF屋PlOPlIPl_2P-13F1辛口忌P3.1JTK&P3.2XfNTOP3F3/IKT1F3.4rrQiP35TT1FO.a/APOP0J/ADIPO.2/AD2F0.3/AD3PD.-1/AD4F0.S/AD5F0S/AD6F0.7/AD7ALEPSEbTPM.寸皿丄蘭P2.

13、6/A14P2.5/A13F2a4/A12F2.3/A1IP2.2/A1DP2.1/A!?P2.0/ABO3337363=34333230曲272f5廿曲22Ou呂JJa.LFl8J-30PFi4UJJ圖4.4.13. 系統(tǒng)板上硬件連線把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0P1.7用8芯排線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的L1L8端口上,要求:P1.0對(duì)應(yīng)著L1,P1.1對(duì)應(yīng)著L2,,P1.7對(duì)應(yīng)著L8。4. 程序設(shè)計(jì)內(nèi)容我們可以運(yùn)用輸出端口指令MOVP1,A或MOVP1,#DATA,只要給累加器值或常數(shù)值,然后執(zhí)行上述的指令,即可達(dá)到輸出控制的動(dòng)作。每次送出的數(shù)據(jù)是不同,具體的數(shù)據(jù)如下表1

14、所示P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0說明L8L7L6L5L4L3L2L111111110L1亮11111101L2亮11111011L3亮11110111L4亮11101111L5亮11011111L6亮10111111L7亮01111111L8亮表15. 程序框圖圖4.4.26. 匯編源程序ORG0START:MOVR2,#8MOVA,#OFEHSETBCLOOP:MOVP1,ALCALLDELAYRLCADJNZR2,LOOPMOVR2,#8LOOP1:MOVP1,ALCALLDELAYRRCADJNZR2,LOOP1LJMPSTARTDELAY:MOVR5

15、,#20;D1:MOVR6,#20D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5,D1RETEND7. C語言源程序#includeunsignedchari;unsignedchartemp;unsignedchara,b;voiddelay(void)unsignedcharm,n,s;for(m=20;m0;m-)for(n=20;n0;n-)for(s=248;s0;s-);voidmain(void)while(1)temp=0xfe;P1=temp;delay();for(i=1;i8;i+)a二tempi;左移一下就可以了吧,后面兩個(gè)語句干什么用呢?b二

16、temp(8-i);P1=a|b;delay();for(i=1;ii;b=tempP23M.呂08TT1AT89E2510-0C3MpF圖4.5.13. 系統(tǒng)板上硬件連線把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0P1.7用8芯排線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的L1L8端口上,要求:P1.0對(duì)應(yīng)著L1,P1.1對(duì)應(yīng)著L2,P1.7對(duì)應(yīng)著L8。4. 程序設(shè)計(jì)內(nèi)容在用表格進(jìn)行程序設(shè)計(jì)的時(shí)候,要用以下的指令來完成(1).利用MOVDPTR,#DATA16的指令來使數(shù)據(jù)指針寄存器指到表的開頭。(2).利用MOVCA,A+DPTR的指令,根據(jù)累加器的值再加上DPTR的值,就可以使程序計(jì)數(shù)器PC指到表格內(nèi)

17、所要取出的數(shù)據(jù)。因此,只要把控制碼建成一個(gè)表,而利用MOVC工,A+DPTR做取碼的操作,就可方便地處理一些復(fù)雜的控制動(dòng)作,取表過程如下圖所示:5. 程序框圖圖4.5.26. 匯編源程序ORG0START:MOVDPTR,#TABLELOOP:CLRAMOVCA,A+DPTRCJNEA,#O1H,LOOP1JMPSTARTLOOP1:MOVP1,AMOVR3,#20LCALLDELAYINCDPTRJMPLOOPDELAY:MOVR4,#20D1:MOVR5,#248DJNZR5,$DJNZR4,D1DJNZR3,DELAYRETTABLE:DB0FEH,0FDH,0FBH,0F7HDB0EF

18、H,0DFH,0BFH,07FHDB0FEH,0FDH,0FBH,0F7HDB0EFH,0DFH,0BFH,07FHDB07FH,0BFH,0DFH,0EFHDB0F7H,0FBH,0FDH,0FEHDB07FH,0BFH,0DFH,0EFHDB0F7H,0FBH,0FDH,0FEHDB00H,0FFH,00H,0FFHDB01HEND7. C語言源程序#includeunsignedcharcodetable=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0x

19、df,0xef,0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00,0xff,0x00,0xff,0x01;unsignedchari;voiddelay(void)unsignedcharm,n,s;for(m=20;m0;m-)for(n=20;n0;n-)for(s=248;s0;s-);voidmain(void)while(1)if(tablei!=0x01)P1=tablei;i+;delay();elsei=0;6.報(bào)警產(chǎn)生器1. 實(shí)驗(yàn)任務(wù)用P1.0輸出1KHz和500Hz的音頻信號(hào)驅(qū)動(dòng)揚(yáng)聲器,作報(bào)警信

20、號(hào),要求1KHz信號(hào)響100ms,500Hz信號(hào)響200ms,交替進(jìn)行,P1.7接一開關(guān)進(jìn)行控制,當(dāng)開關(guān)合上響報(bào)警信號(hào),當(dāng)開關(guān)斷開告警信號(hào)停止,編出程序。2. 電路原理圖i?nLtMLR3tIDE:Gl-1D20I4hr:0lFATSSj|NDOuF01?47uF12MHz対FGJH:廿葉EI口0Eg嘰n-cnzrc-jegi-.iinddiI*-ii-n.ri.SJ-I+VOUT!M-OAIMBiTAESGJUWGWDLEg.Id_dTIdIdEHlzin亠ST尺-iiHldWTuFGHDLSIDK_C舟r-idC2RlgLEdEdEAEm.op-rsvcc圖4.6.13. 系統(tǒng)板上硬件連線

21、(1.把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0端口用導(dǎo)線連接到“音頻放大模塊”區(qū)域中的SPKIN端口上;(2.在“音頻放大模塊”區(qū)域中的SPKOUT端口上接上一個(gè)8歐的或者是16歐的喇叭;(3.把“單片機(jī)系統(tǒng)”區(qū)域中的P1.7/RD端口用導(dǎo)線連接到“四路撥動(dòng)開關(guān)”區(qū)域中的K1端口上;4. 程序設(shè)計(jì)內(nèi)容(1.信號(hào)產(chǎn)生的方法500Hz信號(hào)周期為2ms,信號(hào)電平為每1ms變反1次,1KHz的信號(hào)周期為1ms,信號(hào)電平每500us變反1次;5. 程序框圖圖4.6.26. 匯編源程序FLAGBIT00HORG00HSTART:JBP1.7,STARTJNBFLAG,NEXTMOVR2,#200DV:CPLP1.

22、0LCALLDELY500LCALLDELY500DJNZR2,DVCPLFLAGNEXT:MOVR2,#200DV1:CPLP1.0LCALLDELY500DJNZR2,DV1CPLFLAGSJMPSTARTDELY500:MOVR7,#250LOOP:NOPDJNZR7,LOOPRETEND7. C語言源程序#include#includebitflag;unsignedcharcount;voiddely500(void)unsignedchari;for(i=250;i0;i-)_nop_();voidmain(void)while(1)if(P1_7=0)for(count=200;

23、count0;count-)P1_0=P1_0;dely500();for(count=200;count0;count-)P1_0=P1_0;dely500();dely500();7. I/O并行口直接驅(qū)動(dòng)LED顯示1. 實(shí)驗(yàn)任務(wù)如圖13所示,利用AT89S51單片機(jī)的P0端口的P0.0P0.7連接到一個(gè)共陰數(shù)碼管的h的筆段上,數(shù)碼管的公共端接地。在數(shù)碼管上循環(huán)顯示09數(shù)字,時(shí)間間隔0.2秒。2. 電路原理圖VCCGtTDR1o.5F1.0Fl.lFl.3Pl.4P1.J5Pl.Pl.711111蟲114TsTaP3.0/KXDF3.1/TXDF3.2HNTQP3.3flNTtF3.4fT

24、Ops.-srnP3./WRF3i7FFO.O/APDP0.1/AD1F0h2;AD2PO-WWP0.3JAEa5P0.6/AD6P0.7/AD7ALEFSEKP2.7/A1SP2.6/14P2S5/A13P2.4/A12P2.3/A11P2.2/A1UP2.1/AyP2.0/A8U126252433222La!|tUB3QpFD2ED8_1圖4.7.13. 系統(tǒng)板上硬件連線把“單片機(jī)系統(tǒng)”區(qū)域中的P0.0/AD0P0.7/AD7端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個(gè)數(shù)碼管的ah端口上;要求:P0.0/AD0與a相連,P0.1/AD1與b相連,P0.2/AD2與c相連,,P

25、0.7/AD7與h相連。4. 程序設(shè)計(jì)內(nèi)容(1.LED數(shù)碼顯示原理七段LED顯示器內(nèi)部由七個(gè)條形發(fā)光二極管和一個(gè)小圓點(diǎn)發(fā)光二極管組成,根據(jù)各管的極管的接線形式,可分成共陰極型和共陽極型。LED數(shù)碼管的ga七個(gè)發(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”71H(2.由于顯示的數(shù)字09的字形碼沒有規(guī)律可循,只能采用查表的方式來

26、完成我們所需的要求了。這樣我們按著數(shù)字09的順序,把每個(gè)數(shù)字的筆段代碼按順序排好!建立的表格如下所示:TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH5. 程序框圖Rl=0棍據(jù)-EU的直育志1蠻表我得的數(shù)據(jù)送PUJs1延時(shí)口二秒1尺1=尺1十1圖4.7.26匯編源程序ORG0START:MOVR1,#00HNEXT:MOVA,R1MOVDPTR,#TABLEMOVCA,A+DPTRMOVP0,ALCALLDELAYINCR1CJNER1,#10,NEXTLJMPSTARTDELAY:MOVR5,#20D2:MOVR6,#20D1:MOVR7,#248

27、DJNZR7,$DJNZR6,D1DJNZR5,D2RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND7.C語言源程序#includeunsignedcharcodetable=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;unsignedchardispcount;voiddelay02s(void)unsignedchari,j,k;for(i=20;i0;i-)for(j=20;j0;j-)for(k=248;k0;k-);voidmain(void)while(1)for(di

28、spcount=0;dispcount10;dispcount+)P0=tabledispcount;delay02s();8. 按鍵識(shí)別方法之一1.實(shí)驗(yàn)任務(wù)每按下一次開關(guān)SP1,計(jì)數(shù)值加1,通過AT89S51單片機(jī)的P1端口的P1.0到P1.3顯示出其對(duì)應(yīng)的二進(jìn)制計(jì)數(shù)值。2.電路原理圖VCCIOtliF1OK尋IIU1Jtl220產(chǎn)產(chǎn)2202J2OEllI220JIOrr互L3f?TeT7PJ口Pd口饑口口Pl1PC.1/ADIP1.2PCI.2ZAO2P1.3lei.3fAD3P14PC.4/AD4P1.5尸1SPC6/AriCP1.7PO_7fAD7沖r_尺PSEHP3.OXRKDP27

29、/A15pa-irrszDP2.C5/JI1.4032nHTCP2.5/A13PS.SrZIMTlP2.4/A1PP33T0P2.3/A11P35jTT1P22/Jl1C.SZWRP2.1/A5P3P2GA盤P口iMTT4;T匚TGbTD39253g342MH30圖4.8.13. 系統(tǒng)板上硬件連線(1.把“單片機(jī)系統(tǒng)”區(qū)域中的P3.7/RD端口連接到“獨(dú)立式鍵盤”區(qū)域中的SP1端口上;(2.把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0P1.3端口用8芯排線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的“L1L4”端口上;要求,P1.0連接到L1,P1.1連接到L2,P1.2連接到L3,P1.3連接到L4上。4.

30、 程序設(shè)計(jì)方法(1.其實(shí),作為一個(gè)按鍵從沒有按下到按下以及釋放是一個(gè)完整的過程,也就是說,當(dāng)我們按下一個(gè)按鍵時(shí),總希望某個(gè)命令只執(zhí)行一次,而在按鍵按下的過程中,不要有干擾進(jìn)來,因?yàn)?,在按下的過程中,一旦有干擾過來,可能造成誤觸發(fā)過程,這并不是我們所想要的。因此在按鍵按下的時(shí)候,豹缶三到丘之間圖4.8.2要把我們手上的干擾信號(hào)以及按鍵的機(jī)械接觸等干擾信號(hào)給濾除掉,一般情況下,我們可以采用電容來濾除掉這些干擾信號(hào),但實(shí)際上,會(huì)增加硬件成本及硬件電路的體積,這是我們不希望,總得有個(gè)辦法解決這個(gè)問題,因此我們可以采用軟件濾波的方法去除這些干擾信號(hào),一般情況下,一個(gè)按鍵按下的時(shí)候,總是在按下的時(shí)刻存在著

31、一定的干擾信號(hào),按下之后就基本上進(jìn)入了穩(wěn)定的狀態(tài)。具體的一個(gè)按鍵從按下到釋放的全過程的信號(hào)圖如上圖所示:從圖中可以看出,我們?cè)诔绦蛟O(shè)計(jì)時(shí),從按鍵被識(shí)別按下之后,延時(shí)5ms以上,從而避開了干擾信號(hào)區(qū)域,我們?cè)賮頇z測(cè)一次,看按鍵是否真的已經(jīng)按下,若真得已經(jīng)按下,這時(shí)肯定輸出為低電平,若這時(shí)檢測(cè)到的是高電平,證明剛才是由于干擾信號(hào)引起的誤觸發(fā),CPU就認(rèn)為是誤觸發(fā)信號(hào)而舍棄這次的按鍵識(shí)別過程。從而提高了系統(tǒng)的可靠性。由于要求每按下一次,命令被執(zhí)行一次,直到下一次再按下的時(shí)候,再執(zhí)行一次命令,因此從按鍵被識(shí)別出來之后,我們就可以執(zhí)行這次的命令,所以要有一個(gè)等待按鍵釋放的過程,顯然釋放的過程,就是使其恢

32、復(fù)成高電平狀態(tài)。(1.對(duì)于按鍵識(shí)別的指令,我們依然選擇如下指令JBBIT,REL指令是用來檢測(cè)BIT是否為高電平,若BIT=1,則程序轉(zhuǎn)向REL處執(zhí)行程序,否則就繼續(xù)向下執(zhí)行程序。或者是JNBBIT,REL指令是用來檢測(cè)BIT是否為低電平,若BIT=O,則程序轉(zhuǎn)向REL處執(zhí)行程序,否則就繼續(xù)向下執(zhí)行程序。(2.但對(duì)程序設(shè)計(jì)過程中按鍵識(shí)別過程的框圖如右圖所示:5. 程序框圖圖4.8.46. 匯編源程序ORG0START:MOVR1,#00H;初始化R7為0,表示從0開始計(jì)數(shù)MOVA,R1;CPLA;取反指令MOVP1,A;送出Pl端口由發(fā)光二極管顯示REL:JNBP3.7,REL;判斷SP1是否

33、按下LCALLDELAY10MS;若按下,則延時(shí)10ms左右JNBP3.7,REL;再判斷SP1是否真得按下INCR7;若真得按下,則進(jìn)行按鍵處理,使MOVA,R7;計(jì)數(shù)內(nèi)容加1,并送出P1端口由CPLA;發(fā)光二極管顯示MOVP1,A;JNBP3.7,$;等待SP1釋放SJMPREL;繼續(xù)對(duì)K1按鍵掃描DELAY10MS:MOVR6,#20;延時(shí)10ms子程序L1:MOVR7,#248DJNZR7,$DJNZR6,L1RETEND7. C語言源程序#includeunsignedcharcount;voiddelay10ms(void)unsignedchari,j;for(i=20;i0;i

34、-)for(j=248;j0;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í)別技術(shù)1.實(shí)驗(yàn)任務(wù)如圖4.9.1所示,開關(guān)SP1接在P3.7/RD管腳上,在AT89S51單片機(jī)的P1端口接有四個(gè)發(fā)光二極管,上電的時(shí)候,L1接在P1.0管腳上的發(fā)光二極管在閃爍,當(dāng)每一次按下開關(guān)SP1的時(shí)候,L2接在P1.1管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1的時(shí)候,L3接在P1.2管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1

35、的時(shí)候,L4接在P1.3管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1的時(shí)候,又輪到L1在閃爍了,如此輪流下去。2電路原理圖VCC+VCC+1_氏1F-12120R1ra.irrgD1*32Jlt4_a;.u1*3扣fik十了F3=4rrQP3.5fTl_P3-y/WRSP1M崔口l-atldwfiT1AIL11I-11FpPFFPPPGMT口I1I.DE-LIS営APQQ快口口PO.1/AD1PQ.S/AD2PO.4/AD4PO.S7ADSPC3.6/ADfiPO.-7/AD-7ALEPSKNP37/J415F21嗎PW如13片之斗工A12F;曰盤11P2041CP2.1/A5P2QU衛(wèi)3S37

36、左*jJ32302&戈專曲24:心2221jlT3?551VI63OpFIC2二圖4.9.13.系統(tǒng)板上硬件連線(1.把“單片機(jī)系統(tǒng)”區(qū)域中的P3.7/RD端口連接到“獨(dú)立式鍵盤”區(qū)域中的SP1端口上;(2.把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0-P1.4端口用8芯排線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的“L1-L8”端口上;要求,P1.0連接到L1,P1.1連接到L2,P1.2連接到L3,P1.3連接到L4上。4程序設(shè)計(jì)方法(1.設(shè)計(jì)思想由來在我們生活中,我們很容易通過這個(gè)叫張三,那個(gè)叫李四,另外一個(gè)是王五;那是因?yàn)槊總€(gè)人有不同的名子,我們就很快認(rèn)出,同樣,對(duì)于要通過一個(gè)按鍵來識(shí)別每種不同的功

37、能,我們給每個(gè)不同的功能模塊用不同的ID號(hào)標(biāo)識(shí),這樣,每按下一次按鍵,ID的值是不相同的,所以單片機(jī)就很容易識(shí)別不同功能的身份了。(2.設(shè)計(jì)方法從上面的要求我們可以看出,L1到L4發(fā)光二極管在每個(gè)時(shí)刻的閃爍的時(shí)間是受開關(guān)SP1來控制,我們給L1到L4閃爍的時(shí)段定義出不同的ID號(hào),當(dāng)L1在閃爍時(shí),ID=O;當(dāng)L2在閃爍時(shí),ID=1;當(dāng)L3在閃爍時(shí),ID=2;當(dāng)L4在閃爍時(shí),ID=3;很顯然,只要每次按下開關(guān)K1時(shí),分別給出不同的ID號(hào)我們就能夠完成上面的任務(wù)了。下面給出有關(guān)程序設(shè)計(jì)的框圖。5.程序框圖4.9.26匯編源程序IDEQU30HSP1BITP3.7L1BITP1.0L2BITP1.1L

38、3BITP1.2L4BITP1.3ORG0MOVID,#00HSTART:JBK1,RELLCALLDELAY10MSJBK1,RELINCIDMOVA,IDCJNEA,#04,RELMOVID,#00HREL:JNBK1,$MOVA,IDCJNEA,#00H,IS0CPLL1LCALLDELAYSJMPSTARTIS0:CJNEA,#01H,IS1CPLL2LCALLDELAYSJMPSTARTIS1:CJNEA,#02H,IS2CPLL3LCALLDELAYSJMPSTARTIS2:CJNEA,#03H,IS3CPLL4LCALLDELAYSJMPSTARTIS3:LJMPSTARTDEL

39、AY10MS:MOVR6,#20LOOP1:MOVR7,#248DJNZR7,$DJNZR6,LOOP1RETDELAY:MOVR5,#20LOOP2:LCALLDELAY10MSDJNZR5,LOOP2RETEND7.C語言源程序#includeunsignedcharID;voiddelay10ms(void)unsignedchari,j;for(i=20;i0;i-)for(j=248;j0;j-);voiddelay02s(void)unsignedchari;for(i=20;i0;i-)delay10ms();voidmain(void)while(1)if(P3_7=0)del

40、ay10ms();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=P1_3;delay02s();break;10. 0099計(jì)數(shù)器1. 實(shí)驗(yàn)任務(wù)利用AT89S51單片機(jī)來制作一個(gè)手動(dòng)計(jì)數(shù)器,在AT89S51單片機(jī)的P3.7管腳接一個(gè)輕觸開關(guān),作為手動(dòng)計(jì)數(shù)的按鈕,用單片機(jī)的P2.0P2.7接一個(gè)共陰數(shù)碼管,作為0099計(jì)數(shù)的

41、個(gè)位數(shù)顯示,用單片機(jī)的P0.0P0.7接一個(gè)共陰數(shù)碼管,作為0099計(jì)數(shù)的十位數(shù)顯示;硬件電路圖如圖19所示。2. 電路原理圖VCC注0Pl0PJPL2P13IlSI-Pl-PITP-30/RJCEiPX】fTWPSimT?P3.4/TQP珈痙PiJjRDFUOTAUOF0IMH3POJ2rAD2POMI莎丸liAEi珂帀聲珅P0?/AD?ATEPSEtTPl:7i?A5加姑MPiJttJLPlZi0P2打血9PQOiAS5&PfllJ7PD2茶M335PMM33屜熾阿30yP27P2SFS*24PZ33P22Z2P2J21P20j陽iulClpUO閃pqU旳如trs匚啦_】lliSOpO3L

42、EDe:LpmPOOpp郵1GK:OF咚PO?PO27PC7圖4.10.13. 系統(tǒng)板上硬件連線(1.把“單片機(jī)系統(tǒng)”區(qū)域中的P0.0/AD0P0.7/AD7端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個(gè)ah端口上;要求:P0.0/AD0對(duì)應(yīng)著a,P0.1/AD1對(duì)應(yīng)著b,,P0.7/AD7對(duì)應(yīng)著h。(2.把“單片機(jī)系統(tǒng)”區(qū)域中的P2.0/A8P2.7/A15端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個(gè)數(shù)碼管的ah端口上;(3.把“單片機(jī)系統(tǒng)”區(qū)域中的P3.7/RD端口用導(dǎo)線連接到“獨(dú)立式鍵盤”區(qū)域中的SP1端口上;4. 程序設(shè)計(jì)內(nèi)容(1.單片機(jī)對(duì)按鍵的識(shí)別的過程處理

43、(2.單片機(jī)對(duì)正確識(shí)別的按鍵進(jìn)行計(jì)數(shù),計(jì)數(shù)滿時(shí),又從零開始計(jì)數(shù);(3.單片機(jī)對(duì)計(jì)的數(shù)值要進(jìn)行數(shù)碼顯示,計(jì)得的數(shù)是十進(jìn)數(shù),含有十位和個(gè)位,我們要把十位和個(gè)位拆開分別送出這樣的十位和個(gè)位數(shù)值到對(duì)應(yīng)的數(shù)碼管上顯示。如何拆開十位和個(gè)位我們可以把所計(jì)得的數(shù)值對(duì)10求余,即可個(gè)位數(shù)字,對(duì)10整除,即可得到十位數(shù)字了。(4.通過查表方式,分別顯示出個(gè)位和十位數(shù)字。5. 程序框圖歡碼El示00Coutir=Count-i-1挖斜謠別感時(shí)1唱TW匚丄口嗎?凰示匚口imt計(jì)數(shù)佰圖4.10.26. 匯編源程序CountEQU30HSP1BITP3.7ORG0START:MOVCount,#00HNEXT:MOVA,

44、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,6FHEND7. C語言源程序#includeunsignedcharco

45、detable=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;unsignedcharCount;voiddelay10ms(void)unsignedchari,j;for(i=20;i0;i-)for(j=248;j0;j-);voidmain(void)Count=0;P0=tableCount/10;P2=tableCount%10;while(1)if(P3_7=0)delay10ms();if(P3_7=0)Count+;if(Count=100)Count=0;P0=tableCount/10;P2=tableCount%10

46、;while(P3_7=0);11. 0059秒計(jì)時(shí)器(利用軟件延時(shí))1. 實(shí)驗(yàn)任務(wù)如下圖所示,在AT89S51單片機(jī)的P0和P2端口分別接有兩個(gè)共陰數(shù)碼管,P0口驅(qū)動(dòng)顯示秒時(shí)間的十位,而P2口驅(qū)動(dòng)顯示秒時(shí)間的個(gè)位。2. 電路原理圖Llll15證J31.OP1.LP1/2F1JPI.5衛(wèi)】怎F1.7OAPOQTAEfiP0_l/A?lP0-2TAD2PO-STADSPMJLDSP0_7/Ar37上L氐FSEN弊dP2.5?A13P2.3/A11吃如2P-2.!AJ5ps.oa口陽WXDPOL理竺PJ.2ifwTOF35OTTTF34n0F肖SlP3.7jRDPOQP0T02roP2OLQLPC

47、h麗P21的GF1右P-J&0啟鬲總活S3&U23也.IGS4DOOUQO醫(yī)易2器訂0LLDH1KMP22P7PQ4PO3PO2j-GNP圖4.11.13. 系統(tǒng)板上硬件連線(1.把“單片機(jī)系統(tǒng)”區(qū)域中的P0.0/AD0P0.7/AD7端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個(gè)ah端口上;要求:P0.0/AD0對(duì)應(yīng)著a,P0.1/AD1對(duì)應(yīng)著b,P0.7/AD7對(duì)應(yīng)著h。(2.把“單片機(jī)系統(tǒng)”區(qū)域中的P2.0/A8P2.7/A15端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個(gè)ah端口上;要求:P2.0/A8對(duì)應(yīng)著a,P2.1/A9對(duì)應(yīng)著b,P2.7/A15對(duì)應(yīng)著h。4. 程序設(shè)計(jì)內(nèi)容(1.在設(shè)計(jì)過程中我們用一個(gè)存儲(chǔ)單元作為秒計(jì)數(shù)單元,當(dāng)一秒鐘到來時(shí),就讓秒計(jì)數(shù)單元加1,當(dāng)秒計(jì)數(shù)達(dá)到60時(shí),就自動(dòng)返回到0,從新秒計(jì)數(shù)。(2.對(duì)于秒計(jì)數(shù)單元中的數(shù)據(jù)要把它十位數(shù)和個(gè)數(shù)分開,方法仍采用對(duì)10整除和對(duì)10求余。(3.在數(shù)碼上顯示,仍通過查表的方式完成。(4.一秒時(shí)間的產(chǎn)生在這里我們采用軟件精確延時(shí)的方法來完成,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論