
基于单片机的一氧化碳检测仪的控制系统设计
摘 要
一氧化碳检测仪是一种用于公共场所及室内具有检测及超限报警功能的仪器。其设计方案基于ATC52单片机,选择瑞士蒙吧波公司的CO/CF-1000一氧化碳传感器。系统将传感器的标准信号通过AD0832为核心的A/D转换电路调理后,经由单片机进行数据处理,最后由LCD显示一氧化碳浓度值。
文中详细介绍了数据采集子系统、数据处理过程以及数据显示子系统和报警电路的设计方法和过程。系统对于采样地点超出规定的一氧化碳容许浓度时采用三极管驱动的单音频报警电路提醒监测人员。同时,操作人员对于具体报警点的上限值可以通过单片机编程进行设置。另外,该系统对浓度信号进行了信号补偿等处理,减少了测量误差,因此,具有较高的测量精度,而且结构简单,性能优良。
关键词:一氧化碳检测 单片机 数据采集处理系统
Abstract
Carbon monoxide detector is a kind of instrument detection and alarm function for public places and indoor. The design scheme based on ATC52 microcontroller,CO/CF-1000 carbon monoxide sensor Meng Babo Swisscompany.The standard signal sensor by AD0832 as the core of the A/Dconversion circuit,?after conditioning,?data processing by the MCU,?and finally by the LCD display carbon monoxide concentration values.
This paper introduces the data acquisition subsystem,data processing and datadisplay subsystem andalarm circuit design method and process. System for a single audio sampling sites exceeding the prescribed carbon monoxide allowable concentration using triode driven reminder alarm circuit monitors. At the same time, the operator specific alarm point for the upper limit set by MCU programming. In addition, the system of signal compensating of concentration signal, to reduce the measurement error, therefore, high precision, and simple structure, excellent performance.
KEY WORD: The detection of carbon monoxide Single chip microcomputer
Data acquisition and processing system
摘 要 I
Abstract II
第一章 前言 1
第一节 一氧化碳的特性及危害 1
第二节 一氧化碳检测仪的种类 1
第三节 课题的背景和意义 1
第二章 一氧化碳检测仪系统总体设计 2
第三章 一氧化碳检测仪硬件设计 3
第一节 硬件结构设计 3
第二节 硬件选择和设计 3
第四章 软件设计 19
第一节 软件设计结构 19
第二节 主程序模块的设计 19
第三节 模数转换的设计 20
第四节 按键模块的设计 21
第五节 时钟模块的设计 22
第六节 液晶显示模块的设计 23
第五章 系统仿真 24
结论 28
致谢 29
第一章 前言
第一节 一氧化碳的特性及危害
一氧化碳是无色、无臭、无味、有毒的气体,熔点?199℃,沸点?191.5℃。标准状况下气体密度为l.25g/L,和空气密度(标准状况下1.293g/L)相差很小,这也是容易发生煤气中毒的因素之一。
一氧化碳分子中碳元素的化合价是+2价,能进一步被氧比成+4价,从而使一氧化碳具有可燃性和还原性,一氧化碳能够在空气中或氧气中燃烧,生成二氧化碳。
一氧化碳中毒(carbon monoxide poisoning),亦称煤气中毒。一氧化碳是无色、无臭、无味的气体,故易于忽略而致中毒。常见于家庭居室通风差的情况下,煤炉产生的煤气或液化气管道漏气或工业生产煤气以及矿井中的一氧化碳吸入而致中毒。
第二节 一氧化碳检测仪的种类
目前,市场上一氧化碳检测仪的种类是多种多样,目前应用得较为广泛的是热催化监测方式,但由于多种可热性气体都能催化氧化燃烧,导致检测精度下降,另外,采用这种方式的检测仪体积和功率都较大,不便于随身携带,本设计提出的一种采用点调制非光红外(NDIR)气体成分分析技术检测一氧化碳气体的方法,该方法提高了检测精度,大大降低了检测仪的尺度和功耗,延长了电池供给时间,体积和功耗的有效降低。
第三节 课题的背景和意义
在当今社会发展中,现代化的发展给人类带了很大的方便,但与此同时,人生安全越来越受到人们的重视,一氧化碳在工业领域所给我们带来的方便不言而喻,但它对人体的危害也是显而易见的。所以我们设计一款基于单片机控制的一氧化碳检测仪,对一氧化碳进行检测,为人们提供了安全的保障。
第二章 一氧化碳检测仪系统总体设计
本论文主要完成一氧化碳检测仪软件和硬件仿真设计,设计内容包括:A/D转换器程序、控制程序、超标报警、键盘检测、数据显示等。
本系统采用单片机为控制核心,以实现一氧化碳检测仪的基本控制功能。系统主要功能内容包括:数据处理、时间设置、开始测量、超标报警、键盘检测、自动休眠,仪器若不进行测量操作,5分钟后自动进入休眠模式,以降低电源消耗。本系统设计采用功能模块化的设计思想,系统主要分为总体方案设计、硬件和软件的设计三大部分。根据任务书上的要求进行综合分析,总设计方案分为以下几个步骤:
(1)硬件系统电路的设计;
(2)软件系统主程序及其相关子程序的编写;
(3)系统电路及软件的调试;
(4)结论。
第三章 一氧化碳检测仪硬件设计
第一节 硬件结构设计
硬件设计部分主要包括:单片机、A/D转换器、时钟芯片、LCD、外围扩展数据RAM等芯片的选择;硬件主电路设计、数据采集、模数转换电路设计、液晶显示电路设计、外围扩充存储器接口电路、时钟电路、复位电路、键盘接口电路等功能模块电路设计。硬件结构框图3.1。
图3.1 硬件结构框图
第二节 硬件选择和设计
一、 ATC52单片机的选择
本系统采用ATC52单片机。而目前世界上较为著名的8位单片机的生产厂家和主要机型如下:
美国Intel公司:MCS?51系列及其增强型系列;
美国Motorola公司:6801系列和6805系列;
美国Atmel公司:C51等单片机;
美国Zilog公司:Z8系列及SUPER8;
美国Fairchild公司:F8系列和3870系列;
美国Rockwell公司:6500/1系列;
美国TI(德克萨司仪器仪表)公司:TMS7000系列;
NS(美国国家半导体)公司:NS8070系列等等。
尽管单片机的品种很多,但是在我国使用最多的还是公司的系列单片机和美国公司的单片机。
MCS?51系列单片机包括三个基本型8031、8051、8751。
本系统采用ATC52单片机为控制核心。而相比之下52型功能更为强大,ROM和RAM存储空间更大,52还兼容51指令系统。基于本系统设计内容的需要,综合考虑后,我们选择单片机ATME公司的ATC52为控制核心;主要基于考虑ATC52是一个低电压,高性能CMOS 8位单片机,片内含8KB的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM)、6个中断源;时钟频率0~24MHz;器件采用高密度、非易失性存储技术生产,并兼容标准MCS-51指令系统,功能强大。
ATC52是美国ATMEL公司生产的低电压,高性能CMOS 8位单片机,片内含8K bytes的可反复擦写的只读程序存储器PEROM和256K bytes的随机存取数据存储器,器件采用ATMEL公司的高密度,非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位处理器和FLASH存储单元,功能强大,ATC52单片机适合于许多较为复杂控制应用场合。
图3.2 引脚图
主要性能参数:
与产品指令和引脚完全兼容;
8K字节可重擦写FLASH闪存存储器;
1000次写/擦循环;
时钟频率:0Hz~24MHz;
三级加密存储器;
256字节内部RAM;
32个可编程I/O口线;
3个16位定时/计数器;
6个中断源;
可编程串行UART通道。
二、单片机最小系统的设计
采用ATC52来设计一个单片机系统能运行起来的需求最小的系统,电路图见图3.3:
图3.3 单片机最小系统图
上图的最小单片机系统包含有晶振电路和复位电路,ATC52芯片组成。
(1)晶振电路
晶振电路在各种指令的微操作在时间上有严格的次序,这种微操作的时间次序称作时序, ATC52的时钟产生方式有两种,一种是内部时钟方式,一种是外部时钟方式。
本系统中采用了内部时钟方式,为了尽量降低功耗的原则。电路图见图3.4。
图3.4 晶振电路图
在C52单片机的内部有一个震荡电路,只要在单片机的XTAL1和XTAL2引脚外接石英晶体(简称晶振)就构成了自激振荡器并在单片机内部产生时钟脉冲信号,图中电容器C1和C2稳定频率和快速起振,晶振CRY选择的是12MHz。(2)复位电路
①复位的意义
复位电路在单片机工作中仍然是不可缺少的主要部件中,单片机工作时必须处于一种确定的状态。端口线电平和输入输出状态不确定可能使外围设备误动作,导致严重事故的发生;内部一些控制寄存器(专用寄存器)内容不确定可能导致定时器溢出、程序尚未开始就要中断及串口乱传向外设发送数据。
②复位电路原理
图3.5 上电复位电路图
本设计中复位电路采用的是上电复位与手动复位电路,开关未按下是上电复位电路,上电复位电路在上电的瞬间,由于电容上的电压不能突变,电容处于充电(导通)状态,故RST脚的电压与VCC相同。随着电容的充电,RST脚上的电压才慢慢下降。选择合理的充电常数,就能保证在开关按下时是RST端有两个机器周期以上的高电平从而使ATC52内部复位。开关按下时是按键手动复位电路,RST端通过电阻与VCC电源接通,通过电阻的分压就可以实现单片机的复位。电路图见图3.6:
图3.6 复位电路图
三、数据采集系统的选择与设计
(1)一氧化碳传感器的选择:
一氧化碳传感器选用CO/CF-1000探头组成,如下表3-1。
表3-1 传感器参数
名称 一氧化碳传感器 CO/CF-1000
测量范围 0 - 1 000 ppm
输 出 100±20nA/ppm
分辨率 0.05 ppm
响应时间 T 90 ?50 seconds
湿度范围 15-90 %RH(非凝结)
最大零点漂移20℃to 40℃ 10 ppm
长期漂移 ?2% /每月
推荐负载值 10Ω
线性度输出 线性
(2)从传感器过来的电压信号,必须采集,滤波,放大,转换才能被MCU识别和处理。由于假若每一路都设置放大、滤波等器件,那么成本会很大,所以信号的采集一般用多路模拟通路进行选择。然而选择多路模拟开关时必须考虑以下的几个因素:通道数量、切换速度、开关电阻和器件的封装形式。总之数据采集与硬件的选择有很大的关系。
(3)测量电路
测量电路由CO/CF-1000一氧化碳传感器、ADC0832组成。当空气被内部的采样系统接收后,产生一个与一氧化碳浓度成正比的电压信号,该电压信号经ADC0832与ATC52单片机相连,在显示器上显示出一氧化碳的浓度值,当超过国家规定的标准时报警。
四、模数转换器的选择与简介
(1)由于ADC0832模数转换器具有8位分辨率、双通道A/D转换、输入输出电平与TTL/CMOS相兼容、5V电源供电时输入电压在0~5V之间、工作频率为250KHZ 、转换时间为32微秒、一般功耗仅为15MW等优点,适合本系统的应用,所以我们采用ADC0832为模数转换器件。电路图见图3.7如下:
图3.7 模数转换电路图
(2)ADC0832 具有以下特点:
①8位分辨率;
②双通道A/D转换;
③输入输出电平与TTL/CMOS相兼容;
④5V电源供电时输入电压在0~5V之间;
⑤工作频率为250KHZ,转换时间为32μS;
⑥一般功耗仅为15mW;
⑦8P、14P?DIP(双列直插)、PICC 多种封装;
⑧商用级芯片温宽为0℃到+70℃,工业级芯片温宽为?40℃到+85℃;
芯片接口说明:
①CS_片选使能,低电平芯片使能;
②CH0模拟输入通道0,或作为IN+/-使用;
③CH1模拟输入通道1,或作为IN+/-使用;
④GND芯片参考0电位(地);
⑤DI数据信号输入,选择通道控制;
⑥DO数据信号输出,转换数据输出;
⑦CLK芯片时钟输入;
⑧Vcc/REF电源输入及参考电压输入(复用)。
单片机对ADC0832的控制原理:
正常情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。当ADC0832未工作时其CS输入端应为高电平,CLK和DO/DI的电平可任意。当要进行A/D转换时,先将CS使能端置于低电平并且保持低电平直到转换完全结束。同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。
(3)测量量程
由于ADC0832模数转换器的位数为8位,所以ADC0832模数转换器的精度为:10ppm/2560.039ppm。
五、按键选择与简介
(1)本系统选择式按键。键盘分为:式和矩阵式两类,每一类按其编码方法又可以分为编码和非编码两种。本系统具有人机对话功能,该功能即能随时发出各种控制命令和数据输入以及和LCD连接显示运行状态和运行结果。由于本系统只有UP、DOWN、OK、CANCEL4个控制命令,所需按键较少,所以本系统选择式按键。电路图见图3.8。
图3.8 按键电路图
(2)式按键是直接用I/O口线构成的单个按键电路。每个式按键占有一根I/O口线。各根I/O口线之间不会相互影响。在此电路中,按键输入部采用低电平有效,上拉电阻保证了按键断开时,I/O口线有确定的高电平,(ATC52.P1口内部接有上拉电阻)所以就不需要再外接上拉电阻。
(3)键盘抖动的消除:抖动的消除大致可以分为硬件削抖和软件削抖。
硬件削抖是采用硬件电路的方法对键盘的按下抖动及释放抖动进行削抖,经过削抖电路后使按键的电平信号只有两种稳定状态。
六、外围扩充存储器的选择
由于考虑ATC52单片机具有8KB的程序存储器(ROM),256B的数据存储器(RAM),由于考虑到本系统的数据处理与存储所需的容量,现在需要扩充存储器的容量。在应用中要保存一些参数和状态,本系统选用AT24C128存储器。电路图见图3.9。
图3.9 外围扩充存储电路图
七、时钟芯片选择与设计
在本系统,我们选择了DS1302时钟芯片。因为此系统需要记录测量发生的时间,所以需要时钟芯片来记录不同时间的监测数据,因此我们在系统中加入了时钟芯片。
(1)我们时钟电路选择的芯片是DS1302,其内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机通信。而通信时,仅需要3个口线:①RES(复位),②I/O数据线,③SCLK(串行时钟)。时钟/RAM的读/写数据以一字节或多达31字节的字符组方式通信。
(2)DS1302主要性能有:时钟能计算2100年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年的调整能力;读/写时钟或RAM数据时,有单字节和多字节传送两种方式,与DS1202/TTL兼容。
(3)DS1302引脚概述:X1,X2;振荡源,外接32.768KHZ晶振;SCLK:串行时钟输入端。见表3-2。
寄存器名 命令字 取值
范围 各位内容
写操作 读操作7 6 5 4 3~0
秒寄存器 80H 81H 00~59 CH 10SEC SEC
时寄存器 84H 85H 01~12 00~23 12/24 0 10/(A/P) HR HR
日寄存器 86H 87H 01~28,29、30、31 0 0 10DATE DATE
月寄存器 88H H 01~12 0 0 0 10M MONTH
周寄存器 8AH 8BH 01~07 0 0 0 0 DAY
年寄存器 8CH 8DH 01~99 10YEAR YEAR
保护寄存器 8EH 8FHWP 0 0 0 0
慢充电寄存器 90H 91HTCS TCS TCS TCS DS DS RS RS
时钟突发寄存器 BEH BFH
表3-2 时钟控制字对照表
(4)DS1302数据输入/输出时序
数据输入是在输入写命令字的8个SCLK周期之后,在接下来的8个SCLK周期中的每个脉冲的上升沿输入数据,数据从0位开始。如果有额外的SCLK周期,它们将被忽略。
图3.10 时钟电路图
数据输出是在输出命令字的8个SCLK周期之后,在接下来的8个SCLK周期中的每个脉冲的下降沿输出数据,数据从0位开始。需要注意的是,第一个数据位在命令字节的最后一位之后的第一个下降沿被输出。只要RST保持高电平,如
果有额外的SCLK周期,将重新发送数据字节,即多字节传送。其电路图见图3.10。
八、上拉电阻的选择
在主电路图中接在P0口处有一个排阻RP1,由于P0口没有内接上拉电阻,为了为P0口外接线路有确定的高电平,所以要接上排阻RP1,以确保有P0口有稳定的电平。电路连接图见图3.11。
图3-11 上拉电阻电路图
九、液晶显示器选择
我们选用了AMPIRE128X液晶显示模块,是由于本系统要有显示装置完成显示功能,显示器最好能够显示数据、图形,考虑到同种LCD显示器的屏幕越大体积越大,功耗越大的特点,该型号显示器消耗电量比较低,可以满足系统要求。该类液晶显示模块采用动态的液晶驱动,可用5V供电。AMPIRE128X液晶共有22个引脚。如表3-3所示。
表3-3 引脚说明表
管脚名称 管 脚 定 义
/CSA 片选1
/CSB 片选2
VSS 数字地
VDD 逻辑电源+5V
V0 对比度调节
R/S 指令数据通道
R/W 读写选择
E 使能选择
DB0-DB7 数据线
CS1 片选1
CS2 片选2
/RES 复位信号
VEE 液晶驱动电源
LED+ LED背光正电源
LED- LED接地端
管脚名称 管 脚 定 义
/CSA 片选1
/CSB 片选2
VSS 数字地
VDD 逻辑电源+5V
V0 对比度调节
R/S 指令数据通道
R/W 读写选择
E 使能选择
DB0-DB7 数据线
CS1 片选1
CS2 片选2
/RES 复位信号
VEE 液晶驱动电源
LED+ LED背光正电源
LED- LED接地端
AMPIRE128X液晶显示模块与计算机的接口电路有两种方式。分为直接访问方式和间接控制方式。直接访问方式是把液晶模块作为存储器或I/O设备直接接在单片机的总线上,单片机以访问存储器或I/O设备的方式操作液晶显示模块的工作。间接控制方式则不使用单片机的数据系统,而是利用它的I/O口来实与显示模块的联系。即将液晶显示模块的数据线与单片机的Pl口连接作为数据总线,另外三根时序控制信号线通常利用单片机的P3口中未被使用的I/O口来控制。这种访问方式不占用存储器空间,它的接口电路与时序无关,其时序完全靠软件编程实现。本系统采用间接控制方式。液晶显示电路连接原理图见图下: (2)LCD按其显示方式通常可以分为断式、点字符式、点阵式等。还有黑白、多灰度、彩色显示等。
①字符显示:字符显示比较复杂,一个字符由16x8点阵组成,即要找到和显示屏是某几个位置对应的RAM区的字节,再使不同的位置为“1”其他的为“0”;为“1”的点亮,为“0”的不亮,这样就显示出一个字符。
②汉字显示:汉字显示和字符显示的原理差不多,就是一个汉字一般采用图形方式,事先从微机中用字模软件提取要显示的汉字的点阵码,每个汉字占32B,分为两部分,各16B。根据在LCD上开始显示的行列号及每行的列数就可以找出显示RAM的对应地址,送上汉字要显示的第一字节,以此类推,最后送完32B,这样汉字就显示出来了。
系统的液晶显示字体和字母的显示就是按照上述的原理显示的,点阵码是用字模软件在相同的设置区域找出的。然后把提取的点阵码放入编写的LCD软件程序里。
(3)阵码获取过程简介:首先,打开软件,然后新建文件,因为汉字占32B所以设置其为高度和宽度16x16。取模方式选择C51格式在文字输入区输入汉字,在点阵区生成点阵码,例如在文字输入区输入“欢”字,其点阵码生成如下:
图3.13 点阵生成截图
十、报警电路的选择
图3-14 单频音报警电路图
在单片机应用系统中,一般的工作状态可以通过指示灯或数码显示来指示,供操作人员参考,了解系统的工作状况。但对于紧急状态,比如系统检测到的错误状态等,往往还需要有某种更能引人注意,及时采取措施,往往还需要有某种更能引人注意,提起警觉的报警信号。这种报警信号通常有三种类型:一是闪光报警,因为闪动的指示灯更能提醒人们注意;二是鸣音报警,发出特定的音响,作用于人的听觉器官,易于引起和加强警觉;三是语音报警,不仅能起到报警作用,还能直接给出警报种类的信息。其中,前两种报警装置因硬件结构简单,软件编程方便,常常在单片机应用系统中使用;而语音报警虽然警报信息较直接,但硬件成本高,结构较复杂。单频音报警实现单频音报警的接口电路比较简单,其发音元件通常可采用压电蜂鸣器,当在蜂鸣器两引脚上加3~15V直流工作电压,就能产生3kHZ左右的蜂鸣振荡音响。压电式蜂鸣器,约需10mA的驱动电流,可在某端口接上一只三极管和电阻组成的驱动电路来驱动,如图3-14所示。在图3-14中,P1.0接三极管基极输入端,当P1.0输出高电平“1”时,三极管导通,蜂鸣器的通电而发音,当P1.0输出低电平“0”时,三极管截止,蜂鸣器停止发音。
第三节 硬件设计主电路图:
第四章 软件设计
第一节 软件设计结构
软件设计部分主要包括:主程.序/子程序流程的设计、功能模块程序的编写、软/硬件结合调试与演示。主要包括以下功能模块:51驱动、检测、液晶显示、时钟、键盘、模数软换,软件结构框图4.1。
图4.1 软件结构框图
第二节 主程序模块的设计
主程序实现的功能:与硬件相结合实现便携式一氧化碳检测仪的各个功能。主要是检测与显示,时间调整与显示,数据存储,功能子函数的调用,见图4.2。
图4.2 主程序流程图
检测主程序程序见附录二。
第三节 模数转换的设计
(1)模数转换模块的主要功能就是将经放大器放大的模拟电压信号转化为MCU能够处理的数字信号,并传送给单片机。
(2)ADC0832转换的流程图见下图4.3。
图4.3数转换流程图
(3)ADC0832程序见附录三。
第四节 按键模块的设计
(1)按键时显现人机对话的一个控制按钮,通过按键的操作,对系统进行发送操作指令,后经与MCU串行通信,然后在液晶上显示。
(2)按键查询式的流程图见下图:
图4.4 按键查询式的流程图
(3)按键程序见附录四。
第五节 时钟模块的设计
(1)DS1302模块主要是用于设置时间和与MCU通信经LCD显示时间。
(2)时钟模块操作流程图见下图:
图4.5 时钟模块操作流程图
(3)时钟程序见附录五。
第六节 液晶显示模块的设计
(1) LCD模块在本系统中主要起着开界面汉字显示,以及各控制效果的显示。采用直接访问方式。液晶显示的操作流程图见下图4.6。
图4.6 液晶显示的操作流程图
(2)液晶程序见附录六。
第五章 系统仿真
ProteusISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析SPICE各种模拟器件和集成电路,该软件的特点是:
(1)实现了单片机仿真和SPICE电路仿结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
(2)支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
(3)提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。
(4)具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。本章介绍Proteus ISIS软件的工作环境和一些基本操作。
图5.1 ISIS 6 Professional图标
进入Proteus ISIS:双击桌面上的ISIS 6 Professional图标(见图5.1)或者单击屏幕左下方的“开始”→“程序”→“Proteus 6 Professional”→“ISIS 6 Professional”,出现如图5-2所示屏幕,表明进入Proteus ISIS集成环境。工作界面:Proteus ISIS的工作界面是一种标准的Windows界面,如图5.2所示。包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。
图5.2 工作界面
完成了本系统的硬件设计和软件设计后,对其进行了总体调试并且仿真运行,使用的是proteus软件,当硬件设计和软件设计都完成的时候就可以看到虚拟的基于单片机的低功耗计数系统的运行,以下为仿真效果:
(1)编译结束,添加HEX文件到仿真图中运行,本系统主界面显示图如图5.3所示。
图5.3 主界面显示图
(2)系统接下来显示,4个基如本操作功能,“√”为该操作显示项,图5.4。
图5.4 功能界面
(3)选择“开始”,单击“OK”键,便有下面测量选择界面,如图5.5。
图5.5 测量选择界面
(4)再按“OK”,则显示检测数据,范围0-10ppm。如图5.6。
图5.6 测量界面显示图
(5)4个功能的操作和演示是相同的,以下为“时间设置”显示图,如图5.7。
图5.7 当前时间显示图
(6)小结:本系统原先打算设计“开始”、“ 时间设置”、“ 数据存储”“通讯设置”等4个基本功能,后由于条件所限,并未做出全部的功能,但这次的毕业设计,收获还是很多的。今后我会进一步进完善该系统。
结论
本一氧化碳检测仪的设计体积小,质量轻,性价比高。主要分为硬件设计和软件设计。基本实现了设计前对该系统所要求实现的功能。
软件是基于C语言编写的,具有很好的可控性、模块化和移植性。编写的思路以模块化思想,将系统的各个功能进行划分,然后对各个模块进行设计。本系统的主要模块为一氧化碳检测、A/D转换、液晶显示和时钟设置。
软件与硬件相结合的仿真演示出了一氧化碳检测仪主要的工作情况。但由于是电信号模拟,和真实一氧化碳检测有一定区别,而且所学知识有限,本系统实现的功能不是很健全,但在设计过程中让自己学会了很多。
致谢
本论文是在张建平老师的悉心指导下完成的。从选题到完成,每一步都是在张老师的指导下完成的,倾注了张老师大量的心血。在此,谨向张老师表示崇高的敬意和衷心的感谢。
我的毕业课题是便携式一氧化碳检测仪的设计,是一个实际的小工程。作为一个自考本科的学生,我对实际的工程设计认识不够,经验不足,难免在设计的整体框架中,有很多的细节没有考虑。但老师给予我鼓励和很多宝贵的建议,并且悉心引导,给予我一个比较清晰的设计思路,帮助我解决了许多设计上的困难。最后还要感谢在百忙之中进行论文评审的老师们,对论文的不足之处敬请批评点。
附录二 检测主程序程序
#include //调用外函数//
#include
#include
#include
#include
#include
#include /**********初始化CPU************/
void init_cpu //初始化cPu
EA1;
TR01;
TR11;
TMOD0x11;
TH10x3c;
TL10xb0;
/*void time1void interrupt 3 using 1
TH165536-50000/256;
TL165536-50000%256;
keyvalP1; *//初始化CPU结束//
void main_menu_initial //LCD主菜单初始化.//
main1_menu[0].menu_count4; //有4个菜单项.//
main1_menu[0].displaymeasurearray;//定义一个”开始测量“数组//
main1_menu[0].subsNULL;
main1_menu[0].children_menusmeasure_menu; //当前菜单子菜单的指针
main1_menu[0].parent_menusNULL;
void measure_menu_initial //“开始测量”菜单设置//
measure_menu[0].menu_count2;
measure_menu[0].displayqr; //开始测量函数, 确认.
measure_menu[0].subsstart_measure_function; //开始测量函数
measure_menu[0].children_menusNULL;
measure_menu[0].parent_menusmain1_menu;
measure_menu[1].menu_count2;
measure_menu[1].displayqx; //开始测量函数, 取消.
measure_menu[1].subsNULL;
measure_menu[1].children_menusNULL;
measure_menu[1].parent_menusmain1_menu;
//还有void store_menu_initial、void time_menu_initial//
void led_menu_pro
_itemmenu_led-menu_count;
switchkeyval
case 0: break;
case 1://向上键.
ifuser_choosen0
user_choosen_item;
shuaxin1;
user_choosen--;
break;
……//“向上”“向下”“确认”“取消”键//
ifshuaxin //是否需要刷新LCD标志位.
Clr_Scr;
shuaxin0;
led_menu_show;
v oid led_menu_show
uchar n;
_itemmenu_led-menu_count;
if _item4//菜单项为3则表示为主菜单.
forn0;n4;n++
draw_bmpn*2,20,96,0,menu_led[n].display;
select_itemuser_choosen; //标记出当前菜单项.
else
switchtemp_choosen
case 0:
draw_bmp0,20,96,0,measurearray; //“开始测量”数组//
break;
……
default:
break;
forn0;n_item;n++
draw_bmpn+1*2,20,32,0,menu_led[n].display;
select_itemuser_choosen+1;
void select_itemuchar n
draw_bmpn*2,2,16,0,curflag;
void start_measure_functionvoid //开始测量函数//
main_Menu;
……
/*----------------主函数
main
init_cpu;
Init_Clock;
init_lcd;
Disp_ImgFirstPage;
delay2000; //延时//
ClockMsg;
Refresh;
delay2500;
Clr_Scr;
main_Menu;
Clr_Scr;
main_menu_initial;
measure_menu_initial;
store_menu_initial;
time_menu_initial;
communication_menu_initial;
while1
keyvalget_key; //读键.
led_menu_pro;
// 适当延时防止因为不断查忙而耗费大量CUP资源 //
附录三 ADC0832程序
#define uint unsigned int //常量/变量定义//
uchar k,i,j;
float xdata lv;
sbit ADCS P3^1; //ADC0832 chip seclect//接口定义//
…… //其它引脚略……
uchar xdata dsw[20]; //存放sprintf转换字符
uchar xdata value[149]; //点阵字符储存
uchar code table[] //字符查表
0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*".",0*/
……;//采集并返回
unsigned int Adc0832unsigned char channel //AD转换,返回结果
uchar i0; uchar j; uint dat0; uchar ndat0; ifchannel0channel2; ifchannel1channel3; ADDI1; _nop_; _nop_; ADCS0;//拉低CS端 _nop_; _nop_; ADCLK1;//拉高CLK端 _nop_; _nop_; ADCLK0;//拉低CLK端,形成下降沿1 _nop_; _nop_; ADCLK1;//拉高CLK端 ADDIchannel&0x1; _nop_; _nop_; ADCLK0;//拉低CLK端,形成下降沿2 _nop_; _nop_; ADCLK1;//拉高CLK端 ADDIchannel1&0x1; _nop_; _nop_; ADCLK0;//拉低CLK端,形成下降沿3 ADDI1;//控制命令结束_nop_; _nop_; dat0; fori0;i8;i++ dat|ADDO;//收数据ADCLK1;_nop_;_nop_;ADCLK0;//形成一次时钟脉冲_nop_;_nop_;dat1;ifi7dat|ADDO; fori0;i8;i++ j0;jj|ADDO;//收数据ADCLK1;_nop_;_nop_;ADCLK0;//形成一次时钟脉冲_nop_;_nop_;jj7;ndatndat|j;ifi7ndat1;
ADCS1;//拉低CS端 ADCLK0;//拉低CLK端 ADDO1;//拉高数据端,回到初始状态 dat8; dat|ndat; returndat;//return ad k
/*
void trauchar *p //数组dsp[]里面的字符查询后,再储储存到另一个显示数组value[]
void main_Menu
Clr_Scr;// 先清屏 //CS21;CS10;hz_disp160,32,1,jiaquan; …… //甲//醛//测//量//数//据//存//储//……
delay2000;do
/* kAdc08320;//AD转换结果 lk/255.0*100.0;
ltempfloorl;
dsw[0]ltemp/10;
dsw[1]ltemp%10;
// sprintfdsw,"%2.3f",l; // dsw[0]1;
switchdsw[0]
case 0:sz_disp162,32,1,sz0;break;case 1:……sz_disp162,32,1,sz9;
switchdsw[1]
case 0:sz_disp162,40,1,sz0;break;case 1:……sz_disp162,40,1,sz9; */
// sz_disp162,40,1,sz0; /* tradsw;CS21;CS10;sz_disp162,56,1,value; */whileP1_3;
附录四 按键程序 #define nullkey 0 //定义//
……
uchar get_key //读键//
uchar pass,kcodebuf;static uchar lastkcode,keytime0; //定义为静态变量,外部不可见,但需要常驻内存static uchar havekey0;
static uchar keylock0;
kcodebufP1 & 0xff;
keytime++;
if kcodebuf!lastkcode keytime0;
if kcodebuf0xff
havekey0;
keylock0;
keytime0;
pass0;
……
else passnusekey;
lastkcodekcodebuf;
returnpass;
/*uchar get_key
else passnusekey;
returnpass;
*/
附录五 时钟程序
/*
sbit RST2 P3^5; // 复位线引脚 //
sbit CLK P3^6; // 时钟线引脚 //
…… // 其它引脚略……
/*---------------定义时间日期显示缓存
unsigned char Curtime[7];
idata unsigned char day,sec,min,hour,date,month,year,hms,n,fla_cou; unsigned char code yejing[10]0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39;
/*
void InputByteunsigned char Date; void WriteTo1302unsigned char Addr,unsigned char Date;
ReadFrom1302unsigned char Addr;
void SetTimeunsigned char *pSecDa;
void GetTimeunsigned char Curtime[];
void Init_T0void;
void FlashKeyvoid;
void Addvoid;
void Init_Clockvoid;
void Refreshvoid;
void StartMenuvoid
/*
void ClockMsgvoid
Clr_Scr;// 先清屏CS21;CS10; // 左屏
hz_dis
