單片機(jī)課程設(shè)電子琴_第1頁
單片機(jī)課程設(shè)電子琴_第2頁
單片機(jī)課程設(shè)電子琴_第3頁
單片機(jī)課程設(shè)電子琴_第4頁
單片機(jī)課程設(shè)電子琴_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 目 錄1. 引言.1 1.1. 設(shè)計的目的.1 1.2. 設(shè)計的內(nèi)容與要求.12. 總體設(shè)計.1 2.1. 音樂產(chǎn)生原理.1 2.2. 設(shè)計流程.33. 硬件設(shè)計.8 3.1. AT89C51芯片簡介 .8 3.1.1 主要特性.8 3.1.2 功能描述.8 3.1.3 引腳說明與硬件連接.9 3.2. 元器件清單.134. 系統(tǒng)工作說明.135.結(jié)束語.14 5.1 收獲與體會.14 5.2 遇到的問題與解決方法.15 5.3 教程建議.156. 參考文獻(xiàn).157. 附錄.161. 引言 1.1 設(shè)計的目的 本設(shè)計的主要目的是掌握單片機(jī)系統(tǒng)的開發(fā)應(yīng)用,掌握prteus和keil C51軟件

2、的應(yīng)用,鞏固和加深已學(xué)過的知識,提高動手能力及解決實際問題的能力,同時培養(yǎng)團(tuán)隊合作精神。 1.2. 設(shè)計內(nèi)容與要求(1) 本設(shè)計以AT89C52單片機(jī)為核心控制元件設(shè)計一個電子琴,與鍵盤、揚聲 器等模塊組成核心主控制模塊,在主控模塊上設(shè)有16個彈奏按鍵、1個播 放按鍵和揚聲器,并且按下時按鍵發(fā)聲,松開延時一段時間停止,中間再 按別的鍵則發(fā)另一音調(diào)的聲音。16個按鍵設(shè)置成4x4矩陣鍵盤,能彈奏出 16個音,添加歌曲程序同時能夠播放出歌曲。(2)利用軟件 keil C51進(jìn)行程序的調(diào)試。(3)利用proteus軟件畫電路圖,并在單片機(jī)加載程序進(jìn)行仿真。(4)根據(jù)電路圖運用proteus軟件的布局和

3、布線功能繪制PCB圖并輸出顯 示電路的3D圖。(5)根據(jù)電路圖、PCB圖和3D圖快速地焊接電路。(6)下載程序代碼,調(diào)試(Easy 51Pro) 。2. 方案總體設(shè)計 2.1. 音樂產(chǎn)生設(shè)計原理 一首音樂是許多不同的音階組成的,而每個音階對應(yīng)著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所想要的音樂了,當(dāng)然對于單片機(jī)來產(chǎn)生不同的頻率非常方便,我們可以利用單片機(jī)的定時/計數(shù)器T0來產(chǎn)生這樣方波頻率信號,因此,我們只要把一首歌曲的音階對應(yīng)頻率關(guān)系正確即可。若要產(chǎn)生音頻脈沖,只要算出某一音頻的周期(1/頻率),再將此周期除以2,即為半周期的時間。利用定時器計時半周期時間,每當(dāng)計時終止

4、后就將P1.0反相,然后重復(fù)計時再反相。就可在P1.0引腳上得到此頻率的脈沖。    利用AT89C51的內(nèi)部定時器使其工作計數(shù)器模式(MODE1)下,改變計數(shù)值TH0及TL0以產(chǎn)生不同頻率的方法產(chǎn)生不同音階,例如,頻率為523Hz,其周期T1/5231912s,因此只要令計數(shù)器計時956s/1s956,每計數(shù)956次時將I/O反相,就可得到中音DO(523Hz)。    計數(shù)脈沖值與頻率的關(guān)系式是: N=fi÷2÷fr式中N是計數(shù)值;fi是機(jī)器頻率(晶體振蕩器為12MHz時,其頻率為1MHz);fr是想要產(chǎn)生的頻

5、率。 其計數(shù)初值T的求法如下: T65536N65536fi÷2÷fr例如:設(shè)K65536,fi1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的計數(shù)值。T65536N65536fi÷2÷fr655361000000÷2÷fr65536500000/fr    低音DO的T65536500000/26263627    中音DO的T65536500000/52364580    高音DO的T6553650000

