stm32f103電子琴課設報告 終極版(1)_第1頁
stm32f103電子琴課設報告 終極版(1)_第2頁
stm32f103電子琴課設報告 終極版(1)_第3頁
stm32f103電子琴課設報告 終極版(1)_第4頁
stm32f103電子琴課設報告 終極版(1)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 單片機課程設計 題目:實現(xiàn)簡易電子琴 院 (系): 專 業(yè): 班 級: 學 生: 學 號: 指導教師: 2016年6月26日簡易電子琴的設計與實現(xiàn)摘要: 本次設計是利用單片機設計簡易電子琴。 其主要功能為:按下不同按鍵,發(fā)出不同1 、2 、3、4 、5 、6 、7 七個音符并且用LED 或LCD顯示當前按鍵。選用stm32f103VE,它有8個定時器,部分定時器有多達4個用于輸入捕獲/輸出比較/PWM或脈沖計數(shù)的通道和增量編碼器輸入。利用芯片內(nèi)部相關定時器來輸出PWM,從而來驅動蜂鳴器。通過讀取外部按鍵輸入的值來相應改變定時器相關寄存器的值,從而來改變PWM的輸出頻率來達到發(fā)出不同音調(diào)。 關

2、鍵詞: STM32f103VE;蜂鳴器;定時器The Design of the KeyboardAbstract: This design is the professional direction of biomedical engineering design. Using Single Chip Microcomputer to achieve a simple Keyboard. Its main function is: While a user press the different keys, it will make different sounds from the buz

3、zer and display different numbers which corresponded to the sounds. Using stm32f103- -C8T6 as control chip. It has16-bit timers. Some of them with up to 4 IC/OC/PWM or pulse counter. Making use of the Timers to generate driving signal .By reading the state of the external key to change the frequency

4、 of output . Different frequency of the PWM will control buzzer makes different sounds.Key words: STM32f103; signal; Timer 一 、設計目的:通過本次綜合設計,旨在運用已經(jīng)學過的知識,根據(jù)題目的要求進行軟硬件系統(tǒng)的設計和調(diào)試,對在單片機的原理及應用課程中涉及的芯片結構、控制原理、硬件和編程等方面有一定的感性認識和實踐操作能力。從而加深對本課程知識點的理解,對于設計能力,調(diào)試能力,以及分析處理問題的能力得到了一定的提高。其目的是讓學生得到一次進行獨立設計的工程實踐鍛煉,不僅培養(yǎng)

5、嚴謹?shù)目茖W態(tài)度和扎實的實踐技能、良好的工程意識,并在設計中學會如何發(fā)現(xiàn)、分析和解決工程實踐問題的技能和方法,將所學知識綜合應用于工程實踐中,為后續(xù)的畢業(yè)設計做好準備。二、 控制要求:利用stm32系列單片機設計簡易電子琴。 功能要求: (1) 按下不同按鍵,發(fā)出不同1 、2 、3、4 、5 、6 、7 七個音符; (2) 用LED 或LCD顯示當前按鍵三 設計原理:單片機可以驅動蜂鳴器或其他揚聲器發(fā)出聲音,可以控制其發(fā)出不同的聲調(diào),從而連接起來構成一個曲子。一般來說,單片機不像其他專業(yè)樂器能奏出各種音色的聲音,單片機的音樂基本上都是單色頻率。1)音調(diào):在音樂中把C上方的A音定為標準音高,其頻率

6、為f=440Hz,其余音均與之比較。音符do與音符i之間正好相差一個倍頻程,即相差一個八度音。在一個八度音中,有12個半音。只要知道了這12個音符的音高,就可以根據(jù)音符之間的倍頻程關系得到其他音符基本的音調(diào)頻率。知道了一個音符的頻率之后,編可以讓單片機發(fā)出相應的頻率的振蕩信號,從而產(chǎn)生相應的音符聲音,常采用的方法是通過單片機的定時器進行定時中斷,在中斷服務子程序中,將單片機上外界揚聲器的I/O口來回置高電平或低電平,從而讓揚聲器發(fā)出聲音。為了讓單片機發(fā)出不同頻率的音符的聲音,只需將定時器預置不同的定時值來實現(xiàn)。 以標準音高A為例,標準音高的A的頻率f=440Hz,其對應周期為T=1/f=227

