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

📄 testsound.i

📁 这是一个让单片机发出音乐的程序
💻 I
字号:
// CodeVisionAVR C Compiler
// (C) 1998-2001 Pavel Haiduc, HP InfoTech S.R.L.

// I/O registers definitions for the ATmega16


#pragma used+
sfrb TWBR=0;
sfrb TWSR=1;
sfrb TWAR=2;
sfrb TWDR=3;
sfrb ADCL=4;
sfrb ADCH=5;
sfrw ADCW=4;      // 16 bit access
sfrb ADCSRA=6;
sfrb ADMUX=7;
sfrb ACSR=8;
sfrb UBRRL=9;
sfrb UCSRB=0xa;
sfrb UCSRA=0xb;
sfrb UDR=0xc;
sfrb SPCR=0xd;
sfrb SPSR=0xe;
sfrb SPDR=0xf;
sfrb PIND=0x10;
sfrb DDRD=0x11;
sfrb PORTD=0x12;
sfrb PINC=0x13;
sfrb DDRC=0x14;
sfrb PORTC=0x15;
sfrb PINB=0x16;
sfrb DDRB=0x17;
sfrb PORTB=0x18;
sfrb PINA=0x19;
sfrb DDRA=0x1a;
sfrb PORTA=0x1b;
sfrb EECR=0x1c;
sfrb EEDR=0x1d;
sfrb EEARL=0x1e;
sfrb EEARH=0x1f;
sfrw EEAR=0x1e;   // 16 bit access
sfrb UBRRH=0x20;
sfrb UCSRC=0X20;
sfrb WDTCR=0x21;
sfrb ASSR=0x22;
sfrb OCR2=0x23;
sfrb TCNT2=0x24;
sfrb TCCR2=0x25;
sfrb ICR1L=0x26;
sfrb ICR1H=0x27;
sfrb OCR1BL=0x28;
sfrb OCR1BH=0x29;
sfrw OCR1B=0x28;  // 16 bit access
sfrb OCR1AL=0x2a;
sfrb OCR1AH=0x2b;
sfrw OCR1A=0x2a;  // 16 bit access
sfrb TCNT1L=0x2c;
sfrb TCNT1H=0x2d;
sfrw TCNT1=0x2c;  // 16 bit access
sfrb TCCR1B=0x2e;
sfrb TCCR1A=0x2f;
sfrb SFIOR=0x30;
sfrb OSCCAL=0x31;
sfrb OCDR=0x31;
sfrb TCNT0=0x32;
sfrb TCCR0=0x33;
sfrb MCUCSR=0x34;
sfrb MCUCR=0x35;
sfrb TWCR=0x36;
sfrb SPMCR=0x37;
sfrb TIFR=0x38;
sfrb TIMSK=0x39;
sfrb GIFR=0x3a;
sfrb GICR=0x3b;
sfrb OCR0=0X3c;
sfrb SPL=0x3d;
sfrb SPH=0x3e;
sfrb SREG=0x3f;
#pragma used-

//***** Bit Definitions

// GIMSK / GICR
	
// GIFR

// TIMSK

// TIFR

// SPMCR
	
// TWCR


// MCUCR
	

// MCUSR

// TCCR0

// SFIOR

// TCCR1A

// TCCR1B

// TCCR2

// ASSR

// WDTCR

// EECR

// PORTA

// DDRA

// PINA

// PORTB

// DDRB

// PINB

// PORTC

// DDRC

// PINC

// PORTD

// DDRD

// PIND

// SPSR

// SPCR

// UCSRA

// UCSRB

//UCSRC

// ACSR

// ADMUX

// ADCSR

// TWAR



// Interrupt vectors definitions



// CodeVisionAVR C Compiler
// (C) 1998-2000 Pavel Haiduc, HP InfoTech S.R.L.


#pragma used+

void delay_us(unsigned int n);
void delay_ms(unsigned int n);

#pragma used-


#pragma used+

void TransmitByte(unsigned char c);   //发送一个字节到USART
unsigned char ReceiveByte(void);      //从USART中读取一个字节
void TransmitLine(char *s);           //发送字符串到USART,以回车符结束
void TransmitLineF(flash char *s);    //同上
void TransmitString(char *s);         //发送任意字符串到USART
void TransmitStringF(flash char *s);  //同上
void USART_Init(unsigned char BaudRate);  //初始化USART,BaudRate为速度
void TestRate(void);                      //测试USART速度 
void ReceiveCMD(unsigned char * CmdBuf,unsigned char MaxCmdBuf); //从USART中读取一条命令行
#pragma used-
#pragma library USART.lib