6、0/104665059 單片機(jī)12MHZ晶振,高中低音符與計數(shù)T0相關(guān)的計數(shù)值如表1所示:音符頻率(HZ)簡譜碼(T值)音符頻率(HZ)簡譜碼(T值)低1DO26263628# 4 FA#74064860#1DO#27763731中 5 SO78464898低2RE29463835# 5 SO#83164934#2 RE#31163928中 6 LA88064968低 3 M33064021# 693264994低 4 FA34964103中 7 SI98865030# 4 FA#37064185高 1 DO104665058低 5 SO39264260# 1 DO#110965085# 5

7、SO#41564331高 2 RE117565110低 6 LA44064400# 2 RE#124565134# 646664463高 3 M131865157低 7 SI49464524高 4 FA139765178中 1 DO52364580# 4 FA#148065198# 1 DO#55464633高 5 SO156865217中 2 RE58764684# 5 SO#166165235# 2 RE#62264732高 6 LA176065252中 3 M65964777# 6186565268中 4 FA69864820高 7 SI196765283 表1 音符頻率表我們要為這個音

8、符建立一個表格,單片機(jī)通過查表的方式來獲得相應(yīng)的數(shù)據(jù)。    低音019之間,中音在2039之間,高音在4059之間。TABLE: DW 0,63628,63835,64021,64103,64260,64400,64524,0,0 DW 0,63731,63928,0,64185,64331,64463,0,0,0 DW 0,64580,64684,64777,64820,64898,64968,65030,0,0 DW 0,64633,64732,0,64860,64934,64994,0,0,0 DW 0,65058,65110,65157,65178,65

9、217,65252,65283,0,0 DW 0,65085,65134,0,65198,65235,65268,0,0,0 DW 0 在這個程序中,彈奏音樂的程序是用定時/計數(shù)器T0來完成的,播放音樂程序則是用定時/計數(shù)器T1來完成的。2.2. 設(shè)計流程 (1)鍵盤掃描程序: 檢測是否有鍵按下,有鍵按下則記錄按下鍵的鍵值,并跳轉(zhuǎn)至功能轉(zhuǎn)移程序;無鍵按下,則返回鍵盤掃描程序繼續(xù)檢測。 (2)功能轉(zhuǎn)移程序: 對檢測到得按鍵值進(jìn)行判斷,是琴鍵則跳轉(zhuǎn)至琴鍵處理程序,是功能鍵則跳轉(zhuǎn)至相應(yīng)的功能程序,我們設(shè)計的功能程序有兩種,即音色調(diào)節(jié)功能和自動播放樂曲功能。 (3)琴鍵處理程序: 根據(jù)檢測到得按鍵值,

10、查詢音律表,給計時器賦值,使發(fā)出相應(yīng)頻率的聲音。 (4)自動播放歌曲程序:檢測到按鍵按下的是自動播放歌曲功能鍵后執(zhí)行該程序,電子琴會自動播放事先已經(jīng)存放好的歌曲,歌曲播放完畢之后自動返回至鍵盤掃描程序,繼續(xù)等待是否有鍵按下。 程序簡易流程圖: 開始鍵盤掃描程序T0初始化并開中斷允許T0中斷T1初始化并開中斷允許T1中斷有鍵按下否 否延時去抖動識別按鍵功能 是 是否彈奏鍵 否 播放鍵 是取相應(yīng)的音符碼裝入T1根據(jù)按鍵功能裝入相應(yīng)音符值到T0啟動T1啟動T0按鍵釋放成功否按鍵釋放成功否停止T0工作停止T1工作 圖1 程序簡易流程圖 彈奏程序流程圖:彈奏子程序開中斷并允許中斷設(shè)定定時器工作方式取鍵值

