版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中心機房設(shè)計方案
- 幼兒講紅色故事比賽一等獎
- 醫(yī)生進修工作總結(jié)
- 娛樂產(chǎn)業(yè)數(shù)字化演出運營策劃方案
- 心內(nèi)科術(shù)前術(shù)后護理
- 大健康產(chǎn)業(yè)數(shù)字化健康管理與服務(wù)平臺設(shè)計研究
- 2024年4月20日高端班中級冶煉第一輪第十三講
- 甲乙丙三方維修協(xié)議書范文范本
- 智慧農(nóng)業(yè)葡萄園項目種植物聯(lián)網(wǎng)項目解決方案
- 砂石路施工合同
- 上海市普陀區(qū)2024-2025學(xué)年六年級(五四學(xué)制)上學(xué)期期中語文試題
- 采伐樹木合同模板
- 培訓(xùn)師破冰游戲大全課件
- 期中測試卷-2024-2025學(xué)年統(tǒng)編版語文三年級上冊
- 《氣能破巖作業(yè)技術(shù)規(guī)程》征求意見稿編制說明
- 消防救生照明線標(biāo)準(zhǔn)解析
- GB/T 24304-2024動植物油脂茴香胺值的測定
- 第一單元 史前時期:原始社會與中華文明的起源(復(fù)習(xí)課件)
- 廣東省深圳市2023-2024學(xué)年高一上學(xué)期語文期中試卷(含答案)
- 學(xué)校采購課程合同范本
- 2024年公安基礎(chǔ)知識考試題庫及答案
評論
0/150
提交評論