//Type definitions 
typedef unsigned char byte;
typedef unsigned int word;


//音乐频率

const word tone_frq[]=
{ 0,
  //低音
  7372800/2   /262, 7372800/2   /277, 7372800/2   /294, 7372800/2   /311, 7372800/2   /330, 7372800/2   /349,
  7372800/2   /370, 7372800/2   /392, 7372800/2   /415, 7372800/2   /440, 7372800/2   /466, 7372800/2   /494, 
  //中音
  7372800/2   /523, 7372800/2   /554, 7372800/2   /578, 7372800/2   /622, 7372800/2   /659, 7372800/2   /698, 
  7372800/2   /740, 7372800/2   /784, 7372800/2   /831, 7372800/2   /880, 7372800/2   /932, 7372800/2   /988,  
 //高音 
 7372800/2   /1046,7372800/2   /1109,7372800/2   /1175,7372800/2   /1245,7372800/2   /1318,7372800/2   /1397,
 7372800/2   /1480,7372800/2   /1568,7372800/2   /1661,7372800/2   /1760,7372800/2   /1865,7372800/2   /1976
};
  
//音乐简谱定义
//低音
//中音
//高音

//节拍定义,以四分音符为一拍




//===============================================================================
//    音乐文件数据
//    二维数组第一个表示音符,第二个表示节拍长度
//    音符里1-7表示7个音阶,数字前带"_"表示半音,L、M、H分别表示低、中、高音
//    具体定义见 music.h 文件里的定义
//===============================================================================

/*第一首:莫斯科郊外的夜晚*/
const byte music_dt0[]=
const byte music_dt0[]=
 {10,4 		,13,4 		,17,4 		,13,4 		,15,8 		,13,4 		,12,4 		,17,8 		,15,8 		,10,16	    ,
 13,4 		,17,4 		,20,4 		,20,4 		,22,8 		,20,4 		,18,4 		,17,16	    ,
 18,8 		,20,8 		,24,4 		,22,4 		,17,8 		,17,4 		,
 12,8 		,10,4 		,17,4 		,15,4 		,18,8 		,18,4 		,0,4 		,
 20,4 		,18,4 		,17,8 		,15,4 		,13,4 		,17,8 		,15,8 		,10,16	    ,10,4 		,0,4 		,
 0,8 		,0,0};
 
/*第二首:铃儿响叮当*/
const byte music_dt1[]=
 {17,4 		,17,4 		,17,8 		,17,4 		,17,4 		,17,8 		,
 17,4 		,20,4 		,13,6 		,15,2 		,17,16	    ,
 18,4 		,18,4 		,18,6 		,18,2 		,18,4 		,17,4 		,17,4 		,17,2 		,17,2 		,
 17,4 		,15,4 		,15,4 		,13,4 		,15,8 		,20,8 		,
 17,4 		,17,4 		,17,8 		,17,4 		,17,4 		,17,8 		,
 17,4 		,20,4 		,13,6 		,15,2 		,17,12		,0,4 		,
 18,4 		,18,4 		,18,6 		,18,2 		,18,4 		,17,4 		,17,4 		,17,2 		,17,2 		,
 20,4 		,20,4 		,18,4 		,15,4 		,13,12		,0,4 		,
 0,0};

/*第三首:卡秋沙*/
const byte music_dt2[]=
 {10,12		,12,4 		,13,12		,10,4 		,
 13,8 		,12,4 		,10,4 		,12,8 		,
 5,8 		,12,12		,13,4 		,15,12		,
 12,4 		,15,8 		,13,4 		,12,4 		,
 10,16	    ,17,8 		,22,8 		,20,8 		,
 22,4 		,20,4 		,18,8 		,17,4 		,
 15,4 		,17,8 		,10,8 		,0,4 		,
 
 18,8 		,15,4 		,17,12		,13,4 		,
 12,4 		,5,4 		,13,4 		,12,4 		,
 10,16	    ,17,8 		,22,8 		,20,8 		,
 22,4 		,20,4 		,18,8 		,17,4 		,
 15,4 		,17,8 		,10,8 		,0,4 		,
 
 18,8 		,15,4 		,17,12		,13,4 		,
 12,4 		,5,4 		,13,4 		,12,4 		,
 10,16	    ,0,0};
 
