MCU單片機(jī)在蜂鳴器系統(tǒng)中的應(yīng)用設(shè)計(jì)_第1頁(yè)
MCU單片機(jī)在蜂鳴器系統(tǒng)中的應(yīng)用設(shè)計(jì)_第2頁(yè)
MCU單片機(jī)在蜂鳴器系統(tǒng)中的應(yīng)用設(shè)計(jì)_第3頁(yè)
MCU單片機(jī)在蜂鳴器系統(tǒng)中的應(yīng)用設(shè)計(jì)_第4頁(yè)
MCU單片機(jī)在蜂鳴器系統(tǒng)中的應(yīng)用設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、【W(wǎng)ord版本下載可任意編輯】 MCU單片機(jī)在蜂鳴器系統(tǒng)中的應(yīng)用設(shè)計(jì) 初學(xué)者在編寫單片機(jī)程序時(shí)經(jīng)常會(huì)用到延時(shí)函數(shù),但是當(dāng)系統(tǒng)逐步復(fù)雜以后(沒(méi)有復(fù)雜到使用操作系統(tǒng))延時(shí)會(huì)因?yàn)檠訒r(shí)降低MCU的利用率,更嚴(yán)重的會(huì)影響系統(tǒng)中的“并行”操作例如一個(gè)既有按鍵又有蜂鳴器的系統(tǒng)中,如果要求按下按鍵發(fā)出不同的聲音,每次發(fā)聲時(shí)間在1秒-2秒之間, 如果用延時(shí)來(lái)做代碼很簡(jiǎn)單: /蜂鳴器發(fā)出“嗶-嗶-嗶”聲音時(shí)間約1s void BeepFuction(void) unsigned char i; for(i=0;i3;i=+) BeepEn(); /開啟蜂鳴器 Delayms(220);/延時(shí)220ms BeepD

2、is();/關(guān)閉蜂鳴器 Delayms(110);/延時(shí)110ms 當(dāng)這段代碼執(zhí)行時(shí)MCU不可能同時(shí)處理按鍵檢查程序因?yàn)樗蟛糠謺r(shí)間在執(zhí)行Delayms()函數(shù)中的nop指令,這樣就不可能去執(zhí)行檢查按鍵了(不使用中斷時(shí)),如果把程序改成流程形式的寫法則結(jié)果會(huì)大為不同,下面先介紹一下基本原理。 我們都知道一般的定時(shí)器為16位或8位循環(huán)計(jì)數(shù),例如對(duì)于16位的計(jì)數(shù)器當(dāng)計(jì)數(shù)器數(shù)值從0增加到65535時(shí)再加一就會(huì)回到0那么我們來(lái)比較下面兩種情況(不考慮計(jì)數(shù)器在記錄當(dāng)前時(shí)刻T后再次回到或超過(guò)T這種情況我暫且稱它為“壓圈”): 情況1: T1時(shí)刻計(jì)數(shù)器數(shù)值為300 T2時(shí)刻計(jì)數(shù)器數(shù)值為400 則T1時(shí)刻到T

3、2為100個(gè)計(jì)數(shù)單位。 這段時(shí)間差也為100個(gè)計(jì)數(shù)單位。 情況2: T1時(shí)刻計(jì)數(shù)器數(shù)值為65535 T2時(shí)刻計(jì)數(shù)器數(shù)值為99 則T1到T2 可以算出為65535到0的1個(gè)計(jì)數(shù)單位再加上 0到99的99個(gè)計(jì)數(shù)單位總共為100個(gè)計(jì)數(shù)單位。 所以時(shí)間差還是100個(gè)計(jì)數(shù)單位。 在C語(yǔ)言中如果使用兩個(gè)無(wú)符號(hào)數(shù)作減法會(huì)得到如下結(jié)果:99-65535=100,這個(gè)很好理解就和10進(jìn)制的借位一樣只不過(guò)借位后不用管高位了也就相當(dāng)于99+65536-65535結(jié)果是100了,當(dāng)然這些前提條件都是計(jì)數(shù)器不會(huì)出現(xiàn)“壓圈”。 有了上面對(duì)定時(shí)器的了解就可以從新寫這個(gè)Beep函數(shù)了 /蜂鳴器發(fā)出“嗶-嗶-嗶”聲音時(shí)間約1s

4、 bit BeepFlag = 0;/蜂鳴流程忙標(biāo)志位 bit BeepCtrl = 0;/蜂鳴器流程控制標(biāo)志位 void BeepProc(void) staTIc unsigned int BeepTImer; staTIc unsigned char BeepStatus = 0; staTIc unsigned char i; switch(BeepStatus) case 0:/ if(BeepCtrl) i = 3;/蜂鳴次數(shù) BeepFlag = 1;/置位忙標(biāo)志位 BeepCtrl = 0;/去除控制標(biāo)志位 BeepTimer = TIMER;/這里TIMER為系統(tǒng)定時(shí)器計(jì)數(shù)時(shí)

5、鐘為1ms BeepEn(); /開啟蜂鳴器 BeepStatus = 1;/進(jìn)入下一個(gè)狀態(tài) break; case 1:/蜂鳴狀態(tài) if(TIMER-BeepTimer220)/220ms BeepDis(); /關(guān)閉蜂鳴器 BeepTimer = TIMER;/記錄時(shí)刻 BeepStatus = 2;/進(jìn)入下一個(gè)狀態(tài) break; case 2:/停止蜂鳴狀態(tài) if(TIMER-BeepTimer110)/110ms if(i!=0) i-; BeepTimer = TIMER;/記錄時(shí)刻 BeepEn(); /開啟蜂鳴器 BeepStatus = 2;/回到蜂鳴狀態(tài) else BeepS

6、tatus = 0;/回到初始狀態(tài) BeepFlag = 0;/去除忙標(biāo)志位 break; default: BeepFlag = 0;/去除忙標(biāo)志位 BeepStatus = 0;/回到初始狀態(tài) break; 用這樣的方法實(shí)現(xiàn)的蜂鳴程序在使用時(shí)也有不同的地方,因?yàn)槭褂玫膕witch狀態(tài)所有在主循環(huán)中要一直調(diào)用: void main() SystemInitial();/系統(tǒng)初始化 。.。.。.。.。. /主循環(huán) while(1) Fun1Proc();/功能1流程 Fun2Proc();/功能2流程 。.。 BeepProc();/蜂鳴流程 。.。 16 在別的函數(shù)中需要使蜂鳴器工作時(shí)只需要下面代碼即可: if(!BeepFlag)/檢查是否忙 BeepCtrl = 1;/啟動(dòng)蜂鳴器 用這種方法能充分利用MCU,在蜂鳴器發(fā)聲或發(fā)聲間隔的等待時(shí)間MCU可以處理別的函數(shù),但

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論