7、2s,單片機上定時器的中斷觸發(fā)時間為t=T/2=1136s,如果單片機外接12MHz的晶振,則F0=12MHz,則標準音高A在單片機定時器工作方式1下定時器高低計數(shù)器的初值為:TH=FBH,TL=90H.2)節(jié)拍:如果規(guī)定一拍的時長為400ms,那么以四分音符為節(jié)拍時,四分音符的時長為400ms,八分音符的時長為200ms,十六分音符的時長為100ms.從而在單片機上可以采用循環(huán)延時的方法來實現(xiàn)控制一個音符唱多長時間。首先要編寫一個精確的基本時長的延時程序,如果以八分音符的時長為基本延時時間,那么對于一個音符,如果它是四分音符,只需調(diào)用四次延時程序,如果它是二分音符,則需要調(diào)用八次延時程序。以

8、此類推。3)演奏音樂的方法: Step1:將樂譜中的每個音符的音調(diào)及節(jié)拍變換成相應的音調(diào)參數(shù)和節(jié)拍數(shù); Step2:將這些參數(shù)做成數(shù)據(jù)表格,存放在存儲器中; Step3:通過按鍵調(diào)用程序去取出一個音符的相關參數(shù),播放該音符; Step4:播放完該音符后,等待下一次按鍵調(diào)用程序去取出下一次音符的 相關參數(shù),再播放音符; Step5:對于演奏音樂,一般將休止符的音調(diào)參數(shù)設置為FFH,節(jié)拍參數(shù)設 置為00H.蜂鳴器驅動電路 此次設計選用有源蜂鳴器。有源蜂鳴器的發(fā)聲原理是電流通過電磁線圈,使電磁線圈產(chǎn)生磁場來驅動振動膜發(fā)音,因此需要一定的電流才能驅動它。單片機的I/O引腳的輸出電流比較小輸出的TTL電

9、平基本上驅動不了蜂鳴器,因此需要增加一個電流放大的電路,如圖4-4所示,選用NPN的三極管來達到電流放大的作用。圖1-1 蜂鳴器驅動電路按鍵電路:按鍵都采用了上拉電阻,當按鍵處于不被按下的狀態(tài)時,連接到單片機的一端的輸入信號為高電平,當按鍵按下時,輸入為低電平,如圖4-6所示。圖1-2 按鍵電路四 設計任務和主要內(nèi)容: 主要內(nèi)容: 利用實驗資源實現(xiàn)簡易電子琴的簡單功能:(1)利用蜂鳴器發(fā)出不通的聲音(2)使用lcd顯示器來顯示音階輸入的相關信息(3)當按下鍵盤相對按鍵,蜂鳴器會發(fā)出相對音階的單音,共有 兩個8度音階(4)至少可以輸入16個單音,可以一起演奏出來(5)演奏時可以按鍵中斷(6)按下

10、音樂播放鍵可以自動播放預先存在內(nèi)存中的曲子 主要技術指標和要求: (1)充分應用已給出的開發(fā)板硬件的資源進行設計(2)通過改變占空比產(chǎn)生不同頻率的信號 (3)實現(xiàn)按鍵發(fā)出的相對音階的單音(4)可以按照已經(jīng)編好的樂譜演奏出相應的音樂五 單片機控制系統(tǒng)原理: 本次課程設計采用atmel公司stm32f103VE單片機,stm32f103VE是低電壓,高性能的cmos8位單片機,片內(nèi)含8KB的程序存儲器和12B的隨機存取數(shù)據(jù)存儲器,其主要功能特性為:兼容MCS51指令系統(tǒng)·32個雙向I/O口·3個16位可編程定時/計數(shù)器中斷·2個串行中斷·2個外部中斷源

