單片機 跑馬燈實驗_第1頁
單片機 跑馬燈實驗_第2頁
單片機 跑馬燈實驗_第3頁
單片機 跑馬燈實驗_第4頁
單片機 跑馬燈實驗_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

實驗一 跑馬燈實驗一、實驗內(nèi)容1、基本的流水燈根據(jù)圖1電路,編寫一段程序,使8個發(fā)光二極管D1、D2、D3、D4、D5、D6、D7、D8順序(正序)點亮:先點亮D1,再點亮D2、D3……D8、D1……,循環(huán)點亮。每點亮一個LED,采用軟件延時一段時間。2、簡單鍵控的流水燈 不按鍵,按正序點亮流水燈;按下K1不松手,按倒序點亮流水燈,即先點亮D8,再順序點亮D7、D6……D1、D8……。松手后,又按正序點亮流水燈。3、鍵控的流水燈上電,不點亮LED,按一下K1鍵,按正序點亮流水燈。按一下K2鍵,按倒序點亮流水燈,按一下K3鍵,全部關(guān)閉LED。二、實驗方案1、總體方案設(shè)計 考慮到K4鍵未被使用,所以將實驗內(nèi)容中的三項合并到一個主函數(shù)中:K4鍵代替實驗內(nèi)容第二項中的K1鍵;單片機一開機即執(zhí)行實驗內(nèi)容第一項;K1、K2、K3鍵實現(xiàn)實驗內(nèi)容第三項。 所用硬件:AT89C52、BUTTON、LED-BLUE、電源 輸入:P2.0-K1;P2.1-K2;P2.2-K3;P2.3-K4。低電平有效 輸出:P0.0~P0.7-D0~D7。LED組連線采用共陽極,低電平有效 軟件設(shè)計: 軟件延時采用延時函數(shù)delay(t),可調(diào)整延遲時間: voiddelay(uintt){ uinti; while(t--) for(i=0;i<1000;i++){ if(P2!=oldK&&P2!=K[0]) break; //按下了其他鍵退出循環(huán) } } 由于涉及到按鍵變化所以要設(shè)置一個變量oldK保留按鍵鍵值,要在延時程序中檢測是否按鍵,當(dāng)按鍵后立即設(shè)置oldK的值。 按鍵判斷采用在while循環(huán)中利用條件語句判斷P2的值然后執(zhí)行該鍵對應(yīng)的代碼段,達到相應(yīng)的響應(yīng)。 為了讓K4鍵的效果優(yōu)化,即狀態(tài)變化從當(dāng)前已亮燈開始順序點亮或逆序點亮,利用全局變量n來記錄燈號,利用算法即可實現(xiàn)。 主要算法:1、全局變量的定義:ucharD[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f}; //單個LED亮ucharAllOff=0xff; //LED全滅ucharAllOn=0x00; //LED全亮ucharK[]={0xff,0xfe,0xfd,0xfb,0xf7}; //按鍵開關(guān)ucharoldK; //記錄已按鍵intn; 2、順序、逆序點亮流水燈:voidforward(){ for(n=0;n<=7;n++){ out=D[n]; delay(15); if(P2!=oldK&&P2!=K[0]) break; } out=AllOff;}voidbackward(){ for(n=7;n>=0;n--){ out=D[n]; delay(15); if(P2!=oldK&&P2!=K[0]) break; } out=AllOff;}3、實驗內(nèi)容第二項流水燈燈亮順序變換:voidhold(){ n=8; while(1){ if(P2==K[4]){ //一直按著K4鍵,逆序點亮跑馬燈 oldK=K[4]; if(n==-1) n=7; //D0燈亮后點亮D7 while(n>=0){ out=D[n]; n--; if(delay4(15)) break; } } if(P2==K[0]){ //未按下K4鍵,一直正序點亮跑馬燈 oldK=K[0]; if(n==8) n=0; //D7燈亮后點亮D0 while(n<=7){ out=D[n]; n++; if(delay4(15)) break; } } if(P2!=K[4]&&P2!=K[0]){ //按下了其他鍵,退出hold函數(shù) break; } }}4、 對應(yīng)實驗內(nèi)容第一項,開機順序點亮流水燈:while(1){ //開機即正序點亮流水燈 forward(); if(P2!=K[0]){ break; } }2、實驗原理圖圖21實驗原理圖3、程序流程圖圖22程序流程圖三、源程序#include"reg51.h"#defineucharunsignedchar#defineuintunsignedint#defineoutP0ucharD[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f}; //單個LED亮ucharAllOff=0xff; //LED全滅ucharAllOn=0x00; //LED全亮ucharK[]={0xff,0xfe,0xfd,0xfb,0xf7}; //按鍵開關(guān)ucharoldK; //記錄已按鍵intn; //記錄當(dāng)前亮的燈號voiddelay(uintt){ uinti; while(t--) for(i=0;i<1000;i++){ if(P2!=oldK&&P2!=K[0]) break; //按下了其他鍵退出循環(huán) }}voiddelay10ms(){ uinti; for(i=0;i<10000;i++);}voidforward(){ for(n=0;n<=7;n++){ out=D[n]; delay(15); if(P2!=oldK&&P2!=K[0]) break; } out=AllOff;}voidbackward(){ for(n=7;n>=0;n--){ out=D[n]; delay(15); if(P2!=oldK&&P2!=K[0]) break; } out=AllOff;}intdelay4(uintt){ uinti; while(t--) for(i=0;i<1000;i++){ if(P2!=oldK){ //按鍵變化退出循環(huán) return1; } } return0;}voidhold(){ n=8; while(1){ if(P2==K[4]){ //一直按著K4鍵,逆序點亮跑馬燈 oldK=K[4]; if(n==-1) n=7; //D0燈亮后點亮D7 while(n>=0){ out=D[n]; n--; if(delay4(15)) break; } } if(P2==K[0]){ //未按下K4鍵,一直正序點亮跑馬燈 oldK=K[0]; if(n==8) n=0; //D7燈亮后點亮D0 while(n<=7){ out=D[n]; n++; if(delay4(15)) break; } } if(P2!=K[4]&&P2!=K[0]){ //按下了其他鍵,退出hold函數(shù) break; } }} voidmain(){ oldK=K[0]; while(1){ //開機即正序點亮流水燈 forward(); if(P2!=K[0]){ break; } } while(1){ out=AllOff; if((P2&0x0f)!=0x0f){ //檢測有鍵按下 delay10ms(); //延時10ms再去檢測 //P2.0_K1鍵按下正序點亮流水燈 if(P2==K[1]){ oldK=K[1]; while(1){ forward(); if(P2!=K[1]&&P2!=K[0]){ //按下了其他鍵,退出 break; } } } //P2.1_K2鍵按下逆序點亮流水燈 if(P2==K[2]){ oldK=K[2]; while(1){ backward(); if(P2!=K[2]&&P2!=K[0]){ //按下了其他鍵,退出 break; } } } //P2.2_K3鍵按下關(guān)閉全部LED if(P2==K[3]){ oldK=K[3]; out=AllOff; } //P2.3_K4鍵按下長按逆序點亮流水燈,不按正序點亮流水燈,直到其他鍵按下停止 if(P2==K[4]){ hold(); } } }}四、實驗結(jié)果1、基本的流水燈:開機后即重復(fù)順序點亮流水燈,等待其他按鍵。(如圖4-1)圖41基本的流水燈2、簡單鍵控的流水燈:按下K4鍵即點亮D7燈,若一直按著K4鍵逆序點亮流水燈,松開則順序點亮流水燈,且按鍵狀態(tài)改變時送當(dāng)前已亮的燈開始變換順序而不是從D0或D7燈開始亮燈。(如圖4-2)圖4-2簡單鍵控的流水燈3、鍵控的流水燈:K1鍵按下順序點亮流水燈,K2鍵按下逆序點亮流水燈,K3鍵按下全局滅燈。(如圖4-3)圖43鍵控的流水燈五、實驗思考題1、采用I/O口作為輸出口時要考慮哪些因素?為什么實驗裝置中LED要串聯(lián)一個電阻?當(dāng)作為輸出口時候就是單片機向外發(fā)出數(shù)據(jù),或者再產(chǎn)生拉電流,單片機的拉電流一般要比灌電流小,基本上就能點亮2,3個LED,功率很有限,所以一般時候必須用驅(qū)動芯片來驅(qū)動單片機的外圍器件。串聯(lián)電阻是為了保護電路。2、采用I/O口作為輸入口時要注意什么?鍵控的流水燈時為什么要在延時程序中檢測是否按鍵?當(dāng)作為輸入口時候是單片機接收IC的數(shù)據(jù)信息,或者是灌電流,這時候要考慮電流的大小是否在單片機的承受范圍內(nèi)。為了防止在延時程序中間有按鍵按下卻檢測不到的情況,即放在延時中檢測間隔時間短,反應(yīng)快。3、為什么延時程序要做一個函數(shù)?可以具體事情具體處理,方便靈活的調(diào)用。六、總結(jié) 通過本次實驗,我不僅更熟悉了Protues及Keil軟件的使用,對C51編程的使用也更上一層樓,對于C51的編程語句與傳統(tǒng)的C語言編程有一些區(qū)別,其中的無符號字符型是我在C語言中從未使用過的,在C51編程中會經(jīng)常用到,用來給單片機的端口賦值或判斷端口的值。對于C51

溫馨提示

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

評論

0/150

提交評論