




免费预览已结束,剩余18页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
录音笔的设计与制作摘要:该实验设计基于AVRmega16开发板平台,介绍和分析了市场上流行的录音笔的基本原理,并做出了较为简单的录音笔模型展示其原理!主要功能有录音,存储,删除,放音等!关键字:单片机 录音笔 录音与放音我们的课程设计是基于 该系列的单片机,在硬件滤波的基础上,实现录音笔的各项功能!所作的录音笔具有可移植性强,功能简单,可以简单继续添加更多相关功能的模型!对市场上流行已久的录音笔,我们有着学习相关知识以及制作的兴趣,又加上单片机课程给我们提供了相关的实验器材,所以说我们的目的最主要是学习,当然也有好奇的心理在里面。我们制作的录音笔能够进行简单语音信号的采集,存储与播放。对于应用于实际生活中的各种语音信号的处理,还有很大差距,这有待于系统设计的进一步完善和改进,功能的进一步扩充。硬件部分:电路图如下:硬件设计思想:用麦克风采集音频信号,经过一次功放,然后用电容进行一次滤波,电容的大小采用2.2nf,滤波后进行AD转换,转换后的信号存在AT45DB081B中,然后用单片机调出信号,经过一次放大,将信号传到扬声器播放。电路图上,mag16以上的电路图就是用来采集信号的,放大信号用的是LM324集成功放芯片。Mag16一下的电路图用来放音,也是经过一次信号放大,再放大的同时尽心信号过滤,分别用了2.2nf和22nf的电容接地来实现!软件部分:软件设计思想:首先是设备初始化,但是我在初始化程序中ADC.定时器等并没有进行初始化,只是告诉芯片PA0应该设置为输入,不上拉使能(为AD转换的输入通道设置),用于SPI的输出端口哪些应该为输入,哪些该为输出,如此等简单的引脚初始化。初始化完成之后,就进入主程序中进行键盘扫描,速度极其的快,无键盘按下时甚至只用不到1微秒的时间。一旦检测到哪个键按下就进入相应的程序中去。录音程序的设计思想:检测到录音键按下后进入,然后ADC初始化同时开始一次AD转换,延时等待一小会,AD转换结束了。接着SPI、定时器初始化,从此就靠定时器来主导整个录音程序的运行了。定时器有中断,其中有要求TCNT0设置这个基本的操做,还有一个就是ADSC置位要求进行下一次转换。至于AD转化的值则在AD中断中往一个已经建好循环队列中写。定时器定时80微秒,一次AD转换是在定是一开始就进行,需要时间52微秒,也就是说定时器溢出时AD中断一定结束了,下一次中断之前数据一定已经进入了队列中,如此循环。而在这两个终端中间有大量的时间给我利用循环队列的特点向Dataflash中写数据。Dataflash有2048页,每一页有264字节,在每一页写满之前,程序不会再检测按键,一直到一页写满了,才检测按键,如果仍旧是按下则继续录音,否则退出。退出后如果存储空间未满则存储位置的参数会保留,下次录音可以接下去。如果满了,则录音工作指示灯永远都不会亮了,除非重启。但是在退出录音程序时,ADC、SPI、定时器会全部关闭,再进入程序时再初始化开启。放音程序的设计思想:与录音程序相同,进入程序之后才开启所需要的功能。不同的是先开录音工作指示灯,SPI,然后向Dataflash要一次数据,再开TIMER2的快速PWM功能。一次PWM时间是16微秒,每五次更新一次,通过调节占空比来实现DA转换的功能。同样的每五次中断期间都有足够的时间给程序向Dataflash要数据。放音程序最大的特点是那些控制参数虽然是全局变量,但是它们在进入程序的第一时间就被初始化了,在就要退出程序的最后时刻再次被初始化。这样就使得整个程序可以进行循环放音,但是每次都是从头开始,放开按键时停止,再按下时从头开始。以此结束时会因为人很不可能恰好在退出程序时放开按键,所以放音键按下的状态会在下一个按键检测循环中被检测到,并进入方音程序。软件实现具体流程:返回录音程序放音程序开始端口初始化按键检测开始端口初始化相关软件程序模块源代码以及相关功能:/ICC-AVR application builder : 2007-6-22 17:58:09/ Target : M16/ Crystal: 16.000Mhz #include #include #define BUFFER1_READ 0x54#define BUFFER2_READ 0x56#define MAIN_TO_BUFFER1 0x53#define MAIN_TO_BUFFER2 0x55#define BUFFER1_WRITE 0x84#define BUFFER2_WRITE 0x87#define BUFFER1_TO_MAIN_WITH 0x83#define BUFFER2_TO_MAIN_WITH 0x86#define BUFFER1_TO_MAIN_WITHOUT 0x88#define BUFFER2_TO_MAIN_WITHOUT 0x89#define MAIN_PROGRAM_BUFFER1 0x82#define MAIN_PROGRAM_BUFFER2 0x85 /给SPI定义的PORTB的引脚#define DF_CS 3#define DDR_MOSI 5#define DDR_MISO 6#define DDR_SCK 7 /给工作状态指示灯LED的引脚定义/PA7?0B01111111#define RECORD_LED 0x7F#define PLAY_LED 0xBF#define ERASE_LED 0xDF#define unit8 unsigned char#define unit16 unsigned int volatile unit8 over_times=0,play_buffer_number=1,updata_OCR=0;volatile unsigned char NEW_OCR=0;volatile unit16 play_buffer_counter=0,play_page_counter=0;volatile unsigned char record_buffer264=0;volatile unit8 new_turn=0,record_buffer_number=1;volatile unit16 record_page_counter=0,record_buffer_counter=0,data_position=0,send_position=0;void port_init(void)PORTA = 0xE0;DDRA= 0xE0;PORTB = 0x00;DDRB= 0xB8;PORTC = 0x43; /m103 output onlyDDRC= 0x00;PORTD = 0x00;DDRD= 0x80;void timer0_init(void)TCCR0 = 0x00; /stopTCNT0 = 0x60; /set countTCCR0 = 0x02; /start timer8分频TIMSK|=0x01; /timer0 interrupt sources 溢出中断SEI();void timer2_init(void)TCCR2 = 0x00; /stopASSR= 0x00; /set async modeTCNT2 = 0x01; /setupOCR2= 0xFF;TCCR2 = 0x69; /startTIMSK|=0x40;/timer2 interrupt sources /call this routine to initialize all peripheralsvoid init_devices(void)/stop errant interrupts until set upCLI(); /disable all interruptsport_init(); MCUCR = 0x00;GICR= 0x00;TIMSK = 0x00; /timer interrupt sourcesSEI(); /re-enable interrupts/all peripherals are now initializedvoid adc_init(void)ADCSRA = 0x00; /disable adcADMUX = 0x60; /select adc input 0 and AVCC 左对齐ACSR= 0x80;ADCSRA = 0xC6; /刚进入就进行一次A/D转换while(!(ADCSRA&0x40);/等待转换结束void timer0_stop(void)TCCR0=0x00;/stopTIMSK&=0x01; /stop timer0 overflow interruptvoid delay_ms(unsigned int n)unsigned int i;for(;n!=0;n-)for(i=2665;i!=0;i-);void send_SPI(unsigned char data)SPDR=data;while(!(SPSR&0x80);void record(void) /PORTA&=RECORD_LED;?/不应该从这儿开始开灯,开录音指示灯adc_init();/调用timer0_init();/调用SPCR=0x5c;/enable SPISPSR=0x00;PORTB|=(1DF_CS);/拉高一下,以免开始时因特殊原因DF_CS是低,保证安全while(!(PINC&0x01) & record_page_counter2048)PORTA&=RECORD_LED;/开录音指示灯record_buffer_counter=0;while(record_buffer_counter264)if(new_turn=0 & send_positiondata_position)PORTB&=(18);/7 bits dont care+ 1 bit addresssend_SPI(unit8)record_buffer_counter);/8 bits addresssend_SPI(record_buffersend_position);PORTB|=(1DF_CS);send_position+;record_buffer_counter+;if(new_turn=1)if(send_position=264)send_position=0;new_turn=0;PORTB&=(18);/7 bits dont care+ 1 bit addresssend_SPI(unit8)record_buffer_counter);/8 bits addresssend_SPI(record_buffersend_position);PORTB|=(1DF_CS);send_position+;record_buffer_counter+;PORTB&=(17);/4 bits reserved and 4 bits addresssend_SPI(unit8)(record_page_counter1);/7 bits address and 1 dont caresend_SPI(0x00);/8 dont carePORTB|=(1DF_CS); if(record_buffer_number=1)record_buffer_number+;elserecord_buffer_number-; record_page_counter+;timer0_stop();ADCSRA = 0x00; /disable adc PORTA|=RECORD_LED;/关录音指示灯 #pragma interrupt_handler timer2_ovf_isr:iv_TIMER2_OVFvoid timer2_ovf_isr(void)TCNT2 = 0x01; /reload counter value if(over_times=0)OCR2=NEW_OCR;updata_OCR=1;if(over_times=4)over_times=0;elseover_times+; #pragma interrupt_handler timer0_ovf_isr:iv_TIMER0_OVFvoid timer0_ovf_isr(void)TCNT0 = 0x60; /reload counter valueif(data_position264)record_bufferdata_position=ADCH;data_position+;elsedata_position=0;record_bufferdata_position=ADCH;data_position+;new_turn=1;ADCSRA|=(1ADSC);/开始下一次A/D转换 /ADC initialize/ Conversion time: 52uSvoid playback(void)PORTA&=PLAY_LED; SPCR=0x5c;/enable SPISPSR=0x00; PORTB|=(1DF_CS);/拉高一下,以免开始时因特殊原因DF_CS是低,保证安全 PORTB&=(1DF_CS);send_SPI(MAIN_TO_BUFFER1);/8 opcodesend_SPI(0x00);/4 bits reserved and 4 bits addresssend_SPI(0x00);/7 bits address and 1 dont caresend_SPI(0x00);/8 dont carePORTB|=(1DF_CS); delay_ms(1); timer2_init(); while(!(PINC&0x02) & play_page_counter2048)/next_page_to_idle_bufferPORTB&=(17);/4 bits reserved and 4 bits addressssend_SPI(unit8)(play_page_counter+1)1);/7 bits addresssend_SPI(0x00);/8 bits dont carePORTB|=(1DF_CS); play_buffer_counter=0; PORTB&=(1DF_CS);if(play_buffer_number=1)send_SPI(BUFFER1_READ);elsesend_SPI(BUFFER2_READ);send_SPI(0x00);send_SPI(0x00);send_SPI(0x00);send_SPI(0x00);while(play_buffer_counter0;i-)NOP();NEW_OCR=SPDR;updata_OCR=0;play_buffer_counter+;PORTB|=(1DF_CS); if(play_buffer_number=1)play_buffer_number+;elseplay_buffer_number-;play_page_counter+; SPCR=0x00;/disable SPI TCCR2=0x00;OCR2=0xFF;/disable timer2 over_times=0;play_buffer_number=1;updata_OCR=0;play_buffer_counter=0;play_page_counter=0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年舷外机行业当前发展趋势与投资机遇洞察报告
- 2025年膜产业行业当前发展趋势与投资机遇洞察报告
- 播音主持课件
- 2025教师师德师风知识竞赛题库及答案
- 2025年社会工作者之初级社会综合能力通关试题库(有答案)
- 2025年铁路防洪及抢修技术工职业资格知识试题与答案
- 2025消费金融经理个人贷款试题库(含答案)
- 2025年施工员之土建施工基础知识考试题库(含答案)
- 2025年社会工作者之初级社会工作实务题库综合试卷B卷附答案
- 2025年黑龙江省龙东地区中考语文试题(含答案)
- 设计思维方法与表达(高职艺术设计)PPT完整全套教学课件
- 非麻醉患者镇静镇痛原则
- 港口陆域设施
- 模板施工方案技术交底
- 摊铺机使用说明rp953e-903e操作手册
- GB/T 1871.1-1995磷矿石和磷精矿中五氧化二磷含量的测定磷钼酸喹啉重量法和容量法
- GB/T 13880-1992半挂牵引车牵引座的安装
- GB 6675.12-2014玩具安全第12部分:玩具滑板车
- 食物中毒的急救治课件
- 电厂内业资料表格
- 轨道交通工程暗挖隧道安全检查日报(模板)
评论
0/150
提交评论