出租车计价器设计报告
北京化工大学
课程设计
课题名称:出租车计价器 学院:信息科学与技术学院 专业:测控技术与仪器
董兵兵 2010014311 指导教师:冯晓东
2013年12月15日
出租车计价器
摘要
本系统以MSP430F149控制器为核心,主要功能是计价显示、时钟显示、里程显示,根据白天、黑夜、途中等待来调节营运参数、计量数据查询等。开关式霍尔传感器SS41F负责测量里程功能。七段数码管LED负责显示计价、时间、里程等功能。4X4矩阵键盘负责LED显示模式切换、单价设置、复位、等功能。ISD2560语音芯片负责语音播报功能。ATMEL 公司的电可擦除存储芯片AT24C02负责掉电保护等功能。
关键词:MSP430F149控制器;SS41F;七段数码管LED;AT24C02;
一、方案论证与设计
1.1 控制器方案及其选择
方案一:采用FPGA为系统的控制器,FPGA可以实现各种复杂的逻辑功能,模块大,密度高,它将所有器件集成在一块芯片上,减少了体积,提高了稳定性,并且可应用EDA软件仿真、调试,易于进行功能控制。FPGA采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模实时系统的控制核心。通过输入模块将参数输入给FPGA,FPGA通过程序设计控制步进电机运动,但是由于本设计对数据处理的时间要求不高,FPGA的高速处理的优势得不到充分体现,并且由于其集成度高,使其成本偏高,同时由于芯片的引脚较多,实物硬件电路板布线复杂,加重了电路设计和实际焊接的工作。
方案二:采用STC89C52作为系统控制的方案。单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制。由于其功耗低、体积小、技术成熟和成本低等优点,各个领域应用广泛。并且,由于芯片引脚少,在硬件很容易实现。因此,在本设计中采用STC89C52处理输入的数据并控制电机运动。
方案三:采用16位的MSP430单片机作为系统的控制方案,430主要特点就是低功耗,同时集成AD转换电路,JTAG调试端口,多个中断源触发,自带看门狗,以及温度采集电路和RC振荡电路。内部有自带的12位模/数转换器。ADC12模块有模拟多路其、参考电压发生器、具有采样保持功能的12位模数转换器、采样及转换所需的时序控制电路、转换结果缓冲器等功能模块构成。处理精度和运算速度明显高于52。
综合上述三种方案,选择方案三更为合理。
1.2 测量里程方案及其选择
方案一:投射式光电传感器如光电码盘,对轮子的机械加工较难精确实现。 方案二:开关式霍尔传感器SS41F,其工作性能稳定,在车轮上安装一个小磁铁即可实现测圈数,进而得到距离值。
综合上述两种方案,方案二能更好的满足设计要求。
1.3 显示方案及其选择
方案一:采用字符型LCD显示。LCD具有低功耗、长寿命、高可靠性等特点,可显示英文、汉字及数字。利用单片机来驱动液晶显示模块,设计简单,且界面美观舒适,耗电少,显示内容丰富。但其背光效果不好,特别是在白天,较远距离很难看清屏幕上显示的内容。价格也比较昂贵。
方案二:采用七段数码管LED显示。LED发光二极管亮度高、醒目、直观、稳定性好,其对比度明显比LCD好。价格也比LCD低。
综合上述两种方案,结合题目要求,选择方案二。
1.4 键盘方案及其选择
方案一::矩阵键盘虽然占用单片机的端口少,节约单片机的硬件资源,但是电路设计较为复杂,开发时间相对较长,软件设计也相对复杂,主要针对多键盘设计,适用于控制要求高、控制功能多的系统。
方案二:采用简单独立键盘,设计简单,易于实现。键盘在系统中主要作运行控制选择,简单键盘减少了系统的复杂度。
综合上述两种方案,由于本系统的输入量与功能较多,选择方案一。
1.5 掉电保护及其选择
方案一:加接不间断电源,让整个系统在掉电时继续工作,这种方法体积大、成本高,对单片机系统来说,对于本系统来说,不宜采用。
方案二:采用备份电源,掉电后保护系统中全部或部分数据存储单元的内容,此方法可能丢失重要的数据。
方案三:采用EEPROM来保存数据。EEPROM既具有ROM掉电不丢失数据的特点,又有RAM随机读写的特点,其速度稍微有点慢,但能够很好的满足题目的要求。
综合上述两种方案,结合题目要求,选择方案三。
1.6 系统电源选择
方案一:采用普通干电池供电,随着电源的耗电可能会出现电量不足,噪声较大,稳定性差,优点是简单,方便。
方案二:出租车电源经稳压模块稳压后为系统供电,此供电电压精度高,稳定,噪声小,能够满足一些对电压精度要求较高的芯片。
综合上述两种方案,选择方案二。
1.7语音播报数据芯片选择
方案一:WT系列语音芯片,是一种简单的SRAM 录放芯片. 录音时间可以通过调节振荡电阻的频率在4-8S范围内改变,只能储存一段语音,需要很小电流保存语音。特点:录放电路简单;语音存储时间较短;价格较廉。
方案二:ISD系列语音芯片,以FLASHRAM闪烁存储器为IC介质,断电后语音还能保存。特点:内部没有单片机,语音的音质是高保真的,不经过数据转换,控制有两种:并口和串口控制,控制简单,可以直接使用按键控制录放音,语音可以划分为256段语音。
综合上述两种方案,结合题目要求,选择方案二。
二、系统总体设计
本系统完成的主要功能是计价显示、时钟显示、里程显示,根据白天、黑夜、途中等待来调节营运参数、计量数据查询,语音播报等。以MSP430F1491控制器为核心,通过键盘输出与七段数码管LED的显示。以至司机与乘客一目了然。计价器系统总体框架图如图2.1.1所示。
图2.1.1系统总体设计框架图
三、功能模块设定
3.1 控制器模块
MS P43 0F 149是一种新型的混合信号处理器,采用了美国德州仪器(Texas Instruments)公司最新低功耗技术(工作电流为0.1一400 p A ),它将大量的外围模块整合到片内,特别适合于开发和设计单片系统。MS P4 30 F149单片机主要具有如下特点:①低电压、超低功耗。工作电压3.3V ,等待方式下工作电流为1.3 w A,在RAM保持关闭工作方式下工作电流仅为0.巧RA 。②具有 12位的模数转换器(ADC12) ,可以得到很高的精度,并且省去了使用专门的模数转换器给设计电路板带来的麻烦。③拥有大容量的存储空间。存储器方面包括多达60 k Flash ROM和2 k RAM,如此数量的存储空间完全可以满足程序及数据的需要。④两通道串行通信接口。可用于与计算机进行异步或同步串行通信。
⑤硬件乘法器。该乘法器独立于CPU进行乘法运算的操作,在提高乘法运算速度的同时也提升了CPU的利用效率。⑥串行在系统编程。通过仿真器对程序进行下载,并通过专用软件对程序及单片机的工作状态进行监控,极大地方便了程序的调试。如图3.1.1所示其引脚图。
图3.1.1 MSP430F149功能引脚图
3.2输入模块
本系统采用4X4矩阵键盘作为输入控制器,输入的命令包括LED的显示方式切换,例如显示计价、时钟;运营模式选择,例如白天、黑夜、途中等待;单价输入;复位等。本系统中的键盘采用逐行扫描查询法。
3.3测里程模块
本系统采用开关式霍尔传感器SS41F进行里程测量,霍尔开关元件内含稳压电路、霍尔电势发生器、放大器、施密特触发器和输出电路。输出电平与TTL兼容。SS41F内部电源调整器为霍尔内电路提供带温度补偿稳定电源,满足宽电压工作电压范围.SS41F工作温度范围为-40℃~150℃,耐压60V,可适用于各种位置检测,本系统测量中在车轮上安装一个圆盘,圆盘上安装磁钢即可,磁钢个数越多越精确,考虑到本系统对里程精度的要求不高,安装一个磁钢即可。霍尔开关固定在小磁钢附近,车轮转动时,每当一个小磁钢转过霍尔开关,霍尔开关便输出一个脉冲,计算出脉冲个数N,车轮周长为L,则里程S为L*N。
3.4显示模块
本系统采用七段数码管LED作为显示输出,LED主要显示单价、时间、里程,计价显示。LED显示屏是由发光二极管排列组成的一显示器件,其采用低电压扫描驱动,具有耗电少、使用寿命长、成本低、亮度高、故障少、视角大、可是距离远等特点。结合系统的里程要求,选择4位七段数码管作为LED显示屏,里程的单位设置为KM。
3.5掉电保护及密码模块
本系统掉电保护模块采用一个ATMEL 公司2K位串行CMOS E2PROMAT24C02,其采用两线串行的总线和单片机通讯,工作电压为2.7V至7V,额定电流为1mA,静态电流10Ua(5.5V),片内防误擦除写保护,具有100万次擦写周期,芯片内的资料可以在断电的情况下保存40年以上,而且采用8 脚的DIP 封装,使用方便。该存储器能够在系统断电时,保存数据,再次给单片机上电时,数码管能够显示上次关机时的数据。题目要求输入单价是必须输入密码,对于STC89C52RC的ROM是不可通过编程擦出的,RAM中的数据掉电丢失,因此将需要设置的密码保存在AT24C02中。
3.6系统电源模块
本系统采用三端稳压集成电路lm7805为系统供电,三端IC是指这种稳压用的集成电路,只有三条引脚输出,分别是输入端、接地端和输出端。它的样子象是普通的三极管,TO- 220 的标准封装。输出为+5V稳定电压,最高输入极限电压36,最低输入电压7V,极限电流1000mA,集成稳压块的最佳工作状态是输入电压与输出电压间的压差在3~4V左右。压差太大可在输入前端串联几个二极管降压,这样稳压块就不会很烫了。
3.7语音播报模块
ISD2560是ISD系列单片语音录放集成电路的一种。这是一种永久记忆型语音录放电路,录音时间为60s,可重复录放10万次。该芯片采用多电平直接模拟量存储专利技术,每个采样值可直接存储在片内单个EEPROM单元中,因此能够非常真实、自然地再现语音、音乐、音调和效果声,从而避免了一般固体录音电路因量化和压缩造成的量化噪声和“金属声”。该器件的采样频率为8.0KHz,同一系列的产品采样频率越低 录放时间越长 但通频带和音质会有所降低。此外,ISD2560还省去了A/D和D/A转换器。其集成度较高,内部包括前置放大器、内部时钟、定时器、采样时钟、滤波 器、自动增益控制、逻辑控制、模拟收发器、解码器和480k字节的EEPROM。ISD2560内部EEPROM存储单元均匀分为600行,有600个地址单元,每个地址单元指向其中一行,每一个地址单元的地址分辨率为100ms。此外,ISD2560还具备微控制器所需的控制接口。通过操纵地址和控制线可完成不同的任务,以实现复杂的信息处理功能,如信息的组合、连接、设定固定的信息段和信息管理等。ISD2560可不分段,也可按最小段长为单位来任意组合分段。
四、硬件设计
4.1输入部分硬件设计
如图4.1.1所示键盘与控制器MSP430F149的电气连接图,4X4矩阵键盘与控制器的P1口相连,其中P5.0~P5.3作为输出口,P5.4~P5.7作为输入口。其工作原理为MCU先使行线P5.0为低,即0行为“0”,其余行为“1”;MCU读入P5.4~P5.7的状态,以确定哪条列线为“0”状态,若P5.4为“0”状态,则S0按下,以此类推,确定是那个键按下;若P5.0行线全为“1”状态,MCU继续使P5.1行线为“0”状态,其余行线为高,再次读入列线的状态,以确定是哪个键按下;判
断出哪个键按下后转入相应的键处理程序。本系统键盘采用定式扫描方式,在初始化程序中对定时/计数器进行编程,使之产生10ms的定时中断,MCU响应定时中断,执行中断服务程序,对键盘扫描一遍,检查键盘的状态,实现对键盘的定时扫描。对键盘的功能定义如下SW0~SW9对应数字0~9,SW10三个运营模式切换,白天、黑夜、途中等待。SW11显示模式切换。SW12表示接收键盘输入单价,SW13为复位功能。当按下上述按键时转入相应的程序处理,SW14启动系统计时。
图4.1.1键盘工作原理图
4.2测量里程部分硬件设计
如图4.2.1所示霍尔传感器SS41F的工作原理图,41F反应速度快,灵敏度高,成了多个功能块于一个小封装内的霍尔效应器件。该电路主要有三部分组成,
一、内部集成电源反接保护线路,防止电源极性意外接反损坏传感器。二、SS41F内置电源调节器,内部电源调整器为霍尔内电路提供带温度补偿稳定电源,满足宽电压工作电压范围,从而满足3.8V到28V宽工作电压范围。三、SS41F片内还集成霍尔电压发生器,温度补偿线路,比较器,抗噪音施密特触发器及集电极开路输出。在没有磁钢时输出高电平,磁钢接近磁感应面时输出低电平。其工作原理为当车轮上的磁钢接近霍尔片(Hall Plate)时,会产生一个脉冲信号,经运算放大器放大后,再由施密特触发器和集电极开路输出。在没有磁钢时输出低电平,有磁钢经过霍尔片时输出高电平。
图4.2.1霍尔传感器SS41F原理图
在本系统采用SS41F集成模块,只需要到VCC,GND,VOUT三个口,其与控制器的连接图如图4.2.2所示。VOUT接控制器的中断TO口,每检测到一个脉冲信号,里程就增加一个车轮周长。
图4.2.2 SS41F接线图
4.3七段数码管部分硬件设计
如图4.3.1所示为共阴极4位七段数码管内部结构图。管脚标号为从数码管正面观看,以第一脚为标号1,以逆时针方向排序。其中12-9-8-6分别为四个数码管的共阴极。11-7-4-2-1-10-5-3对应数码管的a-b-c-d-e-f-g-h-dp。
图4.3.1 4位七段数码管内部结构图
本系统采用驱动芯片74HC573来驱动4位七段数码管的显示。如图4.3.2所示为74HC573芯片管脚图。其中D0~D7为段选数据输入口,Q0~Q7为段选数据输出口,分别于七段数码管的a~dp相连。OE与LE为使能输入端口。其部分真值表如图4.3.3所示。
图4.3.2 74HC573管脚图
图4.3.3 74HC573真值表
本系统中七段数码管采用动态显示方式,单片机通过74HC573给与七段数码管段选信号,七段数码管的位选端口由独立的单片机I/O口控制。当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM
端,就使各个数码管轮流受控显示。在轮流显
示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。点亮时间通过单片机的定时\计数器控制。
七段数码管与驱动芯片74HC573及单片机的电气原理图如图4.3.4所示。当显示时间时让DP2,DP3亮,里程和计价时全灭。
图4.3.4 七段数码管电气原理图
4.4掉电保护硬件设计
如图4.4.1所示AT24C02芯片的管脚图,其中A0、A1、A2 器件地址选择,SDA为串行数据地址,SCL为穿行时钟,WP为写保护。AT24C02的存储容量为2Kb,内容分成32页,每页8B,共256B,操作时有两种寻址方式:芯片寻址和片内子地址寻址。本系统采用片内子地址寻址:芯片寻址可对内部256B中的任一个进行读/写操作,其寻址范围为00~FF,共256个寻址单位。对于最后一页用于储存密码。
图4.4.1 AT24C02管脚图
本系统中AT24C02与控制器的电气图如图4.4.2所示。其中是控制器的VCC,P3.3为控制器的INT1中断。本电路充分利用电容的储电功能,在掉电以后,通过电容中存储的电量给整个系统供电,以维持一段系统工作时间。
在这
个过程中将需要保护的数据写入AT24C02芯片中。其工作过程如下V1=VCC-0.30;掉电瞬间,U2=0,由于C3的储电功能,U1>0,比较器输出低电平,控制器进行中断处理,对需要保护的数据通过I2C总线写入AT24C02中,写入过程所需的时间同写入的数据有关。重新上电以后,微处理器必须延迟一段时间,保证外围芯片也达到正常工作电压,然后才能从AT24C02中读出数据,恢复掉电前的状态。本系统中电容选取最为关键,系统掉电以后整个系统都由电容中储电供电,在选取电容时不光只考虑AT24C02的正常工作时间,否则会丢失部分数据。
图4.4.2 AT24C02电气原理图
4.5系统电源硬件设计
本系统采用稳压芯片lm7805为系统其他芯片供电,其输入电压范围为7~36V,输出电压为+5V,精度较高。其电气原理图如图4.5.1所示,其中Vin为出租车电瓶电压,VO1为稳压后输出的+5V电压。采用7803稳压后输出3.3V为MSP430供电。
图4.5.1 稳压电源模块电气图
4.6 语音播报模块硬件设计
ISD2560系列最多可分为600段,只要在分段录/放音操作前(不少于300纳秒),给地址A0~A9赋值,录音及放音功能均从设定的起始地址开始,录音结束由停止键操作决定,芯片内部自动在该段的结束位置插入结束标志(EOM)
;而放音
时芯片遇到EOM标志即自动停止放音。
2560系列地址空间是这样分配的:地址0~599作为分段用,见表4.6.1,地址600~767未使用,地址768~1023为工作模式选择。
表4.6.1ISD2560地址空间分配表
在进行播报之前首先录入相应的语音,进行分段存储,进行语音播报时通过相应的语音播报子程序找到相应的语音段地址,然后播报相应的语音。其电气原理图如图4.6.2所示。
图4.6.2ISD2560电气连接图
4.7总体电气连接图
其总体电气原理图如图4.7.1所示,总体PCB图如图4.7.2所示,所有元器件参数及个数如表4.7.3所示。
图4.7.1 总体电气连接图
图4.7.2 总体PCB图
表4.7.3 元器件参数表
五、软件设计 5.1 键盘部分软件设计
本系统键盘采用定式扫描方式,在初始化程序中对定时/计数器进行编程,使之产生10ms的定时中断,MCU响应定时中断,执行中断服务程序,对键盘扫描一遍,检查键盘的状态,实现对键盘的定时扫描,以确定是哪个按键按下。其总体流程图如图5.1.1所示。
图5.5.1 键盘中断流程图
键盘部分程序代码如下:
void Check_Key(void) {
unsigned char row,col,tmp1,tmp2;
tmp1 = 0x10; //tmp1用来设置P5口的输出,取反后使P5.0~P5.3中有一个为0 for(row=0;row
P1 = 0x0f; // 先将
P5.0~P5.3置高
P1 =~tmp1; // 使P5.0~P5.3中有一个为0 tmp1*=2; // tmp1左移一位
if ((P1 & 0x0f)
tmp2 = 0x01; // tmp2用于检测出哪一列为0 for(col =0;col
if((P1 & tmp2)==0x00) // 该列如果为低电平则可以判定为该列 {
//执行相应的中断服务子程序 return; // 退出循环 }
tmp2*=2; // tmp2左移一位 } } } }
5.2测里程部分软件设计
本系统中霍尔传感器每检测到一次磁钢,里程就增加一个周长,霍尔传感器测里程部分流程图如图5.2.1所示。
图5.2.1 霍尔传感器测里程部分流程图
霍尔传感器测里程部分代码如下:
void LiCheng(void) {
WDTCTL = WDTPW + WDTHOLD; num=0;//中断次数 distance=0;//里程
//关闭看门狗
unsigned int num,l,distance;//l为车轮周长
}
//按键中断设置
P1REN |= BIT0; //设置上拉/下拉使能 =0不使能 P1OUT |= BIT0; //设置带上拉电阻 P1DIR &= ~BIT0; P1IFG &= ~BIT0;
//中断引脚应该设置为输入
//因为P1IES设置会使中断标志位置位,故清零
P1IES |= BIT0; //设置为下降沿触发 =0上升沿触发 P1IE |= BIT0; //设置中断使能 _EINT(); //打开总中断 LPM3;
//设置为LPM3低功耗模式,产生中断时自动激活 //为活动模式,如果在中断中没有修改低功耗模 //式,中断程序执行完成后,又进入LPM3模式
while(1);
#pragma vector = PORT1_VECTOR __interrupt void P1_Interrupt(void) { }
if((P1IFG&0x02) == BIT0)//判断是不是按键P1.1产生的中断 { } else { }
P1IFG &= ~BIT0;
//非P1.1的中断处理
P1IFG &= ~BIT0; num++;
//中断标志清除
//因为P1端口共用这个中断向量表
distance=num*l;//里程
5.3掉电保护及密码设置部分软件设计
AT24C02掉电保护芯片的主要过程是,在系统掉电过后,通过电容储存的电能将此时单片机RAM里的数据写入AT24C02的ROM里,待系统重新上电后,单片机又从AT24C02里面读取数据,这样就实现了掉电保护。密码设置部分是在AT24C02的最后一页写入密码设置语句,每当要修改单价时,调用一次,之所以写在AT24C02芯片上的原因是,其掉电过后不消失。其主流程图如图5.3.1。
图5.3.1 掉电保护流程图
掉电保护部分程序代码如下:
#define uchar unsigned char #define uint unsigned int void BaoHu(void) {
sbit sda=P4.5; //数据线 sbit scl=P4.6; //时钟线 sbit wp=P4.7; //读写保护 uint num1,num,jia;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98}; uchar write;
void delay() //时序延时 {uint j=5; while(j>=0) { Nop();
j--; } }
void init() //AT24C02初始化 { sda=1; delay();
scl=1;
}
void start() //启动 { sda=1; delay(); scl=1; delay(); sda=0; delay(); }
void stop() //停止 { sda=0; delay(); scl=1; delay(); sda=1; delay(); }
void writebyte(uchar date) //写数据 {
uchar i,temp; temp=date; for(i=0;i
temp=temp
void respons() //应答 {
uchar m; m=0; scl=1;
while((sda==1)&&(m
} //读数据 uchar readbyte() {
uchar j,k; scl=0; delay(); sda=1; delay(); for(j=0;j
void writeadd(uchar address,uchar date)//串口通信 { // wp=0; start(); writebyte(0xa0); respons(); writebyte(address); respons(); writebyte(date); respons(); stop(); }
uchar readadd(uchar address) {
uchar n; start();
writebyte(0xa0); //寻址、控制字节 respons(); //应答
writebyte(address); //把要读的首地址发送到从机 respons(); start();
writebyte(0xa1); //再次发送寻址、控制字节
n=readbyte(); //读的字节数
stop();
return n;
}
5.4七段数码管显示部分软件设计
本系统的七段数码管主要显示里程,价格,时间,系统上电后数码管默认显示里程。其主流程图如图5.4.1所示。
图5.4.1 数码管显示流程图
数码管显示部分程序如下:
void XianShi(void)//P3.4~P3.7实现位选,P6.0~P6.7实现段选
{
unsigned char code Duan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};
unsigned char code Wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char TempData[8];
void Delay(unsigned int t);
void Display(unsigned char FirstBit,unsigned char Num);
unsigned int num,j,i=0;//其中num是里程/价格/时间
//通过按键确定num是里程、价格、时间中哪一个。
Scan()
{
while(1)
{
}
void Delay(unsigned int t)
{
while(--t);
}
void Display()
{
unsigned char i;
unsigned char n; for(i=0;i
COM2=1;
COM3=1;
DataPort=TempData[i];
}
if(i==1)
{COM0=1; COM1=0;
COM2=1;
COM3=1;
DataPort=TempData[i];
}
if(i==2)
{COM0=1; COM1=1;
COM2=0;
COM3=1;
DataPort=TempData[i];
}
if(i==3)
{COM0=1; COM1=1;
COM2=1;
COM3=0; TempData[0]=Duan[num/1000]; TempData[1]=Duan[(num%1000)/100]; TempData[2]=Duan[((num%1000)%100)/10]; TempData[3]=Duan[((num%1000)%100)%10]; Display(); }
DataPort=TempData[i];
}
Delay(5);//延迟5ms
}
}
}
5.5 语音播报部分软件设计
本系统语音播报部分采用ISD2560语音芯片,首先录入语音,一次录入过后便可一直使用。通过地址选择将不同的语音存储在不同的段地址中,语音输出时也通过地址选择输出相应的语音。其流程图如图5.5.1所示。
图5.5.1 语音播报流程图
语音播报部分代码如下:
void YuYin(void)
{ void record(void);
void playback(void);
uchar count; // 重复播放次数计数器
uchar StartFlag; // 开始键按下标志
uchar IdleFlag; // 系统是否处于空闲状态标志
/* 定义语音芯片ISD2560的控制引脚 */
sbit START = 0;
sbit EOM = P4.4;
sbit PR = P4.7;
sbit PD = P4.3;
sbit CE = P4.2;
void delay(uint t)
{ uint i;
while(t--)
{ /* 对于11.0592M时钟,约延时1ms */
for (i=0;i
{}
}
}
/* 外部中断P1.3服务子程序 */
__interrupt void P1_Interrupt(void){
if((P1IFG&0x02) == BIT0)//判断是不是按键P1.1产生的中断
{
P1IFG &= ~BIT0; //中断标志清除
PD = 1; // 进入节电状态
if(count
{ count++;
delay(500); // 延时500ms
P4.0=0;
P4.1=0;// A8=A9=0
P2 = P2&0x00; // 起始地址为0
playback(); // 从地址0处播放
EX0 = 1; // 开外部中断0
}
}
else
{ IdleFlag = 1; // 变为空闲状态,可以再次按开始键
count = 0;
}
}
/* 主程序 */
void main()
{ //打开中断
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P1REN |= BIT0; //设置上拉/下拉使能 =0不使能
P1OUT |= BIT0; //设置带上拉电阻
//中断引脚应该设置为输入
//因为P1IES设置会使中断标志位置位,故清零 P1DIR &= ~BIT0; P1IFG &= ~BIT0; //因为P1端口共用这个中断向量表 P1IES |= BIT0; //设置为下降沿触发 =0上升沿触发
P1IE |= BIT0; //设置中断使能
_EINT(); //打开总中断
while(1);
count = 0;
StartFlag = 0;
IdleFlag = 1;
while(IdleFlag==1)
{ if (START)
{
delay(10); // 延时去抖动
if (START)
StartFlag = 1; // 开始键按下标志
}
if (StartFlag == 1)
{ do
{ P4.0=0;
P4.1=0; // A8=A9=0
P2=P2&0x00; //起始地址为0
record(); // 录音开始,存放在地址0处
}
StartFlag = 0;
PR = 1; // 结束录音
PD = 1; // 进入节电状态
delay(500); // 延时500ms再播放录音
EX0 = 1; // 开外部中断0
P2 = P2&0xFC; // A8=A9=0
P0 = P0&0x00; // 起始地址为0
playback(); // 从地址0处进行第一次播放
IdleFlag = 0; // 当前不空闲,按开始键无效
}
}
}
/* 录音函数 */
void record(void)
{
CE = 0;
PD = 0;
PR = 0;
}
/* 放音函数 */
void playback(void)
{
CE = 0;
PD = 0;
PR = 1;
}
六、仿真与实现
参考文献
[1]肖海荣,王凤瑛,杨金清,孙玉风.基于AT89C2051与ISD2560的录放音系统设计[J].微计算机信息(测控仪表自动化).2004, (1).
[2] 邢海霞,索明何,张怀强.基于ISD2560语音系统的设计与实现[J].科技信息(科学·教研).2007, (9).
[3] 王金泉,李正生,郑健,孙纪民.基于ISD2560语音芯片的小型实用语音系统[J]. 国外电子测量技术. 2002, 21(6).
[4]