| /************************************************************************ *****music.c *****created by zhangyongchang *****date 2006 4.5 /**********************************************************************/ #include <reg51.h> unsigned char m; //m为频率常数 unsigned char n=0; //n为节拍常数 unsigned char i=0; sbit bell=P1^1; unsigned char code music_tab[] ={ 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数, 0x20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18, 0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26, 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20, 0x20, 0x30, 0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x80, 0x20, 0x30, 0x1C , 0x10, 0x20, 0x10, 0x1C , 0x10, 0x20, 0x20, 0x26 , 0x20, 0x2B, 0x20, 0x30 , 0x20, 0x2B, 0x40, 0x20 , 0x15, 0x1F, 0x05, 0x20 , 0x10, 0x1C, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x30, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x40, 0x1C , 0x20, 0x20, 0x20, 0x26 , 0x40, 0x13, 0x60, 0x18 , 0x20, 0x15, 0x40, 0x13 , 0x40, 0x18, 0x80, 0x00 }; void time0(void) interrupt 1 using 1 //产生10MS精确定时 { TH0=(65536-10000)/256; TL0=(65536-10000)%256; n--; } void delayms(unsigned char a) //微秒延时程序 { while(--a); } void delay(void) //延迟程序 { int i,j; for(i=50;i--;i>0) for(j=10000;j--;j>0) ; } void main() { TMOD=(TMOD&0xf0) 0x01; TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1; ET0=1; TR0=0; while(1) { switch(music_tab[i]) { case 0x00: i=0;delay(); break; // 曲终停顿一定时间 case 0xff: i=i+1;delayms(100);break; //遇到休止符停顿一定时间100微秒,再取下一个频率 default: m=music_tab[i++];n=music_tab[i++];//取频率到m,取节拍到n TR0=1; while(n!=0) { bell=!bell; delayms(4*m);//调整产生的频率,可以通过在m前的值来修正音调的高低 } TR0=0; } } } |
