前兩天上單片機課,講了蜂鳴器有關內容,順便寫了個蜂鳴器播放音樂的小程序;
程序在code文件夾下,使用keil4編譯,并附帶仿真,仿真環(huán)境為Proteus7.8;
想強調的一個問題是音調之間加延時真的很重要,不然特別難聽
ppt中講解了蜂鳴器的有關知識,最后有關于執(zhí)行流程的講解
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (103.15 KB, 下載次數(shù): 109)
下載附件
2019-3-31 03:59 上傳
ppt教程預覽:
0.png (52.18 KB, 下載次數(shù): 103)
下載附件
2019-3-31 03:59 上傳
0.png (180.45 KB, 下載次數(shù): 113)
下載附件
2019-3-31 03:58 上傳
單片機源程序如下:
- /***************
- author:zc
- description: 蜂鳴器播放音樂 天空之城
- 晶振11.0592Mhz
- 實現(xiàn)方法:
- while(1)循環(huán)中生成音調方波;
- 定時器1記錄每個音調的時長并切換音調
- ****************/
- #include "reg51.h"
- #include "intrins.h"
- unsigned int tones[]= //C調音調
- {
- 3816,3401,3030,2865,2551,2272,2024, //低音
- 1912,1703,1517,1432,1275,1136,1012, //中音
- 965, 851, 758, 715, 605, 538, 466 //高音
- };
- unsigned char code sky[]={ //譜子
- //格式: 音調, 音度, 拍數(shù)
- //例: 4,1,1 //音調fa,中音,時長半拍
- //0代表空音
- 0,0,2,
- 0,0,2,
- 0,0,2,
- 6,1,1,
- 7,1,1,
- 1,2,3,
- 7,1,1,
- 1,2,2,
- 3,2,2,
- 7,1,4,
- 0,2,2,
- 3,1,1,
- 3,1,1,
- 6,1,3,
- 5,1,1,
- 6,1,2,
- 1,2,2,
- 5,1,4,
- 0,1,2,
- 3,1,2,
- 4,1,3,
- 3,1,1,
- 4,1,2,
- 1,2,2,
- 3,1,3,
- 0,0,1,
- 1,2,1,
- 1,2,1,
- 1,2,1,
- 7,1,3,
- 4,1,1,
- 4,1,2,
- 7,1,2,
- 7,1,4,
- 0,0,2,
- 6,1,1,
- 7,1,1,
- 1,2,3,
- 7,1,1,
- 1,2,2,
- 3,2,2,
- 7,1,4,
- 0,0,2,
- 3,1,1,
- 3,1,1,
- 6,1,3,
- 5,1,1,
- 6,1,2,
- 1,2,2,
- 5,1,4,
- 0,0,2,
- 2,1,1,
- 3,1,1,
- 4,1,2,
- 1,2,1,
- 7,1,2,
- 1,2,3,
- 2,2,1,
- 2,2,1,
- 3,2,1,
- 1,2,3,
- 0,0,2,
- 1,2,1,
- 7,1,1,
- 6,1,1,
- 6,1,1,
- 7,1,2,
- 5,1,2,
- 6,1,4,
- 0,0,2,
- 1,2,1,
- 2,2,1,
- 3,2,3,
- 2,2,1,
- 3,2,2,
- 5,2,2,
- 2,2,4,
- 0,0,2,
- 5,1,1,
- 5,1,1,
- 1,2,3,
- 7,1,1,
- 1,2,2,
- 3,2,2,
- 3,2,4,
- 0,0,2,
- 6,1,1,
- 7,1,1,
- 1,2,2,
- 7,1,2,
- 2,2,1,
- 2,2,1,
- 1,2,3,
- 5,1,1,
- 5,1,3,
- 0,0,1,
- 4,2,2,
- 3,2,2,
- 2,2,2,
- 1,2,2,
- 3,2,4,
- 0,0,2,
- 3,2,2,
- 6,2,4,
- 5,2,2,
- 5,2,2,
- 3,2,1,
- 2,2,1,
- 1,2,4,
- 0,2,1,
- 1,2,1,
- 2,2,2,
- 1,2,1,
- 2,2,1,
- 2,2,2,
- 5,2,2,
- 3,2,4,
- 0,2,2,
- 3,2,2,
- 6,2,4,
- 5,2,4,
- 3,2,1,
- 2,2,1,
- 1,2,4,
- 0,0,1,
- 1,2,1,
- 2,2,2,
- 1,2,1,
- 2,2,1,
- 2,2,2,
- 7,1,2,
- 6,1,2,
- };
- sbit Buzzer=P3^0; //定義buzzer引腳
- void delay_ms( unsigned int t) ; //毫秒延時12MHz下
- void delay_us( unsigned int t) ; //微妙延時12MHz下
- void play_tone(unsigned int tone); //播放音調函數(shù),即方波發(fā)生器
- void time_init( void ); //初始化定時器
- unsigned char s=0, t_tone=0; //s用作定時器計時, t_tone保存音調時長
- unsigned int tone=0; //tone保存音調,
- char *tone_p=sky; //指針指向要播放的曲目
- void main( void )
- {
- time_init(); //初始化定時器
- while(1)
- if(tone!=0)play_tone(tone); //一直在播放音調,播放的音調由定時器切換,
- //音調時常由定時器決定
- } //如果tone==0 不進入播放
- void time_init( void )
- {
- TMOD|=0x10; //使用定時器1
- TH1=(65536-65000)/256; //裝初值
- TL1=(65536-65000)%256;
- EA = 1; //開中斷,打開定時器開關
- ET1 = 1;
- TR1 = 1;
- }
- void timer1( void ) interrupt 3 //定時器1 中斷
- {
- TH1=(65536-50000)/256; //裝初值
- TL1=(65536-50000)%256;
- s++;
- if(s>=4*t_tone) //一個音節(jié)播放的時間,這里可以通過調t_tone前的系數(shù)可以改變時長
- {
- s=0; //講計時器清零
- if((*tone_p)!=0) //如果音不是0
- tone = tones[*tone_p+7*(*(tone_p+1))-1]; //賦值音調
- else
- tone = 0; //關了蜂鳴器
- t_tone = *(tone_p+2); //取時間啊
- tone_p+=3; //移動指針
- delay_ms(30); //延時一下,不延時特別難聽
- }
- }
- void play_tone(unsigned int tone) //播音調函數(shù),就是方波發(fā)生器
- {
- Buzzer=!Buzzer;
- delay_us(tone);
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
test2.rar
(2.16 MB, 下載次數(shù): 542)
2019-3-30 21:00 上傳
點擊文件名下載附件
蜂鳴器播放音樂 下載積分: 黑幣 -5
|