采用两个定时器,一个用于产生不同频率方波,另一个控制音节长度
至少要使用有1T定时器的单片机
单片机源程序如下:
- #include"STC12C5A60S2.h"
- #include<intrins.h>
- typedef unsigned int u16;
- typedef unsigned char u8;
- //音乐播放小程序 @12MHz
- sbit output=P1^0;//接蜂鸣器
- u8 f[48][2]={//C4-B8
- // C #C D #D E F #F G #G A #A B
- {0x4b,0xb7},{0x56,0xe4},{0x60,0x61},{0x69,0x57},{0x71,0xcc},{0x79,0xc7},{0x81,0x50},{0x88,0x6c},{0x8f,0x22},{0x95,0x78},{0x9b,0x72},{0xa1,0x17},
- {0xa5,0xdc},{0xab,0x72},{0xb0,0x31},{0xb4,0xac},{0xb8,0xe6},{0xbc,0xe4},{0xc0,0xa8},{0xc4,0x36},{0xc7,0x91},{0xca,0xbc},{0xcd,0xb9},{0xd0,0x8c},
- {0xd2,0xee},{0xd5,0xb9},{0xd8,0x19},{0xda,0x56},{0xdc,0x73},{0xde,0x72},{0xe0,0x54},{0xe2,0x1b},{0xe3,0xc9},{0xe5,0x5e},{0xe6,0xdd},{0xe8,0x46},
- {0xe9,0x77},{0xea,0xdd},{0xec,0x0d},{0xed,0x2b},{0xee,0x3a},{0xef,0x39},{0xf0,0x2a},{0xf1,0x0e},{0xf1,0xe5},{0xf2,0xaf},{0xf3,0x6f},{0xf4,0x23}};
- u8 reH,reL;
- u8 spH,spL;
- u8 length;
- u16 disp;
- u16 fulllength;//乐曲总音节数
- u8 speed;//速度(b/min)
- char tune;//调(单位为半音)
- u8 code music[][2]={
- {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{21,2},{19,2},{19,1},{21,1},//10
- {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{21,2},{19,2},{19,1},{21,1},//10
- {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{21,2},{19,2},{19,1},{21,1},//10
- {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{21,2},{19,2},{19,1},{21,1},//10
- {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{21,2},{19,2},{19,1},{21,1},//10
- {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{21,2},{19,2},{19,1},{21,1},//10
- {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{21,2},{19,2},{19,1},{21,1},//10
- {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{36,2},{35,2},{31,2},//9
- {31,2},{33,1},{33,3},{31,2},{31,2},{33,1},{33,3},{31,2},//8
- {31,2},{33,1},{33,3},{31,2},{33,2},{35,2},{36,2},{38,2},//8
- {35,4},{31,4},{41,4},{38,4},//4
- {38,3},{38,3},{40,2},{255,2},{36,2},{35,2},{31,2},//7
- {31,2},{33,1},{33,3},{31,2},{31,2},{33,1},{33,3},{31,2},//8
- {31,2},{33,1},{33,3},{31,2},{33,2},{35,2},{36,2},{38,2},//8
- {33,4},{255,4},{33,2},{35,2},{36,2},{38,2},//6
- {35,4},{31,4},{28,4},{31,4},//4
- {31,2},{33,1},{33,3},{36,2},{35,2},{31,1},{28,1},{28,2},{31,2},//9
- {31,2},{33,1},{33,17},{255,12},//4--145
- {30,8},{30,2},{28,2},{30,2},{32,2},//5
- {30,8},{30,2},{28,2},{30,2},{32,2},//5
- {33,8},{33,2},{35,2},{33,2},{32,2},//5
- {33,2},{32,2},{30,2},{37,2},{33,8},//5
- {30,8},{30,2},{28,2},{30,2},{32,2},//5
- {30,8},{30,2},{28,2},{30,2},{32,2},//5
- {33,4},{26,4},{32,2},{30,2},{28,2},{30,2},//6
- {28,6},{26,2},{26,8},//3--184
- {33,2},{33,1},{33,2},{33,1},{33,4},{33,2},{32,2},{31,2},//8
- {29,4},{29,2},{37,1},{37,7},{37,1},{37,1},//6
- {37,2},{35,2},{33,2},{20,2},{35,1},{33,2},{32,3},{30,2},//8
- {28,3},{28,3},{26,2},{30,8},//4
- {30,2},{30,1},{30,2},{30,1},{30,4},{30,2},{32,2},{32,2},//8
- {32,4},{32,2},{28,1},{28,5},{255,2},{28,2},//6
- {26,4},{26,2},{25,2},{26,2},{28,1},{30,3},{30,2},//7
- {30,6},{28,1},{26,1},{28,8},//4
- {37,3},{255,2},{38,3},{255,2},{37,3},{255,3},//5--240
- {255,5},{36,2},{35,2},{31,2},//4
- {31,2},{33,1},{33,3},{31,2},{31,2},{33,1},{33,3},{31,2},//8
- {31,2},{33,1},{33,3},{31,2},{33,2},{35,2},{36,2},{38,2},//8
- {35,4},{31,4},{41,4},{38,4},//4
- {38,3},{38,3},{40,2},{255,2},{36,2},{35,2},{31,2},//7
- {31,2},{33,1},{33,3},{31,2},{31,2},{33,1},{33,3},{31,2},//8
- {31,2},{33,1},{33,3},{31,2},{33,2},{35,2},{36,2},{38,2},//8
- {33,5},{255,3},{33,2},{35,2},{36,2},{38,2},//6//////////////
- {35,3},{31,3},{28,3},//3////////////////////////
- {255,2},{36,2},{35,2},{31,2},//4
- {31,2},{33,1},{33,3},{31,2},{31,2},{33,1},{33,3},{31,2},//8
- {31,2},{33,1},{33,3},{31,2},{33,2},{35,2},{36,2},{38,2},//8
- {35,4},{31,4},{41,4},{38,4},//4
- {38,3},{38,3},{40,2},{255,2},{36,2},{35,2},{31,2},//7
- {31,2},{33,1},{33,3},{31,2},{31,2},{33,1},{33,3},{31,2},//8
- {31,2},{33,1},{33,3},{31,2},{33,2},{35,2},{36,2},{38,2},//8
- {33,5},{255,3},{33,2},{35,2},{36,2},{38,2},//6/////////////////
- {35,4},{31,4},{28,4},{31,4},//4
- {31,2},{33,1},{33,3},{36,2},{35,2},{31,1},{28,1},{28,2},{31,2},//9
- {31,2},{33,1},{33,17},{255,12},//4--366
- };
- void delay(u16 a)
- {
- u8 i;
- while(a--)
- {
- i=110;
- while(i--);
- }
- }
- void init()
- {
- unsigned long auxnum;
- delay(10);
- AUXR|=0x80;//T0不分频,12倍速
- TMOD|=0X11;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
- fulllength=366;
- tune=-1;
- speed=115;
- auxnum=7500/speed;
- auxnum*=1000;
- auxnum=65536-auxnum;
- spH=auxnum>>8;
- spL=auxnum%16;
- TH0=f[music[disp][0]+tune][0];//给定时器0赋初值
- TL0=f[music[disp][0]+tune][1];
- TH1=spH;//一个16分音符
- TL1=spL;
- ET0=1;//打开定时器中断允许
- ET1=1;
- EA=1;//打开总中断
- TR0=1;//打开定时器
- TR1=1;
- }
- void main()
- {
- init();
- P1M0=0x01;
- while(1)
- {
- if(length>music[disp][1])
- {
- TR0=0;
- length=0;
- disp++;
- if(disp>=fulllength)
- {
- delay(2000);
- disp=0;
- }
- TR0=1;
- delay(100);
- if(music[disp][0]==255)//空音
- TR0=0;
- else
- {
- TH0=reH=f[music[disp][0]+tune][0];
- TL0=reL=f[music[disp][0]+tune][1];
- }
- }
-
- }
- }
- void Timer0() interrupt 1
- {
- TH0=reH;
- TL0=reL;
- output=~output;
- }
- void Timer1() interrupt 3
- {
- TH1=spH;//一个16分音符
- TL1=spL;
- length++;
- }
复制代码
以上资料51hei提供下载:
music.rar
(1.46 KB, 下载次数: 30)
|