2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論