單片機(jī)課程設(shè)計(jì)——電子琴_第1頁
已閱讀1頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

評(píng)論

0/150

提交評(píng)論