专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

AVR单片机学习程序(音乐合成)

作者:佚名   来源:本站原创   点击数:  更新时间:2010年06月25日   【字体:
//AVR单片机学习程序
//名称:音乐合成
//硬件:AVR-ATMEGA16实验板
//编写人:李春起
//编写时间:2010。04。28
//修改日志:
#include<iom16v.h>  
#include <macros.h>

//-------------位拉高--------------------------------------------
#define ADC0_H PORTA|=BIT(PA0) 
#define ADC1_H PORTA|=BIT(PA1)   
#define LEDLK_H PORTA|=BIT(PA2)  //流水灯选通
#define SEGLK_H PORTA|=BIT(PA3)  //数码管段码选通
#define BITLK_H PORTA|=BIT(PA4)  //数码管位选通
//#define 18B20_H PORTA|=BIT(PA5) 
#define BEEP_H PORTA|=BIT(PA6)   //蜂鸣器
#define CUSB_H PORTA|=BIT(PA7) 
//#define ~YY PORTD|=BIT(PD7)
//-------------位拉低--------------------------------------------
#define ADC0_L PORTA&=~BIT(PA0)  
#define ADC1_L PORTA&=~BIT(PA1)    
#define LEDLK_L PORTA&=~BIT(PA2)   
#define SEGLK_L PORTA&=~BIT(PA3)   
#define BITLK_L PORTA&=~BIT(PA4)   
//#define 18B20_L PORTA&=~BIT(PA5)  
#define BEEP_L PORTA&=~BIT(PA6)  
#define CUSB_L PORTA&=~BIT(PA7)  
//#define YY PORTD&=~BIT(PD7)

#define NOP() asm("nop")

#define uchar unsigned char 
#define uint unsigned int

uint a,x;

//====================音乐数据表=============================================

__flash uchar yin[]={
//《我们从这里起飞》
119,119,106,94,119,106,119,106,119,159,
119,119,106,94,89,94,106,142,126,119,94,106,94,89,79,71,79,94,106,
126,119,106,94,142,159,119,94,71,79,94,119,106,159,106,119,
119,119,89,79,71,79,71,59,71,89,71,79,79,79,94,71,79,94,119,
106,159,126,119,106,119,119,89,79,71,59,71,89,71,79,94,
59,79,94,71,79,94,119,106,159,94,106,119,
119,119,106,94,119,106,119,106,119,159,
119,119,106,94,89,94,106,142,126,119,94,106,94,89,79,71,79,94,106,
126,119,106,94,142,159,119,94,71,79,94,119,106,159,106,119,
//119,119,106,94,89,94,89,71,89,106,89,94,94,94,119,94,94,119,119,
//126,159,126,119,106,119,119,106,94,89,71,89,106,89,94,119,
//79,94,119,94,94,119,119,126,159,142,126,119,
119,119,89,79,71,79,71,59,71,89,71,79,79,79,94,71,79,94,119,
106,159,126,119,106,119,119,89,79,71,59,71,89,71,79,94,
59,79,94,71,79,94,119,106,159,94,106,119,
59,79,94,71,79,89,94,79,79,71,63,59,0,
//《你怎么说》
60,60,53,59,71,79,95,80,71,59,80,80,71,59,
53,53,59,53,47,0,39,47,53,47,47,79,71,
59,47,53,0,79,39,47,53,79,47,53,59,
59,53,47,47,39,47,53,59,71,79,59,59,53,47,94,79,94,106,94,
79,79,71,59,59,59,53,47,39,47,39,47,39,47,53,
59,53,53,59,53,47,47,53,59,53,47,39,0,79,39,47,
53,79,47,53,59,
60,60,53,59,71,79,95,80,71,59,80,80,71,59,
53,53,59,53,47,0,39,47,53,47,47,79,71,
59,47,53,0,79,39,47,53,79,47,53,59,
59,53,47,47,39,47,53,59,71,79,59,59,53,47,94,79,94,106,94,
79,79,71,59,59,59,53,47,39,47,39,47,39,47,53,
59,53,53,59,53,47,47,53,59,53,47,39,0,79,39,47,
53,79,47,53,59,
0,
//《八月桂花香》
59,71,79,71,59,79,71,59,71,79,71,59,79,
79,71,59,53,71,79,94,79,106,94,79,119,
79,71,59,79,94,106,119,106,79,71,59,79,94,106,119,106,
79,71,59,53,71,79,94,79,106,94,79,119,
79,71,59,53,71,79,94,47,59,53,47,59,0,
//《阿里山的姑娘》
94,79,94,106,94,79,71,79,94,106,94,79,94,94,106,106,
142,119,106,119,142,159,142,71,71,71,79,79,94,94,94,106,106,94,119,
142,142,106,106,106,94,79,94,94,106,94,106,119,119,106,119,142,159,142,142,
119,142,142,159,106,94,106,119,106,94,79,94,106,94,106,142,119,106,119,142,
159,142,71,71,71,79,79,94,94,106,94,106,94,119,142,142,106,106,106,94,
79,94,94,106,94,106,119,119,106,119,142,159,142,94,106,94,79,71,79,94,
106,94,79,94,106,142,119,106,119,142,159,142,71,71,71,79,79,94,94,106,
94,106,94,119,142,142,106,106,94,79,94,79,106,94,79,71,0,
71,71,71,71,71,59,53,59,71,79,94,71,79,59,71,79,106,94,79,79,106,94,106,142,
94,106,94,79,106,94,142,119,94,106,119,142,142,142,
94,106,94,79,71,79,94,
106,94,79,94,106,142,119,106,119,142,159,142,71,71,71,79,79,94,94,106,
94,106,94,119,142,142,106,106,94,79,94,79,106,94,79,71,0,
71,71,71,71,71,59,53,59,71,79,94,71,79,59,71,79,106,94,79,79,106,94,106,142,
94,106,94,79,106,94,142,119,94,106,119,142,142,142,
94,106,94,79,71,79,94,

};

