單片機課程設計電子音調(diào)發(fā)生器_第1頁
單片機課程設計電子音調(diào)發(fā)生器_第2頁
單片機課程設計電子音調(diào)發(fā)生器_第3頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、單片機課程設計實驗報告電子音調(diào)發(fā)生器姓名:日期:2009年 6 月 29 日星期一目錄(一)實驗目的.錯誤 !未定義書簽。(二)設計任務及要求.錯誤 !未定義書簽。(三)工作原理及設計思路.錯誤 !未定義書簽。(四)實現(xiàn)功能設計.錯誤 !未定義書簽。(五)軟件設計.錯誤 !未定義書簽。(六)電路設計.錯誤 !未定義書簽。(七)調(diào)試.錯誤 !未定義書簽。(八)實驗體會錯誤 !未定義書簽。(一)實驗目的1了解計算機發(fā)聲原理。2 熟悉定時器和鍵盤掃描電路的工作原理及編程方法。(二)設計任務及要求利用實驗平臺上的開關 k0-k7 和蜂鳴器設計電子音調(diào)發(fā)生器,要求:1利用實驗平臺上開關 k0-k7 進行

2、音調(diào)選擇, 即撥動不同的開關產(chǎn)生不同的音調(diào),依次撥動 K0K7,蜂鳴器發(fā)出 1234567i 八個音調(diào)。2編寫 2支歌曲,并可進行選擇播放。(三)工作原理及設計思路音節(jié)由不同頻率的方波產(chǎn)生, 音節(jié)與頻率的關系如表 1 所示。要產(chǎn)生音頻方波,只要算出某一音頻的周期( 1/ 頻率),然后將此周期除以 2,即為半周期的時間。利用計時器計時此半周期時間,每當計時到后就將輸出方波的 I/0 反相,然后重復計時此半周期時間再對 I/O 反相,就可在 I/O 腳得到此頻率的方波。 在 ZKS-03 實驗儀上,產(chǎn)生方波的 I/O 腳選用,通過跳線選擇器 JP1 將單片機的與蜂鳴器的驅(qū)動電路相連。 這樣輸出不同

3、頻率的方波, 蜂鳴器便會發(fā)出不同的聲音。另外,音樂的節(jié)拍是由延時實現(xiàn)的,如果 1 拍為秒, 1/4 拍是秒。只要設定延時時間,就可求得節(jié)拍的時間。 延時作為基本延時時間, 節(jié)拍值只能是它的整數(shù)倍,每個音節(jié)相應的定時器初值X 可按下法計算:( 1/2 ) *(1/f)=(12/fose)*(216-x) 即 x=216-(fose/24f)其中 f: 音調(diào)頻率,當晶振 fose= 時,音節(jié)“ 1”相應的定時器初值為 x, 則可得x=63777D=F921H其它的可同樣求得。表 1頻率( Hz)X(HEX)音調(diào)1262F9212294F9E13330FA8C4349FAD85392FB686440

4、FBE97494FC5Bi523FC8F(四)實現(xiàn)功能設計實現(xiàn)兩個主要功能: 電子琴與音樂播放; 一個輔助功能: 在液晶上顯示相關信息。1、電子琴: 4*4 的矩陣 16 個按鍵,按鍵 0 實現(xiàn)兩個功能的切換,其余按鍵分別發(fā)出音調(diào)低音 5、 6、 7,中音 1、 2、 3、 4、 5、 6、7,高音 1、2、3、4、5。發(fā)音的同時在液晶顯示屏上顯示出對應的音調(diào)。2、音樂播放:按鍵0 實現(xiàn)兩個功能的切換,按鍵1 實現(xiàn)播放類型選擇(單曲循環(huán)播放、所有循環(huán)播放) ,其余按鍵分別對應一首歌。目前已經(jīng)有9 首歌。播放的同時,在液晶上顯示出歌名。(五)軟件設計根據(jù)要實現(xiàn)的功能,流程圖如下:開始系統(tǒng)初始化功

