毕业设计(论文)基于AVR单片机录音笔的设计与制作_第1页
毕业设计(论文)基于AVR单片机录音笔的设计与制作_第2页
毕业设计(论文)基于AVR单片机录音笔的设计与制作_第3页
毕业设计(论文)基于AVR单片机录音笔的设计与制作_第4页
毕业设计(论文)基于AVR单片机录音笔的设计与制作_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、毕业设计 系 别:电子工程系专 业:计算机控制班 级:0802班姓 名: 设计课题:基于avr单片机录音笔的设计与制作 指导老师: 前言前言avr单片机是一款功能十分强大,集成度非常高的数字处理系统。它集成了adc与pwm的模块,而且还有硬件滤波器!它基本上能够处理生活中实时性不太强的模拟信号与数字信号,并实现通信!该课题设计基于atmega16单片机,介绍和分析了录音笔的基本原理,并做出了较为简单的录音笔模型展示其原理!主要运用了atmega16单片机内部集成的adc转换模块以及pwm功能,将从外部接收的模拟信号转化为数字信号,并存储在at45db041b存储芯片中,再将从at45db041

2、b存储芯片中读取的数字信号转化为模拟信号,送到外部的喇叭中进行播放。主要功能有录音,存储,删除,放音等!目录i目 录1课题分析11.1录音笔简介11.2设计构想12方案选择32.1运用专门的语音芯片32.2运用avr自带的adc以及pwm模块33芯片简介43.1 atmega16芯片简介43.2 at45db041b芯片简介84总体设计134.1系统设计方框图134.2硬件设计134.2.1硬件设计思想134.2.2声音输入模块144.2.3声音存储模块144.2.4声音输出模块164.3软件设计164.3.1软件设计思想164.3.2程序流程图184.3.3主函数方框图204.4系统的调试与

3、总结215总结227附录23附录a:系统的总体设计原理图23附录b:系统软件设计源程序清单24课题分析1课题分析1.1录音笔简介数码录音笔,也称为数码录音棒或数码录音机,数字录音器的一种,为了便于操作和提升录音质量造型并非以单纯的笔型为主,携带方便,同时拥有多种功能,如激光笔功能、fm调频、mp3播放等。与传统录音机相比,数码录音笔是通过数字存储的方式来记录音频的。数码录音笔通过对模拟信号的采样、编码将模拟信号通过数模转换器转换为数字信号,并进行一定的压缩后进行存储。而数字信号即使经过多次复制,声音信息也不会受到损失,保持原样不变。1.2设计构想 设计三个按钮,分别实现录音、删除、放音的功能,

4、当按下不同的按钮时,可以实现不同的功能。 首先要实现声音信号的采集,就需要一种声敏传感器,可以采用mic,再加上一些滤波电路,从而实现声音信号的采集。但是我们都知道,计算机处理的是数字信号,而采集的声音信号是模拟信号,因此,需要实现从模拟信号到数字信号的转化,可以利用专门的adc转换芯片或者是其他的某种方法,将模拟信号转化为数字信号。接下来就是转化后的声音信号的存储,需要某种存储芯片,将信号存储在芯片中,以至于掉电之后,声音信号1不丢失。最后就是声音的还原,将信号从存储芯片中读取出来,但是此时的信号是数字信号,需要进行dac转换,可以利用专门的dac转换芯片或者是其他的某种方法来实现,将转化后

5、的模拟信号,送到外部的喇叭播放。删除则直接将存储芯片中的数据删除就行了,当然这中间还有许多的细节问题需要考虑,例如声音的功率放大、去除杂波等等。2方案选择2方案选择2.1运用专门的语音芯片采用单片机控制一个语音芯片,再接一个flash存储器的结构。单片机可以控制录放时间,选取特定时间段的播放以及单多声道的录放,容易通过改变外接存储flash改变录放时间。此方法较为简单,但是这种语音芯片的价格较为昂贵,还有avr单片机的功能十分强大、资源也比较丰富,如果把它仅仅作为一种控制开关使用,太过于浪费了。2.2运用avr自带的adc以及pwm模块avr系列的单片机内部,已经集成了adc和pwm模块,利用