//---------------------节拍表------------------------------------------------
__flash uchar time[]={
40,40,40,40,160,40,40,40,40,160,
40,40,40,40,40,40,80,40,40,40,40,160,40,40,40,40,120,20,20,
40,40,40,40,160,40,40,40,40,40,40,80,40,80,40,160,
40,40,40,40,120,20,20,40,40,40,40,160,40,40,40,40,40,40,80,
40,40,40,40,160,40,40,40,40,160,40,40,40,40,80,80,
40,40,40,40,40,40,80,40,80,20,20,160,
40,40,40,40,160,40,40,40,40,160,
40,40,40,40,40,40,80,40,40,40,40,160,40,40,40,40,120,20,20,
40,40,40,40,160,40,40,40,40,40,40,80,40,80,40,160,
//40,40,40,40,120,20,20,40,40,40,40,160,40,40,40,40,40,40,80,
//40,40,40,40,160,40,40,40,40,160,40,40,40,40,80,80,
//40,40,40,40,40,40,80,40,80,20,20,160,
40,40,40,40,120,20,20,40,40,40,40,160,40,40,40,40,40,40,80,
40,40,40,40,160,40,40,40,40,160,40,40,40,40,80,80,
40,40,40,40,40,40,80,40,80,20,20,160,
40,40,50,55,60,65,240,40,80,20,20,160,200,//198个

120,20,20,80,40,40,40,80,20,20,200,40,40,40,40,40,40,40,160,40,
40,40,40,40,40,40,40,60,40,80,40,40,40,40,40,40,40,40,255   ,120,
40,80,40,40,40,40,40,40,160,40,40,40,40,40,20,20,40,40,240,40,
40,120,40,80,40,20,20,40,40,20,20,20,20,160,40,40,40,40,40,20,
20,40,20,20,255,40,40,40,40,40,40,40,40,250,//96个
120,20,20,80,40,40,40,80,20,20,200,40,40,40,40,40,40,40,160,40,
40,40,40,40,40,40,40,60,40,80,40,40,40,40,40,40,40,40,255   ,120,
40,80,40,40,40,40,40,40,160,40,40,40,40,40,20,20,40,40,240,40,
40,120,40,80,40,20,20,40,40,20,20,20,20,160,40,40,40,40,40,20,
20,40,20,20,255,40,40,40,40,40,40,40,40,250,255,

60,20,80,20,20,20,20,80,40,40,40,40,160,60,20,40,40,40,40,80,
40,40,40,40,160,40,20,20,40,40,40,40,80,40,20,20,40,40,40,40,
80,60,20,40,40,40,40,80,40,40,40,40,160,60,20,40,40,40,40,80,
120,40,80,80,160,200,//66个

20,10,10,20,20,20,10,10,20,20,120,20,20,30,10,30,10,20,10,10,
20,20,160,20,20,20,20,20,20,40,20,20,20,20,20,20,40,30,10,20,
20,20,20,40,30,10,20,20,20,10,10,20,20,160,20,10,10,20,20,20,
10,10,20,20,120,20,20,20,20,20,20,20,10,10,20,20,160,20,20,20,
20,20,20,40,20,20,20,20,20,20,40,30,10,20,20,20,20,40,30,10,
20,20,20,10,10,20,20,160,40,20,20,20,10,10,20,20,120,20,20,60,
20,20,10,10,20,20,160,30,10,20,20,20,20,40,30,10,30,10,20,20,
40,40,20,20,40,20,20,80,60,20,255,40,//153个
30,10,20,20,20,20,20,20,40,20,20,40,20,20,40,20,20,20,20,20,20,20,
20,40,40,20,20,40,20,20,20,20,20,10,10,40,40,80,
40,20,20,20,10,10,20,20,120,20,20,60,
20,20,10,10,20,20,160,30,10,20,20,20,20,40,30,10,30,10,20,20,
40,40,20,20,40,20,20,80,60,20,255,
20,20,10,10,20,20,160,30,10,20,20,20,20,40,30,10,30,10,20,20,
40,40,20,20,40,20,20,80,60,20,255,
};
 //===================延时MS子程序===========================================
