首页 基于单片机的一氧化碳检测仪的设计

基于单片机的一氧化碳检测仪的设计

举报
开通vip

基于单片机的一氧化碳检测仪的设计 2011 届毕业设计(论文) 题 目: 基于单片机的一氧化碳检测仪的设计 (上位机软件部分) 学 院: 浦江学院 专 业: 通信工程 班 级: 浦通信0703 姓 名: 张萌 指导教师: 陈志贤 起讫时间: 2011-3-1~2011-6-14 二〇一一 年 六 月 基于单片机的一氧化碳检测仪的设计(上位机软件部分) 摘 要 一氧化碳检测仪是一款用于检测室内以及工作场所中一氧化碳浓度并且具有超限报警功能的仪器,对人们的生活和工作安...

基于单片机的一氧化碳检测仪的设计
2011 届毕业设计( 论文 政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载 ) 题 目: 基于单片机的一氧化碳检测仪的设计 (上位机软件部分) 学 院: 浦江学院 专 业: 通信工程 班 级: 浦通信0703 姓 名: 张萌 指导教师: 陈志贤 起讫时间: 2011-3-1~2011-6-14 二〇一一 年 六 月 基于单片机的一氧化碳检测仪的设计(上位机软件部分) 摘 要 一氧化碳检测仪是一款用于检测室内以及工作场所中一氧化碳浓度并且具有超限报警功能的仪器,对人们的生活和工作安全有很好的保障作用。因此,一氧化碳检测仪具有较高的研究价值和使用价值。 本文主要介绍了上位机软件的设计内容:串口通信、数据打点显示以及数据的存储功能。通过RS232串口接收单片机发送过来的一氧化碳浓度数据,在PC机上以直观图形的方式显示数据并且将其存储起来以方便随时可以调用查看。 本次设计成功的完成了上位机软件部分的制作,能够准确的接收单片机传输的数据并且很好的显示以及储存查看。 关键词:一氧化碳检测仪 数据处理 串口通信 The Design of carbon monoxide detector based on microcontroller (PC software parts) Abstract Carbon monoxide detector is used to detect a paragraph of indoor and workplace carbon monoxide concentrations and has the off-gauge alarm function instrument, for people's life and work safety is very good security role. So, Carbon monoxide detector has high research value and use value. This paper mainly introduces the PC software design content: Data processing、Data display through dot and Data storage function. Through RS232 serial receives the data of monoxide concentrations sent over microcontroller, On PC with intuitive graphic display data and store it up with convenient can always call to check. This design successful completion of the PC software part of the production, the data of SCM transmission can be accurate received and very good show and storage and examine. Key Words: Carbon monoxide detector; Data processing; Serial communication 目 录 I摘 要 IIAbstract 1第一章 绪论 11.1一氧化碳的危害 11.2一氧化碳检测仪的研究现状 11.2.1基于单片机的分类的一氧化碳检测仪 11.2.2基于传感器分类的一氧化碳检测仪 21.3 多机串行通信研究现状 31.4 论文章节介绍 4第二章 上位机软件的设计 42.1 上位机软件整体设计框架 42.2 串口通信模块的设计 42.2.1 RS-232串口 62.2.2 VC6.0介绍 62.2.3串行通讯的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 72.2.4 MSComm控件的介绍 82.2.5串口设计流程 112.2.6 整数和小数位的处理 122.3 数据直观图显示模块 122.3.1基本的画线函数 132.3.2 CO数据图形化显示 142.4 数据的存储以及查看模块 142.4.1类CFile 162.4.2 CFile操作详解 172.4.3 数据的保存方式 182.4.4 查看之前存储的数据 192.5 程序显示界面模块 192.5.1 对话框概述 202.5.2 类CDialog介绍 212.5.3 对话框控件 212.5.4 对话框控件程序设计 242.6 串口采集数据实时显示窗口 25第三章 系统调试和运行 253.1 测试工具介绍 253.2 系统调试和运行 253.2.1 测试方法 253.2.2 系统联调 253.2.3 系统运行 26第四章 总结和展望 264.1 本次毕业设计总结 264.2 下一步工作展望 28参考文献 30致谢 第一章 绪论 1.1 一氧化碳的危害 一氧化碳是石油化工行业以及日常生活中常见的危害因素,分布范围广,接触人员多,毒性危害高。尤其是随着煤气化工业的发展,人员遭受一氧化碳危害影响的可能性增大。一氧化碳是无色、无味的气体,易扩散,微溶于水。易燃、易爆,与空气混合有爆炸的危险 [1]。 一氧化碳使血液携氧能力下降,阻碍氧的释放和传递,导致低氧血症和组织缺氧。由于中枢神经系统对缺氧最敏感,故最易受到侵害。 石化及煤矿等工作场所空气中时间加权平均容许溶度(PC-TWA)不超过25ppm,短时间接触容许浓度(PC-STEL)不超过35ppm。立即威胁生命或健康的浓度(IDLH)为1000ppm。 1.2 一氧化碳检测仪的研究现状 目前市场上的一氧化碳检测仪多种多样,由于所用单片机的种类和传感器的种类不同可以分为多类。 1.2.1 基于单片机的分类的一氧化碳检测仪 (1)基于MSP430的一氧化碳检测仪 MSP430单片机拥有强大的处理能力,在降低芯片的电源电压及灵活而可控的运行时钟方面都有其独到之处,具有低功耗的特点。根据传感器的不同,可以选择不同的传感器。这种检测仪的单片机内置温度传感器、12位高精度A/D转换器、16×16位硬件乘法器,并有6个8位I/O端口可以使用。仪器的大部分功能均可以在MSP430单片机中实现,大大简化了系统的接口设计,也减少了仪器原件的数量和功耗[2]。 (2)基于STC89C52的一氧化碳检测仪 STC89C52是一种带8K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8的微处理器,与MCS-51指令集和输出管脚相兼容。STC89系列单片机高速(最高时钟频率90MHz),低功耗,带有4KB的内存和程序保护系统,便于程序的修改和保密[3]。 1.2.2 基于传感器分类的一氧化碳检测仪 (1) 电化学传感器 采用了多孔性电极进行一氧化碳浓度的检测,有效地防止了溶解液的泄漏。该传感器具有反应时间短、探测范围宽以及使用寿命长的特点,完全满足工业现场及家庭生活的需要。 (2)红外气体传感器 采用电调制非分光红外传感器LHI814,能够快速准确的检测一氧化碳的浓度。采用间歇式供电方式,单片机在读取传感器输出的稳定数据后,立即关闭其电源,待下次读取数据时再将电源打开。 (3)热催化传感器 其具有抗高湿、粉尘等恶劣环境的能力及体积小、价格低的优点,在煤矿瓦斯的检测中发挥了巨大的作用。但由于该传感器的敏感原件和补偿原件本身是热敏原件,其电阻会随着环境条件和工作条件的改变而变化,多种可热性气体都能催化氧化燃烧,导致检测精度下降。 (4)半导体传感器 以半导体敏感原件为核心的半导体传感器,具有灵敏度高、响应速度快、结构简单、体积小、重量轻、成本低、便于集成化和智能化的优点,但是由于特性的分散性、温度的不稳定性和易受干扰的特点,在某些情况下又限制了半导体传感器的应用。半导体传感器是一种将检测到的气体成分和浓度转换为电信号的传感器,根据这些电信号的强弱就可以获得与待测气体在环境中有关的信息,从而可以检测、监控、报警,还可以通过接口电路与计算机或单片机组成自动检测、控制和报警系统。[4] 1.3 多机串行通信研究现状 随着多微机系统的应用和微机网络的发展,通信功能越来越显得重要。这里所说的通信既包括计算机与外部设备之间,也包括计算机和计算机之间的信息交换。由于串行通信是把组成信息的各个码位在同一根传输线上,从低位到高位,逐位地、顺序地进行传送的通信方式,所用的传输线少,一个方向上只须一条传输线,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传送。对于那些与计算机相距不远的人-机交互设备和串行外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式进行近距离交换数据也很普遍。在实时控制和管理方面,采用多台微处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式。所以串行接口是微机应用系统常用的接口。 1.4 论文章节介绍 本文主要介绍基于单片机的一氧化碳检测仪的上位机软件部分。全文分四个章节,第一章绪论部分主要介绍一氧化碳检测仪的背景知识及研究现状以及多机串行通信的研究现状。第二章主要介绍上位机软件的设计。第三章是调试结果的展示。最后一章是对本次设计的一个总结和展望。 第二章 上位机软件的设计 2.1 上位机软件整体设计框架 程序整体设计框架如图2-1所示。 图2-1 上位机软件设计框架 计算机接通过RS-232串口接收到单片机发送过来的一氧化碳的浓度数据,将接收到的一氧化碳浓度数据以打点画图的形式在PC机上显示,并且将数据存储到文本文档中,在程序界面上,可以按秒移动和按页移动查看以前接收到的一氧化碳浓度数据。整体设计分为四个模块:串口通信模块数据直观图显示模块、数据的存储和查看模块以及程序显示窗口模块。下面将对各个模块的设计过程进行详细说明。 2.2 串口通信模块的设计 2.2.1 RS-232串口 RS-232串口是目前PC机与通信工业中应用最广泛的一种串行接口。RS-232被定义为一种低速率串行通讯中增加通讯距离的单端标准。RS-232采取不平衡传输方式,即所谓单端通讯。RS-232标准(协议)的全称是EIA-RS232C标准,其中EIA(Electronic Industry Association)代表没过电子工业协会,RS(Recommended standard)代表推荐标准,232是标识号,C代表RS-232的最新一次修改(1969),在这之前,有RS-232-B、RS-232-A。它规定连接电缆和器械、电气特性、信号功能及传输过程。常用的物理标准还有EIA&#0;RS-232-C、EIA&#0;RS-422-A、EIA&#0;RS-423-A、EIA&#0;RS-485。计算机输入输出接口,是最为常见的串行接口,RS-232常规标准接口有25条线,4条数据线、11条控制线、3条定时线、7条备用和未定义线,常用的只有9根,常用于与25-pinD-sub端口一同使用,其最大传输速率为20kbps,线缆最长为15米。RS-232-C端口被用于将计算机信号输入控制投影机。 典型的RS-232信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在+5~+15V,负电平在-5~-15V电平。当无数据传输时,线上为TTL,从开始传送数据到结束,线上电平从TTL电平到RS-232电平再返回TTL电平。接收器典型的工作电平在+3~+12V与-3~-12V。由于发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大约为15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。[5]其管脚图及管脚定义分别如图2-1和表2-1所示。 图2-1 RS-232管脚接口 表2-1 RS-232管脚定义 9芯 信号方向来自 缩写 描述 1 调制解调器 CD 载波检测 2 调制解调器 RXD 接收数据 3 PC TXD 数据输出线 4 PC DTR 告知数据终端处于待命状态 5 GND SG 链接机器的接地线 6 调制解调器 DSR 告知本机在待命状态 7 PC RTS 要求发送数据 8 调制解调器 CTS 回应对方发送的RTS的发行许可,告知对方可以发送。 9 调制解调器 RI 响铃指示器 2.2.2 VC6.0介绍 VC++6.0是Microsoft公司推出的一个基于Windows系统平台、可视化的集成开发环境,它的源程序按C++语言的要求编写,并加入微软提供的强大的MFC(Microsoft Foundation Class)类库。MFC中封装了大部分Windows API函数和Windows控件,它包含的功能涉及到整个Windows操作系统。MFC不仅给用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。另外,它提供了大量的代码,指导用户编程时实现某些技术和功能。因此,使用VC++提供的高度可视化的应用程序开发工具和MFC类库,可使应用程序开发变得简单。 2.2.3 串行通讯的方法 1. 同步通信 通信双方必须先建立起同步,即双方的时钟必须要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流。但这时还有两种不同的同步方式。一种是使用全网同步,用一个非常精确的主时钟对全网所有结点上的时钟进行同步。另一种是使用准同步,各结点之间的时钟允许有微小的误差,然后使用其他措施实现同步传输。[6] 2. 异步通信 异步通信在发送字符时所发的字符之间的时间间隔可以是任意的。当然,接收端必须时刻做好接收的准备。发送端可以在任何时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。异步通信的好处是通信设备简单,便宜,但是传输效率较低(因为开始位和停止位的开销所占的比例较大)。[6] 比较起来,在传输速率相同的情况下,同步通信方式的信息传输有效率要比异步的高。但是同步由于在信息传输的过程中要求双方必须使用同一个时钟,而异步方式却不一定要求完全一致,只要比较相近即可。因此在串口通信中,比较多的采用异步通信。 串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配: a、波特率:这是一个衡量通信速度的参数,它表示每秒钟传送bit的个数,例如300波特表示每秒钟发送300个bit。当提到时钟周期时,就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比,高波特率常常用于放置的很近的仪器之间的通信,典型的例子就是GPIB设备的通信。 b、数据位:这是衡量通信中实际数据为的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准的ASCII码),那么每个数据包使用7位数据,每个包指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。 c、停止位:用于表示每个包的最后一位,典型的是1、1.5和2位,由于数据是在传输线上定时的,并且每一个设备都有自己的时钟,很有可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅表示传输的结束,并且提供计算机校正时间同步的机会。适用于停止位的位数越多,不同时钟同步的容忍度越大,但是数据传输率同时也越慢。 d、奇偶校验位:在串口通信中一种简单的校错方式。有四种校错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个只确保传输的数据有偶个或奇个逻辑高位,例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验数为1,这样就有3个逻辑高位。高位和低位不真正的校验数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。[6] 2.2.4 MSComm控件的介绍 MSComm通信控件的工作原理类似于中断方式,每当有通信事件发生,均会触发OnComm事件发生。 MSComm的主要属性如下: (1) Commport端口号; (2) InBufferSize输入缓冲区大小; (3) Input Len从接收缓冲区读取的字节数,如果为0则全部读取; (4) Input Mode接收数据的类型,0表示文本类型,1表示二进制类型; (5) OutBufferSize输出缓冲区大小; (6) RThreshold设定当接收几个字符时触发OnComm事件,0表示不产生事件,1表示每接收一个字符产生一个事件; (7) SThreshold设定在触发OnComm事件前,发送缓冲区送允许的最小字符数,0表示发送数据时不产生事件,1表示当发送缓冲区空时产生OnComm事件; (8) Settings串口的参数设置,依次为波特率、奇偶校验、数据位数、停止位数。[6] 2.2.5 串口设计流程 (1)建立应用工程 打开Visual C++,建立一个基于对话框的MFC应用程序,在对话框中添加控件,用Class Wizard为相应控件设置属性及添加变量如表2-2所示。 表2-2 控件机器属性设置情况 控件 控件ID Caption 需要添加的变量及变量类型 静态文本 IDC_STATIC 接收显示 静态文本 IDC_STATIC 发送输出 编辑框 IDC_ED-IT_RXDATA m_strEditRXData Valua CString 编辑框 IDC_ED-IT_TXDATA m_strEditRXData Valua CString 按钮 IDC_BUTTON_MANALSEND 发送 MSComm控件 IDC_MSComm1 m_ctrlComm control (2) 在当前工程中添加MSComm控件 点击菜单Add To Project—>Components and Controls,在打开的对话框中选择“Registered ActiveX Controls”,再双击此项出现控件选择对话框“Component and Controls Gallery”,在该框中选择“Microsoft Communications control,version 6.0”控件,再单击“Insert”按钮,提示“Insert this component?”,确认后,可以看到加入CMSComm类的Confirm Class对话框,提示加入到当前工程中的CMSComm类头文件为MSComm.h,实现文件为MSComm.cpp。单击“OK”按钮关闭Confirm Class对话框,在关闭对话框,则在VC集成环境中,当前工程Class View中就出现了CMSComm类,同时在对话框资源空间中出现了一个电话机形状的控件,就是MSComm控件[7]。 (3)初始化串口 通过前面的操作,Class Wizard自动在SCommTestDlg.h中加入了#include “mscomm.h”语句。串口初始化流程如图2-2所示。 //{{AFX_INCLUDES() #include “mscomm.h” //}}AFX_INCLUDES 下面,在SCommTestDlg::OnInitDialog()函数中写入对串口的初始化语句,串口的初始化由IDC_MSCOMM1的CMSComm控制变量m_ctrlComm来设置串口的控件属性。代码如下: m_comm.SetCommport(1);//打开COM1串口 m_comm.SetInBufferSize(1024);//设置输入缓冲区的大小 m_comm.SetOutBufferSize(512);//设置输出缓冲区的大小 m_comm.SetInBufferCont(0);//清空接收缓冲区 if(!m_comm.GetPortOpen ()) m_comm.SetPortOpen(TRUE);//打开串口 m_comm.SetInPutMode(0); m_comm.SetSettings(“9600,n,8,1”);//9600bps波特率,8位数据,1位停止位,无奇偶校验 m_comm.SetRTreshold(10);/*在MSComm控件设置CommEvent属性为ComEvRecieive并产生OnComm之前,设置并返回的要接收的字符数*/ m_comm.SetSThreshold(0);/*设置、返回在通信控件置ComEvSend并激发OnComm事件前要发送缓冲区中的最少字符数*/ m_comm.SetInputLen(0);/*决定每次Input读入的字符个数,缺省为0,表示读取接收反冲去的全部内容*/[8] 图2-2串口初始化流程 (4)从串口接收数据 读串口数据的原理是,只要当有数据向串口发数据来时,计算机就会自动将其数据写到一个特定的缓冲区,我们只要写程序去读那个特定的缓冲区就可以了。具体流程如图2-3所示。 串口通信线程函数CommThread,它是CserialPort类的最重要函数。函数原型:static UINT CommThread(LPVOIDpParam)。该线程函数将作为工作线程(Worker Thread)被启动,一旦该线程被激活,它将负责监视串口的接收字符事件、发送字符事件和关闭串口事件,并调度与上述事件相关的处理函数,从而完成对串口的操作。 为了防止这三个事件同时对同一个对象(串口实例)进行操作,它们之间的同步方式采用Critical Section(排斥体)。这里用到的主要API函数有:WaitCommEvent、ClearCommError、GetCommMask等[10]。 BYTE Comm_Packet_Len; //需要接收到的数据个数 BYTE Comm_DataBuffer[20]; //依次存放串口接收到的数据 long Comm_Packet_Index; //每次收到数据个数,并标志数据应放在全局数组位置的索引 //每次处理完数据后清空,为下一次接收做准备 void CEOLDlg::OnMscomm () { VARIANT variant_inp; COleSafeArray safearray_inp; long len=0, k=0; //转换为数组时使用的变量 BYTE rxdata[204]; //设置BYTE数组 CString strtemp; //字符型变量 int temp = 0; //临时变量 unsigned char ecuchecksum = 0; //ecu回传校验码 if(m_ctrlComm.GetCommEvent() == 2) //事件值为2表示接收缓冲区内有字符 { { m=m_Com.GetInBufferCount(); variant_inp = m_ctrlComm.GetInput() //读缓冲区 safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len = safearray_inp.GetOneDimSize(),//得到有效数据长度 for(k = 0; k < len; k++) //将ColeSafeArray型变量转换为BYTE型数组 { safearray_inp.GetElement(&k, rxdata + k);//转换为BYTE型数组 } for(temp = 0; temp < len; temp++) { Comm_DataBuffer [Comm_Packet_Index + temp] = rxdata [temp]; } Comm_Packet_Index += len; if(Comm_Packet_Index == Comm_Packet_Len) //接收到的数据个数 } } 由于直接获取的数据为VARIANT型数据,需要再通过数据类型转换来变为我们所需要的INT和CString型数据。 图2-3 串口接收数据流程图 2.2.6整数和小数位的处理 为了提高数据精度,对一氧化碳浓度数据采用两位整数和一位小数的方式显示,在发送数据时,最前一个字节为FF起始位,接着的一个字节为整数部分,再接着发一个字节的数据为小数部分。取数算法如下: BYTE a=* (char *)(data+i) BYTE b=* (char *)(data+(++i)) float c=(float)a+(float)(b%10)/10 2.3 数据直观图显示模块 2.3.1 基本的画线函数 (1) CDC::MoveTo (int x,int y) 改变当前点的位置; 功 能:将画笔移到(x, y); 用 法:oid far moveto (int x,int y); CDC::MoveTo(int x,int y) Cpoint MoveTo (int x,int y) Cpoint MoveTo (POINT point) x:新位置的横坐标   y:新位置的纵坐标; point:标识的一个新的位置,以POINT 结构或CPoint 类对象的形式表示。[12] (2) CDC::LineTo (int x,int y) 画一条由当前点到参数指定点的线; 功能:函数lineto()使用当前绘图色、线型及线宽,从当前位置画一直线到指定位置。    用法:此函数调用方式为void lineto (int x,int y);    说明:参数x,y为指定点的坐标,函数调用后,当前位置改变到指定点(x,y)。    该函数对应的头文件为graphics.h;    返回值:无。[12] (3) CDC::BOOL Arc (LPCRECT lpRect,POINT ptStart,POINT ptEnd) 画弧线; 功能:函数arc()使用当前绘图色并以实线画一圆弧。 用法:函数调用方式为void arc(int x,int y,int startangle,int endangle,int radius),    说明:参数x,y为圆心坐标,startangle与endangle分别为起始角与终止角,radius为半径。圆心坐标和半径以像素个数给出,起始角和终止角以度为单位,0度位于右边,90度位于顶部,180度位于左边,底部是270度。同往常一样,360度与0度重合。角度按逆时针方向增加,但并不要求终止角一定比起始角大。例如指定300度和90度分别为起始角和终止角,与指定300度和450度分别为起始角和终止角可画出相同的弧。大于360度可作为参数,它将被化到0度~360度范围里。函数arc()能画封闭圆,只要取起始角为0度,终止角为360度即可。此函数中,屏显纵横比可自动调节。 arc()函数对应的头文件为graphics.h; 返回值:无。[12] (4) CDC::BOLL Polyline (LPPOINT ipPoints,int nCount) 将多条线依次序连接。[11] 功能:将多条线按照次序连接起来; 用法:hdc ---- Long,在其中绘图的设备场景 lpPoint ---- POINTAPI,nCount POINTAPI结构数组中的第一个POINTAPI结构。 nCount --------- Long,lpPoint数组中的点数。会从第一个点到第二个点画一条线,依次类推 2.3.2 CO数据图形化显示 当有数据向串口发过来时,程序可以将数据接收到,接收的数据是字符型的,那么将数据转化为数字型的,再将这个数据的大小作为画图的某一个点的纵坐标,横坐标为数据的序号。将这些点用线连起来就是一个曲线图了,这个就是图形显示基本原理。 绘图程序首先通过图形设备接口获取设备环境句柄,只有得到这个句柄,Windows才允许应用程序使用设备;之后调用绘图函数,在函数中僵局并作为一个参数传入,想Windows标明需要使用的设备,并最终完成图形绘制。设备环境使得图形设备接口摆脱了具体设备的限制,以至获得设备环境句柄后,同一个函数可以用来向多种输出设备上绘图。Windows应用程序绘制图形具体步骤如下: (1) 取得指定窗口的当前显示设备环境; (2) 选择用户坐标系及映射方式; (3) 设备用户坐标系中的观察窗口和设备坐标系中的显示视区; (4) 输出图形; (5) 释放所使用的显示设备环境。[13] 画图使用的是画直线的方式(LineTo()),先定义一个全局变量用来保存采集的数据值,在画图函数OnPaint()中用这个全局变量来作为纵坐标,等分120个点作为横坐标,那么就有120个点,最后用直线将这120个点连接起来就组成了一个完整的直观图。只要当全局变量中的数值发生变化后就使用函数this->Invalidate()强制重载OnPaint()函数,那么数据图就可以动起来了。OnPaint()画图函数如下: void CCommDlg::OnPaint() //用于在窗口客户区绘图 { int hoc; if (NextTime<600 && stop==FALSE) hoc = 600;//接收600个字节 else hoc = NextTime; CString TabStr=""; CPaintDC dc(this); dc.GetNearestColor(RGB(255,0,0)); //定义画线颜色 dc.MoveTo(108,250); //画笔位置 if (NextTime<=600 && stop==FALSE) for (int i=0;i<(NextTime/5);i++) //进行连续画点 { dc.LineTo(108+(5*i),250-LineHight[i]); //将点连成线 } else for (int i=0;i<121;i++)//连续画点 { dc.LineTo(108+(5*i),250-LineHight[i]), //将点连成线 } void CCommDlg::Display() { if (NextTime <= 600 && stop==FALSE) { LineHight [NextTime/5] = LineHight [121]; //数组中保存的是最新采集的一组数据 } else { for (int i=0;i<120;i++) //依次采集120个以内的数据 { LineHight [i] = LineHight [i+1]; //保存最新采集的数据 } LineHight[120]=LineHight[121]; } NextTime = NextTime+5; //继续采集数据 this->Invalidate(); //重载OnPaint()函数 return; } 2.4 数据的存储以及查看模块 2.4.1 类CFile CFile是MFC文件类的基类,它直接提供非缓冲的二进制磁盘输入/输出设备,并直接地通过派生类支持文本文件和内存文件。CFile与CArchive类共同使用,支持MFC对象的串行化。该类与其派生类的层次关系让程序通过多形CFile接口操作所有文件对象。通常,一个磁盘文件在CFile构造时自动打开并在析构时关闭。静态成员函数使你可以在不打开文件的情况下检查文件状态。 类CFile直接派生于类CObject,是所有MFC文件类的基类,其继承关系如图2-4所示。 类CFile提供了完整的方法操作二进制文件,分别有构造方法、I/O方法、文件定位方法、文件锁定方法、文件状态方法和文件静态操作方法。 图2.4 文件类的继承关系 类CFile的构造函数CFile用于创建文件类对象,函数声明如下: CFile( ); CFile(int hFile); CFile(LPCTSTR lpszFileName,UINT nopenFlags); Throw(CFileException); 其中,参数hFile是已打开文件的句柄;参数lpszFileName是表示文件路径的字符串;参数nOpenFlags是共享和访问模式标识,其取值如表2-3所示。[13] 表2-3 参数nOpenFlags的取值 模式标志 说明 CFile::modeCreate 建立新文件,若文件已存在,是文件长度归零 CFile::modeNoTruncate 与CFile::modeCreate配合使用,若文件已存在,文件长度不变 CFile::modeRead 文件以只读方式打开 CFile::modeReadWrite 文件以读写方式打开 CFile::modeWrite 文件以只写方式打开 CFile::modeNoInherit 禁止文件被子程序继承 CFile::shareDenyNone 打开文件,不禁止其他进程对文件的读写访问 CFile::shareDenyRead 打开文件,禁止其他进程对文件的读访问 CFile::shareDenyWrite 打开文件,禁止其他进程对文件的写访问 CFile::shareExclusive 以独占方式打开,禁止其他进程对文件的读写访问 CFile::shareCompat 此标识在32位MFC中无效,与操作CFile::Open时的标志CFile::shareExclusive配合使用 CFile::typeText 设置文本模式,对换行进行特殊处理(只用于派生类) CFile::typeBinary 设置二进制模式(只用于派生类) 构造函数:CFile 从一个路径或文件句柄构造一个CFile对象;Abort 不管任何警告和错误,关闭一个文件;Duplicate 构造一个基于该文件的副本;Open 带错误检验选项,安全打开一个文件;Close 关闭文件,删除对象。 输入/输出:Read 从文件的当前位置读数据; ReadHuge 可从文件的当前位置读取大于64K数据,Write 将文件数据写入当前文件位置;WriteHuge 可将文件的大于64K数据写到当前文件位置;Flush 溢去未被写入的任何数据。 文件定位:Seek 定位于当前文件指针;SeekToBegin 定位当前文件指针到文件开头;   SeekToEnd 定位当前文件指针到文件尾;GetLength 获取文件长度;SetLength 改变文件长度。 文件封锁方法:LockRange 在文件中封锁一定范围内的字节;UnlockRange 解锁一定范围内的字节。 文件状态方法:   GetPosition 获取当前文件指针;GetStatus 获取打开文件的状态;GetFileName 获取被选文件的文件名;GetFileTitle 获取被选文件的标题;GetFilePath 获取被选文件的完整路径;SetFilePath 设置被选文件的完整路径。 文件静态方法:Rename 改名指定文件(静态函数);Remove 删除指定文件(静态函数);   GetStatus 获取指定文件的状态(静态);SetStatus 设置指定文件的状态(静态)。[14] 2.4.2 CFile操作详解 1.文件的查找 当对一个文件操作时,如果不知道该文件是否存在,就要首先进行查找。MFC中有一个专门用来进行文件查找的类CFileFind,使用它可以方便快捷地进行文件的查找。 2. 文件的打开/保存对话框 让用户选择文件进行打开和存储操作时,就要用到文件打开/保存对话框。MFC的类CFileDialog用于实现这种功能。使用CFileDialog声明一个对象时,第一个BOOL型参数用于指定文件的打开或保存,当为TRUE时将构造一个文件打开对话框,为FALSE时构造一个文件保存对话框。   在构造CFileDialog对象时,如果在参数中指定了OFN_ALLOWMULTISELECT风格,则在此对话框中可以进行多选操作。此时要重点注意为此CFileDialog对象的m_ofn.lpstrFile分配一块内存,用于存储多选操作所返回的所有文件路径名,如果不进行分配或分配的内存过小就会导致操作失败。 3. 文件的读写 文件读写的最普通的方法是直接使用CFile进行,但是它的使用繁琐,而且功能非常简单。可以使用CArchive,它的使用方法简单且功能十分强大。首先还是用CFile声明一个对象,然后用这个对象的指针做参数声明一个CArchive对象,就可以非常方便地存储各种复杂的数据类型了。 CArchive的 << 和>> 操作符用于简单数据类型的读写,对于CObject派生类的对象的存取要使用ReadObject()和WriteObject()。使用CArchive的ReadClass()和WriteClass()还可以进行类的读写。 如果要进行的文件操作只是简单的读写整行的字符串,建议使用CStdioFile,用它来进行此类操作非常方便,如下例。    CStdioFile mFile; CFileException mExcept; mFile.Open (“d:\\temp\\aa.bat”, CFile::modeWrite, &mExcept); CString string="I am a string."; mFile.WriteString (string); mFile.Close (); 4.临时文件的使用 正规软件经常用到临时文件,经常可以会看到C:\Windows\Temp目录下有大量的扩展名为tmp的文件,这些就是程序运行是建立的临时文件。临时文件的使用方法基本与常规文件一样,只是文件名应该调用函数GetTempFileName()获得。它的第一个参数是建立此临时文件的路径,第二个参数是建立临时文件名的前缀,第四个参数用于得到建立的临时文件名。得到此临时文件名以后,就可以用它来建立并操作文件了。[14] 5. 文件的复制、删除等 MFC中没有提供直接进行这些操作的功能,因而要使用SDK。SDK中的文件相关函数常用的有CopyFile()、CreateDirectory()、DeleteFile()、MoveFile()。 2.4.3 数据的保存方式 对采集的CO浓度数据采用文本方式保存于一文件中,保存格式为,第120数据保存一次,数据采用推算法来确定时间。如:08.9 33.5 08.8 65.4 09.8 09.3…… 其算法如下: //将数据保存到文件中 if (m_ReceiveData.GetLength()>=600) //600个字符刚好对应120个数据 { CStdioFile readfile, CString readstr, readstr2, if(readfile.Open(FilePath,CFile::modeRead)) //以只读方式打开文件 { while(readfile.ReadString(readstr)) //逐行查询,至到文件尾 { readstr2+=readstr; //依次查询 } readfile.Close(); //关闭文件 } if (file. Open(FilePath,CFile::modeCreate│CFile::modeReadWrite))//文件以读写方式打开 { file.Write(readstr2,readstr2.GetLength());//原来的数据 file.Write(m_ReceiveData,600); //写入新的120个数据 file.Close(); m_ReceiveData=""; //清除编辑框内容 break; } } 2.4.4 查看之前存储的数据 查看以前的数据的方法是,将数据从文件中取出并将每一个数据都付给那一个全局变量,最后同样用this->Invalidate()就能显示以前的数据了。上面给出的是按秒移动查看的程序,其他按》、按《和>按秒移动程序和上面程序操作相似,具体算法见commDlg文件中的Button(4)(按》查询)、Button(5)(按《查询方式)和Button(6)(按<查询方式)。 void CCommDlg::OnButton7() //按秒移动查看之前的数据即按>方式查看 { if (stop==FALSE) //继续接收数据 { gogo=NextTime; DTemp=m_ReceiveData; for (int i =0;i<120;i++) LHTemp[i]=LineHight[i];//依次接收120以内个数据 } stop=TRUE; //关闭接收数据,使显示区和数据区用来为显示原来数据用 if (NextTime==0) NextTime=595; //接收数据做多为595个字符 NextTime=NextTime-595; SetDlgItemText (IDC_STOPRECV,“继续显示”); //先取出文件中的数据,放入一个数组中 CStdioFile file; if(file.Open(FilePath,CFile::modeRead)) //以只读方式打开文件 { CString str; //定义全局变量 CString instr; CString outstr; CString sss; int i; while(file.ReadString(str)) //逐行查询,至到文件尾 { instr+=str; } if(instr.GetLength()>=600&&NextTime>instr.GetLength()-600)NextTime=instr.GetLength()-600; for (i=0;i<120;i++) //取出起点后的120个数据 { sss=instr[NextTime]; sss+=instr[NextTime+1]; outstr+=sss+instr[NextTime+2]+instr[NextTime+3]+" "; LineHight[i]=atoi(sss); NextTime=NextTime+5; //读取下一秒的数据 } m_ReceiveData=outstr; UpdateData(FALSE); //更新编辑框内容 this->Invalidate(); //更新图相 } } 在移动数据以前要对当前显示的数据进行保存: gogo=NextTime; DTemp=m_ReceiveData; for (int i =0;i<120;i++) LHTemp[i]=LineHight[i]; 以便在继续接收时能接着原来的数据。 2.5 程序显示界面模块 2.5.1 对话框概述 对话框(Dialog Box,简称Dialog)在应用程序与用户交互的过程中扮演着非常重要的角色,大部分的Windows应用程序都要借助于对话框及其控件接收用户输入或反映应用程序信息。对话框可以是最简单的消息框,也可以是复杂的数据输入窗体。 对话框是应用程序中功能非常强大的元素,它是一个真正的窗口,不但能接受信息,还可以移动和关闭,甚至可以在他的客户区中进行绘图操作。 对话框一般分为两种,一种是模式对话框(Modal),另一种是非模式(Modeless)对话框。当模式对话框出现时,调用该对话框的父窗口会关闭,窗口上的用户接口无法使用;而非模式对话框出现时,调用该对话框的父窗口功能不受任何影响。两种对话框的生成方式不同,但对于对话框上的呃控件的操作方式却基本无差异。 MFC将对话框的功能封装在类CDialog中,为对话框变成带来了方便,往往只需要一些简单的操作并添加几行代码,就可以建立一个复杂的对话框。 创建一个模式对话框,首先要创建一个对话框模版,描述对话框及包含的控件;再为该对话框创建一个派生于CDialog的类,封装该对话框模版及对话框的所有操作;最后调用函数DoModal建立并显示模式对话框,同时也使得所有用户对应用程序的操作在该对话框外无效。函数DoModal被调用后,只有当用户通过操作直接或间接关闭对话框后,函数DoModal才返回,并将返回值1传递给函数EndDialog,该函数负责清楚模式对话框。[13] 2.5.2 类CDialog介绍 MFC提供的类CDialog既支持模式对话框,也支持飞模式对话框。类CDialog继承于类CWind,如图2-6所示。这也表示对话框是一个窗口。 图2-6 对话框类的继承关系 类CDialog包含了对话框操作的所有基本方法,有构造与初始化方法、操作方法和虚拟方法。构造与初始化方法如表2-4所示。[13] 表2-4 类CDialog的构造和初始化方法 方法 说明 CDialog 创建CDialog类象 Create 创建一个非模式对话框并将其连接到CDialog对象上 CreateIndirect 基于内存中的对话框模版创建一个非模式对话框,对话框不基于模版资源 InitModalIndirect 基于内存中的对话框模版创建一个模式对话框,对话框不基于模版资源 创建模式对话框的、需要从类CDialog派生出一个对话框类,这时就需要重写类CDialog的虚拟函数以获得特定的功能。 类CDialog包含多个派生类以封装特殊对话框的属性与操作,继承关系如图2-5所示。 图2-5 类CDialog的派生类 2.5.3 对话框控件 (1)编辑框(Edit Box) 编辑框是一种非常重要的控件,它为用户提供了一个可输入字符串、整数等数据的窗口。如果用户不输入任何数据,则编辑框就直显示预设初始值。MFC使用类CEdit包含编辑框控件的属性及操作,通过类Edit的函数Creat可讲编辑框实例初始化,函数声明如下。 BOOL Creat(SWORD dwStyle,const RECT& rect,CWnd* pParentWnd,UINT nID); 其中,参数dwStyle是编辑框控件的模式,参数rect是控件所在位置的大小,参数pParentWnd是控件的父窗口,参数nID则是控件的ID。 (2)单选按钮、复选框、下压按钮与组框 单选按钮、复选框与组框通常配合使用,目的是将单选按钮或复选框组合为一组,用户在组内只能选择一个单选按钮火选择多个复选框。需要注意的是,控件的Group属性用于标识是否为一组空间中的第一个,如果某个控件的Group属性设置为TRUE,其后面的所有Group属性为FALSE的控件都将与其一组,知道出现下一个Group属性为TRUE的控件。而下压按钮是最常见的对话框控件,默认的对话框模版就包含OK和Cancel两个下压按钮。 MFC使用类CButton包含按钮控件的属性及操作,通过类CButton的函数Creat可将按钮控件实例初始化,函数声明如下。 BOOL Creat (LPCTSTR lpszCaption,DWORD dwStyle,const RECT& rect,CWnd* pParentWnd,UINT nID); 其中,参数lpszCaption是按钮空间显示的文本,参数DWStyle是控件的样式,参数rect是控件所在的位置和大小,参数pParentWnd是控件的父窗口,参数nID是控件的ID。 (3)列表框、组合框 列表框常用于集中显示童子功红类型的内容,他可提供大量的选项供用户选择,也允许用户单项选择或多项选择。 MFC使用类CListBox包含列表框控件的属性及操作,通过类CListBox的函数Creat可将列表框控件实例初始化,函数声明如下。 BOOL Creat (DWORD dwStyle,const RECT& rect,CWnd* pParentWnd,UINT nID); 其中,参数dwStyle是列表框控件的样式,参数rect是控件所在位置的大小,参数pParentWnd是控件的父窗口,参数nID则是控件的ID。[13] 2.5.4 对话框控件程序设计 (1)串口选择按钮程序 void CCommDlg::OnComselect() { if(m_Comm.GetPortOpen()) //如果串口是打开的则关闭串口 m_Comm.SetPortOpen(FALSE); m_Comm.SetCommPort(m_com.GetCurSel()+1);//选择第GetCurSel()+1个串口 } (2)打开/关闭串口按钮程序 void CCommDlg::OnButton1() { if( !m_Comm.GetPortOpen()) { m_Comm.SetPortOpen(TRUE); //打开串口 SetDlgItemText(IDC_BUTTON1,"关闭串口"); //按钮显示为关闭串口 } else { m_Comm.SetPortOpen(FALSE);//关闭串口 SetDlgItemText(IDC_BUTTON1,"打开串口");//按钮显示为打开串口 } } (3)清空接收区按钮程序 void CCommDlg::OnButton2() { m_ReceiveData.Empty(); //清除接收对话框中的数据 UpdateData(FALSE); //更新编辑框内容 } (4)波特率的选择 void CCommDlg::OnComspeed() { CString temp; int i=m_speed.GetCurSel(); //定义列表框中被选中的下标 switch(i) { case 0: speed=2400; //选择波特率为2400bits break; case 1: speed=4800; //选择波特率为4800bits break; case 2: speed=9600; //选择波特率为9600bits break; case 3: speed=19200; //先择波特率为19200bits break; case 4: speed=38400; //先择波特率为38400bits break; } temp.Format("%d,n,8,1",speed);//设置数据位为8,起始位为1 m_Comm.SetSettings(temp); } (6) 继续/停止接受按钮程序 void CCommDlg::OnStoprecv() { if (stop==TRUE) //停止接收数据 { NextTime=gogo; m_ReceiveData=DTemp; for (int i=0;i<120;i++) LineHight[i]=LHTemp[i]; } stop=!stop; if (stop==TRUE) SetDlgItemText(IDC_STOPRECV,"继续显示");//按钮显示为继续显示 else SetDlgItemText(IDC_STOPRECV,"停止显示");//按钮显示为停止显示 } (6)当前数据按钮程序 void CCommDlg::OnButton8() //此函数用来查看最后一屏数据 { if (stop==TRUE) //停止接收数据,显示区数据区显示为之前接收的数据 { m_ReceiveData=DTemp; if (NextTime<600) NextTime=600; for (int i=0;i<120;i++) LineHight[i]=LHTemp[i]; UpdateData(FALSE); //更新编辑框内容 this->Invalidate(); //更新图相 } } 2.6 串口采集数据实时显示窗口 第三章 系统调试和运行 3.1 测试工具介绍 此次系统的测试是借用串口调试工具进行的,串口助手是一个很好而小巧的串口调试工具,支持常用的300-115200bps波特率,能设置校验、数据位和停止位,能以ASCII码或十六进制接收或发送任何数据或字符(包括中文),可以任意设定自动发送周期,并能将接收数据保存成文本文件,能发送任意大小的文本文件。 3.2 系统调试和运行 3.2.1 测试方法 由于我的计算机上只有一个串口,所以利用串口助手在两台PC机上对系统进行测试,首先将两台PC机上的串口用串口线连接好,然后分别运行程序,分被打开各自的串口,波特率全部选择为9600,然后由串口助手向编好的程序发送数据,看是否可以准确的接收到串口助手发送过来的数据,并根据数据画出正确的直观图和对数据进行存储。如果可以正确的完成设置的功能,则表示程序编写成功,否则要对程序进行修改,直到可以实现预定功能。 3.2.2 系统联调 利用串口助手调试成功后,待硬件制作成功后,将硬件通过串口链接到PC机上,此时可以先通过串口调试工具测试一下单片机端程序是否正常,在确定单片机端工作正常时,将单片机与编写的VC++程序连接,测试程序运行情况。 3.2.3 系统运行 在LCD的显示程序中可以看到采集的温度数据,将单片机开发板与PC机连接时,可以在VC++编写的程序中接收到传输的数据,下面是接收单片机传送的数据的图片: 第四章 总结和展望 4.1 本次毕业设计总结 经过了三个多月时间,本次的毕业设计终于完成了。在经过了这么长时间的资料收集、系统设计、代码编写和程序测试,最终成功完成了毕业设计和 毕业论文 毕业论文答辩ppt模板下载毕业论文ppt模板下载毕业论文ppt下载关于药学专业毕业论文临床本科毕业论文下载 。看着自己的成果,有说不出的感触。 毕业设计不仅仅是检验学生在大学3年半里面的学习成果,也是让学生在最后的半年事件里面对自己的专业知识进行进一步的学习和对只是的总结归纳。在做毕业设计的过程中,我学习到了很多东西,对文献的检索和挑选能力进行了加强,学习到了更多的专业知识,增强了自己的动手能力。 在进行课题研究的过程中,通过对串口通信的认真学习和理解,对串口通信有了深刻的认识。一方面是加强了对诸如RS-232体系结构、数据流模型和传输类型等基本概念的理解,另一方面,在研究RS-232协议规范的过程中,深入理解了其数据传送的原理和具体过程,为在硬件平台上实现主从机之间的数据通信打下了坚实的基础。 在设计之初,由于平时理论知识的不足,再加上平时没有什么经验和对所用语言的不熟悉,做得有些手忙脚乱,不知从何入手。在老师的精心指导下和同学的热心帮助下,理清了完成这次毕业设计的思路。在通过对串口通信的原理学习后,提出了此次设计的 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 。最后设计成功地完成了,证明了思路和方案是正确的。 但因为本人缺少开发经验,本次同尚有很多不足之处:本系统实现的存储功能相对比较简单,仅仅是用类CFile将数据存在了文本文档中,并没有将数据存入到更加规范和方便的数据库中,这一点需要有所的改善。在进行串口通信的时候,由于PC机的时钟和单片机时钟有所不同产生了一定的差错,并没有完美的接收单片机传送的数据。 在撰写论文的过程中,不仅对专业知识进行了一遍温习,而且加强了对word的使用熟练度,和用visio画图工具有了进一步的了解,规范了画图的框架,不再是盲目的使用各种流程和箭头。对论文撰写的格式有了进一步的认识。 4.2 下一步工作展望 本次设计的一氧化碳检测器的上位机软件部分主要是通过RS-232串口接收单片机发送的一氧化碳浓度数据并可以进行绘图显示和数据存储。由于设计中的缺陷,存储功能做的不是很理想,只是简单的存放在文本文档中。下一步的工作就是利用数据库技术,使的可以更好的分析和管理一氧化碳浓度数据,更好的实现一氧化碳检测器在生活工作中的作用,为人们的生活做好更好的保障。 此外,主从机的通信所使用的技术可谓是日新月异,时刻了解最新的设计方法,并且搞清楚不同的方法所使用的场合,利用不同的总线协议进行通信设计是本人下一步的研究方向。 参考文献 [1] 龚建峰,一氧化碳的危害和防护[N].中国石化报,2010-7-5(03). [2] 毛会琼,任子辉,陈世海.基于MSP430的便携式一氧化碳检测仪的设计[J].工矿自动化,2007,(2):72~74. [3] 黄双根,吴燕,黄大星.基于STC89C52新型一氧化碳报警器设计[J].机械与电子,2009.(10):67~69. [4] 李凤文.一氧化碳报警器的工作原理及检定方法研究[J].中国高新技术企业,2010,(25):47~48. [5] 百度文库.基于RS232通信的电压检测软件的设计 [EB/OL].http://wenku.baidu.com/view/acf17e6d1eb91a37f1115cb1.html.2010-12-31. [6] 黄晖,柴剑勇,严兴.串口通信技术[J].科技创新导报,2010,(27):20~21. [7] 王丽萍.基于VC串口通信的实现[J].电脑学习,2007,(3):46~47. [8] 王莉,阳春华.基于VC++的串口通信设计及其应用[J].控制工程,2004,(11):89~92. [9] 杨淑美,刘元静.智能通信管理机的上位机人机接口界面设计[J].人机界面与自动化软件,2010,(9):88~90. [10] 任丽红,张晓燕.在VC++中开发串口类及串口通信应用程序[J].北京石油化工学院学报,2010,12(2):26~29. [11] 阮宇.Visual C++ 6.0基础教程[M].北京:清华大学出版社,2005. [12] 百度百科.graphics.h[EB/OL].http://baike.baidu.com/view/1390221.htm.2011-5-1. [13] 欧阳志宏,董霖,钱俊华.MFC程序设计[M].北京:人民邮电出版社.2009. [14] 百度百科.CFile[EB/ON].http://baike.baidu.com/view/994710.htm.2011-5-25. [15] 姚志成.单片机多机通信的设计[J].中国核心期刊(嵌入式与SOC),2006,22(2). [16] 王丽红.基于单片机的CO检测与报警系统[J].知识经济,2010,(10):108~110. [17] 龚建伟,熊光明.Visual C++/Turbo C串口通信编程实践[M].北京:电子工业出版社.2004. [18] Bohdan Borowik. Interfacing PIC Microcontrollers to Peripheral Devices[J]. Science and Engineering, 2011, (2):88~104. [19] 杨军,沈毅.PC机与单片机的多机通讯[J].郑州纺织工学院学报,1998,(9):83~87. [20] 陆建华.PC机与单片机的串行通信[J].中国现代教育装备,2010,(1):35~38. [21] 百度百科.CFile[EB/ON].http://baike.baidu.com/view/2143589.htm#3.2011-1-15. [22] 徐振方,孟艳花,王艳.基于AVR单片机的LED显示屏控制系统的研究[J].照明工程学报,2010,(2):76~80. [23] 戴佳,戴卫恒,刘博文.51单片机C语言应用程序设计实例精讲[M].北京:电子工业出版社,2008. [24] 林颖,罗金炎,刘骄,等.基于RS485总线的PC 机与多单片机系统的串行通信[J]. 机械与电子,2006,( 1):33~36. [25] 杜洋.爱上单片机[M].北京:人民邮电出版社,2010. 致谢 在这次毕业设计过程中,有许多老师和同学都给予了我很大的帮助,在此我表示衷心的感谢!要特别感谢我的指导老师陈志贤老师,陈老师对工作认真负责的作风和严谨的治学态度给我留下了深刻的印象,并将使我终生受益。在整个设计中,陈老师进行多次指导,对我的设计思路、方法提供了宝贵而可行的建议,并时刻关心我的设计进度及问题,为我提供了很大的方便。 此外,本文最终得以顺利完成,也是与本学院其他老师的帮助分不开的,虽然他们没有直接参与我的论文指导,但在开题报告答辩时也给我提供了不少的 意见 文理分科指导河道管理范围浙江建筑工程概算定额教材专家评审意见党员教师互相批评意见 ,提出了一系列可行性的建议,在此向他们表示深深的感谢! 我也要感谢四年来给我默默传授知识的所有老师,感谢他们对我无私的教诲和帮助,是在他们的辛勤培育下我才有了今天的成绩;同时我也要感谢班上同学给予我的帮助,是他们的帮助使我的设计工作开展得如此顺利,使我四年的理论与实践进行了一次完美的结合。 最后要感谢的是我的父母,他们在我做毕业设计的过程中也一直给我鼓励,为我能够顺利的完成毕业论文提供了巨大的动力。在未来的日子里,我会更加努力的学习和工作,不辜负父母对我的殷殷期望!努力报答他们的养育之恩。 _1369197379.vsd � � � 开始 串口初始化� 判断串口号� 打开串口� 串口设置� 终止读写/清楚缓存区� 返回 _1369198352.vsd � � � 串口接收数据� 等待接收� 接收数据为0?� 清除错误标记� 读串口� 读串口成功?� 求异域值� 清空接收� 返回� 读出0个数据� 是 否 _1369115982.vsd � Cfile � CObject� CMemFile� COleStreamFile� CSocketFile� CStudioFile� _1369192940.vsd � 发送到串口来的一氧化碳浓度数据 选择接收数据的方式� 查看以前的数据� 接收数据� 打开存储的数据文件� 数据分析显示� 保存数据� 方式查询� _1369115689.vsd � CDialog� CWnd� CCmdTarget� CObject� _1369115730.vsd � CDialog� CCommonDialog� COlePropertyPage� CPropertyPage� CFileDialog� User Dialog Boxes� CprintDialog� CColorDialog� others�
本文档为【基于单片机的一氧化碳检测仪的设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥17.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
北溟愚鱼
暂无简介~
格式:doc
大小:716KB
软件:Word
页数:0
分类:工学
上传时间:2018-09-22
浏览量:26