6、这两个模块,可以实现数模转换和模数转换。只要从软件上加以控制,就可以实现声音的录放功能。此方法很好的利用了单片机的内部资源,不但可以节约大量的费用而且还可以让我们更进一步的了解avr系列单片机的内部结构,因此在本课题中采用了这种方法。3芯片简介39 3芯片简介3.1 atmega16芯片简介1atmega16 的封装如图3-1所示。图3-1 atmega16 的引脚图atmega16 的引脚说明:vcc 数字电路的电源 gnd 地 端口 a(pa7.pa0) 端口 a 做为 a/d 转换器的模拟输入端。 端口 a 为 8 位双向 i/o 口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动

7、特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,端口被外部电路拉低时将输出电流。在复位过程中,即使系统时钟还未起振,端口 a 处于高阻状态。端口 b(pb7.pb0) 端口 b 为 8 位双向 i/o 口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,端口被外部电路拉低时将输出电流。在复位过程中,即使系统时钟还未起振,端口 b 处于高阻状态。端口 b 也可以用做其他不同的特殊功能。端口c(pc7.pc0) 端口 c 为 8 位双向 i/o 口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特 性,可以输

8、出和吸收大电流。作为输入使用时,若内部上拉电阻使能,端口被外部电路拉 低时将输出电流。在复位过程中,即使系统时钟还未起振,端口 c 处于高阻状态。如果 jtag接口使能,即使复位出现引脚 pc5(tdi)、 pc3(tms) 与 pc2(tck) 的上拉电阻被激活。端口 d(pd7.pd0) 端口 d 为 8 位双向 i/o 口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特 性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,则端口被外部电路拉低时将输出电流。在复位过程中,即使系统时钟还未起振,端口 d 处于高阻状态。 端口 d 也可以用做其他不同的特殊功能。 reset

9、复位输入引脚。持续时间超过最小门限时间的低电平将引起系统复位。持续时间小于门限间的脉冲不能保证可靠复位。xtal1 反向振荡放大器与片内时钟操作电路的输入端。xtal2 反向振荡放大器的输出端。 avcc avcc是端口a与a/d转换器的电源。不使用adc 时,该引脚应直接与vcc连接。使用adc时应通过一个低通滤波器与 vcc 连接。aref a/d 的模拟基准输入引脚。atmega16 的功能说明:avr 内核具有丰富的指令集和 32 个通用工作寄存器。所有的寄存器都直接与算逻单元(alu) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。这种结构大大提高了代码效率,并且

10、具有比普通的 cisc 微控制器最高至 10 倍的数据吞吐率。 atmega16 有如下特点:16k字节的系统内可编程flash(具有同时读写的能力,即rww) ,512 字节 eeprom ,1k 字节 sram ,32 个通用 i/o 口线,32 个通用工作寄存器,用于边界扫描的 jtag 接口,支持片内调试与编程,三个具有比较模式的灵活的定时器 / 计数器(t/c),片内/外中断,可编程串行usart ,有起始条件检测器的通用串行接口,8路 10位具有可选差分输入级可编程增益 (tqfp 封装 ) 的 adc ,具有片内振荡器的可编程看门狗定时器,一个 spi 串行端口,以及六个可以通过

11、软件进行选择的省电模式。工作于空闲模式时 cpu 停止工作,而 usart、两线接口、 a/d 转换器、 sram、 t/c、 spi 端口以及中断系统继续工作;掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作;在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠状态; adc 噪声抑制模式时终止 cpu 和除了异步定时器与 adc 以外所有 i/o 模块的工作,以降低 adc 转换时的开关噪声; standby 模式下只有晶体或谐振振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力;扩展 standby 模

