⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sound.c

📁 AVR 8515音乐演示demo程序
💻 C
字号:
/**********************************************
             http://www.sl.com.cn
      双龙电子公司----电脑音乐演示程序(ICCAVR)
	             作者:詹卫前
		  1、学习定时器T0溢出中断的使用
		  2、学习定时器T1比较中断的使用
		  3、学习电脑音乐的产生
**********************************************/
#include <io8535.h>
#include <macros.h>
#pragma interrupt_handler timer0:IT_TIMER0_OVF0
#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;     
       }
   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -