




免费预览已结束,剩余22页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、功能说明1. 能通过键盘输入基本的音阶,并在LED上显示,蜂鸣器同步发出声音。输入的音阶将被存储起来,可以被重放。 2. 编辑完成后,可播放编辑好的音乐。 3. 可对音乐进行基本的操作:播放,暂停,停止,重输入,快进,后退。 二、应用价值1. 作为手机音乐编辑器。 2. 作为的模拟电子琴(比如,放在婴儿车上)。 3. 作为定音哨。三、实现方案1. 硬件设计思想和电原理图。 2. 通过TIMER0输出方波,作为音阶,以 TIMER1延时,产生节拍,通过蜂鸣器播放出来。 3. 由键盘输入数据、控制播放,由LED显示。 电原理图如下:连线照片:软件设计思想和流程图。每个play, pause等(暂称之为执行函数),都只执行很短的时间,放在while (state=?)循环内部,中断函数只负责改变state的值。 数组定义: Music_arr歌曲数组名状态位; 歌曲数组名音频节拍; 共五个;下图仅表示功能定义,代表由上而下的设计结构。不代表程序流程。4位led代表意义:1. 模式选择,P,E; 2. 曲目序号,1-5; 3. 播放模式时为当前状态,state为空时不显示 4. 音阶0-7,播放时为播放的音阶,编辑时为输入的音阶。 中断处理子过程程序流程main()软件详细功能:当键盘被按下时,触发外部中断,中断函数更改全局状态变量,主函数不断扫描这些变量,从而调用相应的函数处理。以下简单介绍几个函数的功能: play函数:播放预存数组中的一个音节。 stop函数:停止播放。 pause函数:暂停播放,同时记录下当前播放的数组元素的位置,等待继续播放。 ,:播放状态时,前进一首和后退一首。编辑状态时,升高或降低八度,从而可以在覆盖几乎全部音域 当处于编辑状态时,delete退格键,reset重新输入键。07为音阶,存入数组中。 程序源代码见附一。 四系统测试过程及测试数据。系统测试过程随着开发过程同时进行,我们实行的是边开发,边测试的思路。开发过程及进度表如下:起始阶段:定义键盘功能(详见附二)16月13日,可以通过TIMER0输出方波,作为音阶,以 TIMER1延时,产生节拍,通过蜂鸣器播放出来发出各种频率的声音。定义了17各个音阶的频率。写出发音函数,作为底层接口,可以在程序中直接调用。方便以后的进程。(测试代码见附三)26月16日,能通过键盘输入基本的音阶,并在LED上显示,蜂鸣器同步发出声音。通过键盘输入,编辑完成音乐,数据存入一个定义的数组中。 编辑完成后,可将数组中的数据按照预定的方式通过单片机输出到喇叭中,播放编辑好的音乐。数组中预存喀秋莎,可以下载程序听到美妙的音乐播放出来。(测试代码见附四)36月20日,完成,并开始准备相应的设计报告及其他文档。(测试代码见附一)五 . 设计所需资源。硬件资源:AVR开发板一块,扬声器一个。软件资源:iccavr,avr studio 软件。人力资源:组内全体成员。六 .成员分工和工作情况。李晓:播放函数编写,键盘定义。杨金龙:软件整体架构,软件调试。李钰:相关文档整理,ppt , 网页制作。各成员基本完成各自份内的任务。附一:#include config.h /决定是否播放 ,全局变量/uint16 *p;/歌曲选择指针 uint8 list=0;/歌曲选择变量 uint8 input=1; uint8 pause=1; uint8 state=0,stop=1,play=1,key; uint8 MUSIC_DATA502; uint8 i=0,length=50,key_buffer;/i 歌曲播放指针 /6 7 1 2 3 5 6 7 1flash uint16 Mode_Data16=440,494,523,587,659,698,784, 880,998,1046,1156,1318,1396,1568,0;/存放声音的频率/* 音乐产生函数 * 功能:输出频率为x的方波,延时y MS* 范围:x:100-20000Hz,0:不发声 * y:0-65536 MS */extern void sound(uint16 i) /uint16 x;/x=music_datai0; /取音乐的频率数据if(i!=0) /x=; /1M时钟数据计算OCR1A=500000/i; /比较值赋值TCCR1A = 0x40; /允许比较反转输出elseTCCR1A = 0x00; /频率为0,休止符,不发声/* 延时函数:1M时钟时为MS */extern void delay_ms(uint16 i) uint8 a;for(;i;i-) for (a = 220; a; a-) /倍率 原来220 ;flash uint16 kaqiusha2= 440,600,494,200,523,600,443,200,523,400,494,200,440,200,494,400,330,400,494,600,523,200,578,600,494,200,578,400,523,200,494,200,440,800,659,400,880,400,784,400,880,200,784,200,698,400,659,200,578,200,659,400,440,400, 0,200,698,400,578,200,659,600,523,200,494,200,330,200,523,200,494,200,440,800,659,400,880,400,784,400,880,200,784,200,698,400,659,200,578,200,659,400,440,400, 0,200,698,400,578,200,659,600,523,200,494,200,330,200,523,200,494,200,440,800,0,0; void kaqiusha_sing(void) sound(kaqiushai0); /输出音符 / PORTA=seg7_data(i%16); delay_ms(kaqiushai1);/节拍延时 TCCR1A = 0x00; /奏完一个音符停止 PORTD|=15) list=0; flash uint16 moscow_night2= 440,400,523,400,659,400,523,400,587,800,523,400,494,400,659,800,587,800,440,1600,523,400,659,400,784,400,784,400,880,800,784,400,698,400,659,1600,740,800,831,800,988,400,880,400,659,1200,494,800,440,400,659,400,587,400,698,1600,784,400,698,400,659,800,587,400,523,400,659,800,587,800,440,1600,740,800,831,800,988,400,880,400,659,1200,494,800,440,400,659,400,587,400,698,1600,784,400,698,400,659,800,587,400,523,400,659,800,587,800,440,3200,0,0; void moscow_night_sing(void) sound(moscow_nighti0); /输出音符 / PORTA=seg7_data(i%16); delay_ms(moscow_nighti1);/节拍延时 TCCR1A = 0x00; /奏完一个音符停止 PORTD|=15) list=0; flash uint16 super_mario2= 659,200,659,200,0,200,659,200,0,200,523,200,659,200,0,200,784,400,0,400,392,400,0,400,523,200,0,400,392,400,0,400,330,200,0,400,440,200,0,200,494,200,0,200,466,200,440,200,0,200,392,266,659,266,784,266,880,200,0,200,698,200,784,200,0,200,659,200,0,200,523,200,587,200,494,200,0,400,523,200,0,400,392,400,0,400,330,200,0,400,440,200,0,200,494,200,0,200,466,200,440,200,0,200,392,266,659,266,784,266,880,200,0,200,698,200,784,200,0,200,659,200,0,200,523,200,587,200,494,200,0,800,784,200,740,200,698,200,622,200,0,200,659,200,0,200,415,200,440,200,523,200,0,200,440,200,523,200,587,200,0,400,784,200,740,200,698,200,622,200,0,200,659,200,0,200,1047,200,0,200,1047,200,1047,200,0,800,784,200,740,200,698,200,622,200,0,200,659,200,0,200,415,200,440,200,523,200,0,200,440,200,523,200,587,200,0,200,622,200,0,400,587,200,0,400,523,200,0,600,392,200,392,200,0,200,262,200,0,400,784,200,740,200,698,200,622,200,0,200,659,200,0,200,415,200,440,200,523,200,0,200,440,200,523,200,587,200,0,400,784,200,740,200,698,200,622,200,0,200,659,200,0,200,1047,200,0,200,1047,200,1047,200,0,800,784,200,740,200,698,200,622,200,0,200,659,200,0,200,415,200,440,200,523,200,0,200,440,200,523,200,587,200,0,200,622,200,0,400,587,200,0,400,523,200,0,600,392,200,392,200,0,200,262,200,0,400,0,0;/ super mario void super_mario_sing(void) sound(super_marioi0); /输出音符 / PORTA=seg7_data(i%16); delay_ms(super_marioi1);/节拍延时 TCCR1A = 0x00; /奏完一个音符停止 PORTD|=15) list=0; flash uint16 butterfly_lovers2= 247,800,294,600,330,200,392,600,440,200,330,200,392,200,294,200,0,200,587,600,784,200,659,200,587,200,494,200,587,200,440,1400,0,200,440,400,440,200,494,200,370,400,330,400,294,600,330,200,392,400,440,400,247,400,392,400,330,200,294,200,330,200,392,200,294,1400,0,200,494,600,587,200,370,400,440,400,330,200,392,200,294,1200,247,300,294,100,247,400,294,300,330,100,370,200,440,200,330,1200,294,200,330,200,392,600,440,200,587,400,494,400,440,400,494,200,440,200,392,400,330,200,294,200,247,400,0,400,392,400,0,400,330,300,392,100,330,200,294,200,247,200,294,200,330,200,392,200,294,1400,0,0; /梁祝歌曲 void butterfly_lovers_sing(void) sound(butterfly_loversi0); /输出音符 / PORTA=seg7_data(i%16); delay_ms(butterfly_loversi1);/节拍延时 TCCR1A = 0x00; /奏完一个音符停止 PORTD|=15) list=0; flash uint16 Sdu_Song2= 698,300,698,100,698,200,698,200,698,200,698,200,659,200,587,200,587,200,523,1000,349,400,440,400,523,400,523,200,466,400,440,200,466,400,440,400,392,800,392,300,392,100,392,200,392,200,392,200,370,200,392,200,440,200,466,200,523,200,587,200,659,200,698,200,784,600,880,600,784,200,784,200,523,600,698,1600,0,0;/song of SDUvoid Sdu_Song_sing(void) sound(butterfly_loversi0); /输出音符 / PORTA=seg7_data(i%16); delay_ms(Sdu_Songi1);/节拍延时 TCCR1A = 0x00; /奏完一个音符停止 PORTD|=15) list=0; flash uint16 music_data2=440,400,440,400,659,400,659,400,740,400,740,400,659,800,587,400,587,400,554,400,554,400,494,400,494,400,440,800,659,400,659,400,587,400,587,400,554,400,554,400,497,800,659,400,659,400,587,400,587,400,554,400,554,400,497,800,440,400,440,400,659,400,659,400,740,400,740,400,659,800,587,400,587,400,554,400,554,400,494,400,494,400,440,800,0,0;/ abcdefgvoid music_data_sing(void) sound(music_datai0); /输出音符 / PORTA=seg7_data(i%16); delay_ms(music_datai1);/节拍延时 TCCR1A = 0x00; /奏完一个音符停止 PORTD|=15) list=0; /* 端口初始化函数 */void port_init(void)DDRD|=0xa0; /D5口配置为输出,驱动蜂鸣器PORTD|=0x0f;DDRB=0xf0;PORTB=0X0F;DDRA=0xff;Seg7_Led_Init();MCUCR=0x00;GICR = 0x40;SEI();/*name: list_deal();function: deal with many songs of the machine*/extern void list_deal(void) switch(list) case 0: butterfly_lovers_sing();break; case 1: moscow_night_sing();break; case 2: Sdu_Song_sing();break; case 3: super_mario_sing();break; case 4: kaqiusha_sing();break; case 5: music_data_sing();break; /*name: key_deal();function: deal with states of the machine*/extern void key_deal(void)if(state=0)/播放状态 while(play&pause) list_deal(); /* sound(music_datai0); /输出音符 delay_ms(music_datai1);/节拍延时 TCCR1A = 0x00; /奏完一个音符停止 PORTD|=15; if(!music_datai+1) i=0; */调试用 /播放选择的音乐 /播放modeelse while(play&pause&(input) sound(Mode_DataMUSIC_DATAi0); /输出音符 PORTA=seg7_data(i%16); delay_ms(400);/节拍延时 TCCR1A = 0x00; /奏完一个音符停止 PORTD|=1length) break;else i+=2;break; if(!play) if(+list5)list=0;break; case BACK: if(play=1) if(i2)i=0;break;else i-=2;break; if(!play) if(-list0)list=5;break; default :break; ; Seg7_Data_Port=seg7_data(i); else if(state) if(key=8)&input) add(key); MUSIC_DATAi+0=key;MUSIC_DATAi-11=400; sound(Mode_Datakey); delay_ms(200); TCCR1A = 0; /奏完一个音符停止 PORTD|=18) switch(key) case PAUSE:pause=0;break; case PLAY: if(input) /不是输入模式 play=1;pause=1;break;/* if(i!=0) /输入模式 MUSIC_DATAi0=0; MUSIC_DATAi1=0;/clear i=0,play=1,pause=1;input=0;break; */ case DEL: if(input) del(i4?MUSIC_DATAi-50:16); if(i0) i-;break; case OVER: if(input)/输入模式 MUSIC_DATAi0=0; MUSIC_DATAi1=0;/clear play=0;i=0,input=0,pause=1;break; ; case STOP: if(input)play=0,pause=1,i=0;break;/输入模式 case RST: if(input) i=0,pause=1,play=0;break;/如果正在输入, if(input&play&pause)/没有输入 i=0,pause=1;state=0;break; if(input&pause) /没有输入且暂停 切换模式 input=1,i=0,play=0,pause=1;break;/则case STOP:play=0;i=0;break;重新输入 case ADVANCE:if(input&pause) MUSIC_DATAi-11+=200; show(MUSIC_DATAi-11);break; if(play&input) if(i+2)length) break;else i+=2;break; case BACK: if(input&pause) if(MUSIC_DATAi-11200) MUSIC_DATAi-11-=200; show(MUSIC_DATAi-11); break; if(play&input) if(i0;i-) /250ms*4=1000ms delay_1ms(); for(i=250;i0;i-) delay_1ms(); for(i=250;i0;i-) delay_1ms(); for(i=250;i0;i-) delay_1ms();/*微秒级延时*/void delay_us(unsigned int n) unsigned int i; for(i=n;i0;i-) delay_1us();/*毫秒级延时*void delay_ms(unsigned int n) unsigned int i; for(i=n;i0;i-) delay_1ms();*/*秒级延时,太浪费资源,不建议使用*/void delay_s(unsigned int n) unsigned int i,j; for(j=n;j0;j-) for(i=250;i0;i-) /250ms*4=1000ms delay_1ms(); for(i=250;i0;i-) delay_1ms(); for(i=250;i0;i-) delay_1ms(); for(i=250;i0;i-) delay_1ms(); 附二:课程设计进度报告(6月9日) 目前已完成键盘定义,共有16个键(44)。每个按键的定义如下: 17.表示音阶0:休止符。Paus:暂停,pause;Del:退格键,删除前一个音符Over:输入结束;Res:reset键,重新输入;Play:播放键,播放之前编辑的音乐;Stop:停止键,停止播放;:快进:慢进附三:程序代码如下:#include #include #define uchar unsigned char#define uint unsigned int/以下音乐数据为卡秋莎,位于程序区flash uint music_data2=440,600,494,200,523,600,443,200,523,400,494,200,440,200,494,400,330,400,494,600,523,200,578,600,494,200,578,400,523,200,494,200,440,800,659,400,880,400,784,400,880,200,784,200,698,400,659,200,578,200,659,400,440,400, 0,200,698,400,578,200,659,600,523,200,494,200,330,200,523,200,494,200,440,800,659,400,880,400,784,400,880,200,784,200,698,400,659,200,578,200,659,400,440,400, 0,200,698,400,578,200,659,600,523,200,494,200,330,200,523,200,494,200,440,800, 0, 0;#pragma data:data /设置回到数据存储器区/* 延时函数:1M时钟时为MS */void delay_ms(uint i)uchar a;for(;i;i-) for (a = 220; a; a-) ;/* 端口初始化函数 */void port_init(void)DDRD=0xff; /D5口配置为输出,驱动蜂鸣器/* 音乐产生函数 * 功能:输出频率为x的方波,延时y MS* 范围:x:100-20000Hz,0:不发声 * y:0-65536 MS */void sound(uchar i)uint x;x=music_data0; /取音乐的频率数据if(x!=0)x=7372800/x; /1M时钟数据计算OCR1A=x; /比较值赋值TCCR1A = 0x40; /允许比较反转输出elseTCCR1A = 0x00; /频率为0,休止符,不发声/* 主函数 */void main(void)uchar i=0;port_init(); /端口初始化TCCR1A = 0x40; /将T/C1配置为比较匹配,OC1A取反TCCR1B = 0x09;while(1)while(music_data1!=0) /等待最后一个音符到来 sound(i); /输
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育机器人个性化教学方案的设计与实践
- 数据化教学模式的探索与实践
- 抹灰砂浆M5的检验报告
- 中国电子化学品行业市场调查报告
- 2021-2026年中国安全防护设备市场调查研究及行业投资潜力预测报告
- 挂机项目投资可行性研究分析报告(2024-2030版)
- 2025年中国香精香料行业发展前景预测及投资战略研究报告
- 中国三倍一体化摄像机行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- 玉石碟项目投资可行性研究分析报告(2024-2030版)
- 2020-2025年中国螺纹铣床行业市场调研分析及投资战略咨询报告
- 绿化养护投标方案(技术方案)
- 电梯日管控、周排查、月调度内容表格
- 小学生火星天问一号祝融车分享
- AI技术在市场营销策略中的应用指南
- 2020年青海省(初三学业水平考试)中考数学真题试卷含详解
- 病理学智慧树知到期末考试答案章节答案2024年温州医科大学
- 大学英语写作网络课程智慧树知到期末考试答案章节答案2024年佳木斯大学
- T-CSTM 00607-2024 被动式超低能耗建筑外围护结构用防水隔汽膜、透汽膜及气密性配件
- DL-T5333-2021水电水利工程爆破安全监测规程
- 郑州经贸学院辅导员考试题库
- 医疗废物收集人员个人防护要求
评论
0/150
提交评论