11、83;2個讀寫中斷口線·3級加密位·低功耗空閑和耗電模式·軟件設置睡眠和喚醒功能等.單片機必須在時鐘的驅動下才能工作,在單片機內(nèi)部有一個時鐘振蕩電路,只需要外接一個振蕩源就能產(chǎn)生一定的時鐘信號送到單片機內(nèi)部的各個單元,決定單片機的工作速度。單片機的定時控制功能是用時鐘電路和振蕩器完成的,而根據(jù)硬件電路的不同,連接方式分為內(nèi)部時鐘方式和外部時鐘方式。本次設計中采用內(nèi)部時鐘方式。在按鍵中常產(chǎn)生毛刺現(xiàn)象,要消除“毛刺”現(xiàn)象,最常用的方法是即時重復掃描法,延時法的原理是:毛刺脈沖一般持續(xù)時間短,約為幾毫秒,而我們按鍵的時間一般遠遠大于這個時間,所以當單片機檢測到有按鍵動靜

12、后,再延時一段時間(十毫秒到二十毫秒)后再進行判斷此電平是否保持原來的狀態(tài),如果是,則說明是有效的按鍵按下,否則為無效按鍵。矩陣鍵盤是單片中外部設備中所使用的排列類似于矩陣的鍵盤組。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。行掃描法:1、判斷鍵盤中有無鍵按下 將全部行線Y0-Y3置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。2、判斷閉合鍵所在的位置 在確認有鍵按

13、下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。六 主程序: 主程序的流程圖: 開始 按鍵是否按下 N Y去抖動,延時10ms N按鍵是否按下Y掃描按鍵位置做一次按鍵處理,播放相應的音符或音樂七、結束語: 通過本次課程設計,我不僅學會了對KEIL的應用,還加深了對STM32單片機的了解,同時也進一步增強了自己的動手能力。 通過本次設計,我不僅加深了對單片機理論的理解,將理論很好地應用到實際當中去,而且我還學會了

14、如何去培養(yǎng)我們的創(chuàng)新精神,從而不斷地戰(zhàn)勝自己,超越自己。創(chuàng)新可以是在原有的基礎上進行改進,使之功能不斷完善,成為真己的東西。 這個設計過程中,通過在原有的按鍵中斷的基礎上進行了改進,使之具備了電子琴的基本功能。設計結果能夠符合題意,成功完成了此次實習要求,我不只在乎這一結果,更加在乎的,是這個過程。這個過程中,自己更加注重了一些基礎的理知識的學習,很好的把平時課堂上的知識運用到了實際的操作中。同時,軟硬件的結合調(diào)試也讓自己明白了理論上的很多東西也是需要實際實驗的驗證的。本綜合設計是讓得到一次進行獨立設計的工程實踐鍛煉,不僅培養(yǎng)嚴謹?shù)目茖W態(tài)度和扎實的實踐技能、良好的工程意識,并在設計中學會如何發(fā)

15、現(xiàn)、分析和解決工程實踐問題的技能和方法,為后續(xù)的畢業(yè)設計做好準備。同時在這里也感謝在整個設計中幫助過我的老師和同學們。八、參考文獻1馮建華,趙亮.單片機應用系統(tǒng)設計與產(chǎn)品開發(fā)M.北京:人民郵電出版社 2004 2譚浩強.C語言程序設計M.北京:清華大學出版社 19993單片機與嵌入式:STM32庫開發(fā)實戰(zhàn)指南M北京:機械工業(yè)出版社 2013附件: Main.c #include "stm32f10x.h"#include "KEY.h"#include "Beep.h"#include "PWM_OutPut.h"

16、/int main(void)/ uint8_t K;/ / SysTick_Init();/ KeyBoard_Init();/ TIM4_GPIO_Config();/ / Beep_GPIO_Config();/ TIM4_PWM_Init();/ / Beep_do();/ while(1) / / TIM4->CCR3=523;/ Delay_us(400);/ TIM4->CCR3=578;/ Delay_us(400);/ TIM4->CCR3=659;/ Delay_us(400);/ TIM4->CCR3=698;/ Delay_us(400);/ T

