單片機課程設(shè)計--音樂倒數(shù)計時器_第1頁
已閱讀1頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  單片機課程設(shè)計</b></p><p><b>  結(jié)題報告</b></p><p><b>  ——音樂倒數(shù)計時器</b></p><p><b>  姓名:</b></p><p><b>  學號:</b

2、></p><p><b>  指導(dǎo)教師:</b></p><p><b>  系統(tǒng)方案設(shè)計</b></p><p><b>  項目設(shè)計的內(nèi)容</b></p><p>  選題:音樂倒數(shù)計數(shù)器</p><p><b>  設(shè)計要求<

3、;/b></p><p>  利用AT89C51單片機結(jié)合字符型LED顯示器設(shè)計一個簡易的倒數(shù)計數(shù)器,可用來煮方便面、煮開水或小睡片刻等。做一小段時間倒計數(shù),當?shù)褂嫈?shù)為0時,則發(fā)出一段音樂聲響,通知倒計數(shù)終了,該做應(yīng)當做的事。</p><p>  定時鬧鐘的基本功能如下。</p><p><b>  6位LED顯示器。</b></p

4、><p>  顯示格式為“TIME 分分:秒秒”。</p><p>  用4個按鍵操作來設(shè)置當前想要倒計數(shù)的時間。一旦按下鍵則開始倒計數(shù),當計數(shù)為0時,發(fā)出一陣音樂聲。</p><p>  程序執(zhí)行后工作指示燈LED閃動,表示程序開始執(zhí)行,按下操作鍵K1~K4動作如下。</p><p>  K1—可調(diào)整倒計數(shù)的時間1~60分鐘。</p>

5、;<p>  K2—設(shè)置倒計數(shù)的時間為5分鐘,顯示“0500”。</p><p>  K3—設(shè)置倒計數(shù)的時間為10分鐘,顯示“1000”。</p><p>  K4—設(shè)置倒計數(shù)的時間為20分鐘,顯示“2000”。</p><p>  復(fù)位后LED的畫面應(yīng)能顯示倒計時的分鐘和秒數(shù),此時按K1鍵則在LED上顯示出設(shè)置畫面。此時,若:</p>

6、<p>  a. 按操作鍵K2—增加倒計數(shù)的時間1分鐘。</p><p>  b. 按操作鍵K3—減少倒計數(shù)的時間1分鐘。</p><p>  c. 按操作鍵K4—設(shè)置完成。 </p><p>  本題目最大難點是實現(xiàn)音樂的播放。作者利用定時計數(shù)器,通過載入不同的計數(shù)初值,產(chǎn)生頻率不同的方波,輸入到蜂鳴器(SOUNER)中,使其發(fā)出頻率不同的聲音。本設(shè)計中

7、單片機晶振為1.0592MHz,通過計算各音階頻率,可得1、2、3、4、5、6、7共7個音應(yīng)賦給定時器的初值為64580、64684、64777、64820、64898、64968、65030。</p><p>  在此基礎(chǔ)上,可將樂曲的簡譜轉(zhuǎn)化為單片機可以“識別”的“數(shù)組譜”,進一步加入對音長、休止符等的控制量后,可以實現(xiàn)音樂的播放。</p><p>  根據(jù)實際的使用習慣,要求中提出的

8、設(shè)置時采用K1到K4實現(xiàn)的功能并不十分合理,要實現(xiàn)1到60分鐘可調(diào)如果初值設(shè)置時最大只能是20分鐘那么想要定時超過30分鐘時在微調(diào)階段就會十分麻煩,需要反復(fù)按下按鍵,并且K1鍵的作用在實際應(yīng)用時也容易混淆,所以在編程時將K1到K4四個鍵擴展為K1到K4在加上“確認”和“返回”共六個按鍵,使得時間的設(shè)置更加符合平常的認知和使用習慣,更加實用。</p><p><b>  具體更改如下:</b>

9、</p><p><b>  表1_1</b></p><p>  其他指標相比題目要求沒有較大更改。</p><p><b>  項目設(shè)計的指標</b></p><p><b>  表1_2</b></p><p><b>  項目設(shè)計的方案

10、選擇</b></p><p>  方案一:使用MSP430單片機自制最小系統(tǒng),包含按鍵、數(shù)碼管、LED燈、音頻放大等模塊部分,采用C語言編寫程序?qū)崿F(xiàn)按鍵控制、數(shù)碼管倒計時顯示和音樂的播放。</p><p>  方案二:使用89C51單片機自制最小系統(tǒng),包含按鍵按鍵、數(shù)碼管、LED燈、音頻放大等模塊部分,采用C語言編寫程序?qū)崿F(xiàn)按鍵控制、數(shù)碼管倒計時顯示和音樂的播放。</p&