11、根據(jù)鍵值查音律表給定時器T0賦值開始計時進(jìn)入中斷CPL P3.0 P3.0退出中斷延時返回鍵盤掃描程序 圖2 彈奏程序流程圖自動播放歌曲程序流程圖:自動播放音樂程序A<< 0,DPTR<<歌譜地址開中斷,設(shè)定定時器T1工作模式取簡譜碼 取該音符的節(jié)拍碼STOPA=0 Y N休止符返回鍵盤掃描A=0FFH Y N 查音律表,給定時器賦值INC DPTR 開始計時進(jìn)入中斷CPL3.0退出中斷延時 圖3 自動播放歌曲程序流程圖3.硬件設(shè)計 3.1. AT89C51芯片簡介 3.1.1 主要特性·與MCS-51 兼容 ·4K字節(jié)可編程閃爍存儲器 ·

12、壽命:1000寫/擦循環(huán)·數(shù)據(jù)保留時間:10年·全靜態(tài)工作:0Hz-24Hz·三級程序存儲器鎖定·128*8位內(nèi)部RAM·32可編程I/O線·兩個16位定時器/計數(shù)器·5個中斷源 ·可編程串行通道·低功耗的閑置和掉電模式·片內(nèi)振蕩器和時鐘電路 3.1.2 功能描述 (1) AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS8位微處理器,俗稱單片機(jī)。AT89

13、C2051是一種帶2K字節(jié)閃爍可編程可擦除只讀存儲器的單片機(jī)。單片機(jī)的可擦除只讀存儲器可以反復(fù)擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案。 (2)振蕩器特性: XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內(nèi)振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時鐘源驅(qū)動器件,XTAL2應(yīng)不接。有余輸入

14、至內(nèi)部時鐘信號要通過一個二分頻觸發(fā)器,因此對外部時鐘信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。 (3)芯片擦除: 整個PEROM陣列和三個鎖定位的電擦除可通過正確的控制信號組合,并保持ALE管腳處于低電平10ms 來完成。在芯片擦操作中,代碼陣列全被寫“1”且在任何非空存儲字節(jié)被重復(fù)編程以前,該操作必須被執(zhí)行。此外,AT89C51設(shè)有穩(wěn)態(tài)邏輯,可以在低到零頻率的條件下靜態(tài)邏輯,支持兩種軟件可選的掉電模式。在閑置模式下,CPU停止工作。但RAM,定時器,計數(shù)器,串口和中斷系統(tǒng)仍在工作。在掉電模式下,保存RAM的內(nèi)容并且凍結(jié)振蕩器,禁止所用其他芯片功能,直到下一個硬件復(fù)位為止。 3

15、.1.3 引腳說明與硬件連接 (1) 引腳圖,如圖4: 圖4 AT89C51引腳圖 (2)P1口: P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。 利用P1口為按鍵接入口,形成4x4組成具有16個按鍵矩陣的鍵盤,作為琴鍵鍵盤,設(shè)計成16個音,如下圖5: 所對應(yīng)的鍵碼 0 1 2 3 4 5 6 7 8 9 A B C D E F 圖5 4x4鍵盤(3) P2口: P2口為一個內(nèi)部上拉電阻的8位

16、雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當(dāng)P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進(jìn)行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進(jìn)行讀寫時,P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。 利用P2.0接播放音樂鍵,如圖6: 圖6 自動播放歌曲 (4)P3口: P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流

17、。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。P3口同時為閃爍編程和編程校驗接收一些控制信號。 利用P3.0RXD口(串行輸入口)接1個喇叭,通過執(zhí)行相應(yīng)的功能程序使電子琴發(fā)出不同音色的聲音,如圖7: 圖7 P3.0的輸出電路 圖中喇叭處接了1個2N3906的PNP,其引腳圖如下圖8: 圖8 2N3906引腳圖 (5)RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST腳兩個機(jī)器周期的 高電平時間。 /EA/VPP:當(dāng)/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程

18、序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 當(dāng)按下按鍵,RST端口輸入高點平,電路進(jìn)行復(fù)位,歌曲停止播發(fā),如圖9: 圖9 復(fù)位部分 (6)XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。 XTAL2:來自反向振蕩器的輸出。如圖10: 圖10 晶振部分 3.2. 元器件清單 如下表2: 名稱 數(shù)值 個數(shù) 單片機(jī) AT89C51 1 獨立按鍵(可彈起的) 18 2N3906 1 喇叭 1 電阻R1 10K 1 電阻R2 1K 1 電阻R3 200 1 電容C1、C2

