视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
基于单片机的二氧化碳浓度测量及播报系统
2025-10-03 03:58:23 责编:小OO
文档
引言

我们的地球被一层大气包围着,其中氧气占21%,78%是氮气,1%是其它气体。这1%气体当中,就有只有一小部分为二氧化碳气体,约为300ppm(百万分之一,即0.03%)。虽然含量较少,但是二氧化碳的作用缺越来越受到高度的重视。大气二氧化碳持续增加,从而对整个地球的气候产生重大影响,让人们对二氧化碳这一微量气体有了新的认识。另一方面,做为植物光和作用的原料气体,二氧化碳的应用技术水平对农业大国来说也是至关重要。

在办公室的公共场合,二氧化碳测量也十分必须。二氧化碳在空气中的含量越高,对人体的影响就越大,当二氧化碳含量高出0.7%时,人体就会感到不舒服,当二氧化碳含量超过10%时,人体就会出现昏迷和死亡。达到20%,人就会在几秒内死亡。因此在人群比较密集的地方,二氧化碳含量是一个非常重要的参数,直接关系到人体舒适度和安全。

当代电子技术飞速发展,大规模集成电路不断普及应用,给人们的生活带来巨大的变化。同时人们对于自己的生活质量要求也不断提高。如何根据实际需求设计二氧化碳浓度测量系统就成为一个具有现实意义的课题。传感技术应用的领域越来越广泛,同时对其的要求也越来越高,需求越来越迫切。二氧化碳传感器的技术研究也越来越成熟,产品的性能也越来越高。同时,语音芯片应用不断普及,语音芯片产品的发展也十分迅速,新型号的语音芯片的功能更加强大。这使得设计一个二氧化碳浓度测量系统在技术层面上的难度逐渐降低。

本文中设计的系统,正是针对人群密集公共场所对二氧化碳浓度测量需求而设计。该系统能够对公共场合的二氧化碳浓度进行测量,并且能将测得浓度显示和语音播报,当浓度过高时还可以向办公室等公共场所的人员进行报警提示,使得能及时提醒人员通风以降低二氧化碳浓度。公共场所二氧化碳浓度播报器围绕ATS52来作为核心控制元件设计整个系统,通过外围电路的设计,利用液晶和语音芯片实现对二氧化碳浓度的现实以及播报。本系统,具有成本低,技术开发难度小,适用性、灵活性较好,具有一定得应用性。

1设计方案

二氧化碳语音播报器,顾名思义,即该系统实现的功能为对二氧化碳浓度的测试同时对其浓度进行播报。二氧化碳浓度通过传感器转化成电量信号,再通过单片机进行采集处理。系统中的核心控制单元为单片机,围绕单片机设计相应系统需求功能模块。

1.1系统需求分析:

系统需求分析主要是通过系统要求实现的功能对各个模块部分应该所具备的功能进行分析。

本系统基于ATS52单片机,实现对于室内二氧化碳的浓度测量及及时播报。系统的所需要的功能有:实现对二氧化碳浓度的测量;语音播放功能;按键控制;LCD显示功能。对于各部分性能有以下4点要求。

(1)LCD显示器正确测量结果,测量结果动态变化,并且可以控制切换设置界面菜单;

(2)二氧化碳浓度定时播报,可以通过按键控制进行播报,可以实现对浓度值的正确播报 ;

(3)系统出现异常可以复位;

(4)系统具有按键控制功能。

1.2方案设计

1.2.1数据采集

通过信号采集电路,主要是将二氧化碳的浓度值这一非电量信号转化为模拟电信号再转化为能通过单片机处理的数字量。因此前向通道由传感器、信号放大电路和AD转化电路组成。

1.2.2控制部分

本系统中控制信号主要是用来设置定时播报时间和报警浓度限值以及按键控制语音播报,根据实际功能的需求,可以通过软件使按键的功能灵活使用,仅需按键即可以达到控制功能。

1.2.3显示部分

因为有不同的设置功能要实现,用LCD显示比较方便,可以切换不同设置界面和二氧化碳浓度显示界面。

1.2.4语音播报

单片机控制语音芯片来进行语音播报。每次播报的内容中有很多是重复的,只有二氧化碳的浓度值是变动的。因此通过单片机来动态调动语音芯片内

的语音内容实现相应的播报内容。

1.3设计框图

基于以上的功能分析和设计的方案。单片机输入端接收传感器的测量信号和键盘控制信号,输出端控制液晶显示和音乐芯片音乐芯片驱动扬声器放音。