11、gt;<p>  方案三:使用偉福Lab2000實驗箱,采用匯編語言編寫程序?qū)崿F(xiàn)按鍵控制、數(shù)碼管倒計時顯示和音樂的播放。</p><p>  通過比較發(fā)現(xiàn),方案一最大的缺點在于MSP430單片機功能雖然強大,但是價格較高,相比之下51單片機不僅完全能夠?qū)崿F(xiàn)音樂倒數(shù)計時器的功能而且價格相對低廉,更具有使用和推廣價值。而方案一和方案二共同的缺點在于:第一,自制最小系統(tǒng)板相對于實驗箱功能并不十分穩(wěn)定,由于

12、條件的限制,自制最小系統(tǒng)只能采用萬用板焊接或者自己腐蝕PCB板制作,相對于專業(yè)廠家生產(chǎn)的集成實驗箱穩(wěn)定性較差,而實驗箱本身具備了該項目所需的各種功能模塊,按鍵、數(shù)碼管、音頻放大和LED燈,所以采用實驗箱保證了系統(tǒng)的穩(wěn)定性;第二,C語言作為面向用戶的語言有它自身的局限性,作為對時間要求精確的計時器而言,采用匯編語言更能保證程序的實時性和計時的準確行。綜上所述,最終決定采用方案三。</p><p><b>

13、  系統(tǒng)方案框圖</b></p><p>  圖1_1 系統(tǒng)總框圖</p><p><b>  硬件設(shè)計</b></p><p>  說明:所有電路均參考實驗箱設(shè)計,整體電路圖見附頁一</p><p>  鍵盤與LED顯示電路</p><p>  圖2_1 鍵盤與LED數(shù)碼管顯示電路&

14、lt;/p><p>  顯示控制的位碼由74HC374輸出,經(jīng)MC1413反向驅(qū)動后,做LED的位選通信號。位選通信號也可做為鍵盤列掃描碼,鍵盤掃描的行數(shù)據(jù)從74HC245讀回,374輸出的列掃描碼經(jīng)245讀入后,用來判斷是否有鍵被按下,以及按下的是什么鍵。如果沒有鍵按下,由于上拉電阻的作用,經(jīng)245讀回的值為高,如果有鍵按下,374輸出的低電平經(jīng)過按鍵被接到245的端口上,這樣從245讀回的數(shù)據(jù)就會有低位,根據(jù)37

15、4輸出的列信號和245讀回的行信號,就可以判斷哪個鍵被按下。LED顯示的段碼由另一個74HC374輸出。</p><p><b>  LED電平顯示電路</b></p><p>  圖2_2 LED電平顯示電路</p><p>  L0― L2為相應(yīng)發(fā)光二極管驅(qū)動信號輸入端,該輸入端為高電壓電平“1”時發(fā)光二極管點亮。我們可以通過P1口對其直

16、接進行控制,點亮或者熄滅發(fā)光二極管。</p><p><b>  音頻放大濾波電路</b></p><p>  圖2_3 音頻放大濾波電路</p><p><b>  復(fù)位電路</b></p><p>  圖2_4 復(fù)位電路</p><p><b>  軟件設(shè)計

17、</b></p><p>  說明:所有流程圖均使用Edraw(試用版)制作,由于試用版無法直接導(dǎo)出圖形故采用截圖方式,造成某些流程圖不清晰</p><p><b>  按鍵設(shè)置部分</b></p><p>  圖3_1 按鍵設(shè)置程序總流程圖</p><p>  按鍵部分調(diào)用了單元實驗中的顯示子程序(Dis

18、playLED)和鍵盤讀入子程序(GetKey),以及自定義的顯示緩沖賦值程序(Trans_M和Trans_S),使用R4、R5寄存器分別存儲秒鐘和分鐘的計數(shù)值,按鍵的判斷使用的是cjne邏輯,即相等繼續(xù)執(zhí)行程序,不相等跳轉(zhuǎn)到相應(yīng)的標號處。</p><p>  設(shè)置部分也加入了相應(yīng)的指示燈來指示相應(yīng)的操作,如黃燈亮表示進入了初值設(shè)置階段可以進行5、10、20、40分鐘的初值設(shè)置,綠燈亮表示進入了微調(diào)設(shè)置階段,可以

19、對分鐘位和秒位進行微調(diào),實現(xiàn)1—60:59可調(diào)。</p><p>  圖3_2 按鍵初值設(shè)置程序流程圖</p><p>  圖3_3 按鍵微調(diào)設(shè)置程序流程圖</p><p><b>  計時部分</b></p><p>  圖3_4 計時部分主程序流程圖</p><p>  圖3_5 計時

20、部分中斷程序流程圖</p><p>  計時部分采用三個計數(shù)器R3、R4和R5分別對100ms,1s和1min進行計數(shù),采用定時器0,方式一實現(xiàn)100ms的中斷,在中斷子程序中使用djnz邏輯判斷秒鐘和時鐘是否達到單位量值,例如對秒位的控制,R4開始為0,進入中斷子程序后賦值為60,經(jīng)過djnz的判斷變?yōu)?9,之后59減到58為一秒,58減到57為一秒以此類推直到1減到0為一秒,正好計時60s的時間。</p

