//AVR單片機(jī)學(xué)習(xí)程序 //名稱(chēng):音樂(lè)合成 //硬件:AVR-ATMEGA16實(shí)驗(yàn)板 //編寫(xiě)人:李春起 //編寫(xiě)時(shí)間: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) //數(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; //====================音樂(lè)數(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, //《你怎么說(shuō)》 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個(gè) 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個(gè) 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個(gè) 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個(gè) 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, }; //===================延時(shí)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; } //==============定時(shí)器T0初始化==================== void timer0_init(void) { TCCR0 = 0x0B; //64分頻 TCNT0 = 0x00; //計(jì)數(shù)器清0 OCR0 = 1; //1*8/8M=8uS TIMSK |=0x02; //使能OCIE0 TIFR |=0x02; //清OCIF0中斷標(biāo)識(shí)位 } //==============使能全局中斷====================== void Interrupt_init() { SREG|=0x80; } //==============初始化============================ void init(void) { IO_init(); timer0_init(); Interrupt_init();//使能全局中斷 } //===============主函數(shù)=========================== 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); } } } //============定時(shí)器T0中斷服務(wù)子程序=============== #pragma interrupt_handler Timer0_Interrupt:20 void Timer0_Interrupt(void) { TIFR |=0x02; TCNT0 =0x00; PORTD^=0x80; //PD7輸出音樂(lè) }