设计框图如下:

  图1.1 系统总体框图

    二氧化碳浓度为非电量信号,不能由单片机直接处理,要先经过传感器,将二氧化碳浓度(非电量信号)转化电压信号(电量信号)。然后由单片机进行数据处理,将采集到得电压信号转化成对应的二氧化碳浓度值。再通过单片机控制液晶显示浓度值,并控制语音芯片进通过扬声器进行语音播报。按键向单片机提供控制信号, 控制单片机实现报警浓度设置功能。

2硬件设计

本应用系统的硬件电路设计包含4部分内容:一是信号采集部分;二是控制单元部分;三是液晶显示电路;四是语音电路。

系统的扩展和模块设计应遵循下列原则:

(1)尽可能选择标准化、模块化的典型电路,提高设计的成功率和结构的灵活性;

(2)外围电路配置的水平应充分满足应用系统的功能要求;

(3)硬件结构应结合应用软件方案一并考虑。硬件结果与软件方案会产生相互影响,考虑的原则是:软件能实现的功能尽可能由软件来实现,以简化硬件结构。但必须注意,由软件实现的硬件功能,其响应时间要比直接用硬件响应来的长,而且占用CPU时间。所以,选择软件方案时,要考虑到这些因素;

(4)整个系统中相关的器件要尽可能做到性能匹配;

(5)单片机外接电路较多时,必须考虑其驱动能力。驱动能力不足时,系统工作不可靠,解决的办法是增加驱动能力,增设线驱动器或减少芯片功耗,降低总线负载。

2.1传感器选择及信号采集部分

传感器选择及其性能

测量二氧化碳浓度,传感器的选择十分重要。传感器的性能直接决定后续电路的设计以及整个系统设计的难度。因此了解二氧化碳传感器的种类,加以选择十分重要。

    目前,国际成熟的二氧化碳传感器有电化学式、半导体陶瓷式、固体电解质式、红外吸收式等四种原理产品。半导体陶瓷式二氧化碳传感器以其制作简单、成本低廉、抗恶劣环境等特点,受到业内人士的重视。但是,这种类型的二氧化碳传感器市场上不多,可能技术还不够成熟。红外吸收式的CO2传感器的精度及稳定性能都很好,但是由于它需要与光学系统组装在一起成为一个完整的装置。而这种装置体积大,价格高,因此,在一般的公共场合中不方便使用。电化学式及热传导式的CO2传感器虽然体积小,但是其精度、稳定性及对气体的选择性都不太理想。且电化学式的CO2传感器还存在着必须在电解质溶液中使用的缺点。

本系统采用的传感器MS4100为固态电解质测量方式,具有对二氧化碳反应灵敏,受温度和湿度影响小,成本低。

二氧化碳传感器相对于其他一般的烟雾传感价格较为昂贵,而且技术相对成熟的产品大多为进口,MS4100在众多二氧化碳传感器中,价格适中,性能比较稳定,器采用原理是固态电解质测量方式,使用时需要预热。本产品预热时间

为1个小时。工作电压5伏,与系统其它芯片可以统一供电,同时量程可以满足公共场合测量二氧化碳浓度的需求。 相应时间较快只需5秒,输出电压易于放大,可以使测量电路简化。而且输出电压与二氧化碳气体浓度成线性关系,使得数据处理较为简单

主要参数:

量程:0~30,000ppm

工作电压:5VDC±0.5%

功耗:至少800mW

输出电势:430~540mV(0ppm CO2)

准确性: ±5%;

图2.1 MS4100 二氧化碳传感器

   输出电压与气体浓度关系曲线,以及内部原理可见图2.2和图2.3所示。

图2.2 传感器灵敏度曲线图                 图2.3 传感器内部结构图

图2.2中浓度与输出电动势(EMF)关系表达式为:

EMF=EMF0-R×Log(Concentration)            (2—1)

其中EMF0为co2为0ppm时,输出的电压,一般为470~540mv之间。R为曲线的斜率,一般在55~75之间。Concentration代表二氧化碳浓度,单位为PPM。EMF为实际电压,即为1脚和6脚电压差。

在图2.3中可以知道,传感器电源供电端为3脚和4脚。此传感器的电源

端为加热器供电,电源接入方向没有要求。当加热器加热到一定温度时,电解质部分才能和空气中的二氧化碳产生反应,此时1脚和6脚产生电动势。1脚和6脚的电压满足式(2—1)。

电路中我们可以测得的1脚和6脚的电动势即为EMF。而公式(2-1)中R和EMF0中都为参数,所以要求的二氧化碳浓度Concentration可从以下公式中求得:

  (2—2)