12、式下则允许振荡器和异步定时器继续工作本芯片是以 atmel 高密度非易失性存储器技术生产的。片内 isp flash 允许程序存储器通过 isp 串行接口,或者通用编程器进行编程,也可以通过运行于avr 内核之中的引导程序进行编程。引导程序可以使用任意接口将应用程序下载到应用flash存储区(application flash memory)。在更新应用flash存储区时引导flash区(boot flash memory)的程序继续运行,实现了 rww 操作。 通过将 8 位 risc cpu 与系统内可编程的 flash 集成在一个片内, atmega16 成为一个功能强大的单片机,为许多

13、嵌入式控制应用提供了灵活而成本的解决方案。 atmega16 具有一整套的编程与系统开发工具,包括:c 语言 编译器、宏汇编、程序调试器 / 软件仿真器、仿真器及评估板。3.2 at45db041b芯片简介at45db041b的封装如图3-2所示。图3-2 at45db041b的引脚图at45db041b的引脚说明:连续输入(si):si 脚仅作为输入脚且用于将数据写入至器件中。所有的数据输入包括操作码,地址序列都用此引脚。 连续输出(so):so 脚仅作为输出脚且用于将器件内的数据移出。 连续时钟(sck):sck 仅作为输入脚且用于控制流进和流出器件的数据。数据总是随着sck 脚上的上升沿

14、进入而随着sck 脚上的下降沿流出。 片选(cs):当cs 脚为低电平时选通数字闪存。当器件没有被选通时,数据无法被 si 脚所接收,而so 脚将会保持为高阻态。要进行某个操作,cs 脚上必须有一个由高到低电平的跃变,要结束某个操作,cs 脚上必须有一个由低到高电平的跃变。写保护:如果wp 脚置为低电平,主存中的前256 页就无法被重写。要重写前256页的唯一方法就是将该引脚拉为高电平,然后用前面所提到的编写命令。wp 脚是内部拉高的;因此若非需要,wp 脚上不需连接其他引脚。然而,我们建议尽量通 过外部拉高wp 引脚。 复位:复位脚(reset)上的低电平将终止正在运行中的操作并将内部状态置

15、为空闲状态。只要reset 脚上一直为低电平,那么器件就一直处于复位状态。一旦reset 脚上返回至高电平,器件就可以正常运行了。本器件内部整合了电源开启重接电路,所以在开启电源期间在reset 脚上并无何限制。reset 脚也是内部拉高的;因此若非需要,reset 脚上不需连接其他引脚。然而,我建议尽量通过外部拉高reset 引脚。 准备/忙:当器件进行某个内部自同步操作而处于忙状态时,该漏极输出引脚将被拉低。该引脚通常处于高电平状态(通过1 个1 千欧外部上拉电阻),而在编写,较和页至缓存的传送操作器件,将会被拉低。状态表示着闪存阵列和其中一个缓存不能被访问;但对于另一个缓存的读写操作仍可

16、进行。at45db041b的功能说明:单电源2.5v-3.6v或2.7v-3.6v供电,兼容串行外设接口最高20mhz时钟频率页编写操作 单周期程序重调(擦除和编写) l 2048页(264字节/页)主内存,支持页和块擦除操作,双264字节sram数据缓存在非易失性存储器中进行程序重调时可接收数据,能过连续地读取整个存储阵列,低功耗 有效读取工作电流仅为4毫安 cmos待机电流仅为2微安,数据保护功能l 100%与at45db041及at45db041a兼容,5v输入容限电压:si,sck,cs,reset和wp引脚,商用及工业用温度范围描述 at45db041b仅需2.5v或2.7v供电,采

17、用串行接口闪存,能够广泛的适用于各种数字语音,图像,编码以及数据存储应用。其4,325,376位的内存是由2048个页构成,每页为264个字节。除了主存以外,at45db041b还有两个容量为264字节的sram数据缓存。 当在主内存的某页上进行程序重调或者连续读 写数据流时,数据缓存都可以接收数据。eeprom仿真(位或字节可变更)能够容易地处理独立的三步读-修改-写操作。不同于传统的以多路地址线和并行接口随机访问的闪存芯片,本数字闪存是利用spi串行接口来顺序存取其数据。该数字闪存支持spi模式0和模式3。其简单的串行接口使得外围硬件设计变得容易,增强了系统的可靠性,最大化减小了开关噪声,

