资源描述:
《基于proteus蜂鸣器播放音乐(atmega16)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、/*************************************************************Filename:T1单音音乐播放器(CTC)Chiptype:ATmega16Programtype:NO.8_7Clockfrequency:1.000000MHz*************************************************************/#include#include#defineMax_Note32intNote[9]={0,956,865,759,7
2、16,638,568,506,470};//音符频率intBeat[9]={0,105,116,132,140,157,176,198,209};//节拍周期intMusic[Max_Note]={5,2,8,2,5,2,4,2,3,2,2,2,1,4,1,2,1,2,2,2,3,2,3,2,1,2,3,2,4,2,5,8};//乐谱(奇数为音符,偶数为节拍)intNote_n;//记录乐谱音符节拍模拟指针intCount;//记录单个音符播放时间intPlay_on;//判定是否从头开始播放音乐(0_从头开始播放/1_音乐正在播放)voidport_init(void
3、){PORTA=0x00;DDRA=0x00;PORTB=0x00;DDRB=0x00;PORTC=0x00;DDRC=0x00;PORTD=0x08;//PD3(INT1)按键下降沿触发打开内部上拉电阻DDRD=0x20;//PD5(OCR1A)输出模式脉冲驱动发声}voidtimer1_init(void){TCCR1B=0x00;//关闭T1TCNT1H=0x00;TCNT1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;ICR1H=0x00;ICR1L=0x00;TCCR1A=0x40;TCCR1B=
4、0x08;//打开T1——设置无时钟源模式——停止T1}#pragmainterrupt_handlertimer1_compa_isr:iv_TIM1_COMPA//T1比较匹配中断voidtimer1_compa_isr(void){if(!Play_on)//从头开始播放音乐{Note_n=0;//乐谱音符节拍模拟指针指向乐谱第一个音符Count=1;//设置单个音符播放时间=0目的:兼容--Count,方便设置Play_on=1;//阻止从头开始播放}else//正在进行音乐播放{if(--Count==0)//判定是否完成当前音符的播放时间(0——一个音符播放
5、完成,修改设置下个音符){TCCR1B=0x08;//停止T1if(Note_n6、R1B=0x09;}else{Play_on=0;//允许从头开始播放}}}}#pragmainterrupt_handlerint1_isr:iv_INT1voidint1_isr(void){if(!Play_on){TCCR1B=0x09;//不经过分配器模式——启动T1}}voidinit_devices(void){CLI();port_init();timer1_init();MCUCR=0x08;GICR=0x80;TIMSK=0x10;SEI();}intmain(){init_devices();while(1){}}