21、><p>  整個計數(shù)部分有兩處需要調(diào)整計數(shù)值,第一處是如果R4不為0,則必須在相應(yīng)設(shè)置的分鐘數(shù)基礎(chǔ)上再加一,因為不為0的R4也會消耗掉一位分鐘位,如果補不足相應(yīng)的分鐘數(shù)就會造成分鐘數(shù)計數(shù)錯誤;第二處是在分鐘的顯示部分,例如要計時2分鐘,雖然倒計時到1分59秒時分鐘計數(shù)值仍然應(yīng)該是2,但是顯示時卻應(yīng)該顯示1,故在這種情況下只在顯示時進行減一操作而不影響真實的計數(shù)值。</p><p><b

22、>  音樂播放部分</b></p><p>  圖3_6 音樂播放程序流程圖</p><p>  聲音的產(chǎn)生是一種音頻震動的效果,震動的頻率高,則為高音,頻率低則為低音,音頻的范圍為20Hz—200kHz,人類的耳朵比較容易辨識的聲音大概是200Hz—20KHz。在數(shù)字電路里,多以脈沖信號驅(qū)動喇叭,以產(chǎn)生聲音,如圖2_3所示。以8051產(chǎn)生聲音,可利用程序產(chǎn)生頻率,送到

23、輸入/輸出端口(一個位即可,例如P1.0等),再從該點連接到蜂鳴器的驅(qū)動電路,即可驅(qū)動蜂鳴器。而蜂鳴器的驅(qū)動電路以PNP晶體管放大電路最適合。</p><p>  子程序DEL為延時子程序,當R3為1時,延時時間約為20us,R3中存放延時常數(shù),對200HZ音頻,其周期為1/200秒,即5ms。這樣,當P1.3的高電平或低電平的持續(xù)時間為2.5ms,即R3的時間常數(shù)取2500/20=125(7DH)時,就能發(fā)出2

24、00HZ的音調(diào)。依照此原理結(jié)合音階-頻率對照表就可以得到想要的音階所對應(yīng)的R3時間常數(shù)了。</p><p>  音符的節(jié)拍用定時器T1來控制,送入不一樣的初值,就能產(chǎn)生不一樣的定時時間。如某歌曲的節(jié)奏為每分鐘94拍,即一拍為0.64秒。但是,由于T1的最大定時時間只能為131毫秒,因此不可能直接用改變T1的時間初值來實現(xiàn)不一樣節(jié)拍。所以只能用T1來產(chǎn)生10毫秒的時間基準,然后設(shè)置一個中斷計數(shù)器,通過判別中斷計數(shù)器

25、的值來控制節(jié)拍時間的長短。依照此原理結(jié)合樂譜中音階的節(jié)拍即可計算出對應(yīng)的計數(shù)值。</p><p>  制表時將音階常數(shù)和節(jié)拍常數(shù)間隔放置,先取音符再去節(jié)拍。</p><p><b>  測試方案和調(diào)試過程</b></p><p><b>  測試方案:</b></p><p>  整個項目具體的測試

26、方案主要是軟件的調(diào)試,分為五個階段:</p><p>  第一階段是按鍵設(shè)置部分的調(diào)試,需要連接按鍵、數(shù)碼管和LED顯示燈</p><p><b>  硬件連接:</b></p><p><b>  表4_1</b></p><p><b>  單獨調(diào)試完成指標:</b><

27、;/p><p>  程序開始指示燈閃爍,數(shù)碼管顯示00-00,黃燈亮表示進入SET1階段</p><p>  不按“確認”鍵前程序可以實現(xiàn)5、10、20、40分鐘自由切換顯示,并且r5的值相應(yīng)跟著改變</p><p>  按下的值是“返回”則數(shù)碼管顯示00-00,并且R4、R5清零</p><p>  按下的值不是K1-4或者“確認”和“返回”

28、紅燈閃爍報錯</p><p>  按下“確認”鍵后黃燈滅綠燈亮表示進入SET2階段</p><p>  按下K1鍵確認初值后可以實現(xiàn)在初值的基礎(chǔ)上重復(fù)加減分鐘數(shù)和秒鐘數(shù),顯示和R4、R5的值都相應(yīng)跟著改變</p><p>  若加出的分鐘數(shù)為60則不可再加或減得的分鐘數(shù)為0則不可再減,并且紅燈報錯</p><p>  按下的鍵不是K1-4或者

29、“確認”和“返回”的紅燈閃爍報錯,顯示和R4、R5的值保持不變重新設(shè)置</p><p>  SET2階段按下“確認”后跳入計時部分(用綠燈滅表示)</p><p>  第二階段是計時部分的單獨調(diào)試,硬件連接一個LED燈來表示播放音樂</p><p><b>  單獨調(diào)試完成指標:</b></p><p>  按照程序開始

