版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 單片機(jī)課程設(shè)計(jì)</b></p><p><b> 結(jié)題報(bào)告</b></p><p><b> ——音樂倒數(shù)計(jì)時(shí)器</b></p><p><b> 姓名:</b></p><p><b> 學(xué)號(hào):</b
2、></p><p><b> 指導(dǎo)教師:</b></p><p><b> 系統(tǒng)方案設(shè)計(jì)</b></p><p><b> 項(xiàng)目設(shè)計(jì)的內(nèi)容</b></p><p> 選題:音樂倒數(shù)計(jì)數(shù)器</p><p><b> 設(shè)計(jì)要求<
3、;/b></p><p> 利用AT89C51單片機(jī)結(jié)合字符型LED顯示器設(shè)計(jì)一個(gè)簡(jiǎn)易的倒數(shù)計(jì)數(shù)器,可用來煮方便面、煮開水或小睡片刻等。做一小段時(shí)間倒計(jì)數(shù),當(dāng)?shù)褂?jì)數(shù)為0時(shí),則發(fā)出一段音樂聲響,通知倒計(jì)數(shù)終了,該做應(yīng)當(dāng)做的事。</p><p> 定時(shí)鬧鐘的基本功能如下。</p><p><b> 6位LED顯示器。</b></p
4、><p> 顯示格式為“TIME 分分:秒秒”。</p><p> 用4個(gè)按鍵操作來設(shè)置當(dāng)前想要倒計(jì)數(shù)的時(shí)間。一旦按下鍵則開始倒計(jì)數(shù),當(dāng)計(jì)數(shù)為0時(shí),發(fā)出一陣音樂聲。</p><p> 程序執(zhí)行后工作指示燈LED閃動(dòng),表示程序開始執(zhí)行,按下操作鍵K1~K4動(dòng)作如下。</p><p> K1—可調(diào)整倒計(jì)數(shù)的時(shí)間1~60分鐘。</p>
5、;<p> K2—設(shè)置倒計(jì)數(shù)的時(shí)間為5分鐘,顯示“0500”。</p><p> K3—設(shè)置倒計(jì)數(shù)的時(shí)間為10分鐘,顯示“1000”。</p><p> K4—設(shè)置倒計(jì)數(shù)的時(shí)間為20分鐘,顯示“2000”。</p><p> 復(fù)位后LED的畫面應(yīng)能顯示倒計(jì)時(shí)的分鐘和秒數(shù),此時(shí)按K1鍵則在LED上顯示出設(shè)置畫面。此時(shí),若:</p>
6、<p> a. 按操作鍵K2—增加倒計(jì)數(shù)的時(shí)間1分鐘。</p><p> b. 按操作鍵K3—減少倒計(jì)數(shù)的時(shí)間1分鐘。</p><p> c. 按操作鍵K4—設(shè)置完成。 </p><p> 本題目最大難點(diǎn)是實(shí)現(xiàn)音樂的播放。作者利用定時(shí)計(jì)數(shù)器,通過載入不同的計(jì)數(shù)初值,產(chǎn)生頻率不同的方波,輸入到蜂鳴器(SOUNER)中,使其發(fā)出頻率不同的聲音。本設(shè)計(jì)中
7、單片機(jī)晶振為1.0592MHz,通過計(jì)算各音階頻率,可得1、2、3、4、5、6、7共7個(gè)音應(yīng)賦給定時(shí)器的初值為64580、64684、64777、64820、64898、64968、65030。</p><p> 在此基礎(chǔ)上,可將樂曲的簡(jiǎn)譜轉(zhuǎn)化為單片機(jī)可以“識(shí)別”的“數(shù)組譜”,進(jìn)一步加入對(duì)音長、休止符等的控制量后,可以實(shí)現(xiàn)音樂的播放。</p><p> 根據(jù)實(shí)際的使用習(xí)慣,要求中提出的
8、設(shè)置時(shí)采用K1到K4實(shí)現(xiàn)的功能并不十分合理,要實(shí)現(xiàn)1到60分鐘可調(diào)如果初值設(shè)置時(shí)最大只能是20分鐘那么想要定時(shí)超過30分鐘時(shí)在微調(diào)階段就會(huì)十分麻煩,需要反復(fù)按下按鍵,并且K1鍵的作用在實(shí)際應(yīng)用時(shí)也容易混淆,所以在編程時(shí)將K1到K4四個(gè)鍵擴(kuò)展為K1到K4在加上“確認(rèn)”和“返回”共六個(gè)按鍵,使得時(shí)間的設(shè)置更加符合平常的認(rèn)知和使用習(xí)慣,更加實(shí)用。</p><p><b> 具體更改如下:</b>
9、</p><p><b> 表1_1</b></p><p> 其他指標(biāo)相比題目要求沒有較大更改。</p><p><b> 項(xiàng)目設(shè)計(jì)的指標(biāo)</b></p><p><b> 表1_2</b></p><p><b> 項(xiàng)目設(shè)計(jì)的方案
10、選擇</b></p><p> 方案一:使用MSP430單片機(jī)自制最小系統(tǒng),包含按鍵、數(shù)碼管、LED燈、音頻放大等模塊部分,采用C語言編寫程序?qū)崿F(xiàn)按鍵控制、數(shù)碼管倒計(jì)時(shí)顯示和音樂的播放。</p><p> 方案二:使用89C51單片機(jī)自制最小系統(tǒng),包含按鍵按鍵、數(shù)碼管、LED燈、音頻放大等模塊部分,采用C語言編寫程序?qū)崿F(xiàn)按鍵控制、數(shù)碼管倒計(jì)時(shí)顯示和音樂的播放。</p&
11、gt;<p> 方案三:使用偉福Lab2000實(shí)驗(yàn)箱,采用匯編語言編寫程序?qū)崿F(xiàn)按鍵控制、數(shù)碼管倒計(jì)時(shí)顯示和音樂的播放。</p><p> 通過比較發(fā)現(xiàn),方案一最大的缺點(diǎn)在于MSP430單片機(jī)功能雖然強(qiáng)大,但是價(jià)格較高,相比之下51單片機(jī)不僅完全能夠?qū)崿F(xiàn)音樂倒數(shù)計(jì)時(shí)器的功能而且價(jià)格相對(duì)低廉,更具有使用和推廣價(jià)值。而方案一和方案二共同的缺點(diǎn)在于:第一,自制最小系統(tǒng)板相對(duì)于實(shí)驗(yàn)箱功能并不十分穩(wěn)定,由于
12、條件的限制,自制最小系統(tǒng)只能采用萬用板焊接或者自己腐蝕PCB板制作,相對(duì)于專業(yè)廠家生產(chǎn)的集成實(shí)驗(yàn)箱穩(wěn)定性較差,而實(shí)驗(yàn)箱本身具備了該項(xiàng)目所需的各種功能模塊,按鍵、數(shù)碼管、音頻放大和LED燈,所以采用實(shí)驗(yàn)箱保證了系統(tǒng)的穩(wěn)定性;第二,C語言作為面向用戶的語言有它自身的局限性,作為對(duì)時(shí)間要求精確的計(jì)時(shí)器而言,采用匯編語言更能保證程序的實(shí)時(shí)性和計(jì)時(shí)的準(zhǔn)確行。綜上所述,最終決定采用方案三。</p><p><b>
13、 系統(tǒng)方案框圖</b></p><p> 圖1_1 系統(tǒng)總框圖</p><p><b> 硬件設(shè)計(jì)</b></p><p> 說明:所有電路均參考實(shí)驗(yàn)箱設(shè)計(jì),整體電路圖見附頁一</p><p> 鍵盤與LED顯示電路</p><p> 圖2_1 鍵盤與LED數(shù)碼管顯示電路&
14、lt;/p><p> 顯示控制的位碼由74HC374輸出,經(jīng)MC1413反向驅(qū)動(dòng)后,做LED的位選通信號(hào)。位選通信號(hào)也可做為鍵盤列掃描碼,鍵盤掃描的行數(shù)據(jù)從74HC245讀回,374輸出的列掃描碼經(jīng)245讀入后,用來判斷是否有鍵被按下,以及按下的是什么鍵。如果沒有鍵按下,由于上拉電阻的作用,經(jīng)245讀回的值為高,如果有鍵按下,374輸出的低電平經(jīng)過按鍵被接到245的端口上,這樣從245讀回的數(shù)據(jù)就會(huì)有低位,根據(jù)37
15、4輸出的列信號(hào)和245讀回的行信號(hào),就可以判斷哪個(gè)鍵被按下。LED顯示的段碼由另一個(gè)74HC374輸出。</p><p><b> LED電平顯示電路</b></p><p> 圖2_2 LED電平顯示電路</p><p> L0― L2為相應(yīng)發(fā)光二極管驅(qū)動(dòng)信號(hào)輸入端,該輸入端為高電壓電平“1”時(shí)發(fā)光二極管點(diǎn)亮。我們可以通過P1口對(duì)其直
16、接進(jìn)行控制,點(diǎn)亮或者熄滅發(fā)光二極管。</p><p><b> 音頻放大濾波電路</b></p><p> 圖2_3 音頻放大濾波電路</p><p><b> 復(fù)位電路</b></p><p> 圖2_4 復(fù)位電路</p><p><b> 軟件設(shè)計(jì)
17、</b></p><p> 說明:所有流程圖均使用Edraw(試用版)制作,由于試用版無法直接導(dǎo)出圖形故采用截圖方式,造成某些流程圖不清晰</p><p><b> 按鍵設(shè)置部分</b></p><p> 圖3_1 按鍵設(shè)置程序總流程圖</p><p> 按鍵部分調(diào)用了單元實(shí)驗(yàn)中的顯示子程序(Dis
18、playLED)和鍵盤讀入子程序(GetKey),以及自定義的顯示緩沖賦值程序(Trans_M和Trans_S),使用R4、R5寄存器分別存儲(chǔ)秒鐘和分鐘的計(jì)數(shù)值,按鍵的判斷使用的是cjne邏輯,即相等繼續(xù)執(zhí)行程序,不相等跳轉(zhuǎn)到相應(yīng)的標(biāo)號(hào)處。</p><p> 設(shè)置部分也加入了相應(yīng)的指示燈來指示相應(yīng)的操作,如黃燈亮表示進(jìn)入了初值設(shè)置階段可以進(jìn)行5、10、20、40分鐘的初值設(shè)置,綠燈亮表示進(jìn)入了微調(diào)設(shè)置階段,可以
19、對(duì)分鐘位和秒位進(jìn)行微調(diào),實(shí)現(xiàn)1—60:59可調(diào)。</p><p> 圖3_2 按鍵初值設(shè)置程序流程圖</p><p> 圖3_3 按鍵微調(diào)設(shè)置程序流程圖</p><p><b> 計(jì)時(shí)部分</b></p><p> 圖3_4 計(jì)時(shí)部分主程序流程圖</p><p> 圖3_5 計(jì)時(shí)
20、部分中斷程序流程圖</p><p> 計(jì)時(shí)部分采用三個(gè)計(jì)數(shù)器R3、R4和R5分別對(duì)100ms,1s和1min進(jìn)行計(jì)數(shù),采用定時(shí)器0,方式一實(shí)現(xiàn)100ms的中斷,在中斷子程序中使用djnz邏輯判斷秒鐘和時(shí)鐘是否達(dá)到單位量值,例如對(duì)秒位的控制,R4開始為0,進(jìn)入中斷子程序后賦值為60,經(jīng)過djnz的判斷變?yōu)?9,之后59減到58為一秒,58減到57為一秒以此類推直到1減到0為一秒,正好計(jì)時(shí)60s的時(shí)間。</p
21、><p> 整個(gè)計(jì)數(shù)部分有兩處需要調(diào)整計(jì)數(shù)值,第一處是如果R4不為0,則必須在相應(yīng)設(shè)置的分鐘數(shù)基礎(chǔ)上再加一,因?yàn)椴粸?的R4也會(huì)消耗掉一位分鐘位,如果補(bǔ)不足相應(yīng)的分鐘數(shù)就會(huì)造成分鐘數(shù)計(jì)數(shù)錯(cuò)誤;第二處是在分鐘的顯示部分,例如要計(jì)時(shí)2分鐘,雖然倒計(jì)時(shí)到1分59秒時(shí)分鐘計(jì)數(shù)值仍然應(yīng)該是2,但是顯示時(shí)卻應(yīng)該顯示1,故在這種情況下只在顯示時(shí)進(jìn)行減一操作而不影響真實(shí)的計(jì)數(shù)值。</p><p><b
22、> 音樂播放部分</b></p><p> 圖3_6 音樂播放程序流程圖</p><p> 聲音的產(chǎn)生是一種音頻震動(dòng)的效果,震動(dòng)的頻率高,則為高音,頻率低則為低音,音頻的范圍為20Hz—200kHz,人類的耳朵比較容易辨識(shí)的聲音大概是200Hz—20KHz。在數(shù)字電路里,多以脈沖信號(hào)驅(qū)動(dòng)喇叭,以產(chǎn)生聲音,如圖2_3所示。以8051產(chǎn)生聲音,可利用程序產(chǎn)生頻率,送到
23、輸入/輸出端口(一個(gè)位即可,例如P1.0等),再從該點(diǎn)連接到蜂鳴器的驅(qū)動(dòng)電路,即可驅(qū)動(dòng)蜂鳴器。而蜂鳴器的驅(qū)動(dòng)電路以PNP晶體管放大電路最適合。</p><p> 子程序DEL為延時(shí)子程序,當(dāng)R3為1時(shí),延時(shí)時(shí)間約為20us,R3中存放延時(shí)常數(shù),對(duì)200HZ音頻,其周期為1/200秒,即5ms。這樣,當(dāng)P1.3的高電平或低電平的持續(xù)時(shí)間為2.5ms,即R3的時(shí)間常數(shù)取2500/20=125(7DH)時(shí),就能發(fā)出2
24、00HZ的音調(diào)。依照此原理結(jié)合音階-頻率對(duì)照表就可以得到想要的音階所對(duì)應(yīng)的R3時(shí)間常數(shù)了。</p><p> 音符的節(jié)拍用定時(shí)器T1來控制,送入不一樣的初值,就能產(chǎn)生不一樣的定時(shí)時(shí)間。如某歌曲的節(jié)奏為每分鐘94拍,即一拍為0.64秒。但是,由于T1的最大定時(shí)時(shí)間只能為131毫秒,因此不可能直接用改變T1的時(shí)間初值來實(shí)現(xiàn)不一樣節(jié)拍。所以只能用T1來產(chǎn)生10毫秒的時(shí)間基準(zhǔn),然后設(shè)置一個(gè)中斷計(jì)數(shù)器,通過判別中斷計(jì)數(shù)器
25、的值來控制節(jié)拍時(shí)間的長短。依照此原理結(jié)合樂譜中音階的節(jié)拍即可計(jì)算出對(duì)應(yīng)的計(jì)數(shù)值。</p><p> 制表時(shí)將音階常數(shù)和節(jié)拍常數(shù)間隔放置,先取音符再去節(jié)拍。</p><p><b> 測(cè)試方案和調(diào)試過程</b></p><p><b> 測(cè)試方案:</b></p><p> 整個(gè)項(xiàng)目具體的測(cè)試
26、方案主要是軟件的調(diào)試,分為五個(gè)階段:</p><p> 第一階段是按鍵設(shè)置部分的調(diào)試,需要連接按鍵、數(shù)碼管和LED顯示燈</p><p><b> 硬件連接:</b></p><p><b> 表4_1</b></p><p><b> 單獨(dú)調(diào)試完成指標(biāo):</b><
27、;/p><p> 程序開始指示燈閃爍,數(shù)碼管顯示00-00,黃燈亮表示進(jìn)入SET1階段</p><p> 不按“確認(rèn)”鍵前程序可以實(shí)現(xiàn)5、10、20、40分鐘自由切換顯示,并且r5的值相應(yīng)跟著改變</p><p> 按下的值是“返回”則數(shù)碼管顯示00-00,并且R4、R5清零</p><p> 按下的值不是K1-4或者“確認(rèn)”和“返回”
28、紅燈閃爍報(bào)錯(cuò)</p><p> 按下“確認(rèn)”鍵后黃燈滅綠燈亮表示進(jìn)入SET2階段</p><p> 按下K1鍵確認(rèn)初值后可以實(shí)現(xiàn)在初值的基礎(chǔ)上重復(fù)加減分鐘數(shù)和秒鐘數(shù),顯示和R4、R5的值都相應(yīng)跟著改變</p><p> 若加出的分鐘數(shù)為60則不可再加或減得的分鐘數(shù)為0則不可再減,并且紅燈報(bào)錯(cuò)</p><p> 按下的鍵不是K1-4或者
29、“確認(rèn)”和“返回”的紅燈閃爍報(bào)錯(cuò),顯示和R4、R5的值保持不變重新設(shè)置</p><p> SET2階段按下“確認(rèn)”后跳入計(jì)時(shí)部分(用綠燈滅表示)</p><p> 第二階段是計(jì)時(shí)部分的單獨(dú)調(diào)試,硬件連接一個(gè)LED燈來表示播放音樂</p><p><b> 單獨(dú)調(diào)試完成指標(biāo):</b></p><p> 按照程序開始
30、賦入的R4、R5的初值進(jìn)行倒數(shù)計(jì)時(shí),數(shù)碼管動(dòng)態(tài)顯示計(jì)時(shí)過程,并且在倒記到到00-00時(shí)跳入音樂播放部分(用紅燈亮來表示)</p><p> 第三階段是按鍵部分與計(jì)時(shí)部分的聯(lián)調(diào),硬件連接如表4_1所示</p><p><b> 聯(lián)調(diào)完成指標(biāo):</b></p><p> 按下確認(rèn)鍵后能夠按照按鍵設(shè)置部分設(shè)置的分鐘和秒鐘數(shù)進(jìn)行倒數(shù)計(jì)時(shí),數(shù)碼管動(dòng)
31、態(tài)顯示計(jì)時(shí)過程,并且在倒記到00-00時(shí)跳入音樂播放部分(用紅燈亮來表示)</p><p> 第四階段是音樂部分的單獨(dú)調(diào)試,硬件連接需要連接P1.3口和音頻放大部分和LED指示燈</p><p><b> 單獨(dú)調(diào)試完成指標(biā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)完成指標(biāo):</b></p><p> 1
33、程序開始:紅燈閃爍,初始顯示為“00-00”,格式為“分分—秒秒”</p><p> 2按下“確認(rèn)”鍵前指示燈黃燈亮,綠燈滅表示是SET1初值設(shè)置階段5、10、15、20分鐘初值設(shè)置可以自由調(diào)整</p><p> 3按下“確認(rèn)”鍵后指示燈綠燈亮,黃燈滅表示是SET2微調(diào)設(shè)置階段在初值基礎(chǔ)上01:00—60:59微調(diào)設(shè)置自由調(diào)整</p><p> 4若按
34、下的不是操作鍵則紅燈閃爍表示錯(cuò)誤,但不改變?cè)O(shè)置值</p><p> 5若按下的是“返回”鍵則返回設(shè)置開始,并且設(shè)置值全部清零</p><p> 6若微調(diào)時(shí)分鐘或秒鐘數(shù)低于0或高于60紅燈閃爍表示錯(cuò)誤,但不改變?cè)O(shè)置值</p><p> 7設(shè)置完成按下“確認(rèn)”鍵開始計(jì)時(shí),數(shù)碼管實(shí)時(shí)顯示倒記時(shí)間</p><p> 8倒計(jì)時(shí)到“00—
35、00”時(shí)顯示關(guān)閉,播放一段音樂</p><p> 9音樂播放完畢自動(dòng)回到程序開始</p><p> 10實(shí)現(xiàn)秒位的微調(diào)設(shè)置和倒計(jì)時(shí)顯示</p><p><b> 調(diào)試過程:</b></p><p> 第一階段:按鍵設(shè)置部分的調(diào)試</p><p> 編程完成第一次調(diào)試時(shí)初值設(shè)置部分沒有
36、出現(xiàn)任何問題,但是在微調(diào)部分卻出現(xiàn)了不能正常賦值和顯示的問題,無論開始初值設(shè)置的是多少怎么按按鍵調(diào)整,顯示值始終是0分或者2分,后來經(jīng)過軟件仿真發(fā)下問題出在設(shè)置的計(jì)數(shù)空間上,開始我是用的是定義的TimeBuf來儲(chǔ)存分鐘值,但是發(fā)現(xiàn)跟其他定義有沖突,并且不能完全保證所定義的空間在執(zhí)行其他部分是值不發(fā)生改變,所以最終決定使用R5寄存器,因?yàn)槠渌映绦蛑卸紱]有使用該寄存器,不會(huì)產(chǎn)生沖突,改過之后發(fā)現(xiàn)完成了指標(biāo)。</p><
37、p> 秒位的控制其實(shí)是在第一次聯(lián)調(diào)完成以后加入的,在按鍵部分沒有遇到什么問題,只是增加了R4寄存器就完成了秒位的設(shè)置。</p><p> 第二階段:計(jì)時(shí)部分的單獨(dú)調(diào)試</p><p> 計(jì)時(shí)部分在單獨(dú)調(diào)試時(shí)只遇到了一個(gè)問題,就是開始的時(shí)候我沒有考慮例如計(jì)時(shí)兩分鐘,計(jì)時(shí)到1:59時(shí)雖然分鐘數(shù)仍為2但是應(yīng)該顯示1的問題,最終在顯示部分增加了分鐘沒有記足一個(gè)計(jì)數(shù)值時(shí)也需要減一顯示的程
38、序,這樣就實(shí)現(xiàn)了實(shí)時(shí)的倒計(jì)時(shí)顯示。</p><p> 增加秒位控制以后又出現(xiàn)了一個(gè)問題,就是設(shè)置的秒位雖然不足一分鐘可是在程序中R4減到0就代表計(jì)時(shí)一分鐘完成,這在以往只設(shè)置分鐘的情況下是沒有問題的,但是對(duì)于秒位不足一分鐘的情況就出現(xiàn)了差錯(cuò),最后我在計(jì)時(shí)開始部分給R4不為零的情況增加了一個(gè)補(bǔ)充分鐘數(shù)的語句,這樣就解決了分鐘數(shù)少一的問題。</p><p> 第三階段:按鍵部分與計(jì)時(shí)部分的
39、聯(lián)調(diào)</p><p> 由于一二階段問題得到了解決,在聯(lián)調(diào)時(shí)候沒有出現(xiàn)任何問題。</p><p> 第四階段:音樂部分的單獨(dú)調(diào)試</p><p> 由于音樂部分的程序參考了網(wǎng)上的匯編程序,所以需要改動(dòng)的地方比較多,如音階和節(jié)拍的計(jì)時(shí)程序都進(jìn)行了調(diào)整,參考程序給出的是以12M晶振為例編寫的程序,改為適合實(shí)驗(yàn)箱6M晶振的程序時(shí)都將計(jì)時(shí)常數(shù)相應(yīng)的進(jìn)行了調(diào)整,由于計(jì)時(shí)
40、部分用了T0計(jì)時(shí)器所以在音樂播放部分就只能使用T1計(jì)時(shí)器了,這一部分也進(jìn)行了相應(yīng)的更改,而且音樂過長也依照曲譜相應(yīng)得進(jìn)行了刪減,調(diào)整和刪減完成后就能實(shí)現(xiàn)音樂播放了。</p><p><b> 第五階段:整體聯(lián)調(diào)</b></p><p> 由于前四個(gè)階段的調(diào)整都完成得很順利,并且單獨(dú)調(diào)試時(shí)都能實(shí)現(xiàn)相互的跳轉(zhuǎn),故整體聯(lián)調(diào)時(shí)沒有出現(xiàn)什么問題。</p>&l
41、t;p><b> 附錄</b></p><p><b> 參考文獻(xiàn):</b></p><p> 《單片機(jī)原理與接口技術(shù)》 何宏主編 國防工業(yè)出版社</p><p> 《例說8051(第三版)》 張義和陳敵北主編人民郵電出版社</p>
42、<p> 《Protel 99SE 電路原理圖設(shè)計(jì)計(jì)數(shù)》 楊志亮主編 西北工業(yè)大學(xué)出版社</p><p> 《51單片機(jī)匯編語言教程:第28課-音樂程序設(shè)計(jì)》</p><p> 《基于51單片機(jī)電子鬧鐘的設(shè)計(jì)》</p><p><b> 實(shí)驗(yàn)程序:</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: ; 延時(shí)子程序&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個(gè)八段管</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> ;------------------定時(shí)器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 ;定時(shí)時(shí)間到,停止T0工作</p><p><b> RTURN:</b></p><p><b> reti</b></p><p> ;--------------------------------------------
72、--------------</p><p> ;--------------------定時(shí)器1中斷------------------------</p><p><b> IT1P:</b></p><p> INC 20H ;中斷服務(wù),中斷計(jì)數(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進(jìn)制轉(zhuǎn)10進(jìn)制顯示=================</p><p> Trans_M: ;顯示分鐘</p><p> mov b,#10</p><p><b> div ab</b></p><p> mov
75、 dptr, #LEDMap ;顯示個(gè)位</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 ;顯示個(gè)位</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 ;清記錄計(jì)數(shù)初值(單位:分鐘)</p><p> mov r4,#0 ;清記錄計(jì)數(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定時(shí)</p><p> MOV IE,#8aH ;開總中斷和定時(shí)器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錯(cuò)誤提示部分</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 ;黃燈亮進(jìn)入設(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 ;判斷是否按下"確認(rèn)"</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> ;若是"確認(rèn)"則進(jìn)入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: ;若不是"確認(rèn)"則進(jìn)入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 ;計(jì)數(shù)值對(duì)應(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、 ;計(jì)數(shù)值對(duì)應(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 ;計(jì)數(shù)值對(duì)應(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 ;計(jì)數(shù)值對(duì)應(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> ;***************計(jì)
115、時(shí)部分***********************************</p><p><b> TIMER:</b></p><p> clr P1.2 ;設(shè)置結(jié)束綠燈滅開始計(jì)時(shí)</p><p> mov r3,#10</p><p>
116、 SETB TR0 ;啟動(dòng)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è)置了秒位,則補(bǔ)足不滿1分鐘的時(shí)間</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í)分鐘數(shù)減一顯示</p>&
120、lt;p> jz xianshi_M</p><p> cjne r3,#0,DENG ;計(jì)數(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 ;中斷計(jì)數(shù)器清0</p><p> MOV B,#00H
123、 ;表序號(hào)清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、 ;啟動(dòng)計(jì)數(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計(jì)-基于單片機(jī)音樂倒數(shù)計(jì)時(shí)器的設(shè)計(jì)
- 基于c語言單片機(jī)倒數(shù)計(jì)時(shí)器課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-單片機(jī)電秒計(jì)時(shí)器
- 單片機(jī)課程設(shè)計(jì)-秒計(jì)時(shí)器設(shè)計(jì)
- 基于c語言單片機(jī)倒數(shù)計(jì)時(shí)器設(shè)計(jì)
- 單片機(jī)時(shí)鐘計(jì)時(shí)器課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--00-59_秒計(jì)時(shí)器
- 單片機(jī)課程設(shè)計(jì)--單片機(jī)60秒計(jì)時(shí)器的設(shè)計(jì)與仿真
- 單片機(jī)答辯倒計(jì)時(shí)器課程設(shè)計(jì)報(bào)告
- 60秒倒計(jì)時(shí)器-單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---籃球比賽計(jì)分計(jì)時(shí)器
- 單片機(jī)課程設(shè)計(jì)---(00-59秒計(jì)時(shí)器設(shè)計(jì))
- 60秒倒計(jì)時(shí)器-單片機(jī)課程設(shè)計(jì)報(bào)告
- 單片機(jī)原理及應(yīng)用課程設(shè)計(jì)--答辯倒計(jì)時(shí)器
- 單片機(jī)課程設(shè)計(jì)---倒數(shù)計(jì)數(shù)器
- 課程設(shè)計(jì)報(bào)告-籃球30秒倒數(shù)計(jì)時(shí)器
- 倒數(shù)計(jì)數(shù)器單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--簡(jiǎn)單的倒計(jì)時(shí)器的設(shè)計(jì)與制作
- 單片機(jī)【倒計(jì)時(shí)音樂鬧鐘】課程設(shè)計(jì)
- 基于單片機(jī)的紅外計(jì)時(shí)器
評(píng)論
0/150
提交評(píng)論