其中EMF0=534,R=65为厂商提供的在温度为25摄氏度,湿度为65%时的标定值。由于没有标准的二氧化碳浓度测量仪来进行标定,系统中数据处理将采用厂商提供的标准。

二氧化碳传感器的测量浓度单位为:百万分单位或ppm。600 ppm浓度的二氧化碳意味着:每1,000,000 公升的空气中有600 公升的二氧化碳(或在1公升的空气中有0.6 毫升的二氧化碳)。

放大电路设计

传感器的输出电动势为1脚和6脚的差值,因此选择用差分放大电路实现对电量信号的放大,同时,AD转换采用ADC0809,其参考电压为正5伏,因此要把信号放大到电压范围内,根据传感器灵敏特性曲线知输出电压范围为(0~540mv),所以电路放大十倍就可以。

放大电路设计如下:

                       图2.4 差分放大电路

若设1脚输出电压为,6脚输出电压为,放大电路输出电压为,运放正极电压,运放负极电压,则根据虚短和虚断概念有:

(vi1-vn)/R4=(vn-vo)/R5                      (2—3)

(vi2-vp)/R1=vp/R2                           (2—4) 

   当R4/R1=R3/R2时, Vo=R4*(vi2-vi1)/R1       (2—5)

本电路要放大信号十倍,所以R4、R3取20k,R1、R2取2k。运放6脚输出电压接ADC0809模拟输入端。

本电路选用op07运算放大器,op07是高精度低失调电压的精密运放集成电路,用于微弱信号的放大,如果使用双电源.能达到最好的放大效果。给op07提供正负12伏电压,而系统中其他部分供电电压为+5伏,通过7805将+12伏电压转化成+5伏,这样外部供电就只需提供正负12伏电压即可。

                     

图2.5 电压转化电路

模数转化

 模数转化采用ADC0809将模拟信号转化成数字信号,提供给单片机处理。

   本系统中ADC0809只有一路输入,即二氧化碳传感器的放大信号,所以芯片三条地址选择线直接接地,即只选中IN0通道。数据端接P0口,其他控制端连接如下图:

                图2.6 ADC0809接口电路

ADC0809控制端口直接接单片机普通I/O口,通过I/O口模拟ADC0809时序,实现对ADC0809的控制,从而获得最终数模转换后的数据。

ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。

ADC0809时钟由单片机ALE端4分频后得到,单片机的晶振为12MHz,ALE端为晶振频

率的1/6,即2MHz,所以ADC0809的时钟信号频率为500KHz。4分频信号可由两级D触发器获得。

2.2控制单元电路

单片机最小系统

ATS52单片机是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得ATS52单片机为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。本系统主要通过IO口来控制个部分电路以及接受信号,32位I/O口控制线足以满足系统功能需求。

  ATS52具有P0、P1、P2、P3四个I/O口。由于外围电路比较多,所以要合理的利用端口,同一个器件尽量使用同一个I/O端口。根据这个原则,各模块之间因合理分配。

 P0口接ADC0809数据端口,P2口用来控制ADC0809和语音芯片(语音芯片采用端口模拟SPI控制,需要4条I/O口控制线,ADC0809需要3条),P1接液晶数据端,而液晶使能端和键盘控制接P3口。如图2.7所示。

需要注意的是,P0口作为普通I/0口时需要增加上拉电阻。

键盘控制

根据系统功能考虑,系统的按键控制有以下5个功能。

启动语音播报;

进入播报定时时间设置菜单;

修改时间;

进入报警限值设置菜单;

修改报警数值。 

基于以上功能设置键盘按键的功能。语音播报可以用以个按键控制。关于播报间隔时间和设置报警限值,可以采用一个按键进行功能切换:按第一次,进入播报时间间隔设置;按第二次,进入设置报警限值;按第三次,退出设置菜单。然后再用2个键控制数值的增减即可。

基于以上功能设计,可以不必使用4×4键盘,只用按键即可,即3个按键直接接单片机I/O口。这样的好处是可以使得布局简单。硬件功能的设计要根据具体功能需要,而不是全部都是标准设置。

按键与接口连接如图2.8所示。

    

图2.7  单片机控制电路

图2.8   按键接口电路

   3个按键接单片机I/O口,通过对I/O口的电位判断判断否有键按下。在显示浓度值时,可以通过P34的按键控制语音播报。在进入设置菜单时,可以通过P33口按键切换菜单,通过P36和P34来上调和下调设置。

2.3液晶显示部分