19、 16pF 各1個 電容C3 4.7uF 1 晶振 12MHz 1 表2 元器件清單4. 系統(tǒng)工作說明 接上電源,按下自動播放歌曲按鍵B17,P2.0口此時接上低電平,作為輸出口,因為P2.0具有輸出寄存器寄存的內(nèi)容的特殊功能,所以播放出已編好程序的歌曲。當(dāng)按下復(fù)位部分的按鍵B18時,因為復(fù)位部分是接高電平的,按下按鍵就產(chǎn)生高電平輸入進(jìn)行電路的復(fù)位,自動播放的歌曲就馬上停止。而4x4矩陣鍵盤是接P1口作為輸入,16個鍵位產(chǎn)生不同的頻率對應(yīng)其簡譜碼而產(chǎn)生不同的音階。喇叭輸出部分接P3.0口,一直保持低電平作為輸出,接上一個PNP 2N3906作為放大功能使其播放聲音。5. 結(jié)束語 5.1 收獲與

20、體會 通過這次課程設(shè)計,讓我感覺到了單片機(jī)的樂趣以及運用單片機(jī)設(shè)計電路比較方便和簡單。在課程設(shè)計過程中,我學(xué)會了怎么通過各種方式查詢相關(guān)的資料,尤其是要充分利用互聯(lián)網(wǎng)來查找自己想要的資料。這次的課程設(shè)計涉及硬件和軟件兩方面的內(nèi)容。首先是軟件部分,我學(xué)會了運用keil C51軟件建立工程文件來調(diào)試程序的正確性,同時也學(xué)會了運用proteus軟件來畫電路圖,基本掌握proteus軟件的使用方法包括繪制原理圖、PCB圖、3D圖,通過這些圖與焊接硬件電路緊密的聯(lián)在一起。由于自己所學(xué)有限,所以程序的編寫事件很頭疼的事,所以我們是先從網(wǎng)上下載一些類似的程序,然后對程序進(jìn)行分析修改加以利用。硬件部分,在選取

21、單片機(jī)前必須知道我們將要制作的電路需要實現(xiàn)什么功能,根據(jù)其功能來選取我們需要的單片機(jī)。而在焊接的過程中我發(fā)現(xiàn)每個元器件的排布是十分講究的,布局得好焊接起來就方便且簡單多了。 設(shè)計好后,要將程序燒入芯片,經(jīng)過調(diào)試成功后,我們可以任意彈奏自己想要的旋律。本研究通過制作電子琴,將幾個模塊很好的融合起來,對使用單片機(jī)設(shè)計簡易電子琴進(jìn)行了分析,并介紹了基于單片機(jī)電子琴統(tǒng)硬件組成。利用單片機(jī)產(chǎn)生不同頻率來獲得我們要求的音階。說明一首音樂是許多不同的音階組成的,而每個音階對應(yīng)著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所想要的音樂了,所以我們只要把一首歌曲的音階對應(yīng)頻率關(guān)系弄正確來,然后我

22、們利用功放電路來將音樂聲音放大。 5.2 遇到的問題與解決方法 (1)繪制好電路總原理圖準(zhǔn)備焊接的時候,發(fā)現(xiàn)按照原理圖來焊接相當(dāng)困難,不知從何下手。于是我上網(wǎng)查了一下資料,發(fā)現(xiàn)原來proteus軟件有自動布局和自動布線的功能來繪制PCB圖,而且還可以輸出3D圖。根據(jù)這總原理圖、PCB圖還有3D圖來焊接電路,很快地焊接好電路而且一插上電源電路就跟仿真一樣成功了。 (2)在購買材料的時候那間店沒有AT89C51單片機(jī),只好購買了STC89C52單片機(jī)。回來上網(wǎng)查了一下資料,發(fā)現(xiàn)它們的引腳都一樣,而且STC89C52的容量大一些,功能更強(qiáng),所以完全可以代替AT89C51來實現(xiàn)本設(shè)計的電子琴電路的功能

