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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

2、></p><p><b>  指導教師:</b></p><p><b>  系統方案設計</b></p><p><b>  項目設計的內容</b></p><p>  選題:音樂倒數計數器</p><p><b>  設計要求<

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

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

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

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

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

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

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

10、選擇</b></p><p>  方案一:使用MSP430單片機自制最小系統,包含按鍵、數碼管、LED燈、音頻放大等模塊部分,采用C語言編寫程序實現按鍵控制、數碼管倒計時顯示和音樂的播放。</p><p>  方案二:使用89C51單片機自制最小系統,包含按鍵按鍵、數碼管、LED燈、音頻放大等模塊部分,采用C語言編寫程序實現按鍵控制、數碼管倒計時顯示和音樂的播放。</p&

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

42、<p>  《Protel 99SE 電路原理圖設計計數》 楊志亮主編 西北工業(yè)大學出版社</p><p>  《51單片機匯編語言教程:第28課-音樂程序設計》</p><p>  《基于51單片機電子鬧鐘的設計》</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 ; 關所有八段管</p><p>  mov a, @r0</p><p>  mov dptr, #OUTSEG ;指針指向數碼管段控制</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 ;中斷服務,中斷計數器加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進制轉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 ;清記錄計數初值(單位:分鐘)</p><p>  mov r4,#0 ;清記錄計數初值(單位:秒鐘)</p><p>  mov P1,#0

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

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

85、lt;p>  MOV TH1,#HIGH(BASE) ;給T1設初值,最小間隔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>  ;-------------------指示燈設置------------------------</p><p>  lcall LED1_shan ;紅燈閃爍表示程序開始</p><p>  ;*************************

88、************************************</p><p>  ;***************按鍵設置部分**************************</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 ;分鐘數清零

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

92、 ;關綠燈</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 ;關閉設置指示燈(黃)</

95、p><p>  setb P1.2 ;開啟設置指示燈(綠) </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 ;顯示的分鐘數減一</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 ;顯示的分鐘數加一</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 ;顯示的秒數減一</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、 ;顯示的秒數減一</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 ;計數值對應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、 ;計數值對應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 ;計數值對應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 ;計數值對應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 ;設置結束綠燈滅開始計時</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 ;若設置了秒位,則補足不滿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 ;秒數減到59時分鐘數減一顯示</p>&

120、lt;p>  jz xianshi_M</p><p>  cjne r3,#0,DENG ;計數單元r3減到0讀入秒數顯示</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 ;中斷計數器清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,則結束</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、 ;啟動計數</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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論