18、降低了封装尺寸和有效引脚数量。该器件能够最优化的运用于以高密度,少引脚数量,低电压和低功耗为基本要求的各类商业和工业场合。该器件的有效工作电流为4毫安,能运行达到20mhz的时钟频率。 at45db041b不需要高输入电压就可以进行简单在系统编写。在进行编写和读操作时,本器件需要单独的电源供电,电压为2.5v至3.6v或者2.7v至3.6v。片选引脚cs和一个由连续输入si,连续输出so和连续时钟sck组成的三线访问接口使得at45db041b正常工作。 所有的编写周期都是自同步的,因而在编写之前都无需分开的擦除周期。 当器件从atmel公司出厂后,存储阵列中最高页可能没有被擦除净。也就是说,

19、最后一个页中的内容可能并非是ffh。at45db041b的读命令如表3-1所示。表3-1 at45db041b的读命令命令sck模式操作码连续阵列读取未激活时钟极低或高68hspi模式0或3e8h主存页读取未激活时钟极低或高52hspi模式0或3d2h缓存1读取未激活时钟极低或高54hspi模式0或3d4h缓存2读取未激活时钟极低或高56hspi模式0或3d6h状态寄存器读取未激活时钟极低或高57hspi模式0或3d7hat45db041b的编写与擦除命令如表3-2所示。表3-2 at45db041b的编写与擦除命令命令sck模式操作码缓存1写任意84h缓存2写任意87带内置擦除的缓存1到主存

20、页编写任意83带内置擦除的缓存2到主存页编写任意86带内置擦除的缓存1到主存页编写任意88带内置擦除的缓存1到主存页编写任意89页擦除任意81块擦除任意50通过缓存1的主存页编写任意82通过缓存1的主存页编写任意85at45db041b的附加命令如表3-3所示。表3-3 at45db041b的附加命令命令sck模式操作码主存页至缓存1的传送任意53h主存页至缓存2的传送任意55h主存页至缓存1的比较任意60h主存页至缓存2的比较任意61h通过缓存1的自动页重写任意58h通过缓存2的自动页重写任意59hat45db041b的写操作时序如图3-3所示。图3-3 at45db041b的写操作时序at

21、45db041b的读操作时序如图3-4所示。图3-4 at45db041b的读操作时序总体设计4总体设计4.1系统设计方框图 系统总体设计如图4-1所示。方框图的相关说明:以avr单片机为核心,外接声音的输入电路、声音的输出电路、按钮的输入电路和声音的存储电路,其中声音的输入电路用于从外界接收声音信号,并且送到avr单片机中进行处理,声音的输出电路用于接收avr单片机输出的声音信号,并且送到speaker中进行播放,声音的存储电路用于声音信号的存放与取出,按钮的输入电路用于实现不同的功能,包括录音、放音、删除等。通过硬件电路和软件程序的有机结合,从而实现了录音笔的相关功能。 avr单片机声音的

22、输入按钮的输入声音的输出声音的存储图4-1 系统设计方框图4.2硬件设计4.2.1硬件设计思想用麦克风采集音频信号,经过一次功放,然后用电容进行一次滤波,电容的大小采用4.7nf,滤波后进行ad转换,转换后的信号存在at45db041b中,然后用单片机调出信号,经过三次放大,将信号传到扬声器播放。电路图上,atmega16以上的电路图(见附录a)就是用来采集信号的,放大信号用的是lm324集成功放芯片。atmega16以右的电路图(见附录a)用来放音,经过三次信号放大,再放大信号的同时进行过滤。4.2.2声音输入模块2声音输入模块原理图如图4-2所示。图4-2 声音输入模块原理图模块的功能说明