字符与数字显示部分才用LCD1602液晶显示模块,1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,足够系统需求的功能要求。每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出

来,我们就能看到字母“A”。

1602采用标准的16脚接口,其中:

第1脚:VSS为电源地

第2脚:VDD接5V电源正极

第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。

第6脚:E(或EN)端为使能(enable)端。

第7~14脚:D0~D7为8位双向数据端。

第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。

根据引脚对应功能,将双向数据端接单片机P1口,控制端接到P3口(使液

晶模块与单片机端口连接全部处于同侧),接口连接设计如下:

 

             图2.9       液晶模块接口电路

2.4语音电路

本系统中语音播报的内容的特点是有很多内容是相同的,只有每次测量到

得数据,即二氧化碳的浓度是动态测量不断变化。其他的播报内容中的文字信息也有重复内容,因此要充分利用单片机的控制能力,实现动态控制自动调用语音内容组合成播报内容。

本系统选择了ISD1720语音芯片,是华邦公司新推出的ISD1700系列芯片中的一种。改系列芯片提供多种功能而且音质较好。芯片内部包含自动增益控制、麦克风前置扩大器、扬声器驱动线路、振荡器与内存等的全方位整合系统功能。

芯片特点:可录、放音十万次,存储内容可以断点保留一百年。两种控制方式,两种录音输入方式,两种放音输出方式。工作电压在2.4V-5.5V之间,最高不能超过6V。用户可以自己根据需求在芯片中在任意地址空间录入所需的播放内容,同时也可以按地址直接调用录好的内容进行播放。这样就可以满足系统的播报要求。

而语音芯片的外围电路比较简单,仅需一些电阻、电容,电容主要是起到

滤波的作用。

本系统中单片机通过SPI模式控制语音芯片。主控单片机主要通过四线(SCLK,MOSI,MISO,/SS)SPI协议对ISD1720进行串行通信,本系统中通过I/O口模拟串行通信,与单片机的连接仅需4个端口。系统中将其与P2.0-P2.3连接。

    语音芯片接口电路如图2.10所示。

               图2.10  语音芯片接口电路

语音芯片的语音输出端SP+输出的信号强度有限,所以要通过LM386设计一个放大电路来驱动扬声器工作。LM386电压增益内置为20,当在1脚和8脚之间加一只外接电阻和电容,可使电压增益最大增益到200。

如图2.11所示,可以通过R12,10k的电位器来控制输出音频的大小5脚作为输出脚与1.25W的喇叭相连,为了滤掉低频滤波,减少杂音以及储存能量,在

5脚和喇叭之间需加上一个220UF的极性电容。为了使喇叭发出的声音柔和动听,要在5脚和地之间接上一个0.047UF和10欧的电阻。在7脚和地之间接上一个

10U的电容能滤除噪声。在这里只选3脚作为输入端,所以另一反相输入端2脚接地。语音放大电路如图2.11所示。

图2.11   语音放大电路

3 软件设计

应用系统中的应用软件是根据系统功能要求设计的,应该可靠地实现系统的各种功能。一个优秀的应用系统的软件应具有下列特点:

(1)根据软件功能要求,将系统软件分成若干个相对的部分。设计出软件的总体结构,使其结构清晰、简捷、流程合理。

(2)要树立结构化程序设计风格,各功能程序实现模块化、子程序化。既便于调试、链接,又便于移植、修正。

(3)建立正确的数学模型。即根据功能要求,描绘出各个输入和输出变量之间的数学关系,它是关系到系统性能好坏的重要因素。

(4)为提高软件设计的总体效率,以简明、直观的方法对任务进行描述,在编写应用软件之前,应绘制出程序流程图。

(5)注意在程序的有关位置处写上功能注释,提高程序的可读性。

(6)加强软件抗干扰设计,它是提高计算机应用系统可靠性的有利措施。

本系统的软件包括以下几个程序模块:

(1)按键识别程序与处理程序;

(2)ADC0809驱动程序;

(3)LCD显示程序;

(4)语音播报程序;

(5)数据处理部分。

3.1 主程序流程图

    程序主要要实现的功能:启动ADC0809进行模数转化,并将所得数据转化成实际的二氧化碳浓度,并且控制液晶显示,控制语音芯片进行语音播报。

 程序主流程如图3.1.

 否

图3.1 系统主程序流程图

