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

下載本文檔

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

文檔簡介

-16-單片機課程設計設計報告電子音調發(fā)生器2016年4月29日目錄1課程設計總體目標 -2-1.1課題的意義 -2-1.2系統(tǒng)的主要功能 -2-1.3本人所做的工作 -2-2實驗原理及設計思路 -3-2.1樂曲的音調與節(jié)拍 -3-2.2紅外檢測原理 -3-3硬件電路設計及描述 -4-3.1硬件連接圖 -4-3.2單片機系統(tǒng) -5-3.3數碼管顯示電路 -6-3.4蜂鳴器電路 -6-4軟件設計流程及描述 -7-4.1蜂鳴器發(fā)單音 -7-4.2蜂鳴器唱歌 -7-4.3數碼管動態(tài)顯示 -7-4.4程序框圖 -8-4.5源程序代碼及注釋 -9-5實驗結果 -26-1總體設計1.1課題的意義通過這個實際的課題,熟悉51單片機的開發(fā)環(huán)境,熟悉JD-51的硬件電路圖,并能通過三種調試模式來調試程序,為日后進行一些基于單片機的系統(tǒng)開發(fā)打下基礎;掌握使用常用的匯編指令進行51單片機的程序設計,建立嚴謹的邏輯思維來編寫程序,學會畫程序框圖來幫助編程。通過使用蜂鳴器來產生相應音調的聲音,進一步鞏固課上學到的定時器初始化、賦初值、通過查詢方式來產生一定頻率方波的編程方法;掌握使數碼管掃描顯示數字的方法,并同時讓LED燈亮或滅,學會如何讓蜂鳴器發(fā)出不同頻率的聲音;了解NEC協議下的紅外編碼格式,能夠使用單片機來解碼收到的紅外信號,并讀取信號中相應的信息。1.2系統(tǒng)的主要功能電子音調發(fā)生器(1)利用JD51開發(fā)板上的按鍵S1~S4進行音調選擇,即按下不同的開關產生不同的音調,依次按動S1~S4及組合按鍵,蜂鳴器發(fā)出1234567i八個音調;并在數碼管上顯示。(2)編寫2支歌曲,并可進行選擇播放。1.3本人所做的工作通過學習課程平臺上給出的紅外和電子音調發(fā)生器這兩個程序,將電子音調發(fā)送器中關于按鍵掃描的部分換為對接收到的32位紅外信號數據中數據碼的反碼進行按鍵判斷跳轉相應歌曲或音調子程序。2實驗原理及設計思路2.1樂曲的音調與節(jié)拍①音調由不同頻率的方波產生,音調與頻率的關系如下表所示。要產生音頻方波,只要算出某一音頻的周期(1/頻率),然后將此周期除以2,即為半周期的時間。利用計時器計時此半周期時間,每當計時到后就將輸出方波的I/O反相,然后重復計時此半周期時間再對I/O反相,就可在I/O腳得到此頻率的方波。在JD-51單片機上,產生方波的I/O腳選用P2.4,P2.4口與蜂鳴器相連,這樣通過P2.4口輸出不同頻率的方波就能控制蜂鳴器發(fā)出不同音調的聲音。②音樂的節(jié)拍是由延時實現的,如果1拍為0.4秒,1/4拍是0.1秒。只要設定延時時間,就可求得節(jié)拍的時間。延時作為基本延時時間,節(jié)拍值只能是它的整數倍。音調1234567I頻率/Hz262294330349392440494523XF921F9E1FA8CFAD8FB68FBE9FC5BFC8F表1音調和發(fā)音頻率及定時器初值X的對應在定時器工作在工作方式1時每個音節(jié)相應的定時器初值x可按下法計算(1/2)×(1/f)=(12/fosc)×(216-x)x=216-(fosc/24f)(1)其中,f是音調頻率,JD-51單片機的晶振fosc=11.0592Mhz。曲調值DELAY調4/4125ms調3/4187ms調2/4250ms表2各節(jié)拍延時時間對應關系3硬件電路設計及描述3.1硬件連接圖系統(tǒng)的硬件連接圖包括,晶振電路,復位電路,數碼管顯示電路,紅外發(fā)送和接收電路,蜂鳴器電路,硬件連接如下圖所示:圖4紅外高級電子琴硬件連接圖3.2單片機系統(tǒng)ATMEL公司生產的AT89S52單片機是硬件電路的核心部分,時鐘電路晶振使用12MHz,復位電路采取按鍵復位方式。具體連接如下:圖5單片機系統(tǒng)的時鐘電路圖6單片機系統(tǒng)的復位電路3.3數碼管顯示電路顯示電路采用4個共陽極數碼管,P0口作為數碼管的輸入,P2.0、P2.1、P2.2、P2.3分別控制四個數碼管的亮與不亮,P0口控制數碼管亮的是數字幾。圖7數碼管連接圖3.4蜂鳴器電路我們用的蜂鳴器是直流蜂鳴器,驅動簡單,一旦在引腳上加入直流電源它就會發(fā)出一定頻率的聲音,此時聲音的音調和音量是固定的,它與單片機的連接方式如下圖所示。Buzzer與P2.4相連,P2.4輸出不同頻率的方波信號,蜂鳴器就會發(fā)出不同的聲音。如果控制輸出信號的頻率和音長,蜂鳴器則會發(fā)出音樂。圖8蜂鳴器電路圖4軟件設計流程及描述4.1蜂鳴器發(fā)單音根據不同音調的頻率值算出該給定時器賦的初值,利用定時溢出后P2.4口電平的翻轉來產生和音調頻率相同的方波,雖然不是正弦波,聽起來有點不自然,但也能聽出1234567i這8個音調。4.2蜂鳴器播放歌曲蜂鳴器播放歌曲是基于節(jié)拍表和音符表的基礎上的,其基本原理與發(fā)出單個頻率的聲音類似,只不過確定了單個頻率發(fā)聲的時長即節(jié)拍長,和不同頻率發(fā)聲的順序,可以通過查表的方式來使定時器產生不同頻率的方波,加入設定好的節(jié)拍,就相當于延時,便可以聽到音樂。4.3數碼管動態(tài)顯示所謂動態(tài)掃描顯示即輪流向各位數碼管送出字形碼和相應的位選,利用發(fā)光管的余輝和人眼視覺暫留作用,使人的感覺好像各位數碼管同時都在顯示。對于每一位顯示器來說,每隔一段時間點亮一次。顯示器的亮度既與導通電流有關,也與點亮時間和間隔時間的比例有關。通過調時間參數,可以既保證亮度,又保證顯示。透過分時輪流控制各個LED數碼管的COM端,就使各個數碼管輪流受控顯示,這就是動態(tài)驅動。在輪流顯示過程中,每位元數碼管的點亮時間為1~2ms,由于人的視覺暫留現象及發(fā)光二極體的余輝效應,盡管實際上各位數碼管并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示資料,不會有閃爍感,動態(tài)顯示的效果和靜態(tài)顯示是一樣的,能夠節(jié)省大量的資源,而且功耗更低。開始4.4程序框圖開始將開關狀態(tài)送將開關狀態(tài)送P3.2,P3.3,P3.4,P3.1,P3.6查詢鍵盤按鍵狀態(tài)查詢鍵盤按鍵狀態(tài)跳轉到相應子程序跳轉到相應子程序令令P3.5口發(fā)出相應頻率的方波圖9電子音調發(fā)生器流程圖4.5源程序代碼及注釋/*==================================電子音調發(fā)生器==================================******************************程序功能說明***************************通過s1,s2,s3,s4四個按鍵組合,根據按鍵組合值讓蜂鳴器播放1234567i相應的音調,以及兩首歌********************************************************************/ORG0000H LJMPKEYP0KEYP0:MOVR0,#00H;CLRTR0;SETBP2.4 ;關蜂鳴器CLRP2.0CLRP2.1CLRP2.2CLRP2.3 ;關用于表示音調的數碼管SETBP2.0 ;關用于表示模式的數碼管WU:MOVR0,P3 ;掃描鍵盤輸入CJNER0,#0FFH,KEYPO1 ;有輸入時跳轉JMPKEYP0KEYPO1:CJNER0,#0FBH,KEYPO2;SETBP2.4;蜂鳴器置于高電平MOVR3,#200MAIN01:MOVTMOD,#01H;初始化,工作方式1MOVTL0,#21H;寫入計數初值MOVTH0,#0F9HSETBTR0;啟動計數 WAIT1:JNBTF0,WAIT1CLRTF0CPLP2.4;蜂鳴器響 CLRP2.3;數碼管顯示1 MOVA,#11111001B MOVP0,ADJNZR3,MAIN01 LJMPKEYP0;返回程序KEYP0 KEYPO2:CJNER0,#0F7H,KEYPO3;SETBP2.4;蜂鳴器置于高電平 MOVR3,#200MAIN02:MOVTMOD,#01HMOVTL0,#0E1H;寫入計數初值MOVTH0,#0F9HSETBTR0WAIT2:JNBTF0,WAIT2CLRTF0CPLP2.4;蜂鳴器響 CLRP2.3; MOVA,#10100100B MOVP0,ADJNZR3,MAIN02 LJMPKEYP0KEYPO3:CJNER0,#0EFH,KEYPO4;SETBP2.4;蜂鳴器置于高電平 MOVR3,#200MAIN03:MOVTMOD,#01HMOVTL0,#08CHMOVTH0,#0FAHSETBTR0WAIT3:JNBTF0,WAIT3CLRTF0CPLP2.4 CLRP2.3 MOVA,#10110000B MOVP0,ADJNZR3,MAIN03 LJMPKEYP0KEYPO4:CJNER0,#0DFH,KEYPO5;SETBP2.4 MOVR3,#200MAIN04:MOVTMOD,#01HMOVTL0,#0D8HMOVTH0,#0FAHSETBTR0WAIT4:JNBTF0,WAIT4CLRTF0CPLP2.4 CLRP2.3 MOVA,#10011001B MOVP0,ADJNZR3,MAIN04 LJMPKEYP0KEYPO5: CJNER0,#0F3H,KEYPO6;SETBP2.4 MOVR3,#200MAIN05:MOVTMOD,#01HMOVTL0,#068HMOVTH0,#0FBHSETBTR0WAIT5:JNBTF0,WAIT5CLRTF0CPLP2.4 CLRP2.3 MOVA,#10010010B MOVP0,ADJNZR3,MAIN05 LJMPKEYP0KEYPO6:CJNER0,#0E7H,KEYPO7;SETBP2.4 MOVR3,#200MAIN06:MOVTMOD,#01HMOVTL0,#0E9HMOVTH0,#0FBHSETBTR0WAIT6:JNBTF0,WAIT6CLRTF0CPLP2.4 CLRP2.3 MOVA,#10000010B MOVP0,ADJNZR3,MAIN06 LJMPKEYP0KEYPO7:CJNER0,#0CFH,KEYPO8;SETBP2.4 MOVR3,#200MAIN07:MOVTMOD,#01HMOVTL0,#05BHMOVTH0,#0FCHSETBTR0WAIT7:JNBTF0,WAIT7CLRTF0CPLP2.4 CLRP2.3 MOVA,#11111000B MOVP0,ADJNZR3,MAIN07 LJMPKEYP0KEYPO8:CJNER0,#0DBH,KEYPO9;SETBP2.4 MOVR3,#200MAIN08:MOVTMOD,#01HMOVTL0,#08FHMOVTH0,#0FCHSETBTR0WAIT8:JNBTF0,WAIT8CLRTF0CPLP2.4 CLRP2.3 MOVA,#10000000B MOVP0,ADJNZR3,MAIN08 LJMPKEYP0KEYPO9:CJNER0,#0EBH,KEYPO10;跳轉到第一首歌程序LJMPMUSTART1KEYPO10:CJNER0,#0D7H,JIELI;跳轉到第二首歌程序LJMPMUSTART2JIELI:JMPKEYP0;返回主程序MUSTART1:;播放第一首歌MOVR0,#00H;將節(jié)拍表指針置零MOVR1,#00H;將音符表指針置零RTAB:MOVA,R0MOVDPTR,#RYTHMOVCA,@A+DPTR;利用查表法將一個節(jié)拍數據取出放R2計數器中MOVR2,ATTAB:MOVA,R1MOVDPTR,#TONEMOVCA,@A+DPTRMOVR3,A;取出音符表高8位INCR1;指針加1MOVA,R1MOVDPTR,#TONEMOVCA,@A+DPTRMOVR4,A;取出音符表低8位SETBP2.4;輸出相應音調的方波LOOP:MOVR5,#3BHMAIN:MOVTMOD,#01HMOVTL0,R4MOVTH0,R3SETBTR0WAIT:JNBTF0,WAITCLRTF0CPLP2.4MAYA:JBP3.2,MAYB;判斷P3.2口是否有為1JBP3.4,MAYB;判斷P3.4口是否有為1LJMPRA;P3.4口為0則跳轉到程序RAMAYB:JBP3.3,JIELI;判斷P3.3口是否有為1JBP3.5,JIELI;判斷P3.5口是否有為1LJMPMUSTART2;P3.5口為0則放第二首歌RA:DJNZR5,MAIN;無打斷則繼續(xù)放第一首歌DJNZR2,LOOPINCR0;兩個表的指針都加1INCR1CJNER1,#88,RTAB;判斷是否取完LJMPKEYP0TONE:DB0FBH,68H,0FDH,6EH,0FDH,45H,0FCH,0EFH,0FCH,8FH,0FCH,8FH,0FCH,8FH,0FCH,5BH,0FCH,8FHDB0FCH,0EFH,0FDH,45H,0FBH,68H,0FBH,68H,0FCH,8FH,0FCH,5BH,0FBH,0E9H,0FBH,68H,0FBH,68HDB0FAH,0DBH,0FAH,8CH,0F9H,21H,0FAH,8CH,0FAH,0D8H,0FBH,68H,0FBH,68H,0FBH,68H,0FBH,68HDB0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FBH,0E9H,0FCH,5BH,0FAH,8CH,0FCH,8FH,0FCH,8FH,0FCH,5BHDB0FCH,8FH,0FCH,0EFH,0FCH,0EFH,0FCH,0EFH,0FCH,8FH,0FDH,45H,0FDH,6EH,0FCH,0EFHRYTH:DB04,04,04,04,04,04,04,04,04,04DB04,05,04,04,04,04,04,04,04,04DB04,04,04,06,04,04,04,07,04,04DB04,04,04,06,04,04,04,07,04,04DB04,04,04,04MUSTART2: MOVR0,#00HMOVR1,#00HRTAB2:MOVA,R1MOVDPTR,#TABLE1MOVCA,@A+DPTRMOVR2,ATTAB2:MOVA,R1MOVDPTR,#TONE2MOVCA,@A+DPTRMOVR3,AINCR1 MOVA,R1 MOVDPTR,#TONE2 MOVCA,@A+DPTR MOVR4,ASETBP2.4LOOP2:MOVR5,#9BHMAIN2:MOVTMOD,#01HMOVTL0,R4MOVTH0,R3SETBTR0WAITR:JNBTF0,WAITRCLRTF0CPLP2.4MAYA1:JBP3.3,MAYB1JBP3.5,MAYB1LJMPRBMAYB1:JBP3.2,BACKJBP3.4,BACKLJMPMUSTART1BACK:LJMPJIELIRB:DJNZR5,MAIN2DJNZR2,LOOP2INCR0INCR1CJNER1,#64,RTAB2LJMPKEYP0TONE2:DB0FBH,68H,0FDH,6EH,0FDH,45H,0FCH,0EFH,0FCH,8FH,0FCH,8FH,0FCH,8FH,0FCH,5BH,0FCH,8FHDB0FCH,0EFH,0FDH,45H,0FBH,68H,0FBH,68H,0FCH,8FH,0FCH,5BH,0FBH,0E9H,0FBH,68H,0FBH,68HDB0FAH,0DBH,0FAH,8CH,0F9H,21H,0FAH,8CH,0FAH,0D8H,0FBH,68H,0FBH,68H,0FBH,68H,0FBH,68HDB0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FBH,0E9H,0FCH,5BH,0FAH,8CH,0FCH,8FH,0FCH,8FH,0FCH,5BHDB0FCH,8FH,0FCH,0EFH,0FCH,0EFH,0FCH,0EFH,0FCH,8FH,0FDH,45H,0FDH,6EH,0FCH,0EFHTABLE1:DB04,04,04,04,04,04,04,04,04,04DB04,05,04,04,04,04,04,04,04,04DB04,04,04,06,04,04,04,07,04,04DB04,04,04,06,04,04,04,07,04,04DB04,04,04,04END【電子音調發(fā)生的部分C語言程序】/******鍵盤輸入函數******/ucharkeyscan(ucharkey){if(K1==1&&K2==1&&K3==1&&K4==1) { //初始化 delay(20); if(K1==1&&K2==1&&K3==1&&K4==1) { key=0; } } if(K1==0&&K2==1&&K3==1&&K4==1) { //1音,SB1按下 delay(20); if(K1==0&&K2==1&&K3==1&&K4==1) { key=1; } } if(K1==1&&K2==0&&K3==1&&K4==1){ //2音,SB2按下 delay(20); if(K1==1&&K2==0&&K3==1&&K4==1){ key=2; } } if(K1==1&&K2==1&&K3==0&&K4==1){ //3音,SB3按下 delay(20); if(K1==1&&K2==1&&K3==0&&K4==1){ key=3; } } if(K1==1&&K2==1&&K3==1&&K4==0){ //4音,SB4按下 delay(20); if(K1==1&&K2==1&&K3==1&&K4==0){ key=4; } } if(K1==0&&K2==0&&K3==1&&K4==1){ //5音,SB1和SB2按下 delay(20); if(K1==0&&K2==0&&K3==1&&K4==1){ key=5; } } if(K1==1&&K2==0&&K3==0&&K4==1){ //6音,SB2和SB3按下 delay(20); if(K1==1&&K2==0&&K3==0&&K4==1){ key=6; } } if(K1==1&&K2==1&&K3==0&&K4==0){ //7音,SB3和SB4按下 delay(20); if(K1==1&&K2==1&&K3==0&&K4==0){ key=7; } } if(K1==0&&K2==1&&K3==1&&K4==0){ //i音,SB1和SB4按下 delay(20); if(K1==0&&K2==1&&K3==1&&K4==0){ key=8; } } if(K1==0&&K2==1&&K3==0&&K4==1){ //第一首歌,SB1和SB3按下 delay(20); if(K1==0&&K2==1&&K3==0&&K4==1)

溫馨提示

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

評論

0/150

提交評論