23、。 5.3 教程建議 我覺得只是單純的上課來學(xué)習(xí)單片機(jī)是很難的,老師應(yīng)該多找一些電路的實例來講授單片機(jī)的知識,這樣會讓學(xué)生更容易接受而且更容易明白。課程應(yīng)該多安排一些課程設(shè)計來讓學(xué)生自己動手來提高對單片機(jī)的知識和動手能力。6. 參考文獻(xiàn)1 李朝青 . 單片機(jī)原理與接口技術(shù).2 李光飛、樓然苗 .單片機(jī)課程設(shè)計指導(dǎo) .北京:北京航空航天大學(xué)出版 社.3 蔡朝洋 . 單片機(jī)控制實習(xí)與專題制作 .北京:北京航空航天大學(xué)出版社.4 嚴(yán)天峰 單片機(jī)應(yīng)用系統(tǒng)設(shè)計與仿真調(diào)試 北京:北京航空航天大學(xué)出 版社 . 2005年8月.7. 附錄 圖11 原理圖 圖12 實物圖 圖13 PCB圖 圖14 3D圖設(shè)計源

24、程序:BUFF EQU 30HSTH0 EQU 31HSTL0 EQU 32HTEMP EQU 33H ORG 00H LJMP START ORG 0BH LJMP INT_T0 ORG 001BH LJMP TIM1START: MOV TMOD,#01H ;設(shè)置T0工作方式 SETB ET0 SETB EA ;啟動T0MAIN: MOV P1,#0FFH ;P1全置1 CLR P1.4 ;開始掃描第一行 MOV A,P1 ANL A,#0FH ;屏蔽高四位 XRL A,#0FH ;低位 有”0”則有鍵按下,否則無 JZ KKEY1 ; 判斷有無鍵按下,有則繼續(xù),沒有則轉(zhuǎn)移到KKEY1 L

25、CALL DELY10MS ;調(diào)用延時程序 MOV A,P1 ;重新開始判斷有無鍵按下 ANL A,#0FH XRL A,#0FH JZ KKEY1 MOV A,P1 ANL A,#0FH ;求鍵值 CJNE A,#0EH,CKK1 ;相等說明該行第一列有鍵按下,不等則轉(zhuǎn)移 MOV BUFF,#0 ;該鍵值為0 LJMP NDK1 ;跳到NDK1執(zhí)行相應(yīng)的功能程序CKK1: CJNE A,#0DH,KK2;相等說明該行第二列有鍵按下,不等則轉(zhuǎn)移 MOV BUFF,#1;該鍵值為1 LJMP NDK1;跳到NDK1執(zhí)行相應(yīng)的功能程序KK2: CJNE A,#0BH,KK3;相等說明該行第三列有鍵

26、按下,不等則轉(zhuǎn)移 MOV BUFF,#2;該鍵值為2 LJMP NDK1;跳到NDK1執(zhí)行相應(yīng)的功能程序KK3: CJNE A,#07H,KK4;相等說明該行第四列有鍵按下,不等則轉(zhuǎn)移 MOV BUFF,#3;該鍵值為2 LJMP NDK1;跳到NDK1執(zhí)行相應(yīng)的功能程序KK4: NOPNDK1: MOV A,BUFF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,BUFF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP M

27、OV A,TEMP MOVC A,A+DPTR MOV STL0,A MOV TL0,A SETB TR0NDK1A: MOV A,P1 ANL A,#0FH XRL A,#0FH JNZ NDK1A CLR TR0KKEY1: MOV P1,#0FFH ;開始掃描第二行 CLR P1.5 MOV A,P1 ANL A,#0FH XRL A,#0FH JZ KKEY2 LCALL DELY10MS MOV A,P1 ANL A,#0FH XRL A,#0FH JZ KKEY2 MOV A,P1 ANL A,#0FH CJNE A,#0EH,KK5 MOV BUFF,#4 LJMP NDK2KK

28、5: CJNE A,#0DH,KK6 MOV BUFF,#5 LJMP NDK2KK6: CJNE A,#0BH,KK7 MOV BUFF,#6 LJMP NDK2KK7: CJNE A,#07H,KK8 MOV BUFF,#7 LJMP NDK2KK8: NOPNDK2: MOV A,BUFF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,BUFF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MO

