單片機演奏音樂仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (8.39 KB, 下載次數: 25)
下載附件
2019-3-2 03:09 上傳
0.png (14.58 KB, 下載次數: 19)
下載附件
2019-3-2 03:09 上傳
單片機源程序如下:
- /********本程序中,FOSC=11.0592M*********/
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- struct music_type{
- uchar tone;
- uchar delay;
- };
- /**********F調3個8度7音階的音高參數**********/
- uint code tonetab[]={
- 64216,64360,64489,64603,64654,64752,64837, //低音1~7
- 64876,64948,65012,65042,65095,65144,65186, //中音1~7
- 65206,65242,65274,65289,65315,65340,65361 //高音1~7
- };
- //曲譜,每個音符含兩項數據,第1項為音高,第2項為節拍(以1/4拍為單位)
- /**************康定情歌樂譜***************/
- struct music_type code songtab[]={
- 3+7,0x02,5+7,0x02,6+7,0x02,6+7,0x01,5+7,0x01,6+7,0x03,3+7,0x01,2+7,0x04,
- 3+7,0x02,5+7,0x02,6+7,0x02,6+7,0x01,5+7,0x01,6+7,0x03,3+7,0x06,
- 3+7,0x02,5+7,0x02,6+7,0x02,6+7,0x01,5+7,0x01,6+7,0x03,3+7,0x01,2+7,0x04,
- 5+7,0x02,3+7,0x02,2+7,0x01,3+7,0x01,2+7,0x01,1+7,0x01,2+7,0x02,6+0,0x06,
- 6+0,0x02,2+7,0x06,5+7,0x02,3+7,0x06,2+7,0x01,1+7,0x01,6+0,0x06,
- 5+7,0x02,3+7,0x02,2+7,0x01,3+7,0x01,2+7,0x01,1+7,0x01,2+7,0x02,6+0,0x06,
- //
- 3+7,0x01,2+7,0x01,3+7,0x01,5+7,0x01,6+7,0x01,5+7,0x01,1+14,0x01,6+7,0x01,
- 5+7,0x01,3+7,0x01,5+7,0x04,6+7,0x02,
- 1+14,0x02,2+14,0x01,3+14,0x01,2+14,0x01,1+14,0x01,6+7,0x01,1+14,0x01,
- 5+7,0x08,
- 5+7,0x01,3+7,0x01,5+7,0x04,6+7,0x02,
- 1+14,0x02,2+14,0x01,3+14,0x01,1+14,0x01,6+7,0x01,5+7,0x02,
- 5+7,0x02,2+7,0x02,3+7,0x01,5+7,0x01,3+7,0x01,2+7,0x01,
- 1+7,0x01,6,0x01,1+7,0x06,
- 3+7,0x01,2+7,0x01,1+7,0x02,2+7,0x03,3+7,0x01,
- 5+7,0x02,6+7,0x01,1+14,0x01,6+7,0x02,5+7,0x02,
- 5+7,0x01,3+7,0x01,2+7,0x02,3+7,0x01,5+7,0x01,3+7,0x01,2+7,0x01,
- 1+7,0x01,2+7,0x01,6,0x04,1+7,0x02,
- 2+7,0x03,3+7,0x01,1+7,0x01,2+7,0x01,1+7,0x02,6,0x01,
- 1+7,0x01,6,0x01,5,0x05,
- //
- 3+7,0x01,2+7,0x01,3+7,0x01,5+7,0x01,6+7,0x01,5+7,0x01,1+14,0x01,6+7,0x01,
- 5+7,0x01,3+7,0x01,5+7,0x04,6+7,0x02,
- 1+14,0x02,2+14,0x01,3+14,0x01,2+14,0x01,1+14,0x01,6+7,0x01,1+14,0x01,
- 5+7,0x08,
- 5+7,0x01,3+7,0x01,5+7,0x04,6+7,0x02,
- 1+14,0x02,2+14,0x01,3+14,0x01,1+14,0x01,6+7,0x01,5+7,0x02,
- 5+7,0x02,2+7,0x02,3+7,0x01,5+7,0x01,3+7,0x01,2+7,0x01,
- 1+7,0x01,6,0x01,1+7,0x06,
- 3+7,0x01,2+7,0x01,1+7,0x02,2+7,0x03,3+7,0x01,
- 5+7,0x02,6+7,0x01,1+14,0x01,6+7,0x02,5+7,0x02,
- 5+7,0x01,3+7,0x01,2+7,0x02,3+7,0x01,5+7,0x01,3+7,0x01,2+7,0x01,
- 1+7,0x01,2+7,0x01,6,0x04,1+7,0x02,
- 2+7,0x03,3+7,0x01,1+7,0x01,2+7,0x01,1+7,0x02,6,0x01,
- 1+7,0x01,6,0x01,5,0x05,
- 0,0x00
- };
- /*********端口及變量定義**********/
- sbit SPEAKER = P3^7;
- uchar tlow1,thig1;
- /*******軟件延時,約n*10us******/
- void delay10us(unsigned char n){
- do{
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }while(--n);
- }
- /*******軟件延時,約n ms******/
- void delayms(unsigned int n){
- do {
- delay10us(131);
- }while(--n);
- }
- main () {
- uchar i,j;
- EA=1;ET0=1;
- TMOD=0X01;
- while(1){
- i=0;
- while(songtab[i].delay!=0){
- if(songtab[i].tone==0)TR0=0; //音高數據為0
- else{ //音高數據不為0
- //用定時器參數控制T1的振蕩頻率,即音高
- thig1=TH0=tonetab[songtab[i].tone-1]/256;
- tlow1=TL0=tonetab[songtab[i].tone-1]%256;
- TR0=1;
- }
- //控制音符的持續時間,即節拍
- for(j=0;j<songtab[i].delay;j++){
- delayms(200);
- }
- i++; //下一個音符
- }
- TR0=0; //停止演奏
- delayms(1000); //一遍完成后等待
- }
- }
- /*******定時器1中斷,控制蜂鳴器發聲頻率*******/
- void t0 () interrupt 1{
- TH0=thig1;TL0=tlow1;
- SPEAKER = !SPEAKER; //蜂鳴器發聲
- }
復制代碼
所有資料51hei提供下載:
單片機演奏音樂.rar
(54.52 KB, 下載次數: 43)
2019-3-1 21:45 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|