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

📄 musicdemo.c

📁 简单的"祝你生日快乐"歌曲 芯片为mega8
💻 C
字号:
#include <avr/interrupt.h> 
#include <avr/signal.h> 
#include <avr/eeprom.h> 
#include <avr/pgmspace.h> 
#include <avr/wdt.h> 
#include <avr/io.h>//和单片机类型相对应的头文件,选择Atmega8做实验; 
#include <avr/sleep.h> 
#include <avr/delay.h> 
#include <inttypes.h> 
unsigned int SINGM[15]={64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217};  
unsigned char SINGG[24]={0X82,0X01,0X81,0X94,0X84,0XB4,0XA4,0X04,  
                     0X82,0X01,0X81,0XF4,0XD4,0XB4,0XA4,0X94,  
                     0XE2,0X01,0XE1,0XD4,0XB4,0XC4,0XB4,0X04}; 
volatile uint8_t TI,TI2,TI3,S1,S2,S3; 
void AvrInit (void) 
{ 
   TCCR1B = _BV(CS00);         /* Set TIMER0 prescaler  
//   TCNT1 = SINGM[TI];               /* Set TIMER0 3.6kHz/45=80Hz (12.5ms) 0xd3=0x100-0x2d  (0x2d=45)       */ 
//   timer_enable_int(_BV(TOIE1));   /* Enable  TIMER0 overflow  
} 
SIGNAL(SIG_OVERFLOW1)     /* signal handler for Time1 interrupt */ 
{ 
//   timer_enable_int(0<<TOIE1); 
   PORTC ^= 0x08;  
   TCNT1 = SINGM[TI];     /* Set TIMER0     */ 
    
} 
void deley178ms(void) 
{ 
   unsigned int i; 
   for(i=0;i<300;i++) 
   { 
      _delay_loop_2(80); 
   } 
} 

int main(void) 
{ 
   unsigned char j; 
   OSCCAL = 0xAF; 
   cli();   
   DDRC   = 0x0F; 
   PORTC  = 0xff; 
   AvrInit (); 
   sei(); 
   S3 = SINGG[S2]; 
   S3 = S3&0X0F;       //取低4位,将时间存到S3 
   TI= SINGG[S2];       
   TI=TI>>4;                 //取到音符 
   if(TI==0)      timer_enable_int(0<<TOIE1); 
   else    
   { 
      TI=TI-1; 
      TCNT1 = SINGM[TI]; 
      timer_enable_int(_BV(TOIE1)); 
   } 
   while(1) 
   { 
      for(j=0;S3>=j;j++) 
      { 
         deley178ms(); 
      } 
      S2++; 
      timer_enable_int(0<<TOIE1); 
      if(S2>23) S2=0; 
      S3 = SINGG[S2]; 
      S3 = S3&0X0F;    //取低4位,将时间存到S3 
      TI= SINGG[S2];       
      TI=TI>>4;                 //取到音符 
      if(TI==0)      timer_enable_int(0<<TOIE1); 
      else    
      { 
         TI=TI-1; 
         TCNT1 = SINGM[TI]; 
         timer_enable_int(_BV(TOIE1)); 
      } 
      asm("nop"); 
       
   } 
} 



⌨️ 快捷键说明

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