毕业设计(论文)基于AVR单片机录音笔的设计与制作.doc

上传人:仙人指路1688 文档编号:3978893 上传时间:2023-03-30 格式:DOC 页数:42 大小:483.50KB
返回 下载 相关 举报
毕业设计(论文)基于AVR单片机录音笔的设计与制作.doc_第1页
第1页 / 共42页
毕业设计(论文)基于AVR单片机录音笔的设计与制作.doc_第2页
第2页 / 共42页
毕业设计(论文)基于AVR单片机录音笔的设计与制作.doc_第3页
第3页 / 共42页
毕业设计(论文)基于AVR单片机录音笔的设计与制作.doc_第4页
第4页 / 共42页
毕业设计(论文)基于AVR单片机录音笔的设计与制作.doc_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《毕业设计(论文)基于AVR单片机录音笔的设计与制作.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)基于AVR单片机录音笔的设计与制作.doc(42页珍藏版)》请在三一办公上搜索。

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

2、储芯片中读取的数字信号转化为模拟信号,送到外部的喇叭中进行播放。主要功能有录音,存储,删除,放音等!目 录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系统的调试与总结215

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

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

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

6、模数转换。只要从软件上加以控制,就可以实现声音的录放功能。此方法很好的利用了单片机的内部资源,不但可以节约大量的费用而且还可以让我们更进一步的了解AVR系列单片机的内部结构,因此在本课题中采用了这种方法。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) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。这种结构大大提高了代码效率,并且具有比普通的 CISC 微控制器最高至 10

10、倍的数据吞吐率。 ATmega16 有如下特点:16K字节的系统内可编程Flash(具有同时读写的能力,即RWW) ,512 字节 EEPROM ,1K 字节 SRAM ,32 个通用 I/O 口线,32 个通用工作寄存器,用于边界扫描的 JTAG 接口,支持片内调试与编程,三个具有比较模式的灵活的定时器 / 计数器(T/C),片内/外中断,可编程串行USART ,有起始条件检测器的通用串行接口,8路 10位具有可选差分输入级可编程增益 (TQFP 封装 ) 的 ADC ,具有片内振荡器的可编程看门狗定时器,一个 SPI 串行端口,以及六个可以通过软件进行选择的省电模式。工作于空闲模式时 CP

11、U 停止工作,而 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 成为一个功能强大的单片机,为许多嵌入式控制应用提供了灵活而成本的解决方案。 A

13、Tmega16 具有一整套的编程与系统开发工具,包括:C 语言 编译器、宏汇编、程序调试器 / 软件仿真器、仿真器及评估板。3.2 AT45DB041B芯片简介AT45DB041B的封装如图3-2所示。图3-2 AT45DB041B的引脚图AT45DB041B的引脚说明:连续输入(SI):SI 脚仅作为输入脚且用于将数据写入至器件中。所有的数据输入包括操作码,地址序列都用此引脚。 连续输出(SO):SO 脚仅作为输出脚且用于将器件内的数据移出。 连续时钟(SCK):SCK 仅作为输入脚且用于控制流进和流出器件的数据。数据总是随着SCK 脚上的上升沿进入而随着SCK 脚上的下降沿流出。 片选(C

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

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

16、.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公司出厂后,存储阵列中最高页可能没有被擦除净。也就是说,最后一个页中的内容可能并非是FFH。AT45D

19、B041B的读命令如表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到主存页编写任意83带内置擦除的缓存2到主存页编写任

20、意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的写操作时序AT45DB041B的读操作时序如图3-4所示。图

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

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

23、信号,并进行一定的处理,为ATmega16进行ADC转换做好准备。通过MIC接收外部的语音信号,通过功率放大器LM324进行功率放大,并通过4.7nf的电容接地进行滤波,这样可以保证声音信号完整和正确地送到Atmega16的PD7引脚。4.2.3声音存储模块3声音存储模块原理图如图4-3所示。图4-3 声音存储模块原理图模块的功能说明:ATmega16及紧密相连的这一部分电路模块,是该系统的核心部分,ADC转换和DAC转换,都是在该部分进行的,并通过该部分控制整个系统,相应的滤波,外部晶振和按键也属于该部分。ATmega16芯片与AT45DB041B相连,实现对信号的读写操作,从而实现了信号的

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

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

26、此就靠定时器来主导整个录音程序的运行了。定时器有中断,其中有要求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),这样消耗的时间会长很多,大约为70秒钟。4.3.2程序流程图系统主程序

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

30、一次数据开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#define BUFFER1_TO_MAIN_WITH 0x83#de

33、fine 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的引脚定义/PA70B01111111#define RECORD_

34、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

35、;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)

36、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

37、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 adc

38、ADMUX = 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

39、 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 and 4 bits addresssend_SPI(unit8)(

40、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_init();/调用SPCR=0x5c;/enable SPISPS

41、R=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)

42、;/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);/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号