30、賦入的R4、R5的初值進行倒數(shù)計時,數(shù)碼管動態(tài)顯示計時過程,并且在倒記到到00-00時跳入音樂播放部分(用紅燈亮來表示)</p><p>  第三階段是按鍵部分與計時部分的聯(lián)調(diào),硬件連接如表4_1所示</p><p><b>  聯(lián)調(diào)完成指標:</b></p><p>  按下確認鍵后能夠按照按鍵設(shè)置部分設(shè)置的分鐘和秒鐘數(shù)進行倒數(shù)計時,數(shù)碼管動

31、態(tài)顯示計時過程,并且在倒記到00-00時跳入音樂播放部分(用紅燈亮來表示)</p><p>  第四階段是音樂部分的單獨調(diào)試,硬件連接需要連接P1.3口和音頻放大部分和LED指示燈</p><p><b>  單獨調(diào)試完成指標:</b></p><p>  程序開始執(zhí)行后播放《八月桂花香》音樂,播放一遍之后跳回程序開始(用紅燈亮表示)</

32、p><p>  第五階段是整體聯(lián)調(diào),需要連接按鍵、數(shù)碼管、LED顯示燈和音頻放大部分</p><p><b>  硬件連接:</b></p><p><b>  表4_2</b></p><p><b>  整體聯(lián)調(diào)完成指標:</b></p><p>  1

33、程序開始:紅燈閃爍,初始顯示為“00-00”,格式為“分分—秒秒”</p><p>  2按下“確認”鍵前指示燈黃燈亮,綠燈滅表示是SET1初值設(shè)置階段5、10、15、20分鐘初值設(shè)置可以自由調(diào)整</p><p>  3按下“確認”鍵后指示燈綠燈亮,黃燈滅表示是SET2微調(diào)設(shè)置階段在初值基礎(chǔ)上01:00—60:59微調(diào)設(shè)置自由調(diào)整</p><p>  4若按

34、下的不是操作鍵則紅燈閃爍表示錯誤,但不改變設(shè)置值</p><p>  5若按下的是“返回”鍵則返回設(shè)置開始,并且設(shè)置值全部清零</p><p>  6若微調(diào)時分鐘或秒鐘數(shù)低于0或高于60紅燈閃爍表示錯誤,但不改變設(shè)置值</p><p>  7設(shè)置完成按下“確認”鍵開始計時,數(shù)碼管實時顯示倒記時間</p><p>  8倒計時到“00—

35、00”時顯示關(guān)閉,播放一段音樂</p><p>  9音樂播放完畢自動回到程序開始</p><p>  10實現(xiàn)秒位的微調(diào)設(shè)置和倒計時顯示</p><p><b>  調(diào)試過程:</b></p><p>  第一階段:按鍵設(shè)置部分的調(diào)試</p><p>  編程完成第一次調(diào)試時初值設(shè)置部分沒有

36、出現(xiàn)任何問題,但是在微調(diào)部分卻出現(xiàn)了不能正常賦值和顯示的問題,無論開始初值設(shè)置的是多少怎么按按鍵調(diào)整,顯示值始終是0分或者2分,后來經(jīng)過軟件仿真發(fā)下問題出在設(shè)置的計數(shù)空間上,開始我是用的是定義的TimeBuf來儲存分鐘值,但是發(fā)現(xiàn)跟其他定義有沖突,并且不能完全保證所定義的空間在執(zhí)行其他部分是值不發(fā)生改變,所以最終決定使用R5寄存器,因為其他子程序中都沒有使用該寄存器,不會產(chǎn)生沖突,改過之后發(fā)現(xiàn)完成了指標。</p><

37、p>  秒位的控制其實是在第一次聯(lián)調(diào)完成以后加入的,在按鍵部分沒有遇到什么問題,只是增加了R4寄存器就完成了秒位的設(shè)置。</p><p>  第二階段:計時部分的單獨調(diào)試</p><p>  計時部分在單獨調(diào)試時只遇到了一個問題,就是開始的時候我沒有考慮例如計時兩分鐘,計時到1:59時雖然分鐘數(shù)仍為2但是應(yīng)該顯示1的問題,最終在顯示部分增加了分鐘沒有記足一個計數(shù)值時也需要減一顯示的程

38、序,這樣就實現(xiàn)了實時的倒計時顯示。</p><p>  增加秒位控制以后又出現(xiàn)了一個問題,就是設(shè)置的秒位雖然不足一分鐘可是在程序中R4減到0就代表計時一分鐘完成,這在以往只設(shè)置分鐘的情況下是沒有問題的,但是對于秒位不足一分鐘的情況就出現(xiàn)了差錯,最后我在計時開始部分給R4不為零的情況增加了一個補充分鐘數(shù)的語句,這樣就解決了分鐘數(shù)少一的問題。</p><p>  第三階段:按鍵部分與計時部分的