/*第四首:康定情歌*/
const byte music_dt3[]=
 {17,4 		,20,4 		,22,4 		,22,2 		,20,2 		,22,6 		,17,2 		,15,8 		,
 17,4 		,20,4 		,22,4 		,22,2 		,20,2 		,22,4 		,17,12		,
 17,4 		,20,4 		,22,4 		,22,2 		,20,2 		,22,6 		,17,2 		,15,8 		,
 20,4 		,17,4 		,15,2 		,17,2 		,15,2 		,13,2 		,15,4 		,10,12		,
 22,4 		,15,12		,20,4 		,17,12		,15,2 		,13,2 		,22,12		,20,4 		,17,4 		,
 15,2 		,17,2 		,15,2 		,13,2 		,15,4 		,22,12		,
 0,0};
 
/*第五首:童年*/
const byte music_dt4[]=
 {29,4 		,29,8 		,29,4 		,29,8 		,27,8 		,25,4 		,25,8 		,25,4 		,27,4 		,
 25,4 		,22,8 		,
 20,4 		,20,8 		,20,4 		,22,4 		,20,4 		,27,4 		,29,4 		,25,16	    ,
 17,4 		,20,4 		,20,8 		,17,4 		,20,4 		,22,4 		,22,4 		,24,4 		,22,8 		,
 22,4 		,22,4 		,20,4 		,
 25,8 		,25,4 		,25,8 		,25,4 		,22,4 		,25,4 		,22,4 		,20,16	    ,
 17,4 		,20,4 		,20,4 		,17,4 		,20,4 		,22,4 		,22,4 		,24,4 		,22,8 		,
 22,4 		,22,4 		,20,4 		,
 25,8 		,25,4 		,25,4 		,25,4 		,22,4 		,22,4 		,25,4 		,27,16	    ,
 32,4 		,32,8 		,32,4 		,32,8 		,29,4 		,27,4 		,25,4 		,25,8 		,22,8 		,
 25,4 		,22,4 		,25,4 		,
 27,4 		,27,4 		,27,4 		,27,4 		,27,4 		,25,4 		,29,4 		,27,4 		,27,16	    ,
 29,4 		,29,8 		,29,4 		,29,8 		,27,8 		,25,4 		,25,8 		,25,4 		,27,4 		,
 25,4 		,22,8 		,
 20,4 		,20,8 		,20,4 		,22,4 		,20,4 		,27,4 		,29,4 		,25,16	    ,
 29,4 		,29,8 		,29,4 		,29,8 		,27,8 		,25,4 		,25,8 		,25,4 		,27,4 		,
 25,4 		,22,8 		,
 20,4 		,20,8 		,20,4 		,22,4 		,20,4 		,27,4 		,29,4 		,25,16	    ,
 0,0};

/*第六首:沧海一声笑*/
const byte music_dt5[]=
 {22,4 		,22,2 		,20,2 		,17,6 		,15,2 		,13,16	    ,
 17,6 		,15,2 		,13,4 		,10,2 		,8,2 		,8,16	    ,
 8,6 		,10,2 		,8,6 		,10,2 		,13,6 		,15,2 		,17,4 		,20,4 		,
 22,6 		,20,2 		,17,2 		,15,2 		,13,4 		,15,16	    ,
 0,0};

/*第七首:两只蝴蝶*/
const byte music_dt6[]=
 {20,4 		,20,4 		,22,4 		,25,4 		,24,4 		,24,4 		,22,4 		,
 17,8 		,15,4 		,17,4 		,17,12		,0,8 		,
 17,4 		,17,4 		,20,4 		,22,8 		,25,12		,
 10,4 		,20,4 		,17,4 		,15,24		,
 17,4 		,20,4 		,20,4 		,17,4 		,20,8 		,0,4 		,
 25,8 		,24,4 		,22,4 		,24,4 		,17,8 		,0,4 		,
 22,4 		,22,4 		,25,4 		,22,4 		,20,4 		,17,4 		,15,8 		,15,8 		,17,4 		,20,16	    ,
 20,4 		,
 0,0};
 