3.2 ADC0809程序设计

 ADC0809是典型的逐次比较A/D转换器,通常都是以二进制码输出的,数据的输出符合微处理器数据总线的要求。控制ADC0809要按照其时序进行。START为启动转换信号,该信号的上升沿使逐次逼近寄存器复位,从它的下降沿开始进行A/D转换。ALE是地址锁存信号,在 ALE的上升沿,A,B,C被锁入地址锁存器。OE为允许输出信号:当OE=1时,三态输出锁存器重的数据被送上数据总线。EOC为转换结束信号:当A/D转换结束时,EOC变为搞电平,并将结果送入三态输出锁存器。

硬件电路所有控制端口直接接普通I/O口,通过I/O置高和置低来模拟ADC0809时序。ADC0809程序流程图

                                   

图3.2    ADC0809程序流程图

ADC0809程序代码主要如下:

AD0809_ST=0;

  delay_ms(10);

  AD0809_ST=1;

   delay_ms(10);

AD0809_ST=0;

  while(!AD0809_EOC);

   AD0809_OE=1;

 DigitalData=GetResult();

其中GetResult()子程序为读取ADC数据端端口的转化数值 。DigitalData保存所得数据提供单片机处理。

3.3液晶显示程序

   显示采用 LCD1602模块。数据与命令都通过D0~D7传入;读写操作时序由使能信号E完成;对读写操作的识别时对R/W信号上的电平判断,R/W的信号的宽度要大于E ;RS信号用于识别数据总线的数据是属于指令代码还是属于显示数据。

接口端的信号逻辑功能如下表:

表3.1 接口端逻辑功能

RSR/WEDB7~DB0

功能
00高脉冲指令码写指令
01高电平状态字读状态
10高脉冲数据写数据
11高电平数据读数据
表3.2状态字输出口

STA7STA6STA5STA4STA3STA2STA1STA0
D7D6D5D4D3D2D1D0
表3.3 状态字功能说明

STA0-6当前数据地址指针的数值
STA7读写操作使能1:禁止   

0:允许

 上述是基本时序和状态字的功能,其他指令的格式还有很多不一一列举,仅介绍本系统中用到得显示方法。

 本系统中无论是二氧化碳的浓度显示还是设置界面的菜单显示,都是只有中间的数字是变化的。因此可以在初始化液晶显示后,编写一个显示字符串的子程序。显示内容送字符串数组中,然后送显示,每次只要将字符串里的数值改变即可。如图3.3所示。

              图3.3   液晶显示流程图

各部分主要程序如下:

液晶初始化程序如下:

void LCD_init(void)

{

  delay(10);

  WriteCode(0x80);//显示数据指针初始化;

  WriteCode(0x01);//  显示清屏;

     WriteCode(0x38);//  设置16×2显示,5×7点阵,8位数据接口;

  WriteCode(0x0C);//  开显示,不显示光标;      

  WriteCode(0x06);//  写字符后地址指针加一;

}      

字符串显示子程序:

void LCD_Showstring(uchar line , uchar str[])

{

uchar i , j;

   i=line*0x10;

   for(j=0;str[j]!='\\0';j++)

   LCD_Showchar(i++,str[j]);

}

void LCD_Showchar(uchar position,uchar z )

{

  uchar p;

if(position<16)

     p=position+0x80;

     else;

     p=position+0xB0;    

    WriteCode(p);

     WriteData(z);

  }    

字符串处理程序:

DigitalData=GetResult();

sprintf(buffer,"co2 concentration :%d ppm",DigitalData);

   利用sprintf将数值打印到buffer数据缓冲区中,其中buffer就是字符串缓冲区,可以直接传到字符串显示子程序中送显示。

   不同的菜单内容可以通过传不同的数据缓冲区的内容得以调用。

3.4数据处理

传感器输出电压为毫伏级,AD采集到得是输出电压的10倍电压。转换公式中,传感器电压为毫伏级时的数值,AD转化后的数字量为传感器实际值的1/100,所以先对AD转换后的数值100倍放大,再利用公式处理所得数据。

数据处理程序:

DigitalData=GetResult();

其中534对应式(2—2)中的EMF0,65对应式(2—2)中R ,pow为指数函数。DigitalData为ADC0809转化得到的数字量。