39、聯(lián)調(diào)</p><p>  由于一二階段問題得到了解決,在聯(lián)調(diào)時候沒有出現(xiàn)任何問題。</p><p>  第四階段:音樂部分的單獨調(diào)試</p><p>  由于音樂部分的程序參考了網(wǎng)上的匯編程序,所以需要改動的地方比較多,如音階和節(jié)拍的計時程序都進行了調(diào)整,參考程序給出的是以12M晶振為例編寫的程序,改為適合實驗箱6M晶振的程序時都將計時常數(shù)相應(yīng)的進行了調(diào)整,由于計時

40、部分用了T0計時器所以在音樂播放部分就只能使用T1計時器了,這一部分也進行了相應(yīng)的更改,而且音樂過長也依照曲譜相應(yīng)得進行了刪減,調(diào)整和刪減完成后就能實現(xiàn)音樂播放了。</p><p><b>  第五階段:整體聯(lián)調(diào)</b></p><p>  由于前四個階段的調(diào)整都完成得很順利,并且單獨調(diào)試時都能實現(xiàn)相互的跳轉(zhuǎn),故整體聯(lián)調(diào)時沒有出現(xiàn)什么問題。</p>&l

41、t;p><b>  附錄</b></p><p><b>  參考文獻:</b></p><p>  《單片機原理與接口技術(shù)》 何宏主編 國防工業(yè)出版社</p><p>  《例說8051(第三版)》 張義和陳敵北主編人民郵電出版社</p>

42、<p>  《Protel 99SE 電路原理圖設(shè)計計數(shù)》 楊志亮主編 西北工業(yè)大學出版社</p><p>  《51單片機匯編語言教程:第28課-音樂程序設(shè)計》</p><p>  《基于51單片機電子鬧鐘的設(shè)計》</p><p><b>  實驗程序:</b></p><p>  ;=

43、=========端口定義===============================</p><p><b>  org 0000h</b></p><p>  OUTBIT equ 08002h ; 位控制口</p><p>  OUTSEG equ 08004h ; 段控制口</p><p>

44、  IN equ 08001h ; 鍵盤讀入口</p><p>  ;=============================================================</p><p>  ;==========緩沖變量定義===========================</p><p>  BASE equ

45、60536</p><p>  LED1_1 equ 0 ;指示燈定義</p><p>  LEDBuf equ 40h ;顯示緩沖</p><p>  LED1 equ P1.0</p><p>  ;==================================================

46、===========</p><p>  ;==========主程序入口============================</p><p>  ljmp Start</p><p>  ;==========中斷入口==============================</p><p>  org000bh ;T

47、0的中斷入口</p><p>  ljmp IT0P</p><p>  ORG 001BH ;T1的中斷入口</p><p>  ljmp IT1P</p><p>  ;==========顯示子程序============================</p><p>  

48、LEDMAP: ; 八段管顯示碼</p><p>  db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h</p><p>  db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h</p><p>  Delay: ; 延時子程序&l

49、t;/p><p>  mov r7, #0</p><p>  DelayLoop:</p><p>  djnz r7, DelayLoop</p><p>  djnz r6, DelayLoop</p><p><b>  ret</b></p><p>  Di

50、splayLED:</p><p>  mov r0, #LEDBuf ;將LEDBuf的地址賦值給r0</p><p>  mov r1, #6 ; 共6個八段管</p><p>  mov r2, #00100000b ; 從左邊開始顯示</p><p>  Loop: mov dptr,

51、 #OUTBIT</p><p>  mov a, #0</p><p>  movx @dptr, a ; 關(guān)所有八段管</p><p>  mov a, @r0</p><p>  mov dptr, #OUTSEG ;指針指向數(shù)碼管段控制</p><p>  movx @dpt

52、r, a</p><p>  mov dptr, #OUTBIT</p><p>  mov a, r2</p><p>  movx @dptr, a ; 顯示一位八段管</p><p>  mov r6, #1</p><p>  call Delay</p><

53、p>  mov a, r2 ; 顯示下一位</p><p><b>  rr a</b></p><p>  mov r2, a</p><p><b>  inc r0</b></p><p>  djnz r1, Loop</p>

54、<p><b>  ret</b></p><p>  ;===============================================================</p><p>  ;===========鍵盤讀入子程序====================</p><p><b>  TestKe

55、y:</b></p><p>  mov dptr, #OUTBIT</p><p>  mov a, #0</p><p>  movx @dptr, a ; 輸出線置為0</p><p>  mov dptr, #IN</p><p>  movx a, @dptr

56、 ; 讀入鍵狀態(tài)</p><p><b>  cpl a</b></p><p>  anl a, #0fh ; 高四位不用</p><p><b>  ret</b></p><p>  KeyTable: ; 鍵碼定義

57、</p><p>  db 16h, 15h, 14h, 0ffh</p><p>  db 13h, 12h, 11h, 10h</p><p>  db 0dh, 0ch, 0bh, 0ah</p><p>  db 0eh, 03h, 06h, 09h</p><p>  db 0f

58、h, 02h, 05h, 08h</p><p>  db 00h, 01h, 04h, 07h</p><p><b>  GetKey:</b></p><p>  mov dptr, #OUTBIT</p><p>  mov P2, dph</p><p>  mov r