17、IM4->CCR3=784;/ Delay_us(400);/ TIM4->CCR3=880;/ Delay_us(400);/ TIM4->CCR3=988;/ Delay_us(400);/ / K=Read_KeyValue();/ switch(K)/ / case 1: / TIM4->CCR3=256;/ TIM4_Mode_Config(280);/ TIM_Cmd(TIM4,ENABLE);/ break;/ case 2:/ TIM4->CCR3=288;/ TIM4_Mode_Config(10);/ TIM_Cmd(TIM4,ENABLE);

18、 / Delay_us(10);/ TIM_Cmd(TIM4,DISABLE); / break;/ case 3: / TIM4->CCR3=320;/ TIM_Cmd(TIM4,ENABLE);/ break;/ case 4:/ TIM4->CCR3=341;/ TIM_Cmd(TIM4,ENABLE); / break;/ case 5: / TIM4->CCR3=384;/ TIM_Cmd(TIM4,ENABLE);/ break;/ case 6:/ TIM4->CCR3=426;/ TIM_Cmd(TIM4,ENABLE); / break;/ case

19、7: / TIM4->CCR3=480;/ TIM_Cmd(TIM4,ENABLE);/ break;/ case 8:/ TIM4->CCR3=512;/ TIM_Cmd(TIM4,ENABLE); / break;/ / if(K=0)/ / TIM4->CCR3=0; / / / /add your code here/int main(void) TIM_SetAutoreload(TIM2, 1);TIM4_GPIO_Config();NVIC_Configuration(); TIM4_Mode_Config(); KeyBoard_Init();while (1

20、)/TIM_SetAutoreload(TIM2, 7);/if(keyvalue()=0)/ TIM_SetAutoreload(TIM2, 0);/ if(keyvalue()=1)/ TIM_SetAutoreload(TIM2, 120);/else if(keyvalue()=2)/ TIM_SetAutoreload(TIM2, 110);/ else if(keyvalue()=3)/ TIM_SetAutoreload(TIM2, 100);/else if(keyvalue()=4)/ TIM_SetAutoreload(TIM2, 90);/else if(keyvalue

21、()=5)/ TIM_SetAutoreload(TIM2, 80);/else if(keyvalue()=6)/ TIM_SetAutoreload(TIM2, 70);/else if(keyvalue()=7)/ TIM_SetAutoreload(TIM2, 60); switch( Read_KeyValue()case(0):TIM_SetAutoreload(TIM4, 0);break;case(1):TIM_SetAutoreload(TIM4, 3800);break;case(2):TIM_SetAutoreload(TIM4, 3450);break; case(3)

22、:TIM_SetAutoreload(TIM4, 3100);break;case(4):TIM_SetAutoreload(TIM4, 2750);break;case(5):TIM_SetAutoreload(TIM4, 2400);break;case(6):TIM_SetAutoreload(TIM4, 2050);break; case(7):TIM_SetAutoreload(TIM4, 1700);break;case(8):TIM_SetAutoreload(TIM4, 1350);break;case(9):TIM_SetAutoreload(TIM4, 1250);brea

23、k;case(10):TIM_SetAutoreload(TIM4, 1150);break;case(11):TIM_SetAutoreload(TIM4, 1050);break;case(12):TIM_SetAutoreload(TIM4, 950);break;case(13):TIM_SetAutoreload(TIM4, 850);break;case(14):TIM_SetAutoreload(TIM4, 750);break; case(15):TIM_SetAutoreload(TIM4, 650);break;case(16):TIM_SetAutoreload(TIM4

24、, 550);break; SysTick.c#include "SysTick.h"static _IO u32 TimingDelay;void SysTick_Init(void)if (SysTick_Config(SystemCoreClock / 1000) while (1); SysTick->CTRL &= SysTick_CTRL_ENABLE_Msk;void Delay_us(_IO u32 nTime) TimingDelay = nTime; SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;w

25、hile(TimingDelay != 0);void TimingDelay_Decrement(void)if (TimingDelay != 0x00) TimingDelay-;PWM.c#include "PWM_OutPut.h"/static void TIM4_GPIO_Config(void)void TIM4_GPIO_Config(void) GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); RCC_APB2PeriphClo

26、ckCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_8);void NVIC_Configuration(void) NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Ini

溫馨提示

  • 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

提交評論