3 系统硬件设计
3.1 Atmega16单片机
Atmega16是基于增强的AVR RISC结构的低功耗8位CMOS微控制器。由于其先进的指令集以及单时钟周期指令执行时间,Atmega16的数据吞吐率高达1MIPS/MHz,从而可以缓减系统在功耗和处理速度之间的矛盾。
Atmega16具有一整套的编程与系统开发工具,包括:C语言编译器、宏汇编、程序调试器/软件仿真器、仿真器及评估板。Atmega16(引脚图如图3-1所示)是一个功能强大的单片机,为许多嵌入式控制应用提供了灵活而低成本的解决方案。
本系统采用ATmega16单片机作为中央处理器,通过中断技术来控制ISD1820语音芯片的录音与播音,SPI通信方式控制ISD4004语音芯片,检测按键来进行语音录/播放功能等。引脚图如图1-1所示。采用先进的RISC 结构,集成了JTAG接口,可以通过JTAG 接口实现对Flash、EEPROM、熔丝位和锁定位的编程,提高了调试的效率。
图 3-1 ATmega16引脚图
ATmega16单片机外设特点:
– 两个具有独立预分频器和比较器功能的8 位定时器/ 计数器 – 一个具有预分频器、比较功能和捕捉功能的16 位定时器/ 计数器
4
列。
– 四通道PWM
– 8路10 位ADC
– 片内模拟比较器
3.2.1 ISD1820主要特征
3.2 语音录放电路ISD1820
– 面向字节的两线接口
– 两个可编程的串行USART
– 具有独立振荡器的实时计数器RTC
ATmega16单片机的最小系统,如图3-2所示。
– 可工作于主机/ 从机模式的SPI 串行接口
– 具有独立片内振荡器的可编程看门狗定时器
图 3-2 Atmega16单片机最小系统原理图
(3)外接电阻调整录音时间; (4)3v单电源工作。
(1)自动节电,维持电流0.5uA; (2)边沿/电平触发放音;
ISD1810,它的基本结构与ISD1110、1420完全相同,采用CMOS技术,内含振
荡器,话筒前置放大,自动增益控制,防混淆滤波器,扬声器驱动及FLASH阵
美国ISD公司于2001年最新推出一种单片8-20秒单段语音录放电路
5
ISD1820的管脚图如图3-3所示。
图 3-3 ISD1820管脚图
3.2.2录放音操作方式
按住REC录音按键不放即录音,RECLED灯会亮起,松开按键录音停止。放音有三种情况:
(1)沿触发放音,按PE键一下即将全段放音,除非断电或放音结束,否则不停止放音;
(2)电平触发放音,按住PL键时即放音,松开按键即停止;
(3)循环放音,置循环放音开关闭合,按动PE键即开始循环放音,只能断电才能停止。
语音芯片ISD1820与ATmega16单片机的连接图如图3-4所示。
图 3-4 录音芯片ISD1820接口电路
6
4 系统软件设计
4.1软件设计思想
总体思路把系统分为录音和放音两种状态,状态的改变用按键控制。录放音都放在中断服务程序里处理,主程序只处理键盘事件。主程序先对系统进行初始化,然后只处理键盘事件,判断按键值,并据此设置相应的系统状态。中断服务程序是通过定时器中断进入的。在中断服务程序中,先判断系统当前的状态,根据系统状态进行相应操作。如果是录音状态,就去取ADC结果进行数字滤波,把滤波结果保存到ISP Flash芯片中,最后清中断标志退出中断服务;
如果是放音状态,就从ISP Flash芯片中读出数据,进行DAC,最后清中断标志退出中断服务;如果是停止状态,就不进行其它操作,直接清中断标志就退出中断服务程序。其主流程图如图4-1所示。
初始化扫描键录音键停止键播放键无键大于20s否是记录录音时间录音状态设置停止状态设置播放状态设置数码管计时停止录音系统状态判断处理
图 4-1 主程序流程图
4.2软件模块
系统软件模块主要分为:数码管显示模块、ISD1820模块、键盘输入模块三个模块。
1、数码管显示模块程序如下: //#pragma data:code 软件自身带有
uchar const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void show(uint i,uint j)//显示函数 {
7
DDRA=0xff;// 1输出 0输入 DDRn DDRC=0xff;
PORTA=0x00;//1高电平 0低电平 PORTn PORTC=0x00; PORTC=table[i];
PORTA|=BIT(j);//BIT(2) 0000 0100 delay_us(1); }
2、ISD1820模块程序如下: void main() {
//uchar a; DDRB=0XFF;
DDRD=0X00;//DDRD&=0xf3;//1111 0011 PORTD=0xFF; DDRC=0xff; PORTB=0x00; //TCCR1B=0X04; TCNT1H=0XFe; TCNT1L=0XC7; TIMSK|=BIT(2); SREG|=BIT(7); while(1) {
if(PIND==0xfb) { num=0; num1=0;
8