59、0, #Low(IN)</p><p>  mov r1, #00100000b</p><p>  mov r2, #6</p><p><b>  KLoop:</b></p><p>  mov a, r1 ; 找出鍵所在列</p><p><b>

60、;  cpl a</b></p><p>  movx @dptr, a</p><p><b>  cpl a</b></p><p><b>  rr a</b></p><p>  mov r1, a ; 下一列</p>&l

61、t;p>  movx a, @r0</p><p><b>  cpl a</b></p><p>  anl a, #0fh</p><p>  jnz Goon1 ; 該列有鍵入</p><p>  djnz r2, KLoop</p><p>  

62、mov r2, #0ffh ; 沒有鍵按下, 返回 0ffh</p><p>  sjmp Exit</p><p><b>  Goon1:</b></p><p>  mov r1, a ; 鍵值 = 列 X 4 + 行</p><p>  mov a, r2<

63、;/p><p><b>  dec a</b></p><p><b>  rl a</b></p><p><b>  rl a</b></p><p>  mov r2, a ; r2 = (r2-1)*4</p><

64、;p>  mov a, r1 ; r1中為讀入的行值</p><p>  mov r1, #4</p><p><b>  LoopC:</b></p><p>  rrc a ; 移位找出所在行</p><p>  jc Exit</p&

65、gt;<p>  inc r2 ; r2 = r2+ 行值</p><p>  djnz r1, LoopC</p><p><b>  Exit:</b></p><p>  mov a, r2 ; 取出鍵碼</p><p>  mov dp

66、tr, #KeyTable</p><p>  movc a, @a+dptr</p><p>  mov r2, a</p><p>  WaitRelease:</p><p>  mov dptr, #OUTBIT ; 等鍵釋放</p><p><b>  clr a</b&g

67、t;</p><p>  movx @dptr, a</p><p>  mov r6, #10</p><p>  call Delay</p><p>  call TestKey</p><p>  jnz WaitRelease</p><p>  mov a, r2&

68、lt;/p><p><b>  ret</b></p><p>  ;===================================================================</p><p>  ;==========中斷子程序=====================================</p>

69、;<p>  ;------------------定時器0中斷---------------------------</p><p>  IT0P:MOVTL0,#0B0H ;T0中斷子程序,T0重裝初值</p><p>  MOVTH0,#3CH</p><p>  cjne r3,#0,next</p><p&

70、gt;  mov r3,#10</p><p>  next:cjne r4,#0,next2</p><p>  mov r4,#60</p><p>  next2:djnz r3,RTURN</p><p>  djnz r4,RTURN</p><p>  djnz r5,RTURN;中

71、斷返回</p><p>  CLRTR0 ;定時時間到,停止T0工作</p><p><b>  RTURN:</b></p><p><b>  reti</b></p><p>  ;--------------------------------------------

72、--------------</p><p>  ;--------------------定時器1中斷------------------------</p><p><b>  IT1P:</b></p><p>  INC 20H ;中斷服務(wù),中斷計數(shù)器加1</p><p>  MOV TH1,

73、#HIGH(BASE)</p><p>  MOV TL1,#LOW(BASE) ;6M晶振,形成10毫秒中斷</p><p><b>  RETI</b></p><p>  ;-------------------------------------------------------------</p><p>

74、;  ;==========(自定義子程序)16進制轉(zhuǎn)10進制顯示=================</p><p>  Trans_M: ;顯示分鐘</p><p>  mov b,#10</p><p><b>  div ab</b></p><p>  mov

75、 dptr, #LEDMap ;顯示個位</p><p>  movc a, @a+dptr</p><p>  mov LEDBuf+1, a</p><p>  mov a,b ;顯示十位</p><p>  movc a, @a+dptr</p><p>  mov

76、 LEDBuf+2, a</p><p><b>  RET</b></p><p>  Trans_S: ;顯示秒</p><p>  mov b,#10</p><p><b>  div ab</b></p><p>

77、;  mov dptr, #LEDMap ;顯示個位</p><p>  movc a, @a+dptr</p><p>  mov LEDBuf+4, a</p><p>  mov a,b ;顯示十位</p><p>  movc a, @a+dptr</p><

78、;p>  mov LEDBuf+5, a</p><p><b>  ret</b></p><p>  ;=============================================================</p><p>  ;===========(自定義子程序)指示燈子程序============<

79、/p><p>  LED1_shan:</p><p>  mov r3,#10</p><p>  SHS: cpl LED1_1 ; 取反LED</p><p>  mov c, LED1_1 ;紅燈閃爍</p><p>  mov LED1

80、, c</p><p>  call Delay</p><p>  djnz r3,SHS</p><p><b>  clr P1.0</b></p><p><b>  ret</b></p><p>  ;==========================

81、=====================================</p><p>  ;==============主程序================================</p><p><b>  Start:</b></p><p>  ;*********************初始化**************

