版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 一、設(shè)計(jì)任務(wù)(要求)</p><p> 利用51系列單片機(jī)、按鍵、揚(yáng)聲器等器件,設(shè)計(jì)一個(gè)電子琴。</p><p><b> 具體功能要求如下:</b></p><p> 設(shè)計(jì)鍵盤電路,使其具有數(shù)字鍵1、2、3、4、5、6、7、8、9作為電子琴按鍵,演示鍵DEMO,其中1~7號(hào)鍵按下后即發(fā)出相應(yīng)的音調(diào)。8號(hào)鍵按下后依次
2、發(fā)出“1、2、3、4、5、6、7” 音調(diào),9號(hào)鍵按下后依次發(fā)出“7、6、5、4、3、2、1” 音調(diào),按下DEMO鍵,自動(dòng)演示一首歌曲,用單片機(jī)某一接口發(fā)出音頻脈沖,驅(qū)動(dòng)揚(yáng)聲器發(fā)音。</p><p> 利用定時(shí)器定時(shí),可以發(fā)出不同頻率的脈沖,不同頻率的脈沖經(jīng)揚(yáng)聲器驅(qū)動(dòng)電路放大濾波后,就會(huì)發(fā)出不同的音調(diào).定時(shí)器按設(shè)置的定時(shí)參數(shù)產(chǎn)生中斷,一次中斷發(fā)出脈沖低電平,下一次反轉(zhuǎn)發(fā)出脈沖高電平.由于定時(shí)參數(shù)不同,就發(fā)出了不同
3、頻率的脈沖.按鍵一次,發(fā)50個(gè)脈沖.發(fā)完后繼續(xù)檢測鍵盤,如果鍵還按下,繼續(xù)發(fā)音,發(fā)脈沖個(gè)數(shù)的多少可以決定節(jié)拍的長短。</p><p><b> 二、總體方案</b></p><p> 按照設(shè)計(jì)任務(wù)(要求),電子琴的主要涉及以下幾個(gè)模塊:</p><p> 1、定時(shí)器控制不同頻率發(fā)音;</p><p> 2、矩陣鍵
4、盤的掃描;</p><p> 3、除此以外,我還在本次設(shè)計(jì)中加入了數(shù)碼管顯示,分別顯示當(dāng)前彈奏的音符。于是又多了數(shù)碼管顯示模塊;</p><p><b> 實(shí)現(xiàn)方案:</b></p><p> 通過不斷地鍵盤進(jìn)行掃描。當(dāng)有按鍵按下時(shí),執(zhí)行該按鍵對(duì)應(yīng)的程序,包括:發(fā)出相應(yīng)的音符或音樂、數(shù)碼管顯示當(dāng)前音符。當(dāng)按鍵松開,將音符停止發(fā)出,如果是音
5、樂,將進(jìn)行演奏。</p><p> 其中,不同的音符,采用定時(shí)器中斷,從而發(fā)出不同的音符。即改變不同的定時(shí)器初始值。</p><p> 對(duì)于音樂的音符,采用自編的特殊編碼,以便程序的調(diào)用。本程序的設(shè)計(jì)采用了三位數(shù)編碼,即:利用三位數(shù)表示一個(gè)音符。第一位由1-7組成,表示音符1-7;第二位由1-4組成,表示音階的低、中、高和超高;第三位由1-9組成,表示該音階的拍數(shù),計(jì)算方式是1/2拍數(shù)
6、字。</p><p> 例如:6,2,2……表示一拍中音6;4,3,1……表示半拍高音4。</p><p> 關(guān)于對(duì)音符編碼的調(diào)用,設(shè)一個(gè)音的編碼為則,調(diào)用的頻率參數(shù)為,該參數(shù)用于修改定時(shí)器初始值;調(diào)用的時(shí)間參數(shù)為,該參數(shù)用于修改定時(shí)器執(zhí)行時(shí)間。</p><p><b> 三、原理框圖</b></p><p>
7、四、系統(tǒng)模塊詳細(xì)設(shè)計(jì)與調(diào)試</p><p><b> ?。ㄒ唬╂I盤掃描模塊</b></p><p> 1、矩陣鍵盤工作原理</p><p> 矩陣鍵盤的按鍵設(shè)在行、列線的交點(diǎn)上。行線通過上拉電阻接到+5V電源上。無鍵盤按下時(shí),行線出于高電平狀態(tài);當(dāng)有按鍵按下時(shí),行線電平狀態(tài)將由此按鍵相連接的列線的電平?jīng)Q定。</p><p
8、><b> 2、設(shè)計(jì)思路</b></p><p> 通過掃描法識(shí)別鍵盤。即,先將某一列線置為低電平,其余各列線置為高電平,檢查各行線電平的變化,如果某行線電平的為低電平,就可以確立此行此列交叉點(diǎn)處的按鍵被按下。</p><p> ?。ǘ?shù)碼管顯示模塊</p><p><b> 1、硬件電路</b></p
9、><p> 數(shù)碼管的顯示,是通過74LS374鎖存器來實(shí)現(xiàn)的。段選和位選分別是P3.5和P3.4。數(shù)據(jù)的輸出為P0口。(詳見附錄一:硬件原理圖)</p><p><b> 2、設(shè)計(jì)思路</b></p><p> 通過分別控制段選、位選鎖存器的導(dǎo)通(低電平)、鎖存信號(hào)(高電平)。從而分時(shí)給數(shù)碼管寫入數(shù)據(jù)并鎖存。</p><p
10、> ?。ㄈ┮粽{(diào)編碼讀取模塊</p><p><b> 1、編碼規(guī)則</b></p><p> 本程序的設(shè)計(jì)采用了三位數(shù)編碼,即:利用三位數(shù)表示一個(gè)音符。第一位由1-7組成,表示音符1-7;第二位由1-4組成,表示音階的低、中、高和超高;第三位由1-9組成,表示該音階的拍數(shù),計(jì)算方式是1/2拍數(shù)字。</p><p> 例如:6,2,
11、2……表示一拍中音6;4,3,1……表示半拍高音4。</p><p><b> 2、讀取方式</b></p><p> 首先讀取前兩位數(shù),以確定音調(diào)。然后讀取最后一位,以確定拍數(shù)(時(shí)間)。然后依次遞增3位。</p><p> 音調(diào)確定后,通過查表獲取定時(shí)器初始值,并調(diào)用定時(shí)器中斷。拍數(shù),即定時(shí)器中斷執(zhí)行的循環(huán)次數(shù),以此來控制聲音的時(shí)間。&
12、lt;/p><p> (四)定時(shí)器中斷模塊</p><p><b> 1、定時(shí)器的調(diào)用</b></p><p> 本程序的設(shè)計(jì)采用定時(shí)器中斷的方法來使蜂鳴器發(fā)出不同的頻率聲音,從而實(shí)現(xiàn)電子琴的音調(diào)。定時(shí)器的初始值不同,產(chǎn)生的頻率也就不同。</p><p> 定時(shí)器的調(diào)用是循環(huán)不斷的,它的循環(huán)包括兩類:一類是一個(gè)音節(jié)頻
13、率的循環(huán),從而控制一個(gè)拍數(shù)的長短;另一類是下一個(gè)音節(jié)的到來,重新寫入初值,直至結(jié)束標(biāo)志位的到來,即0,0,0。</p><p> 如果再調(diào)用程序中,再加入一個(gè)整體循環(huán),則可以反復(fù)執(zhí)行音樂播放。即,檢測到結(jié)束標(biāo)志后,重新播放音樂而不間斷。(本程序,沒有使用該循環(huán)。)</p><p> 2、初始值的生成與寫入</p><p> 定時(shí)器的初始值,是通過網(wǎng)絡(luò)搜索得到的
14、,不同的初值代表著會(huì)發(fā)出不同頻率的音調(diào)。將它制成表,以便程序讀取。</p><p><b> 五、設(shè)計(jì)總結(jié)</b></p><p> 我課程設(shè)計(jì)的題目是電子琴的設(shè)計(jì)。主要用的了之前所學(xué)的定時(shí)器中斷、矩陣鍵盤掃描、數(shù)碼管顯示、C51編程等相關(guān)的單片機(jī)及接口技術(shù)的知識(shí)和理論。在課設(shè)中,也充分的做到了學(xué)以致用,把之前所學(xué)的知識(shí)應(yīng)用的實(shí)際當(dāng)中去。同時(shí),也通過實(shí)踐來檢驗(yàn)之前
15、所學(xué)的理論,發(fā)現(xiàn)了很多對(duì)理論知識(shí)的誤解。這些,也都在實(shí)踐中得到了很好的彌補(bǔ)。</p><p> 在設(shè)計(jì)程序的初始階段,我本打算一次性完成任務(wù),但每次嘗試都以失敗告終。后來,我學(xué)會(huì)了分模塊處理問題,逐一突破。這也是我在此次課程設(shè)計(jì)中的一大收獲。讓我充分懂得了,如何去處理一個(gè)較大的工程項(xiàng)目。</p><p> 首先,我先實(shí)現(xiàn)了使單片機(jī)發(fā)出不同音調(diào)的基本功能,然后開始考慮鍵盤掃描。但是在調(diào)試
16、時(shí),總是出現(xiàn)BUG。在部分按鍵按下后,蜂鳴器會(huì)一直響,無法終止。這個(gè)問題一直困擾了我很久,嘗試了很多方法都沒能成功,終于在一天早上醒來后的第一次嘗試,終于成功了,即在鍵盤掃描中加入一個(gè)程序,當(dāng)音樂執(zhí)行到結(jié)束標(biāo)志后,此時(shí)若沒有鍵盤被按下時(shí),令蜂鳴器停止鳴叫不做任何響應(yīng),直至有鍵盤再被按下。</p><p> 最后,我將兩個(gè)模塊進(jìn)行結(jié)合,于是便成功的寫出了電子琴的程序。而且成功進(jìn)行了調(diào)試。</p>&
17、lt;p> 第一天驗(yàn)收,老師讓我再加入數(shù)碼管顯示功能。于是,我又寫了數(shù)碼管顯示模塊的程序。數(shù)碼管顯示是通過鎖存器來完成的。當(dāng)我程序?qū)懲曛筮M(jìn)行調(diào)試,數(shù)碼管沒有進(jìn)行顯示,多次調(diào)試發(fā)現(xiàn):只有長時(shí)間按下按鍵才會(huì)有相應(yīng)字符顯示。于是我嘗試把段選信號(hào)的選通與鎖存指令和P0數(shù)據(jù)寫在一起,這樣就可以立即顯示當(dāng)前字符了。</p><p> 第二天驗(yàn)收,順利通過。事后,我又采用了外部中斷的方法進(jìn)行電子琴的模式切換等其他功
18、能,從而不斷地豐富了電子琴的功能。同時(shí),也對(duì)程序進(jìn)行了整理,使程序更加規(guī)范、美觀、易讀。</p><p> 總而言之,此次課設(shè),我學(xué)的東西很多。也深深地懂得理論不進(jìn)行實(shí)際,是不行的。只有通過實(shí)踐才能檢驗(yàn)自己對(duì)理論知識(shí)的理解和掌握。在寫程序的時(shí)候,一定要有良好的習(xí)慣,格式要有自己的排版方式,不能混亂。這樣易于檢查和調(diào)整。</p><p> 通過這次課設(shè)。大大提高了我對(duì)單片機(jī)以及編程的能力
19、與信心。我相信,以后通過自己的不斷深入的學(xué)習(xí),我一定能夠熟練的運(yùn)用單片機(jī)到實(shí)際當(dāng)中去。</p><p><b> 六、參考文獻(xiàn)</b></p><p> [1] 李升,《單片機(jī)原理與接口技術(shù)》,北京:北京大學(xué)出版社,2011年7月;</p><p> [2] 網(wǎng)友:lv_xiaowei,《音調(diào)與頻率對(duì)應(yīng)關(guān)系表》, http://wenku
20、.baidu.com/view/d90a081a6edb6f1aff001f45.html ,2012年01月03日;</p><p><b> 七、附件材料</b></p><p><b> 附錄一:硬件原理圖</b></p><p> 附錄二:程序清單及說明</p><p><b&g
21、t; 附錄三:元器件清單</b></p><p><b> 附錄四:實(shí)物圖</b></p><p> /***********************************************************</p><p> *** 課程設(shè)計(jì):電子琴(南京工程學(xué)院自動(dòng)化學(xué)院) ***<
22、;/p><p> *** ***</p><p> *** 開發(fā)平臺(tái):AT80C52 ***</p><p> ***
23、 ***</p><p> *** 程序設(shè)計(jì):施國慶 203100423 ***</p><p> ***********************************************************/</p><p> /*________________
24、______________ </p><p> / o oooo ooo oooo o o o /\ </p><p> / oo ooo oo oooo o o o / / </p><p> / _________________________ / / </p><
25、;p> / // / //I///LOVE // U // // // / / </p><p> /___ //////////////////////////_/ / </p><p> \____\________________________\_*/</p><p> /*************************
26、**********************************</p><p> *** 頭文件 ***</p><p> ***********************************************************/</p><p>
27、#include <reg51.h></p><p> #include<stdio.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> sbit speaker = P3^6;</p&g
28、t;<p> sbit a0=P2^0;</p><p> sbit a1=P2^1;</p><p> sbit a2=P2^2;</p><p> sbit a3=P2^3;</p><p> sbit a4=P2^4;</p><p> sbit b2=P3^2;</p>
29、<p> sbit b4=P3^4;</p><p> sbit b5=P3^5;</p><p> unsigned char timer0h, timer0l;</p><p> void jian();</p><p> //--------------------------------------</p&g
30、t;<p> /***********************************************************</p><p> *** 音調(diào)設(shè)置及數(shù)碼管編碼 ***</p><p> **************************************************
31、*********/</p><p> // 頻率-半周期數(shù)據(jù)表 高八位</p><p> code unsigned char FREQH[] = {</p><p> 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567</p><p> 0xF9, 0xF9, 0xFA, 0
32、xFA, 0xFB, 0xFB, 0xFC, //1,2,3,4,5,6,7</p><p> 0xFC, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 1234567</p><p> 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567</p><p> //
33、頻率-半周期數(shù)據(jù)表 低八位</p><p> code unsigned char FREQL[] = {</p><p> 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567</p><p> 0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, //1,2,3,4,5,6
34、,7</p><p> 0x8F, 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 1234567</p><p> 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567</p><p> //-------------------------------------
35、-</p><p> unsigned char const display[]={0x3f,0x06,0x5b,0x4f,0x66,</p><p> 0x6d,0x7d,0x07,0x7f,0x6f };</p><p> /***********************************************************</p&
36、gt;<p> *** 樂譜及其獨(dú)立音調(diào) ***</p><p> ***********************************************************/</p><p> //-----------------樂譜---------------------//<
37、;/p><p> code unsigned char sszymmh[] = {</p><p> 6,2,3, 5,2,1, 3,2,2, 5,2,2, </p><p> 1,3,2, 6,2,1, 5,2,1, 6,2,4, </p><p> 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, </p&g
38、t;<p> 1,2,1, 6,1,1, 5,2,1, 3,2,1, 2,2,4, </p><p> 2,2,3, 3,2,1, 5,2,2, 5,2,1, 6,2,1, </p><p> 3,2,2, 2,2,2, 1,2,4,</p><p> 5,2,3, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 1,2,1, <
39、/p><p> 5,1,6, 0,0,0};</p><p> code unsigned char dfc[] = {</p><p> 5,2,2, 6,2,2, 5,2,2, 3,2,1, 2,2,1,</p><p> 1,2,1, 2,2,1, 1,2,1, 6,1,1, 5,1,4,</p><p>
40、 6,1,1, 6,1,2, 5,1,1, 6,1,1, 6,1,2, 5,1,1,</p><p> 5,2,3, 3,2,1, 2,2,4,</p><p> 5,2,1, 6,2,1, 5,2,1, 3,2,1, 2,2,4,</p><p> 1,2,1, 2,2,1, 6,1,1, 1,2,1, 2,2,4,</p><p>
41、 2,2,1, 2,2,1, 2,2,1, 3,2,1, 5,2,2, 5,2,1, 6,2,1,</p><p> 1,2,3, 6,1,1, 1,2,1, 0,0,0};</p><p> code unsigned char sheng[] = {</p><p> 1,2,2, 2,2,2, 3,2,2, 4,2,2, 5,2,2, 6,2,2, 7
42、,2,2, 1,3,2,</p><p><b> 0,0,0};</b></p><p> code unsigned char jiang[] = {</p><p> 1,3,2, 7,2,2, 6,2,2, 5,2,2, 4,2,2, 3,2,2, 2,2,2, 1,2,2,</p><p><b&g
43、t; 0,0,0};</b></p><p> code unsigned char songbie[] = {</p><p> 5,2,2, 3,2,1, 5,2,1, 1,3,4,</p><p> 6,2,2, 1,3,2, 5,2,4,</p><p> 5,2,2, 1,2,1, 2,2,1, 3,2,2,
44、2,2,1, 1,2,1, 2,2,4,</p><p> 5,2,2, 3,2,1, 5,2,1, 1,3,3, 7,2,1,</p><p> 6,2,2, 1,3,2, 5,2,4,</p><p> 5,2,2, 2,2,1, 3,2,1, 4,2,3, 7,2,1, 1,2,4,</p><p> 6,2,2, 1,3,2,
45、 1,3,4,</p><p> 7,2,2, 6,2,1, 7,2,1, 1,3,4,</p><p> 6,2,1, 7,2,1, 1,3,1, 6,2,1, 6,2,1, 5,2,1, 3,2,1, 1,2,1, 2,2,4,</p><p> 5,2,2, 3,2,1, 5,2,1, 1,3,3, 7,2,1,</p><p>
46、 6,2,2, 1,3,2, 5,2,4,</p><p> 3,2,2, 1,2,1, 2,2,1, 3,2,2, 2,2,1, 1,2,1, 2,2,4,</p><p> 5,2,2, 3,2,1, 5,2,1, 1,3,3, 7,2,1,</p><p> 6,2,2, 1,3,2, 5,2,4,</p><p> 5,2,
47、2, 2,2,1, 3,2,1, 4,2,3, 7,2,1, 1,2,4,</p><p><b> 0,0,0};</b></p><p> //-----------------單音---------------------//</p><p> code unsigned char dou[] = {</p><
48、p> 1,2,1, 0,0,0</p><p><b> };</b></p><p> code unsigned char re[] = {</p><p> 2,2,1, 0,0,0</p><p><b> };</b></p><p> code
49、unsigned char mi[] = {</p><p> 3,2,1, 0,0,0</p><p><b> };</b></p><p> code unsigned char fa[] = {</p><p> 4,2,1, 0,0,0,</p><p><b> }
50、;</b></p><p> code unsigned char so[] = {</p><p> 5,2,1, 0,0,0</p><p><b> };</b></p><p> code unsigned char la[] = {</p><p> 6,2,1,
51、0,0,0</p><p><b> };</b></p><p> code unsigned char xi[] = {</p><p> 7,2,1, 0,0,0</p><p><b> };</b></p><p> code unsigned char
52、doo[] = {</p><p> 1,3,1, 0,0,0</p><p><b> };</b></p><p> /***********************************************************</p><p> *** 時(shí)間參數(shù):延時(shí)、定時(shí)
53、器中斷 ***</p><p> ***********************************************************/</p><p> void t0int() interrupt 1 //T0中斷程序,控制發(fā)音的音調(diào)</p><p><b> {</b></p>
54、<p> TR0 = 0; //先關(guān)閉T0</p><p> speaker = !speaker; //輸出方波, 發(fā)音</p><p> TH0 = timer0h; //下次的中斷時(shí)間, 這個(gè)時(shí)間, 控制音調(diào)高低</p><p> TL0 = timer0l;</p><p> TR0 = 1; //啟動(dòng)T0&l
55、t;/p><p><b> }</b></p><p> //--------------------------------------</p><p> void delay(unsigned char t) //延時(shí)程序,控制發(fā)音的時(shí)間長度</p><p><b> {</b></p
56、><p> unsigned char t1;</p><p> unsigned long t2;</p><p> for(t1 = 0; t1 < t; t1++) //雙重循環(huán), 共延時(shí)t個(gè)半拍</p><p> for(t2 = 0; t2 < 8000; t2++); //延時(shí)期間, 可進(jìn)入T0中斷去發(fā)音</
57、p><p> TR0 = 0; //關(guān)閉T0, 停止發(fā)音</p><p><b> }</b></p><p> void jpdelay(void)</p><p><b> {</b></p><p> unsigned char i;</p><
58、;p> for(i=300;i>0;i--);</p><p><b> }</b></p><p> /***********************************************************</p><p> *** 聲頻驅(qū)動(dòng)程序
59、 ***</p><p> ***********************************************************/</p><p> void song(unsigned char time) //演奏一個(gè)音符</p><p><b> {a3=0;</b></p><
60、p> TH0 = timer0h; //控制音調(diào)</p><p> TL0 = timer0l;</p><p> TR0 = 1; //啟動(dòng)T0, 由T0輸出方波去發(fā)音</p><p> delay(time); //控制時(shí)間長度</p><p><b> }</b></p><p
61、> /***********************************************************</p><p> *** 聲頻調(diào)用程序 ***</p><p> *******************************************************
62、****/</p><p> //---------------------單音節(jié)----------------------------//</p><p> void yin1(void)</p><p><b> {</b></p><p> unsigned char k, i,time;</p&g
63、t;<p><b> TMOD = 1;</b></p><p><b> ET0 = 1; </b></p><p><b> EA = 1;</b></p><p><b> i = 0;</b></p><p> time =
64、 1; </p><p> while(time) {</p><p> k = dou[i] + 7 * dou[i + 1] - 1;//第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度</p><p> timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值</p><p> timer0l = FREQL[k]; //實(shí)際上
65、, 是定時(shí)的時(shí)間長度</p><p> time = dou[i + 2]; //讀出時(shí)間長度數(shù)值</p><p><b> i += 3;</b></p><p> song(time); //發(fā)出一個(gè)音符</p><p><b> } }</b></p><p>
66、 void yin2(void)</p><p><b> {</b></p><p> unsigned char k, i,time;</p><p><b> TMOD = 1;</b></p><p><b> ET0 = 1; </b></p>
67、<p><b> EA = 1;</b></p><p><b> i = 0;</b></p><p> time = 1; </p><p> while(time) {</p><p> k = re[i] + 7 * re[i + 1] - 1;//第i個(gè)是音符, 第i
68、+1個(gè)是第幾個(gè)八度</p><p> timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值</p><p> timer0l = FREQL[k]; //實(shí)際上, 是定時(shí)的時(shí)間長度</p><p> time = re[i + 2]; //讀出時(shí)間長度數(shù)值</p><p><b> i += 3;</b&
69、gt;</p><p> song(time); //發(fā)出一個(gè)音符</p><p><b> } }</b></p><p> void yin3(void)</p><p><b> {</b></p><p> unsigned char k, i,time;&
70、lt;/p><p><b> TMOD = 1;</b></p><p><b> ET0 = 1; </b></p><p><b> EA = 1;</b></p><p><b> i = 0;</b></p><p>
71、 time = 1; </p><p> while(time) {</p><p> k = mi[i] + 7 *mi[i + 1] - 1;//第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度</p><p> timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值</p><p> timer0l = FREQL[k]; /
72、/實(shí)際上, 是定時(shí)的時(shí)間長度</p><p> time = mi[i + 2]; //讀出時(shí)間長度數(shù)值</p><p><b> i += 3;</b></p><p> song(time); //發(fā)出一個(gè)音符</p><p><b> } }</b></p><p&
73、gt; void yin4(void)</p><p><b> {</b></p><p> unsigned char k, i,time;</p><p><b> TMOD = 1;</b></p><p><b> ET0 = 1; </b></p&g
74、t;<p><b> EA = 1;</b></p><p><b> i = 0;</b></p><p> time = 1; </p><p> while(time) {</p><p> k = fa[i] + 7 *fa[i + 1] - 1;//第i個(gè)是音符,
75、第i+1個(gè)是第幾個(gè)八度</p><p> timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值</p><p> timer0l = FREQL[k]; //實(shí)際上, 是定時(shí)的時(shí)間長度</p><p> time = fa[i + 2]; //讀出時(shí)間長度數(shù)值</p><p><b> i += 3;</
76、b></p><p> song(time); //發(fā)出一個(gè)音符</p><p><b> } }</b></p><p> void yin5(void)</p><p><b> {</b></p><p> unsigned char k, i,time
77、;</p><p><b> TMOD = 1;</b></p><p><b> ET0 = 1; </b></p><p><b> EA = 1;</b></p><p><b> i = 0;</b></p><p>
78、; time = 1; </p><p> while(time) {</p><p> k = so[i] + 7 * so[i + 1] - 1;//第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度</p><p> timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值</p><p> timer0l = FREQL[k]
79、; //實(shí)際上, 是定時(shí)的時(shí)間長度</p><p> time = so[i + 2]; //讀出時(shí)間長度數(shù)值</p><p><b> i += 3;</b></p><p> song(time); //發(fā)出一個(gè)音符</p><p><b> } }</b></p><
80、;p> void yin6(void)</p><p><b> {</b></p><p> unsigned char k, i,time;</p><p><b> TMOD = 1;</b></p><p><b> ET0 = 1; </b></
81、p><p><b> EA = 1;</b></p><p><b> i = 0;</b></p><p> time = 1; </p><p> while(time) {</p><p> k = la[i] + 7 *la[i + 1] - 1;//第i個(gè)是音
82、符, 第i+1個(gè)是第幾個(gè)八度</p><p> timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值</p><p> timer0l = FREQL[k]; //實(shí)際上, 是定時(shí)的時(shí)間長度</p><p> time = la[i + 2]; //讀出時(shí)間長度數(shù)值</p><p><b> i += 3;&l
83、t;/b></p><p> song(time); //發(fā)出一個(gè)音符</p><p><b> } }</b></p><p> void yin7(void)</p><p><b> {</b></p><p> unsigned char k, i,t
84、ime;</p><p><b> TMOD = 1;</b></p><p><b> ET0 = 1; </b></p><p><b> EA = 1;</b></p><p><b> i = 0;</b></p><p
85、> time = 1; </p><p> while(time) {</p><p> k = xi[i] + 7 * xi[i + 1] - 1;//第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度</p><p> timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值</p><p> timer0l = FREQL
86、[k]; //實(shí)際上, 是定時(shí)的時(shí)間長度</p><p> time = xi[i + 2]; //讀出時(shí)間長度數(shù)值</p><p><b> i += 3;</b></p><p> song(time); //發(fā)出一個(gè)音符</p><p><b> } }</b></p>
87、<p> void yin8(void)</p><p><b> {</b></p><p> unsigned char k, i,time;</p><p><b> TMOD = 1;</b></p><p><b> ET0 = 1; </b>&l
88、t;/p><p><b> EA = 1;</b></p><p><b> i = 0;</b></p><p> time = 1; </p><p> while(time) {</p><p> k = doo[i] + 7 * doo[i + 1] - 1;/
89、/第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度</p><p> timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值</p><p> timer0l = FREQL[k]; //實(shí)際上, 是定時(shí)的時(shí)間長度</p><p> time = doo[i + 2]; //讀出時(shí)間長度數(shù)值</p><p><b> i
90、+= 3;</b></p><p> song(time); //發(fā)出一個(gè)音符</p><p><b> } }</b></p><p> //---------------------音樂----------------------------//</p><p> void music1(void
91、)</p><p><b> {</b></p><p> unsigned char k, i,time;</p><p><b> TMOD = 1;</b></p><p><b> ET0 = 1; </b></p><p><b&
92、gt; EA = 1;</b></p><p><b> i = 0;</b></p><p> time = 1; </p><p> while(time) {</p><p> k = songbie[i] + 7 * songbie[i + 1] - 1;//第i個(gè)是音符, 第i+1個(gè)是第幾
93、個(gè)八度</p><p> timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值</p><p> timer0l = FREQL[k]; //實(shí)際上, 是定時(shí)的時(shí)間長度</p><p> time = songbie[i + 2]; //讀出時(shí)間長度數(shù)值</p><p><b> i += 3;</b&g
94、t;</p><p> song(time); //發(fā)出一個(gè)音符</p><p><b> } }</b></p><p> void music2(void)</p><p><b> {</b></p><p> unsigned char k, i,time;
95、</p><p><b> TMOD = 1;</b></p><p><b> ET0 = 1; </b></p><p><b> EA = 1;</b></p><p><b> i = 0;</b></p><p>
96、 time = 1; </p><p> while(time) {</p><p> k = dfc[i] + 7 * dfc[i + 1] - 1;//第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度</p><p> timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值</p><p> timer0l = FREQL[k
97、]; //實(shí)際上, 是定時(shí)的時(shí)間長度</p><p> time = dfc[i + 2]; //讀出時(shí)間長度數(shù)值</p><p><b> i += 3;</b></p><p> song(time); //發(fā)出一個(gè)音符</p><p><b> } }</b></p>&
98、lt;p> void music3(void)</p><p><b> {</b></p><p> unsigned char k, i,time;</p><p><b> TMOD = 1;</b></p><p><b> ET0 = 1; </b>&
99、lt;/p><p><b> EA = 1;</b></p><p><b> i = 0;</b></p><p> time = 1; </p><p> while(time) {</p><p> k = sheng[i] + 7 * sheng[i + 1]
100、- 1;//第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度</p><p> timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值</p><p> timer0l = FREQL[k]; //實(shí)際上, 是定時(shí)的時(shí)間長度</p><p> time = sheng[i + 2]; //讀出時(shí)間長度數(shù)值</p><p><b&
101、gt; i += 3;</b></p><p> song(time); //發(fā)出一個(gè)音符</p><p><b> } }</b></p><p> void music4(void)</p><p><b> {</b></p><p> unsi
102、gned char k, i,time;</p><p><b> TMOD = 1;</b></p><p><b> ET0 = 1; </b></p><p><b> EA = 1;</b></p><p><b> i = 0;</b>&
103、lt;/p><p> time = 1; </p><p> while(time) {</p><p> k = jiang[i] + 7 * jiang[i + 1] - 1;//第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度</p><p> timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值</p><
104、p> timer0l = FREQL[k]; //實(shí)際上, 是定時(shí)的時(shí)間長度</p><p> time = jiang[i + 2]; //讀出時(shí)間長度數(shù)值</p><p><b> i += 3;</b></p><p> song(time); //發(fā)出一個(gè)音符</p><p><b>
105、} }</b></p><p> void music5(void)</p><p><b> {</b></p><p> unsigned char k, i,time;</p><p><b> TMOD = 1;</b></p><p><b
106、> ET0 = 1; </b></p><p><b> EA = 1;</b></p><p><b> i = 0;</b></p><p> time = 1; </p><p> while(time) {</p><p> k = ss
107、zymmh[i] + 7 * sszymmh[i + 1] - 1;//第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度</p><p> timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值</p><p> timer0l = FREQL[k]; //實(shí)際上, 是定時(shí)的時(shí)間長度</p><p> time = sszymmh[i + 2]; //讀出時(shí)
108、間長度數(shù)值</p><p><b> i += 3;</b></p><p> song(time); //發(fā)出一個(gè)音符</p><p><b> } }</b></p><p> /******************************************************
109、*****</p><p> *** 鍵盤掃描 ***</p><p> ***********************************************************/</p><p> uchar keyscan(void) //鍵盤掃描函數(shù),使
110、用行列反轉(zhuǎn)掃描法</p><p><b> {</b></p><p> uchar cord_h,cord_l;//行列值中間變量</p><p> P2=0x0f; //行線輸出全為0</p><p> cord_h=P2&0x0f; //讀入列線值</p>
111、<p> if(cord_h!=0x0f) //先檢測有無按鍵按下</p><p><b> {</b></p><p> jpdelay(); //去抖</p><p> if(cord_h!=0x0f)</p><p><b> {</b></p&
112、gt;<p> cord_h=P2&0x0f; //讀入列線值</p><p> P2=cord_h|0xf0; //輸出當(dāng)前列線值</p><p> cord_l=P2&0xf0; //讀入行線值</p><p> return(cord_h+cord_l);//鍵盤最后組合碼值</p><p>
113、<b> }</b></p><p><b> }</b></p><p> return(0xff); //返回該值</p><p><b> }</b></p><p> /*****************************************
114、******************</p><p> *** 按鍵判別 ***</p><p> ***********************************************************/</p><p> void jian()</p&
115、gt;<p><b> {</b></p><p> uchar key;</p><p> key=keyscan();</p><p> jpdelay();</p><p> switch(key)</p><p><b> {</b><
116、/p><p> case 0xee:b5=0;P0=display[1];b5=1;yin1();break;</p><p> case 0xde:b5=0;P0=display[2];b5=1;yin2();break;</p><p> case 0xbe:b5=0;P0=display[3];b5=1;yin3();break;</p>&l
117、t;p> case 0x7e:b5=0;P0=display[4];b5=1;yin4();break;</p><p> case 0xed:b5=0;P0=display[5];b5=1;yin5();break;</p><p> case 0xdd:b5=0;P0=display[6];b5=1;yin6();break;</p><p> c
118、ase 0xbd:b5=0;P0=display[7];b5=1;yin7();break;</p><p> case 0x7d:b5=0;P0=display[8];b5=1;yin8();break;</p><p> case 0xeb:b5=0;P0=display[1];b5=1;music1();break;</p><p> case 0xdb
119、:b5=0;P0=display[2];b5=1;music2();break;</p><p> case 0xbb:b5=0;P0=display[3];b5=1;music3();break;</p><p> case 0x7b:b5=0;P0=display[4];b5=1;music4();break;</p><p> case 0xe7:b5=
120、0;P0=display[5];b5=1;music5();break;</p><p> case 0xd7:b5=0;P0=0x40;b5=1;;break;</p><p> case 0xb7:b5=0;P0=0x40;b5=1;break;</p><p> case 0x77:b5=0;P0=0x40;b5=1;break;</p>
121、<p> case 0xff:b5=0;P0=0x40; b5=1;speaker=1;break;</p><p><b> }</b></p><p><b> }</b></p><p> /******************************************************
122、*****</p><p> *** 主程序 ***</p><p> ***********************************************************/</p><p> void main()</p><p&g
123、t;<b> {</b></p><p><b> b5=0;</b></p><p><b> P0=0x40;</b></p><p><b> b5=1;</b></p><p><b> P0=0x00;</b>&l
124、t;/p><p><b> b4=0;</b></p><p><b> P0=0xff;</b></p><p><b> b4=1;</b></p><p><b> IE=0x82;</b></p><p><b&g
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)(電子琴)
- 單片機(jī)課程設(shè)計(jì)-電子琴
- 單片機(jī)課程設(shè)計(jì)——電子琴
- 電子琴課程設(shè)計(jì)--基于單片機(jī)的電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---電子琴設(shè)計(jì)
- 單片機(jī)簡易電子琴單片機(jī)課程設(shè)計(jì)
- 電子琴課程設(shè)計(jì)--基于單片機(jī)的電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---電子琴設(shè)計(jì)
- 電子琴課程設(shè)計(jì)-- 基于單片機(jī)的電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)簡易電子琴
- 簡易電子琴單片機(jī)課程設(shè)計(jì)
- 簡易電子琴單片機(jī)課程設(shè)計(jì)
- 簡易電子琴單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--電子琴
- 電子琴單片機(jī)課程設(shè)計(jì)--電子琴模擬實(shí)驗(yàn)
- 單片機(jī)課程設(shè)計(jì)簡易電子琴
- 單片機(jī)課程設(shè)計(jì)——簡易電子琴
- 單片機(jī)課程設(shè)計(jì)---簡易電子琴
- 單片機(jī)課程設(shè)計(jì)—基于單片機(jī)的電子琴
- 單片機(jī)課程設(shè)計(jì)--簡易電子琴設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論