23、:mic与atmega16之间的电路模块,用来采集语音信号,并进行一定的处理,为atmega16进行adc转换做好准备。通过mic接收外部的语音信号,通过功率放大器lm324进行功率放大,并通过4.7nf的电容接地进行滤波,这样可以保证声音信号完整和正确地送到atmega16的pd7引脚。4.2.3声音存储模块3声音存储模块原理图如图4-3所示。图4-3 声音存储模块原理图模块的功能说明:atmega16及紧密相连的这一部分电路模块,是该系统的核心部分,adc转换和dac转换,都是在该部分进行的,并通过该部分控制整个系统,相应的滤波,外部晶振和按键也属于该部分。atmega16芯片与at45d

24、b041b相连,实现对信号的读写操作,从而实现了信号的储存与取出,擦除等。电路中有三个按键和三个指示灯,当不同的按键按下时,会执行不同的程序,并且会点亮相应的指示灯。当从引脚pd7接收到外部语音信号后,经过处理,存储在芯片at45db041b中,需要放音时,从芯片at45db041b中读取信号,经过处理,送到引脚pa0。4.2.4声音输出模块声音输出模块原理图如图4-4所示。图4-4 声音输出模块原理图模块的功能说明:耳机与atmega16之间的电路模块,用来将存储在atmega16的数字信号通过模拟语音信号还原出来,之前还进行了一系列的功放,用于信号的放大与相关处理。接收到芯片引脚pa0输出

25、的信号后,经过三个功率放大器lm324进行功率放大,并且有接地电容进行滤波,这样可以保证声音信号完整和不失真地送到speaker中进行播放。4.3软件设计4.3.1软件设计思想4首先是设备初始化,但是初始化程序中,用于adc转换的定时器等并没有进行初始化,只是将pa0设置为输入模式,不上拉使能(作为ad转换的输入通道),用于spi通信1的各个引脚的模式进行了设置。初始化完成之后,就进入主程序中进行键盘扫描,速度极其的快,无键盘按下时甚至只用不到1微秒的时间。一旦检测到哪个键按下就进入相应的程序中去。录音程序的设计思想:检测到录音键按下后进入录音程序,然后adc初始化同时开始一次ad转换,延时一

26、小会儿,等待ad转换结束。接着spi、定时器初始化,从此就靠定时器来主导整个录音程序的运行了。定时器有中断,其中有要求tcnt0设置这个基本的操做,还有一个就是adsc置位要求进行下一次转换。至于ad转化的值则在ad中断中写入一个已经建好循环队列中。定时器定时80微秒,一次ad转换是在定时一开始就进行,需要时间52微秒,也就是说定时器溢出时ad中断一定结束了,下一次中断之前数据一定已经进入了队列中,如此循环。而在这期间有大量的时间向dataflash中写数据。dataflash有2048页,每一页有264字节,在每一页写满之前,程序不会再检测按键,一直到一页写满了,才检测按键,如果仍旧是按下则

27、继续录音,否则退出。退出后如果存储空间未满则存储位置的参数会保留,下次录音可以接着向下写。如果满了,则录音工作指示灯永远都不会亮了,除非重启。但是在退出录音程序时,adc、spi、定时器会全部关闭,再进入程序时再初始化开启。放音程序的设计思想:与录音程序相同,进入程序之后才开启所需要的功能。不同的是先开录音工作指示灯,spi,然后向dataflash要一次数据,再开timer2的快速pwm功能。一次pwm时间是16微秒,每五次更新一次,通过调节占空比来实现da转换的功能。同样的每五次中断期间都有足够的时间向dataflash要数据。放音程序最大的特点是那些控制参数虽然是全局变量,但是它们在进入

