www.pudn.com > music_kqs.rar > sound.c, change:2001-12-30,size:3059b


/********************************************** 
             http://www.sl.com.cn 
      双龙电子公司----电脑音乐演示程序(ICCAVR) 
	             作者:詹卫前 
		  1、学习定时器T0溢出中断的使用 
		  2、学习定时器T1比较中断的使用 
		  3、学习电脑音乐的产生 
**********************************************/ 
#include <io8515.h> 
#include <macros.h> 
#pragma interrupt_handler timer0:IT_TIMER0_OVF 
#pragma interrupt_handler timer1:IT_TIMER1_COMPA 
const unsigned int music_data[][2]= 
/******************************************* 
       卡秋莎音乐数据{x,y} 
	   x:对应音符音阶(频率),0表示休止符 
	   y:对应音符节拍 
********************************************/ 
{ 
{440,600} ,{494,200} ,{523,600} ,{440,200}, 
{523,400} ,{494,200} ,{440,200} ,{494,400}, 
{330,400} ,{494,600} ,{523,200} ,{578,600}, 
{494,200} ,{578,400} ,{523,200} ,{494,200}, 
{440,800} ,{659,400} ,{880,400} ,{784,400}, 
{880,200} ,{784,200} ,{698,400} ,{659,200}, 
{578,200} ,{659,400} ,{440,400} ,{  0,200},//休止符 
{698,400} ,{578,200} ,{659,600} ,{523,200}, 
{494,200} ,{330,200} ,{523,200} ,{494,200}, 
{440,800} ,{659,400} ,{880,400} ,{784,400}, 
{880,200} ,{784,200} ,{698,400} ,{659,200}, 
{578,200} ,{659,400} ,{440,400} ,{  0,200},//休止符 
{698,400} ,{578,200}, {659,600} ,{523,200}, 
{494,200} ,{330,200}, {523,200} ,{494,200}, 
{440,800} , 
{0,0}}; 
#pragma data:data 
unsigned int delay=0; 
/******************************* 
       MCU初始化 
*******************************/ 
void music_init(void) 
 { 
  MCUCR=0x00; 
  DDRC=0x01; 
  TCCR1A=0x00; 
  TCCR1B=0x09; 
  TCCR0=0x03; 
  TCNT0=0x19; 
  TIMSK=(1<<OCIE1A)|(1<<TOIE0); 
  } 
/************************************************** 
      T0中断程序,产生音乐节拍 
**************************************************/   
void timer0(void)  
    { 
     delay++; 
     TCNT0=0x19; 
    } 
/************************************************** 
      T1中断程序,根据SOUND函数输出一定频率的方波 
**************************************************/   
void timer1(void)  
    { 
     PORTC^=0x01; 
    } 
/***************************************************** 
      SOUND程序,输出频率为 x HZ的方波,延时 y MS 
       x:100~20000 HZ, 0表示不发声 
       y:0~65536 MS 
*****************************************************/      
void sound(unsigned int x,unsigned int y) 
    { 
       SEI();  
       delay=0;  
       if (x!=0) 
        {          
         x=4000000/x;  
         OCR1A=x;    
         TCNT1=0x00; 
         TIMSK|=(1<<OCIE1A); 
          while(delay<y) 
          ; 
          TIMSK&=~(1<<OCIE1A);       
         } 
      else 
         { 
          TIMSK&=~(1<<OCIE1A); 
          while(delay<y) 
          ; 
          } 
      CLI();  
              
    } 
/******************************* 
          主程序 
*******************************/   
void main(void) 
  { 
   unsigned char i=0; 
   music_init();   
   while(1) 
      {  
       while(music_data[i][1]!=0) 
           { 
            sound(music_data[i][0],music_data[i][1]); 
            i++; 
            } 
       i=0;      
       } 
   }