3.5语音播报

 语音播报采用ISD1720语音芯片,可以播放20s的语音内容,芯片内部有内部存储单元,存储预先输入的语音信息。存储单元可以寻址访问,因此用户可以自行设置语音存放的空间以及播放任意录制空间的语音内容。芯片存储地址从第一个提示音的地址0x0000开始计算,但0x000-0x00F地址平均保留给了4个提示音。从0x010地址开始,才是非保留的存储区域,即真正的录音区,最高地址为0x09F。

 本系统中对语音芯片主要通过SPI模式进行控制,实现语音播报。ISD1720作为从机,几乎所有的操作都可以通过这个协议来完成。兼容按键模式,有PLAY,REC,ERASE,FWD,RESET和GLOBAL_ERASE的运行类似于形影的按键模式的操作。另外,SET_PLAY,SET_REC,SET_ERASE命令允许用户指定录音、放音和擦除的开始和结束地址。

 ISD1720SPI串行接口操作遵照以下协议:一个SPI 处理开始于/SS管脚的下降沿;在一个完整的SPI指令传输周期,/SS管脚必须保持低电平;数据在SCLK的上升沿锁存在芯片的MOSI管脚,在SCLK的下降沿从MISO 管脚输出,并且首先移出低位;SPI指令操作码包括命令字节,数据字节和地址字节,这决定于1720的指令类型;当命令字及地址数据输入到MOSI管脚时,同时状态寄存器和当前行地址信息从MISO管脚移出;一个SPI 处理再/SS变高后启动;再完成一个SPI命令的操作后,会启动一个中断信息,并且保持为低,直到芯片收到CLR_INT命令或者芯片复位。

                      图3.4 语音芯片时序图 

在SPI命令输入到ISD1720前,SPI端口的状态应该保持如下状态:/SS=HIGH;CLK=HIGH;OSI=LOW。

ISD1700芯片内部寄存器可以返回1700芯片的内部状态,其中SR0为2个字节,SR1为一个字节。SR0第一个字节的0为与SR1的0位用来判断上条命令是否正确执行及执行完毕。

具体的功能实现播报数据中要实现对数字的动态播报。例如:当数据为1234是,要播报的内容为“二氧化碳浓度为一千二百三十四PPM(PPM二氧化碳单位)” 。这就需要在软件上处理。数字播报流程图如图3.5。

 录音空间为0x09F-0x010=0x08F,即8×16+15=143,143+1=144段空间,每段空间20÷144=0.14秒,0~9,万,千,百,十各用0.5秒,各占0.5÷0.14=4段空间。在0x010~0x013存放读音“0” ,以此类推“9”存放在0x034~0x034,“万”存放在0x038~0x03B,“十”存放在0x044~0x047。-

 通过以下判断顺序可以正确报数值:先判断数字位数,然后从最高位播起,每播一位追加单位播报;数字播报可以用每一位数字本身做偏移量,寻址播放;单位在最初判断数字位后,设定起始单位地址,然后逐一增加。

                图3.5 数字播报流程图  

4调试过程

整个调试过程包括硬件调试、软件调试和系统测试三部分。每个模块在功能上相互联系又各自,所以在每个部分调试的过程中也要分模块进行。这样做的好处是,可以将出现的问题进行具有针对性的处理,避免出现问题时找不到真正原因。调试过程是对原理进一步理解和对原理中的不足改进的重要步骤。   

4.1硬件调试

硬件正常是整个系统正常运转的基础,所以硬件调试就格外重要。硬件调试主要是对制版的电气特性进行检测,逐个排查电路布线问题,使器件在能正常工作。前期的电路特性检查必须十分耐心,硬件电路的细小问题都可能对软件的工作是否正常产生影响。

硬件的调试主要经行了以下测试:

第一,对于电路布线中容易短路和断路的地方进行检测。因为在印制板子的过程中难免出现细微问题,比如布线比较近的地方就可能出现短路,然后在焊接好以后,对容易焊接短路的地方进行检测。这部分检测较为容易用万用表测量短路档来检测即可。

第二,在焊好板子后先不安装芯片上电。检测芯片底座供电电压是否正常。如果不正常,由于已经排除掉焊接短路、断路的问题,可以重点怀疑电路原理的问题。

第三,安装芯片分模块检测电路是否正常,这时先检测单片机是否正常工作,然后通过单片机向各模块发送一些简单命令测试模块是否能正常工作。4.1.1单片机硬件电路检测

 单片机最小系统检测主要是检测单片机是否能正常启动。

方法为用示波器检测单片机30脚,即ALE管脚是否有方波输出,且方波的频率因为晶振的1/6,即2M(晶振使用的是12M的)。检测到2M方波,说明单片机能正常启动。

4.1.2液晶模块调试

 液晶模块检测主要是检测能否正常显示字符。

 利用前面提到的送字符串显示测试。当然首先要保证液晶初始化程序和子程序都是正确的,在此前提下查看液晶的硬件电路连接。注意要保证对比度适合。 开始测试 没有看到字符,就是因为对比度调节不合适。