28、程序的第一时间就被初始化了,在就要退出程序的最后时刻再次被初始化。这样就使得整个程序可以进行循环放音,但是每次都是从头开始,放开按键时停止,再按下时又从头开始。由于放开按键的同时按下按键的可能性很小,所以放音键按下的状态会在主程序按键检测循环中被检测到,并进入放音程序。擦除程序设计思想:擦除程序就简单多了。首先,如前面提到的,它有延时去抖的时间。其次,由于查找资料时找到的资料并没有芯片的块擦除命令,所以决定先往芯片的buffer1中写满0,然后顺次往每一个主页存储空间中进行先擦除再写的操作(即buffer to main memory with built-in erase),这样消耗的时间会

29、长很多,大约为70秒钟。4.3.2程序流程图系统主程序如图4-5所示。开始端口初始化是否有按键按下?延时去抖是否是抖动?擦除程序返回录音程序放音程序擦除键录音键放音键否是图4-5 程序流程图4.3.3主函数方框图主函数方框图如图4-6所示。方框图的相关说明5:这里主要说明了放音函数具体的操作过程,当按下放音按键时,进入放音函数playback(),进行相关变量和器件的的初始化操作,当放音按键放开时,返回到主函数进行按键的扫描,否则,进入声音的播放程序。从buffer中读取数据并且根据数据改变ocr变量,利用timer的pwm功能,实现数字信号的模拟输出,即声音信号的还原。main()playb

30、ack()开led开spi向databuffer()要一次数据开timer2进入循环放音键按下?下一页到下一个bufferbuffer完?等待5次timer溢出更新标记ocr变量关spi关timer2 关led返回main()是是否否图4-6 主函数方框图4.4系统的调试与总结按照电路原理图,连接好电路。在icc avr编译器中,输入程序,并且进行编译,生成test.hex文件,通过编程器下载到avr单片机中,上电运行6。按下录音按键,对着mic讲话,讲完以后放开按键。按下放音按键,仔细听speaker中的声音。放出的声音失真,对定时器的定时时间做一下微调,然后再进行测试。按下删除按键,无法再

31、进行播放,达到了删除已存储信息的目的。通过对系统的微小调节,基本上可以实现录音、放音和删除等功能。总结5总结本课题使用的是avrmage16高速单片机6,利用其内部的adc模块和pwm功能,实现了声音的录放功能,揭开了录音笔的神秘面纱。当然这与现实生活中运用的录音笔相比,还有很多的不足之处。此设计充分利用的单片机内部的资源,通过硬件和软件的紧密结合,基本上实现了声音的录放功能。在声音的处理上,硬件设计和软件设计,也许考虑的不够周全,可能造成声音的失真。随着科技的不断发展,芯片的集成度越来越高,可以用最简单的外围电路,来实现非常复杂的功能。所以,在我们在系统设计时,应该充分利用芯片内部的资源,认

32、真分析它们的使用方法,这样在进行设计时可以达到事半功倍的效果。参考文献附录7附录附录a:系统的总体设计原理图如图7-1所示图7-1 系统的总体设计原理图附录b:系统设计源程序清单/ 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#

33、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 /给工作状态指示灯le

34、d的引脚定义/pa70b01111111#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;volati

35、le 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 = 0x0

36、0;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 inter

37、rupt 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_in

38、it(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

39、!=0;i-);void send_spi(unsigned char data)spdr=data;while(!(spsr&0x80);void erase(void)int erase_page_counter=0,erase_buffer_counter=264;spcr=0x5c;/enable spispsr=0x00;portb|=(1df_cs);/拉高一下,以免开始时因特殊原因df_cs是低portb&=(10;erase_buffer_counter-)send_spi(0x00);portb|=(1df_cs);doportb&=(17);/4 bits reserved

40、 and 4 bits addresssend_spi(unit8)(erase_page_counter1);/7 bits address and 1 dont caresend_spi(0x00);/8 dont careportb|=(1df_cs);delay_ms(22);/等待数据转移结束+erase_page_counter;while(erase_page_counter=2047);spcr=0x00;/disable spivoid record(void) /porta&=record_led;/不应该从这儿开始开灯,开录音指示灯adc_init();/调用timer0

41、_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 addressse

42、nd_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 addres

43、ssend_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+;

44、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_buffe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论