AVR單片機學習程序(音樂合成)
//AVR單片機學習程序
//名稱:音樂合成
//硬件:AVR-ATMEGA16實驗板
//修改日志:
#includeiom16v.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) //數(shù)碼管段碼選通
#define BITLK_H PORTA|=BIT(PA4) //數(shù)碼管位選通
//#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;
//====================音樂數(shù)據(jù)表=============================================
__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,
};
//---------------------節(jié)拍表------------------------------------------------
__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;im;i++)
{
for(j=0;j10000;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; //計數(shù)器清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();//使能全局中斷
}
//===============主函數(shù)===========================
void main()
{
init();
while(1)
{
for(x=0;x820;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輸出音樂
}
評論