4.1.3 ADC0809和语音电路调试

 检测ADC0809首先要检测ADC0809的时钟是否正确。本系统采用500Hz,可以用示波器加以检测。

 语音芯片保留了按键部分用来测试芯片是否正常工作和芯片电源供电是否正常。工作正常后,可以通过控制端口模拟SPI时序,用示波器观测各控制端是否有正常信号输出。

 在检测语音芯片控制端的时候发现信号有异常,不能对芯片进行控制,最后发现P2口的上拉排阻装反了。

4.1.4放大电路检测

 放大电路主要是对传感器信号的放大。检测放大电路主要是检测放大电路能不能调零。将差分输入端同时接地,然后调整调零电阻,看是否能调零。放大电路放大倍数产生的误差也是主要要考虑的。为后面的数据处理可能导致较大误差。

                    

4.2软件调试

本系统软件部分采用C语言编写,系统硬件电路比较简单,主要通过软件来实现各个模块之间的协调运作。由于软件运行的基础是硬件,所以在调试软件的过程中如果发现问题,应该同时考虑软件和硬件的问题。调试可以通过使用伟福仿真器来仿真调试。

4.2.1液晶显示程序调试

 液晶显示在开始测试电路是否正常时,通过送字符串可以正常显示。但实际系统要求要显示的浓度值是动态变化的。开始曾想过,整个显示内容分段显示,数字单独显示,发现程序比较繁琐。所以想到如果可以将这个显示的内容看做一个整体的字符串,而其中的数字可以动态改变就可以了。通过使用scanf函数就可以达到目的。

4.2.2语音播报程序调试

 语音播报主要是模拟SPI时序传输命令与数据。主要出现问题是开始播

报数字,用每位数字作偏移量寻址播报,所播数字与实际不符。用编译器仿真查看程序中变量,发现问题为当数字量转化成字符放到字符串中时,值就转化成其对应的ASCⅡ码。因此想用数字做便宜量,要对其处理,即减掉30H即可。

 同时在分段播放时,没次播放前都要加入判断是否播放完毕,这样才能正常运行。调试初期,没有加入判断语句,导致分段播放混乱。  

还有要注意的是,当使用SPI 模式不按照严格要求进行录音的时候,按键模式无效,此时不能通过按键来判断芯片是否正常。

 4.2.3其他程序调试

 模数转化程序比较简单,就是模拟其时序即可。数据处理部分,根据其线

性关系可以得到求值公式,但是其斜率和输出的电压随温度变化,没能得到很好的解决,可以通过多次求值求平均值来减小误差,但室内空气检测,要求不是很精确,只要误差范围在允许范围内即可。

4.3系统测试

 在各个模块软件功能基本实现的时候,其实也就是硬件与软件能配套实现的过程。在各个模块程序实现功能的时候,在整合整个系统的软件时要注意不要出现死循环。各功能单独测试时,可以实现并不意味着这个系统的功能可以正常实现。在软件上根据流程图,合理设置个功能的连接方式十分重要。

 以上调试经过以后可以,进行系统整体测试。

 由于传感器正常输出信号需要预热一个小时,系统在一个小时候才能正常测量。

 传感器预热后可以看到,液晶屏能够显示二氧化碳浓度。

 由于没有标准的二氧化碳浓度检测仪进行比较,没法进行自行标定。只能根据传感器芯片中所标定来处理传感器输出信号。所得浓度与实际值存在一些偏差,但是公共场合二氧化碳浓度测量本身精度要求并不高,只要偏差范围不是太大即可。

 然后可以经行按键功能测试。按设置菜单建,可以进入设置菜单,按一次是进行报警值的设置,按两次是进入报警间隔时间的设置。其他两个按键可以对数值进行增减设置。

 在显示浓度时,按下语音播放键,可以对浓度进行语音播报。在设置菜单时不能通过按键播放语音,这时播放按键用来经行设置相应数值。

 系统整体设计功能基本能够实现,能够对二氧化碳浓度进行实时显示和语音播报。

5结论

  本系统设计过程中遇到一些问题,有些已经解决有些还有待改善。系统中主要应用了ATS52单片机,ADC0809模数转化芯片,液晶LCD1602以及语音芯片1720。各个芯片在应用的过程中应该注意一些问题。

对于ATS52单片机,应用已经相当普及和广泛。由于其本身没有像类似凌阳单片机集成其他多种功能,在组建系统时只能起到中心控制器的作用,其他功能需要依靠其他芯片来组建相应的功能电路。尽管本身功能不是强大,但具有很强的灵活型,根据不同的需求来配合外部电路来实行控制。

