電磁式蜂鳴器驅(qū)動原理:
蜂鳴器發(fā)聲原理是電流通過電磁線圈,使電磁圈產(chǎn)生磁場來驅(qū)動振動膜發(fā)聲的。因此需要一定的電流才能驅(qū)動它,而單片機I/O引腳輸出的電壓較小。單片機輸出的TTLK電平基本驅(qū)動不了蜂鳴器,因需要增加一個放大電路。這里用三極管作為放大電路。下面是原理圖:
我這里的J8端是跟芯片的P1^5端口相連,當P1^5輸出高電平時,三極管截止,蜂鳴器不發(fā)聲,反之,輸出低電平時,蜂鳴器發(fā)聲。
而要驅(qū)動蜂鳴器能像唱歌一樣的發(fā)聲,其實只要使蜂鳴器發(fā)出頻率和持續(xù)時間不同的聲音即可。周期等于頻率的倒數(shù),所以可以通過頻率知道這段的時間,所以可以通過調(diào)用延時函數(shù)或者定時器實現(xiàn),同樣的發(fā)聲的持續(xù)時間也可以通過延時函數(shù)實現(xiàn),所以讓蜂鳴器唱歌最關(guān)鍵的就是知道要延長多少時間!
用單片機來演奏音樂,,只要搞清楚兩個概念就好了,分別是“音調(diào)”和“節(jié)拍”。
音調(diào)表示一個音符該唱的頻率。
節(jié)拍表示一個音符該唱多少時間。
這里有兩種方法來實現(xiàn)該功能:
(1)查表法
這個方法復雜的地方在于你要找出每個音符相對應的頻率(根據(jù)音符;頻率對照表找),然后根據(jù)公式轉(zhuǎn)換為相應的時間(取半周期),然后通過延時函數(shù)實現(xiàn)。最后編程實現(xiàn)。
整個流程是這樣的:
首先根據(jù)生日快樂歌的樂譜將各個音調(diào)轉(zhuǎn)換為相應的頻率。
比如:左邊是生日快樂歌樂譜,右邊是音符頻率轉(zhuǎn)換表
??????
這里先來了解一下樂譜的一點知識,左邊樂譜數(shù)字下面有點說明是低音,沒點說明就是普通的,數(shù)字上面有點就是高音,而5的低音就是4.5,高音是5.5,其他音符也是相應的道理。
樂譜的左上方有寫“1=F”,而一般的樂譜都是C調(diào),就是“1=C”,注意,樂譜里面的1234567(哆啦咪發(fā)索拉西多)相對應的不是ABCDEFG而是CDEFGAB!所以這里規(guī)定是F調(diào)的話,
那么就說明2就要唱G,3要唱A,……7要唱E,所以這里的低音5對應的應該是低音的1.5!!!!就是所謂的要相應的左移或者右移。如果還是不明白的話,看下面:
1原本對應的應該是C,4原本應該對應的是F,對吧?
然后現(xiàn)在1對應的變成F了,就相當于對應了4,對吧?
那么1.5對應的是什么?
4.5咯!
那2對應的是什么?
5唄!
那么好了咯,低音5是4.5,是不是就是等于1.5?所以半周期就是1803μs。
至于為什么是根據(jù)半周期算,那是因為單片機是通過循環(huán)對蜂鳴器接的端口置位,復位來使發(fā)聲的,所以就是半周期。因為我用的是無源的蜂鳴器,有源的蜂鳴器就是全周期了。
然后就是按照上述道理,一個個轉(zhuǎn)換,并用延時函數(shù)實現(xiàn),因為每個音符的轉(zhuǎn)換頻率都不一樣,要么使用多個延時函數(shù)一個個實現(xiàn)準確的音調(diào)頻率,但是這樣太煩,而且單片機本身就不是專門
弄來唱歌的。我們不應該為難他們,所以自己將就一下就算了。所以延時函數(shù)為了適應每個音調(diào)都有差不多的頻率,這個就靠自己計算了,而且不同的歌那個值還不一樣,所以這就是這個問題
的難點。
接下來的就是那個唱多久的問題,一般的歌曲默認的一個節(jié)拍是400ms-500ms。
同樣的看樂譜左上方,它有寫“3/4”,意思是以四分音符為節(jié)拍,每一個小結(jié)有三拍。
而在每個數(shù)字下面有一條橫線,那時間就是那個節(jié)拍的時間乘上0.5,有兩條就乘上0.25,三條就乘以0.125。。。音樂的基本知識就別為難我了,我是個音樂白癡。。所以我就這么理解了。。
哈哈哈哈哈~
而至于節(jié)拍轉(zhuǎn)換為頻率,也是有相應的表的,見下:
同樣的也是通過延時函數(shù)來實現(xiàn),當然也是會有誤差的。
編程思想的話挺簡單的,就是先將音符頻率和所要唱的時間轉(zhuǎn)換好,放到兩個數(shù)組里面。然后在主程序里面,通過延時達到相應頻率,唱完一遍,停一會,接著唱就好了。
(2)用工具轉(zhuǎn)碼并用計時器實現(xiàn)
這個代碼明顯的來自網(wǎng)絡(luò)。哈哈。原諒我,這個我就不說明了。哎,還是再說一下步驟吧。。(具體我也不是很懂,不同這個真的很通用,所以還是放到筆記上了。。)
一開始就用MUSICENCODE這個將樂譜轉(zhuǎn)換為相應的代碼,然后根據(jù)音調(diào)和音區(qū)生成一個新的頻率表。所謂的音區(qū)就是降調(diào),平調(diào),升調(diào),這個可以根據(jù)轉(zhuǎn)換的代碼相應位得知。
再計算歌曲的長度,用while就好,用來設(shè)置一首歌唱完之后再來一遍還是執(zhí)行其他動作。
再取出數(shù)組數(shù)據(jù)的奇數(shù)位,那個就是表示音長的。然后根據(jù)這個計算一個音調(diào)唱多久,并將初值賦給定時器。關(guān)于定時器的使用,之后會放出。
一個音調(diào)唱多久最好的方法就是設(shè)置一個基本時長,因為這個例子中,一個四分節(jié)拍大概是400ms-500ms,然后有的是1/4拍(100ms),有的2/4拍(200ms),所以就設(shè)置一個
50ms的定時器,調(diào)用的時候設(shè)置一下參數(shù)就好了。這樣做的好處就是方便。
接著調(diào)用函數(shù)讓它唱歌就好
比較一下這兩個方法的優(yōu)缺點,第一種方法轉(zhuǎn)碼太復雜,不過聲音很好,分辨率高。第二種方法通用!不同的歌,你只要用工具轉(zhuǎn)一下碼,然后重新用個數(shù)組保存這些值,然后再通過
Play(樂曲名,調(diào)號,升降八度,演奏速度)這個函數(shù)調(diào)用就好了,不過用這種方法實現(xiàn)的效果音質(zhì)不是很理想。其實最主要的是這種方法對音樂知識不理解也沒關(guān)系,而第一種方法還是
需要一定的知識來獲得正確的音調(diào)頻率和音長。
-
單片機
+關(guān)注
關(guān)注
6037文章
44558瀏覽量
635311 -
蜂鳴器
+關(guān)注
關(guān)注
12文章
891瀏覽量
45948
原文標題:單片機:蜂鳴器音樂播放實驗
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論