void delayms(uint m)
{
  uint i,j;
  for(i=0;i<m;i++)
  {
    for(j=0;j<10000;j++);
  }
}
//==============IO初始化=========================
void IO_init(void)
{
 DDRA  = 0xff;
 PORTA = 0XFF;
 DDRB  = 0xff;
 DDRC  = 0xff;
 DDRD  = 0xff;
}
//==============定时器T0初始化====================
void timer0_init(void)
{
 TCCR0 = 0x0B; //64分频
 TCNT0 = 0x00;  //计数器清0
 OCR0  = 1;     //1*8/8M=8uS
 TIMSK |=0x02;  //使能OCIE0
 TIFR  |=0x02;  //清OCIF0中断标识位
}
//==============使能全局中断======================
void Interrupt_init()
{
  SREG|=0x80;
}
//==============初始化============================
void init(void)
{
 IO_init();
 timer0_init();
 Interrupt_init();//使能全局中断
}
//===============主函数===========================
void main()
{
 init();
 while(1)
 {
   for(x=0;x<820;x++)
   {
     a=yin[x];
  if(a==0){DDRD=0x00;}
     else  {DDRD=0xFF;OCR0=a;}
     a=time[x];
     delayms(a);
  DDRD=0x00;
  delayms(1);
   }  
 }
}
//============定时器T0中断服务子程序===============
#pragma interrupt_handler Timer0_Interrupt:20
void Timer0_Interrupt(void)
{
  TIFR |=0x02;
  TCNT0 =0x00;
  PORTD^=0x80;   //PD7输出音乐
}

  
关闭窗口

相关文章