29、VC A,A+DPTR MOV STL0,A MOV TL0,A SETB TR0NDK2A: MOV A,P1 ANL A,#0FH XRL A,#0FH JNZ NDK2A CLR TR0KKEY2: MOV P1,#0FFH ;開始掃描第三行 CLR P1.6 MOV A,P1 ANL A,#0FH XRL A,#0FH JZ KKEY3 LCALL DELY10MS MOV A,P1 ANL A,#0FH XRL A,#0FH JZ KKEY3 MOV A,P1 ANL A,#0FH CJNE A,#0EH,KK9 MOV BUFF,#8 LJMP NDK3KK9: CJNE A,#0

30、DH,KK10 MOV BUFF,#9 LJMP NDK3KK10: CJNE A,#0BH,KK11 MOV BUFF,#10 LJMP NDK3KK11: CJNE A,#07H,KK12 MOV BUFF,#11 LJMP NDK3KK12: NOPNDK3: MOV A,BUFF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,BUFF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A

31、,A+DPTR MOV STL0,A MOV TL0,A SETB TR0NDK3A: MOV A,P1 ANL A,#0FH XRL A,#0FH JNZ NDK3A CLR TR0KKEY3: MOV P1,#0FFH;開始掃描第四行 CLR P1.7 MOV A,P1 ANL A,#0FH XRL A,#0FH JZ KKEY4 LCALL DELY10MS MOV A,P1 ANL A,#0FH XRL A,#0FH JZ KKEY4 MOV A,P1 ANL A,#0FH CJNE A,#0EH,KK13 MOV BUFF,#12 LJMP NDK4KK13: CJNE A,#0DH

32、,KK14 MOV BUFF,#13 LJMP NDK4KK14: CJNE A,#0BH,KK15 MOV BUFF,#14 LJMP NDK4KK15: CJNE A,#07H,KK16 MOV BUFF,#15 LJMP NDK4KK16: NOPNDK4: MOV A,BUFF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,BUFF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,

33、A+DPTR MOV STL0,A MOV TL0,A SETB TR0NDK4A: MOV A,P1 ANL A,#0FH XRL A,#0FH JNZ NDK4A CLR TR0KKEY4: MOV A,#0FFHMOV P2,A MOV A,P2JB ACC.0, KKEY5LCALL DELY10MSMOV A,P2JB ACC.0, KKEY5MOV BUFF,#16LJMP START22START22: MOV A,BUFFCJNE A,#16,KKEY5LJMP START2KKEY5: LJMP MAIN START2: MOV TMOD,#10H ;設(shè)T1在M1 MOV I

34、E,#88H ;中斷使能 START0: MOV 30H,#00 ;取簡譜碼指針 NEXT: MOV A,30H ;簡譜碼指針載入A MOV DPTR,#TAB ;至TAB取簡譜碼 MOVC A,A+DPTR ;MOV R2,A ;渠道的簡譜碼暫存于R2 JZ END0 ;是否渠道00(結(jié)束碼) ANL A,#0FH ;不是,則取低4位(節(jié)拍碼) MOV R5,A ;將節(jié)拍碼存入R5 MOV A,R2 ;將取到的簡譜碼再載入A SWAP A ;高低4位交換 ANL A,#0FH ;取低4位(音符碼) JNZ SING ;取到的音符碼是否為0? CLR TR1 ;開始,則不發(fā)音 SJMP D1

35、;跳至D1 SING: DEC A ;取到的音符碼減1(不含0) MOV 22H,A ;存入(22H) RL A ;乘2 MOV DPTR,#TAB1 ;至TABLE1取相對的高位字節(jié)計數(shù)值 MOVC A,A+DPTR ; MOV TH1,A ;取到的高位字節(jié)存入TH0 MOV 21H,A ;取到的高位字節(jié)存入(21H) MOV A,22H ;在載入取到的音符碼 RL A ;乘2 INC A ;加1 MOVC A,A+DPTR ;至TABLE1取相對的低位字節(jié)計數(shù)值 MOV TL1,A ;取到的低位字節(jié)存入TL0 MOV 20H,A ;取到的低位字節(jié)存入(20H) SETB TR1 ;啟動TIMER0D1: LCALL DELAY ;其本單位時間1/4拍187毫秒 INC 30H ;取簡譜碼指針加1 JMP NEXT ;取下一個簡譜碼 END0: CLR TR1 ;停止TIMER0 LJMP MAIN ;重復(fù)循環(huán) T

溫馨提示

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

評論

0/150

提交評論