电子语音温度计的设计与实现.docx
《电子语音温度计的设计与实现.docx》由会员分享,可在线阅读,更多相关《电子语音温度计的设计与实现.docx(28页珍藏版)》请在冰豆网上搜索。
![电子语音温度计的设计与实现.docx](https://file1.bdocx.com/fileroot1/2023-2/8/da01a539-07a7-4026-9aa9-9c3b0fba616e/da01a539-07a7-4026-9aa9-9c3b0fba616e1.gif)
电子语音温度计的设计与实现
电子语音温度计的设计与实现
摘要
本系统是一个基于单片机SPCE061A的语音温度计的设计,用来测量环境温度,整个设计系统分为4部分:
单片机控制、温度传感器、液晶显示以及语音播报。
整个设计是以SPCE061A为核心,选用凌阳SensorModuleV1.0测量温度,SPLC501液晶模组显示温度,且设定了手动实时播报温度功能。
语音录放选用的集成块是SPY0030芯片,其保真度高,录音效果好,而且经济实惠。
关键词:
SPCE061A;SPLC501;SPY0030
Abstract
Thissystemisamicrocontroller-baseddesignSPCE061Avoicethermometertomeasuretheambienttemperature,thewholedesignofthesystemisdividedintofourparts:
MCUcontrol,temperaturesensor,LCDandvoicebroadcast.ThewholedesignisSPCE061Aasthecore,thechoiceofSunplusSensorModuleV1.0measuretemperature,SPLC501LCDmoduledisplaysthetemperature,andthetemperatureissetmanuallyinreal-timebroadcastfunction.ManifoldoptionalvoicerecordingisSPY0030chip,highfidelityaudioisgood,andaffordable.
Keyword:
SPCE061A,SPLC501,SPY0030
目录
1绪论5
2系统硬件设计5
2.1整体硬件设计5
2.2SPCE061A主控MCU框图5
2.3LCD液晶显示7
2.4语音播放电路原理图8
2.5电源模块8
2.6传感器模块9
2.7主控板模块分析9
2.8主控板电路原理图10
2.9硬件资源分配表10
3软件设计11
3.1系统主程序设计11
3.2LCD液晶显示子程序流程框图12
3.3语音播放实现函数12
3.4测量温度子程序设计13
4设计实物图14
4.1实物模型14
5附件15
5.1电子语音温度计的主函数15
5.2温度测量子函数16
5.3中断子函数19
参考文献23
致谢23
1绪论
21世纪是人类全面进入信息电子化的时代,现代信息技术的三大基础是信息采集(即传感器技术)、信息传输(通信技术)和信息处理(计算机技术)。
随着人类探知领域和空间的拓展,使得人们需要获得的电子信息种类日益增加,需要信息传递的速度加快,信息处理能力增强,因此要求与此相对应的信息采集技术――传感技术必须跟上信息化发展的需要。
传感器技术是人类探知自然界信息的触觉,为人们认识和控制相应的对象提供条件和依据。
它属于信息技术的前沿尖端产品,尤其温度传感器被广泛用于工农业生产、科学研究和生活等领域,数量居各种传感器之首。
近百年来,温度传感器的发展大致经历了以下三个阶段:
(1)传统的分立式温度传感器(含敏感元件);
(2)模拟集成温度传感器/控制器;(3)智能温度传感器。
目前,国际上新型温度传感器正从模拟式向数字式、由集成化向智能化、网络化的方向发展。
作为现代信息技术的三大核心技术之一的传感技术,将是二十一世纪世界各国在高新技术发展方面争夺的一个重要领域。
2系统硬件设计
2.1整体硬件设计
分析本题,根据设计要求我们确定了本系统的整体设计原理框图如下图所示。
图2.1原理框图
2.2SPCE061A主控MCU框图
SPCE061A是继u’nSP(TM)[3]系列产品SPCE500A等之后凌阳科技推出的又一款16位结构的微控制器。
与SPCE500A不同的是,在存储器资源方面考虑到用户的较少资源的需求以及便于程序调试等功能,SPCE061A里只内嵌32K字的闪存(FLASH)。
较高的处理速度使u’nSP(TM)能够非常容易地、快速地处理复杂的数字信号。
因此,与SPCE500A相比,以u’nSP(TM)为核心的SPCE061A微控制器是适用于数字语音识别应用领域产品的一种最经济的选择。
SPCE061A芯片结构图如图2-2所示。
图2.2.1SPCE061A芯片结构图
SPCE061A芯片特性如下:
Ø16位u’nSP(TM)微处理器;
Ø工作电压(CPU)VDD为2.4~3.6V(I/O)VDDH为2.4~5.5V;
ØCPU时钟:
0.32MHz~49.152MHz;
Ø内置2K字SRAM;
Ø内置32KFLASH;
Ø可编程音频处理;
Ø晶体振荡器;
Ø系统处于备用状态下(时钟处于停止状态),耗电仅为2A@3.6V;
Ø2个16位可编程定时器/计数器(可自动预置初始计数值);
Ø2个10位DAC(数-模转换)输出通道;
Ø32位通用可编程输入/输出端口;
Ø14个中断源可来自定时器A/B,时基,2个外部时钟源输入,键唤醒;
Ø具备触键唤醒的功能;
Ø使用凌阳音频编码SACM_S240方式(2.4K位/秒),能容纳210秒的语音数据;
Ø锁相环PLL振荡器提供系统时钟信号;
Ø32768Hz实时时钟;
Ø7通道10位电压模-数转换器(ADC)和单通道声音模-数转换器;
Ø声音模-数转换器输入通道内置麦克风放大器和自动增益控制(AGC)功能;
Ø具备串行设备接口;
Ø具有低电压复位(LVR)功能和低电压监测(LVD)功能;
Ø内置在线仿真电路ICE(In-CircuitEmulator)接口;
Ø具有保密能力;
Ø具有WatchDog功能。
2.3LCD液晶显示
本项目中LCD液晶显示器采用凌阳SPLC501液晶模组,该模组广泛用于小规模液晶显示器件,采用SPLC501A芯片作为其控制驱动器,集行、列驱动器和控制器于一体。
其内置8580位显示RAM;晶振本身内置,也可以外接;为128*64点阵显示。
单片机对SPLC501可以有2种访问方式:
直接访问与间接访问。
为简化程序,这里采用直接访问方式,微处理器可将显示数据通过8位数据总线或者串行接口写到SPLC501的显存中。
下图是SPLC501模组的接线电路。
图2.3.1SPLC501液晶显示器接口电路
2.4语音播放电路原理图
十六位单片机SPCE061A一个很重要的特色,就是其语音。
该语音播放电路的核心是通过音频放大芯片SPY0030进行语音放大。
当按键按下时,语音信号通过此电路放大,提示当前温度。
图2.4.1语音播放电路
2.5电源模块
鉴于系统使用的单片机SPCE061A和各芯片工作电压在5V左右。
我们选择了5V稳压电源给单片机和各芯片供电。
电路由简单实用的三端稳压器构成,输入电压5V,满足大部分电路的要求,电源电路图如下图2.5.1所示,由于使用了全桥,电压输入既可以使用交流输入,又可以使用正负直流输入,能够防止由于极性接反造成的事故。
滤波电容使用电解电容与小电容并联的方式,能够有效消除高频自激现象。
发光二极管接到电源与地之间,如果电源输出不正常,发光二极管都会出现工作异常,提示电源部分故障。
图2.5.1电源电路图
2.6传感器模块
凌阳的SensormoduleV1.0传感器模组是为方便学生进行单片机接口方面的学习专门设计的一个模块,它可以方便的和61板连接,涵盖了热、光、电等几大领域,可作为温度检测、温度控制,光线检测、遥控器解码及模拟遥控器实验等应用器件,其中温度/光线检测模块电路如图2.6.1所示,电源电压经稳压管TL431稳压到2.5V,提供给由R8和热敏电阻R9组成的分压电路以及R10和光敏电阻R11组成的分压电路,热敏电阻R9分得的电压通过TO输出,光敏电阻R11分得的电压通过LO输出。
可以直接把SPCE061A单片机ADC的任一通道与TO或LO连接,利用单片机进行A/D转换,并计算出对应的温度。
图2.6.1温度测量电路图
2.7主控板模块分析
SPCE061A单片机是凌阳科技公司推出的一款十六位结构的微处理器,它只内嵌32K字的FLASH,具有较高的处理速度,能够非常容易地、快速地处理复杂的数字信号。
SPCE061A最突出的特色就是它的语音处理功能。
图2.8.1SPCE061A实物图
2.8主控板电路原理图
图2.9.1主控板电路原理图
2.9硬件资源分配表
本设计主控板采用凌阳科技公司的SPCE061A,其硬件资源分配见下表:
CPU型号
SPCE061A
封装
PLCC
振荡器
□crystal
频率
32768Hz
□RC
R值
□外部
输入频率
WATCHDOG
□有 □无
□启用□未启用
复位时间:
0.75s
IO口使用情况
使用情况
IOA0~~IOA3(指示LED输出),IOB0~~IOB7(发送端、接收端):
无线传输模块控制端
IOA8~~IOA15,IOB4~~IOB6(接收端):
液晶显示器
剩余及处理方式
未使用
ADC使用情况
MIC-IN通道、LINE-IN通道
未使用
中断使用情况
用了1个中断
TimerA:
用于放音
3软件设计
3.1系统主程序设计
主程序是在程序运行的过程中必须先经过初始化,包括键盘程序,测量程序,以及各个控制端口的初始化工作。
系统在初始化完成后就进入读取温度测量程序,实时的测量当前的温度,得到温度后判断温度是否超过温度设置的上下限。
再在LCD上显示。
系统软件设计的总体流程图3.1.1所示。
3.1.1主程序流程图
3.2LCD液晶显示子程序流程框图
LCD液晶显示子程序为交互界面。
主要是实时显示当前温度信息。
当温度发生变化时,液晶上的显示会更新。
LCD液晶显示子程序流程图如图3.2.1所示。
图3.2.1LCD液晶显示子程序流程图
3.3语音播放实现函数
由于语音资源存储在外廓的存储器SPR4096上面,要实现语音播放必须采用手动方式。
需要获得语音资源,关键解决语音资源的起始地址,然后通过读取函数获得语音资源。
函数流程图如图3.3.1所示:
图3.3.1语音播放函数子流程图
3.4测量温度子程序设计
由于在整个语音温度计的设计中是以正确采集温度为前提的,因为如果温度采集不正确,那么即使后续电路如显示和报温电路均正确,最后的结果仍然不能达到我们所要的目标,也就是不能正确的对环境温度进行显示和报温,所以关于温度采集是非常重要的。
其测温子程序流程图如3.4.1所示。
图3.4.1测温度子程序流程图
4设计实物图
4.1实物模型
在整个模拟设计过程中,实物模型如下图所示,本设计包括四大模块,分别为主控制器模块、液晶显示模块、语音播报模块以及温度测试模块。
4.1.1整体实物模型
4.1.2液晶显示图
5附件
5.1电子语音温度计的主函数
#include"SPCE061A.h"
#include"SPLC501User.h"
externvoidKey_Init(void);//键盘初始化函数,在Key.c中定义
externunsignedintKeyScan(void);//键盘扫描函数,在Key.c中定义
externunsignedintTemp_Measure(void);//温度测量函数,在Tem_Meature.c中定义
externvoidPlaySnd(unsignedintSndIndex);//申明语音播放指定段语音的函数
externvoidPlayData(unsignedintiData);//申明语音播放某一个3位数字的函数
intmain(void)
{
unsignedintKey,Temp,Counter;//保存键值
intFlag=1;
Key_Init();//键盘初始化
LCD501_Init(0);
LCD501_ClrScreen(0);
while
(1)
{
Temp=Temp_Measure();//测量温度
LCD501_ClrScreen(0);
LCD501_PutString(8,32,(unsignedint*)"TempMeasure");
LCD501_PutChar(8,48,48+Temp/100%10);
LCD501_PutChar(8,48,48+Temp/10%10);
LCD501_PutChar(16,48,48+Temp%10);
LCD501_PutString(32,48,(unsignedint*)"Centigrade");
LCD501_PutString(8,64,(unsignedint*)"Thermograph");
Key=KeyScan();//键盘扫描,取键值
if(Key==0x0004)//如果是KEY3键按下
{
Temp=Temp_Measure();//测量并播放温度
if((Temp>=0)||(Temp<=125))//在测量范围内
{
PlaySnd(13);//播放"温度"
PlayData(Temp);//播放温度值,PlayData()函数在PlayVoice.c中定义
PlaySnd(12);//播放"摄氏度"
if(Temp>32)
{
PlaySnd(13);//播放"温度"
PlaySnd(14);//播放"太高"
PlaySnd(16);//播放"请"
PlaySnd(18);//播放"调小"
PlaySnd(13);//播放"温度"
}
if(Temp<20)
{
PlaySnd(13);//播放"温度"
PlaySnd(15);//播放"太低"
PlaySnd(16);//播放"请"
PlaySnd(17);//播放"调大"
PlaySnd(13);//播放"温度"
}
}
}
*P_IOA_Data&=0xfffb;//IOA2口回低电平
*P_Watchdog_Clear=0x0001;//清看门狗
}
}
5.2温度测量子函数
//文件名:
Tem_Meature.c
//功能描述:
温度测量驱动程序
#include"SPCE061A.h"
externunsignedintADGet(void);//申明热敏电阻上分到电压的A/D转换函数
unsignedintADData,Counter;
floatV[125]={1.576304,1.558983,1.541521,1.523924,1.506198,1.488351,1.470389,1.452319,1.434150,1.415889,
1.397544,1.379122,1.360632,1.342083,1.323481,1.304837,1.286158,1.267453,1.248731,1.230000,
1.230000,1.211269,1.192547,1.173842,1.155163,1.136519,1.117917,1.099368,1.080878,1.062456,
1.044111,1.025850,1.007681,0.989611,0.971650,0.953802,0.936076,0.918479,0.901017,0.883696,
0.866524,0.849505,0.832646,0.815952,0.799428,0.783080,0.766911,0.750927,0.735131,0.719528,
0.704121,0.688913,0.673907,0.659107,0.644514,0.630131,0.615961,0.602004,0.588263,0.574738,
0.561431,0.548342,0.535473,0.522823,0.510392,0.498181,0.486190,0.474417,0.462862,0.451525,
0.440405,0.429499,0.418808,0.408329,0.398061,0.388003,0.378152,0.368507,0.359066,0.349826,
0.340785,0.331941,0.323291,0.314834,0.306566,0.298485,0.290588,0.282873,0.275336,0.267976,
0.260789,0.253772,0.246923,0.240239,0.233717,0.227353,0.221146,0.215092,0.209187,0.203431,
0.197819,0.192348,0.187016,0.181821,0.176758,0.171826,0.167021,0.162341,0.157783,0.153345,
0.149023,0.144815,0.140719,0.136734,0.132852,0.129076,0.125401,0.121825,0.118346,0.114962,
0.111669,0.10847,0.105353,0.1023233,0.099378};//用来存放0~125摄氏度对应热敏电阻分到的标定电压值
//====================================================================================
//语法格式:
voidTemp_Init(void)
//功能描述:
温度测量初始化
//入口参数:
无
//出口参数:
无
//维护记录:
2006年6月27byhongyan.Feng
//====================================================================================
voidTemp_Init(void)
{
*P_IOA_Dir&=0xfffe;//初始化IOA0(LINE1)为悬浮输入口
*P_IOA_Attrib|=0x0001;
*P_IOA_Data&=0xfffe;
}
//====================================================================================
//语法格式:
unsignedintTemp_Measure(void)
//功能描述:
温度测量,测量得到的数据存放在iTemp中,并语音播放这个数据
//入口参数:
无
//出口参数:
温度值
//维护记录:
2006年6月27byhongyan.Feng
//====================================================================================
unsignedintTemp_Measure(void)
{
unsignedintx,iTemp,Flag;//ADData用来存放A/D转换的数据,x用来循环,iTemp用来存放温度值
floatiADData;//iADData用来存放转换后的电压数据
iADData=0.0000;//初始化为0
Flag=1;
Temp_Init();//端口初始化
*P_INT_Ctrl=0x0010;
__asm("intirq");
while(Flag)
{
if(Counter==10)
{
__asm("intoff");
ADData=ADData/10;//取10次测量数据的平均值
iADData=iADData+ADData*3.3/0x03ff;//把A/D转换后数据计算成电压并进行累加
for(x=0;x<125;x++)//查表,根据测量到的电压计算温度值
{
if(iADDataV[x+1])
iTemp=x;//保存温度值
*P_Watchdog_Clear=0x0001;
}
Counter=0;
ADData=0;
Flag=0;
}
*P_Watchdog_Clear=0x0001;//清看门狗
}
iTemp+=10;
returniTemp;//返回温度值
}
voidDelay(unsignedinti)
{
intm,n;
for(m=0;m
for(n=0;n<0x03ff;n++)
*P_Watchdog_Clear=0x0001;
}
5.3中断子函数
//文件名:
isr.asm
//功能描述:
中断服务函数文件
.INCLUDESPCE061A.inc
.INCLUDEs480.inc
.EXTERNAL_ADGet//申明A/D转换函数,该函数在AD.asm文件中定义
.EXTERNAL_ADData//外部变量用来存储A转换D数据
.EXTERNAL_Counter//外部变量用来存储电平的持续时间
.TEXT
//==============================================================================
//汇编语言格式:
_BREAK
//功能描述:
BREAK的中断服务函数
//如果需要,请在reti前面写用户的中断服务函数
//入口参数:
无
//出口参数:
无
//=======================================================