5、能選擇音樂#include <>#include <>#define nop _nop_()#define uchar unsigned char#define uint unsigned int#define PAI_BASE 15#define MUSIC_NUM 9#define SCAN_CYCLE 500#define BEEP P3_3/*液晶顯示相關變量 */sbit LCD_RS = P27;sbit LCD_RW = P26;sbit LCD_EN = P25;static uchar th0_f; 0c0f0c0F0F.Record();."

6、;);break;case 2:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string("6.");Record();break;case 3:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string("7.");Record();break;case 4:disptime

7、_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string("1");Record();break;case 5:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string("2");Record();break;case 6:disptime_flag=0;th0_f=c_musicFreqk

8、ey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string("3");Record();break;case 7:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string("4");Record();break;case 8:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreq

9、key-1%256;TR0 = 1;lcd_init();lcd_string("5");Record();break;case 9:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string("6");Record();break;case 10:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_ini

10、t();lcd_string("7");Record();break;case 11:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string(".1");Record();break;case 12:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string(".2

11、");Record();break;case 13:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string(".3");Record();break;case 14:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string(".4");Record();break

12、;case 15:disptime_flag=0;P2_4=0;lcd_init();Record_flag+;if(Record_flag=1)Record_counter=0;Record_time=0;lcd_string("Record ");else if(Record_flag=2)lcd_init();lcd_string(" Record play ");Record_music+Record_counter=0x00;Music_flag=1;Rplay_flag=1;TH0=0;TL0=0;TR0=0;while(key=keysca

13、n()!=15);else if (Record_flag=3)lcd_init();lcd_string("Electone ");Music_flag=0;Rplay_flag=0;Record_flag=0;Freq_flag=1;break;case 16:P3_3=0;TR0=0;Record();break;if(key=0) P3_3=0;break;void Music(void)P2_4=0;Freq_flag=1;lcd_init();disptime_flag=1;lcd_string("Music");Music_flag=0;k

14、ey=16;delay(10);s_musicCounter=10;s_tableCounter=0;TR0=0;P3_3=0;while(1)if(s_musicCounter=1)Music_flag=1;disptime_flag=0;lcd_init();lcd_moving(" Happy Birthday ");/ lcd_string(" Happy Birthday ");else if(s_musicCounter=2)Music_flag=1;disptime_flag=0;lcd_init();lcd_moving(" T

15、wo Butterflies ");else if(s_musicCounter=3)Music_flag=1;disptime_flag=0;lcd_init();lcd_moving("Mouse Loves Rice ");else if(s_musicCounter=4)Music_flag=1;disptime_flag=0;lcd_init();lcd_moving(" Awakening ");else if(s_musicCounter=5)Music_flag=1;disptime_flag=0;lcd_init();lcd_

16、moving(" dae jang geum ");else if(s_musicCounter=6)Music_flag=1;disptime_flag=0;lcd_init();lcd_moving("walking on Road of Life ");else if(s_musicCounter=7)Music_flag=1;disptime_flag=0;lcd_init();lcd_moving("Most romantic thing");else if(s_musicCounter=8)Music_flag=1;dis

17、ptime_flag=0;lcd_init();lcd_moving("After 1000 years");else if(s_musicCounter=9)Music_flag=1;disptime_flag=0;lcd_init();lcd_moving("Lonely life");else if(key>10) TR0=0;P3_3=0; while(key2=(key=keyscan() nop;TR0=1;key2=key;if(key=0)P3_3=0;Freq_flag=0;Music_flag=0;K0_flag=0;TR0=0

18、;break;else if(key=1)musicAutoFlag=musicAutoFlag;if(musicAutoFlag=1) P2_4=1;else P2_4=0;else if(key=15) disptime();else if(key>9&&key<15) nop;elses_musicCounter=key-1;s_tableCounter=0;void main(void)/*主程序入口 */IE=0;P0=0xff;P2=0xff;/*初始化 T*/TMOD=0x11;/*Timer0 、Timer1 工作在案 MODE1,16位定時器 */

19、TH1=(65536-10000)/256;/* 設定 Timer1 每 10ms中斷一次 */TL1=(65536-10000)%256;TR1=1;TH0=(65536-SCAN_CYCLE)/256; /*設定 Timer0 每隔 SCAN_CYCLEu中斷一次*/TL0=(65536-SCAN_CYCLE)%256;TR0 = 1;ET0 = 1;ET1 = 1;EA=1;P2_4=0;P3_3=0;/* 關喇叭 */while(1)if(K0_flag=0)Electone();/電子琴功能else Music();/播放音樂/ 定時中斷 0, 用于產(chǎn)生唱歌頻率void timer0

20、() interrupt 1 using 1if(Freq_flag=1)TL0=tl0_f;TH0=th0_f; /調(diào)入預定時值BEEP=BEEP;/取反音樂輸出IOelseTH0=(65536-SCAN_CYCLE)/256; /*設定 Timer0 每隔 SCAN_CYCLEu中斷一次*/TL0=(65536-SCAN_CYCLE)%256;void timer1() interrupt 3 using 2uchar ucharTemp,ucharTemp1,TH0temp,TL0temp; uint temp;static uchar paiCounter,paiNum;TH1=(65

21、536-10000)/256; /* 設定 Timer1 每 10ms中斷一次 8ms*/ TL1=(65536-10000)%256;if(Record_flag=1) Record_time+;timecounter();/時間每秒加一,正常顯示if (Music_flag=1)if(+paiCounter>=paiNum)/*音樂一拍的時間到了 */paiCounter=0;if(Rplay_flag=2) if(TR0=0) TR0=1;s_musicCounter=0x20;switch(s_musicCounter)/*根據(jù)當前音樂編號查找下一個音樂標識碼 */case 0x

22、01:ucharTemp=c_music1s_tableCounter+;break; case 0x02:ucharTemp=c_music2s_tableCounter+;break; case 0x03:ucharTemp=c_music3s_tableCounter+; break; case 0x04:ucharTemp=c_music4s_tableCounter+;break; case 0x05:ucharTemp=c_music5s_tableCounter+; break; case 0x06:ucharTemp=c_music6s_tableCounter+; break

23、; case 0x07:ucharTemp=c_music7s_tableCounter+; break; case 0x08:ucharTemp=c_music8s_tableCounter+; break; case 0x09:ucharTemp=c_music9s_tableCounter+; break;case0x20:ucharTemp=Record_musics_tableCounter+;break;case 0x00:ucharTemp=c_music0s_tableCounter+; break; default:break;if(ucharTemp=0x00)/*如果查到

24、0x00 則表示本首歌曲結束*/Freq_flag=0;paiNum=4*PAI_BASE;/*停止發(fā)聲 */*本首歌曲 結束 后停頓4*PAI_BASE*10ms=600ms再繼續(xù)播放*/P3_3=0;/*把喇叭關掉*/s_tableCounter=0;if(musicAutoFlag=1)/*如果歌曲自動循環(huán)播放功能打開則跳到下一首歌曲*/s_musicCounter+;if(s_musicCounter>(uchar)MUSIC_NUM)s_musicCounter=0x01;else/*如果查到非0x00 則表示是音樂標識碼 */paiNum=(ucharTemp&0x0

25、f)*PAI_BASE;/*音樂標識碼的低四位為節(jié)拍碼 */ucharTemp1=(ucharTemp&0xf0)>>4;/*音樂標識碼的高四位為音頻碼 */if(ucharTemp1=0)/*如果音頻碼為零則表示不發(fā)音 */P3_3=0;Freq_flag=0;temp=65536-SCAN_CYCLE;TH0temp=temp>>8;/*temp/256相當于右移 8 位*/TL0temp=temp-(temp>>8)<<8);/*temp%256*/TH0=TH0temp;TL0=TL0temp;Freq_flag=0;else/*

26、如果音頻碼不為零則按此改變Timer0的中斷周期*/Freq_flag=0;temp=c_musicFrequcharTemp1-1;TH0temp=temp>>8;/*temp/256相當于右移 8 位*/TL0temp=temp-(temp>>8)<<8);/*temp%256*/TH0=TH0temp;TL0=TL0temp;th0_f=TH0;/*保存新的代表音頻的 Timer0 周期值 */tl0_f=TL0;Freq_flag=1;程序說明:在此程序中,主要分為三大塊:1、鍵盤掃描; 2、液晶顯示; 3、音頻產(chǎn)生。程序大部分時間在掃描4*4 矩陣

27、鍵盤,通過線反轉法讀入數(shù)據(jù),判斷按鍵;若實現(xiàn)的是電子琴功能,則用1602 顯示按鍵對應的譜,若實現(xiàn)的是音樂播放功能,則顯示對應的歌名;音頻產(chǎn)生由T0、T1 兩個定時器來完成, T0 實現(xiàn) I/O/口的反轉,產(chǎn)生音頻, T1 實現(xiàn)延時,即音樂的節(jié)拍。(六)電路設計本電路由 89S52、LCD1602、16 個按鍵、復位電路、 12M晶振、 7805、 9V 電池等組成。完成單片機的基本連接即晶振及復位電路后,用 P1 口 8 個口連接并控制 4*4 ,即 16 個按鍵構成的鍵盤,由 P0 口以及、控制液晶顯示器 LCD1602,用輸出不同音調(diào)的頻率控制蜂鳴器發(fā)音。蜂鳴器電路:晶振及復位電路開關連

28、接電路:LCD1602電路連接:(七)調(diào)試此次實驗的的硬件電路很簡單,外圍電路只有一個4*4矩陣,復位電路,晶振電路,蜂鳴器。主要是軟件的編寫與調(diào)試。在沒加液晶顯示前:問題一:程序?qū)懞?,燒錄在單片機中,單片機沒有反應,經(jīng)檢查硬件電路沒有問題,最后發(fā)現(xiàn)是單片機壞了,換了一塊單片機就可以用了。問題二:當使用電子琴功能的時候,按鍵不放手,會出現(xiàn)嘟嘟聲聲音不連續(xù)改動程序,將放開按鍵設置為關定時器,這樣按鍵不放聲音就連續(xù)。問題三:功能無法切換。功能標志設定為 bit 型,判斷功能的時候用 case 語句,運行時不知什么原因無法判別,將 case 語句改用 if 語句程序可以判別,切換功能可以實現(xiàn)。問題四

29、:在播放音頻的空隙時間有一個固定的音頻雜音。檢查電路,蜂鳴器使用 NPN管來驅(qū)動,在沒有音頻的時候若輸出為高電平, 則三極管飽和導通, 蜂鳴器發(fā)聲,在無需音頻的地方加上 P3_3=0;語句,可以消除雜音。效果明顯。問題五:音樂循環(huán)播放功能無法切換。程序 if 條件出錯,無法切換,改后切換功能可以實現(xiàn)。加上液晶顯示后:問題六:按鍵不靈敏。重新寫程序,在延時程序中加入鍵盤掃描,按鍵靈敏且不影響其他功能的實現(xiàn)。(八)實驗體會硬件電路需要動腦子的地方少, 鍵盤可以買到, 只要插到 P1 口就行,但是為了鍛煉一下自己的動手能力,自己買了 16 個按鍵,一個一個焊上去,焊出 4*4 矩陣,這樣對鍵盤也有根深層次的了解。每次寫程序都有很多收獲, 每

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論