/*第八首:两只老虎*/
const byte music_dt7[]=
 {13,8 		,15,8 		,17,8 		,13,8 		,13,8 		,15,8 		,17,8 		,13,8 		,
 17,8 		,18,8 		,20,16	    ,17,8 		,18,8 		,20,16	    ,
 20,6 		,22,2 		,20,6 		,18,2 		,17,8 		,13,8 		,
 20,6 		,22,2 		,20,6 		,18,2 		,17,8 		,13,8 		,
 13,8 		,20,8 		,13,16	    ,13,8 		,20,8 		,13,16	    ,
 0,0};

unsigned char delay_inc=0x0C;
unsigned char time_inc=0x01;

struct MUSICDAT
{
  char name;
  char time;
} ;


void delay(word t)
{
 unsigned int i;
// uchar j;
 for (i=0;i<t;i++) i+=delay_inc;
//   for(j=1;j<8;j++);
}

void sound_pc0(unsigned char t)
{
 unsigned int i;
 for (i=0;i<350-t*t;i++)            /*改变发音快慢*/
    {
     PORTD^=0x80;
     delay(t);
    }
}

void TestSnd1()
{
 unsigned char c;

    for (c=0x00;c<0xff;c++)    
      {
       PORTD^=0x80;                 
       delay(c);
      } 
    for (c=0xff;c>0x00;c--)    
     {
      PORTD^=0x80;                 
      delay(c);
      }

}

void TestSnd2()
{
 unsigned char dt;
     for(dt=1;dt<14;dt++)               /*改变发音数量 */
         sound_pc0(dt);
 }

void TestSnd3(void)               
{
 unsigned char c;
    for (c=0x00;c<0xff;c++)  
        {
        PORTD^=0x80;
        delay(c);
        PORTD^=0x80;
        delay(c);
        }
     
    for (c=0;c<255;c++);              
     
    for (c=0xff;c>0x00;c--)  
      {
        PORTD^=0x80;
        delay(c);
        PORTD^=0x80;
        delay(c);
      }
    for (c=0;c<255;c++) ;              
                      
}

void TestSnd4(void)
{
  //struct MUSICDAT * music_dat;
  //unsigned char c;
  unsigned int i,j,k;  
  unsigned char name;
  unsigned int time;
  i=0;
  while (i<sizeof(music_dt0))
  {
    name=music_dt0[i];
    time=music_dt0[i+1];
    for (k=0;k<time;k++)
    for (j=0;j<187-time_inc;j++)
      {
      PORTD^=0x80;
      delay(tone_frq[name]);
      PORTD^=0x80;
      delay(tone_frq[name]);
      }
   delay_ms(20); 
   i+=2;
  }
  //while ((name==0)&&(time==0));
}

void TestSnd5(void)
{
  unsigned int j;
  //for (i=0;i<100;i++)
    for (j=0;j<10;j++)
      {
      PORTD^=0x80;
      delay(tone_frq[13]);
      PORTD^=0x80;
      delay(tone_frq[13]);
      }
}


void main (void)                    /*主函数 */
{
 unsigned char Cmd;
 DDRC=0xff;
 DDRA=0x00;
 DDRD=0xff;
 PORTC=~time_inc;
 
 USART_Init(47);  //3.6864M=23,   7.3728M=47
 
 while (1)
 {
  Cmd=0;
    if (UCSRA&(1<<7)) //串口有信息吗?
   {
     Cmd=UDR;    //如果有,接收一个字节
   }

 if ((!PINA.0)||(Cmd=='1')) TestSnd1();
 if ((!PINA.1)||(Cmd=='2')) TestSnd2();
 if ((!PINA.2)||(Cmd=='3')) TestSnd3();
 if ((!PINA.3)||(Cmd=='4')) TestSnd4();
 if ((!PINA.4)||(Cmd=='5')) TestSnd5();
 
 if ((!PINA.6)||(Cmd=='7'))
  {
    while (!PINA.6);
    time_inc++;
    if (time_inc>186) time_inc=186;
    PORTC=~time_inc;
  }
 if ((!PINA.7)||(Cmd=='8'))
   {
    while (!PINA.7);
    time_inc--;
    if (time_inc<0) time_inc=0;
    PORTC=~time_inc;
   }
 if (Cmd=='9')
   {
     Cmd=ReceiveByte();
     time_inc=Cmd;
    if (time_inc>186) time_inc=186;
    PORTC=~time_inc;
   }
 }
}   




⌨️ 快捷键说明

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