82、***************</p><p>  mov r5,#0 ;清記錄計數(shù)初值(單位:分鐘)</p><p>  mov r4,#0 ;清記錄計數(shù)初值(單位:秒鐘)</p><p>  mov P1,#0

83、 ;關(guān)閉所有指示燈</p><p>  mov sp, #60h ;設(shè)置堆棧指針</p><p>  ;--------------中斷初始化----------------------------</p><p>  MOVTMOD,#11H

84、 ;設(shè)置T0和T1工作在方式1定時</p><p>  MOV IE,#8aH ;開總中斷和定時器0和1中斷</p><p>  MOV TL0,#0B0H ;給T0設(shè)初值,最小間隔100ms</p><p>  MOV TH0,#3CH</p>&

85、lt;p>  MOV TH1,#HIGH(BASE) ;給T1設(shè)初值,最小間隔10ms</p><p>  MOV TL1,#LOW(BASE)</p><p>  ;--------------顯示初始化-----------------------------</p><p>  mov LEDBuf+0

86、, #0 ; 顯示 00-00</p><p>  mov LEDBuf+1, #3fh</p><p>  mov LEDBuf+2, #3fh</p><p>  mov LEDBuf+3, #40h</p><p>  mov LEDBuf+4, #3fh</p><p

87、>  mov LEDBuf+5, #3fh</p><p>  ;-------------------指示燈設(shè)置------------------------</p><p>  lcall LED1_shan ;紅燈閃爍表示程序開始</p><p>  ;*************************

88、************************************</p><p>  ;***************按鍵設(shè)置部分**************************</p><p>  ljmp SET1</p><p>  SET1_error:</p><p>  call LED1_shan</p&g

89、t;<p>  jmp SET1</p><p>  SET1_back: ;SET1錯誤提示部分</p><p>  mov LEDBuf, #0</p><p>  mov LEDBuf+1, #3fh</p><p>  mov LEDBuf+2,

90、#3fh ;清除顯示為 00-00</p><p>  mov LEDBuf+3, #40h</p><p>  mov LEDBuf+4, #3fh</p><p>  mov LEDBuf+5, #3fh</p><p>  mov r5,#0 ;分鐘數(shù)清零

91、</p><p>  mov r4,#0 ;秒鐘數(shù)清零</p><p><b>  SET1:</b></p><p>  setb P1.1 ;黃燈亮進入設(shè)置狀態(tài)</p><p>  clr P1.2

92、 ;關(guān)綠燈</p><p>  call DisplayLED ; 顯示</p><p>  call TestKey ;有鍵入?</p><p>  jz SET1 ;無鍵入, 繼續(xù)顯示</p>&

93、lt;p>  call GetKey ;讀入鍵碼</p><p>  cjne a,#0eh,K1 ;判斷是否按下"確認"</p><p>  ;---------------SET2------------------------------------------------&

94、lt;/p><p>  sjmp SET2</p><p>  SET2_error:</p><p>  call LED1_shan</p><p><b>  SET2:</b></p><p>  clr P1.1 ;關(guān)閉設(shè)置指示燈(黃)</

95、p><p>  setb P1.2 ;開啟設(shè)置指示燈(綠) </p><p>  ;若是"確認"則進入SET2判斷階段</p><p>  call DisplayLED ; 顯示</p>

96、<p>  call TestKey ;有鍵入?</p><p>  jz SET2 ;無鍵入, 繼續(xù)顯示</p><p>  call GetKey ;讀入鍵碼</p><p><b>  K1_2:</

97、b></p><p>  cjne a,#07h,K2_2</p><p>  mov a,r5 ;顯示的分鐘數(shù)減一</p><p>  jz SET2_error ;判斷是否超出0的范圍</p><p><b>  dec a</

98、b></p><p>  mov r5,a</p><p>  lcall Trans_M</p><p><b>  ljmp SET2</b></p><p><b>  K2_2:</b></p><p>  cjne a,#08h,K3_2</p&g

99、t;<p>  mov a,r5 ;顯示的分鐘數(shù)加一</p><p>  subb a,#60</p><p>  jz SET2_error ;判斷是否超出60的范圍</p><p>  mov a,r5</p><p><b&g

100、t;  inc a</b></p><p>  mov r5,a</p><p>  lcall Trans_M</p><p><b>  ljmp SET2</b></p><p><b>  K3_2:</b></p><p>  cjne a,#0

101、9h,K4_2</p><p>  mov a,r4 ;顯示的秒數(shù)減一</p><p>  jz SET2_error ;判斷是否超出0的范圍</p><p><b>  dec a</b></p><p>  mov r4,a

102、</p><p>  lcall Trans_S</p><p><b>  ljmp SET2</b></p><p><b>  K4_2:</b></p><p>  cjne a,#0ah,K5_2</p><p>  mov a,r4

103、 ;顯示的秒數(shù)減一</p><p>  subb a,#60</p><p>  jz SET2_error ;判斷是否超出60的范圍</p><p>  mov a,r4</p><p><b>  inc a</b></p><p&g

104、t;  mov r4,a</p><p>  lcall Trans_S</p><p><b>  ljmp SET2</b></p><p><b>  K5_2:</b></p><p>  cjne a,#0eh,Back2</p><p><b> 

105、 mov a,r5</b></p><p>  jnz TIMER</p><p><b>  mov a,r4</b></p><p>  jnz TIMER</p><p>  jmp SET2_error</p><p><b>  Back2:</b&

106、gt;</p><p>  cjne a,#0dh,SET2_error</p><p>  ljmp SET1_back</p><p>  ;-----------------------------------------------------------------------------</p><p>  ;----------

107、---------SET1------------------------------------------------------</p><p>  K1: ;若不是"確認"則進入SET1判斷階段</p><p>  cjne a,#07h,K2</p><

108、p>  mov LEDBuf+1, #3fh ;顯示 05-00</p><p>  mov LEDBuf+2, #6dh</p><p>  mov r5,#5 ;計數(shù)值對應(yīng)5分鐘</p><p>  ljmp SET1</p><

109、;p><b>  K2:</b></p><p>  cjne a,#08h,K3</p><p>  mov LEDBuf+1, #06h ;顯示 10-00</p><p>  mov LEDBuf+2, #3fh</p><p>  mov r5,#10

110、 ;計數(shù)值對應(yīng)5分鐘</p><p>  ljmp SET1</p><p><b>  K3:</b></p><p>  cjne a,#09h,K4</p><p>  mov LEDBuf+1, #5bh ;顯示 2

111、0-00</p><p>  mov LEDBuf+2, #3fh</p><p>  mov r5,#20 ;計數(shù)值對應(yīng)20分鐘</p><p>  ljmp SET1</p><p><b>  K4:</b></p><p>

112、  cjne a,#0ah,Back1</p><p>  mov LEDBuf+1, #66h ;顯示 40-00</p><p>  mov LEDBuf+2, #3fh</p><p>  mov r5,#40 ;計數(shù)值對應(yīng)40分鐘</p>

113、<p>  ljmp SET1</p><p><b>  Back1:</b></p><p>  cjne a,#0dh,SET1_er</p><p>  ljmp SET1_back</p><p>  SET1_er:ljmp SET1_error</p><p>  ;-

114、-------------------------------------------------------------------------------</p><p>  ;*****************************************************************************</p><p>  ;***************計

115、時部分***********************************</p><p><b>  TIMER:</b></p><p>  clr P1.2 ;設(shè)置結(jié)束綠燈滅開始計時</p><p>  mov r3,#10</p><p> 

116、 SETB TR0 ;啟動T0</p><p>  mov a,r4</p><p>  jz DENG</p><p>  mov a,r5</p><p><b>  inc a</b></p><p>  

117、mov r5,a ;若設(shè)置了秒位,則補足不滿1分鐘的時間</p><p><b>  jmp DENG</b></p><p>  xianshi_M:</p><p>  mov a,r5</p><p><b>  dec a</b&g

118、t;</p><p>  lcall Trans_M</p><p>  xianshi_S:</p><p>  mov a,r4</p><p>  lcall Trans_S</p><p><b>  mov a,r5</b></p><p>  jz Di

119、spMusic</p><p><b>  DENG:</b></p><p>  call DisplayLED</p><p>  mov a,r4</p><p>  subb a,#59 ;秒數(shù)減到59時分鐘數(shù)減一顯示</p>&

120、lt;p>  jz xianshi_M</p><p>  cjne r3,#0,DENG ;計數(shù)單元r3減到0讀入秒數(shù)顯示</p><p>  ljmp xianshi_S ;形成循環(huán),等待中斷</p><p>  ;***********************

121、*******************************************</p><p>  ;**************音樂播放*************************************</p><p>  DispMusic:</p><p>  mov LEDBuf+5,#0</p><p>  lc

122、all DisplayLed</p><p>  MUSIC0:NOP</p><p>  MOV DPTR,#MUSIC ;表頭地址送DPTR</p><p>  MOV 20H,#00H ;中斷計數(shù)器清0</p><p>  MOV B,#00H

123、 ;表序號清0</p><p>  MUSIC1:NOP</p><p><b>  CLR A</b></p><p>  MOVC A,@A+DPTR ;查表取代碼</p><p>  JZ END0

124、 ;是00H,則結(jié)束</p><p>  CJNE A,#0FFH,MUSIC5</p><p>  LJMP MUSIC3</p><p>  MUSIC5:NOP</p><p><b>  MOV R6,A</b></p><p><b>  INC DPTR</b

125、></p><p><b>  MOV A,B</b></p><p>  MOVC A,@A+DPTR ;取節(jié)拍代碼送R7</p><p><b>  MOV R7,A</b></p><p>  SETB TR1

126、 ;啟動計數(shù)</p><p>  MUSIC2:NOP</p><p><b>  CPL P1.3</b></p><p><b>  MOV A,R6</b></p><p><b>  MOV R3,A</b></p><p><b&

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論