ADC0809经典的电路接口是利用单片机读写口和P2.0通过与非门来控制芯片启动。本系统中通过I/0口来模拟启动时序。在实现启动AD0809的程序调试中,在最开始的时候,通过简单的将ALE端置高电平,没能成功。最后通过对时序图的重新认识,才发现时边沿触发。这使我发现对与芯片的使用首先要读懂其时序图,很要的一点就是边沿触发还是电平触发。这一点在ADC1720的使用上也有体会。

液晶LCD1602虽然不能显示汉字,但已经可以满足系统要求。在系统中对LCD的应用较为简单,仅是现实字符串。通过对LCD的命令字的了解,可以自行设置显示效果,例如可以通过控制显示模式达到字符滚动显示,由于本系统不涉及,就不再讨论。

语音芯片ISD1720的使用是本系统中难度最大的部分。本芯片使用不单纯是一个放音电路,还含有其他的控制。因此程序首先要能完成指定地址的放音工作,还要配合其他的功能程序。

在调试液晶和语音芯片的过程中,要从易道难逐步调试。开始就想实现整体功能较为困难。液晶的功能实现先由实现显示字符串内容开始,然后实现显示内容的切换,在实现现实内容的变动。而语音芯片则是先实现按键播放录音,然后实现SPI控制的录放音,最后实现分段播录功能的实现。

语音电路的设计要注意,在线路布线的时候要注意电容要靠近指定管脚,可以提高录放音的质量。

语音程序的应用一定要注意每执行完一跳语句要进行是否执行完毕的判断,在初步调试程序时发现没有判断将使得有的语句没有执行不能按预期的方式播放。也可以用足够的延时来代替完毕判断,但建议使用语句判断较为合理。

系统的整体功能实现,不是简单的各个模块的功能实现的。尤其在软件编写方面格外突出,系统软件中各个功能程序的合理调用对最后系统的影响十分重要。

系统的功能基本实现,但还有一些不足。从制作工艺上来看,布线还有待提高,有些进一步完善;从功能上看,由于室内测量的精度要求不是是特别高,所以本系统对传感器的信号处理的精度不是很高,如果要具有更广泛的应用,信号的处理部分要加以改善。本系统作为二氧化碳播报系统,建立了基本架构,根据不同场合需求可以对不同的功能模块加以改善从而达到要求。

谢        辞

参考文献

[1] 王为青、程国钢.单片机Keil Cx51应用开发技术[M].人民邮电出版社.

[2] 谭浩强.C程序设计[M].清华大学出版社,2005,104~106.

[3] 白驹珩,雷晓平.单片计算机及其应用.高等教育出版社&电子科技大学出版社,2005.

[4] 康华光等.电子技术基础模拟部分(第五版).高等教育出版社,2005.

[5] 马忠梅. 单片机的C语言应用程序设计[M]. 北京航空航天大学出版社,1999.

[6] 劳五一, 劳佳编著. 模拟电子电路分析、设计与仿真[M].清华大学出版社,2007.5.

[7] 王秋爽,曾昭龙著.单片机开发基础与经典设计实例.机械工业出版社,2008

[8] 松井邦彦.传感器应用技巧(梁瑞林)[M].科学出版社,2006,16~18

[9]   Digital logic circuit analysis and design. Victor P.Nelson[et.al.] 1995  by Prentice Hall,Inc.  

[10]田立,田清著,51单片机C语言程序设计快速入门.人民邮电出版社出版发行,2007. 

附    录

附录一:电路原理图

附录二:程序清单

主函数程序:

void main(void)

{

      AD0809_OE=1;

 while(!BACK);

if(temp1>alarm)

 8F);

}

主要子函数:

void time0_int()

}

 //****************定时中断程序**********888

 void Timer0_Overflow() interrupt 1 using 0

 {

}

 }

 void bfnd()

 {

 7F);

}

//AD数据获取函数

float GetResult()

{

 float temp;

 float  VOLT;

}

//菜单设置子程序****************************************************

int showmenu1(void)

{

 ;

}

int showmenu2(void)

{

{

 if(!UP)

}

void bfsz(uint a)

{ uchar b,i,j;

  uint c;

  }

}

void bfwei(uint i)

{

  switch(i)

  {

 4C);break;

 4C,0x00,0x51);break;

  }

}

uint pdwei(uint num)

{ uint i;

if(num>10000)

else if(num>1000)

  i=1;

else if(num>100)

  i=2;

else if(num>10)

  i=3;

  else;

}下载本文

显示全文
专题