基于单片机的CO浓度检测及报警系统设计与制作_第1页
基于单片机的CO浓度检测及报警系统设计与制作_第2页
基于单片机的CO浓度检测及报警系统设计与制作_第3页
基于单片机的CO浓度检测及报警系统设计与制作_第4页
基于单片机的CO浓度检测及报警系统设计与制作_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学号:密级:基于单片机的CO浓度检测及报警系统设计与制作学院名称:培黎工程技术学院专业名称:电子信息科学与技术学生姓名:指导教师:二〇一五年五月DesignandManufactureofCOConcentrationDetectionandAlarmSystemBasedonSCMCollege:SchoolofBailieEngineering﹠TechnologySubject:ElectronicInformationScienceandTechnologyName:Directedby:May2015郑重声明本人呈交的学位论文,是在导师的指导下,独立进行探讨工作所取得的成果,全部数据、图片资料真实牢靠。尽我所知,除文中已经注明引用的内容外,本学位论文的探讨成果不包含他人享有著作权的内容。对本论文所涉及的探讨工作做出贡献的其他个人和集体,均已在文中以明确的方式标明。本学位论文的学问产权归属于培育单位。本人签名:日期:摘要本文是以STC89C52芯片为核心设计制作了一种CO浓度检测及报警系统。通过CO传感器检测空气中CO浓度,经电路处理实现报警及降低其浓度作用。该系统主要包括ADC0832模数转换芯片,CO检测,蜂鸣器预警电路,LCD液晶显示电路等。软件编程采纳C语言,具有功耗低,成本低等特点。关键词:CO检测;单片机;报警系统ABSTRACTAdetectionandalarmsystemforCOconcentrationisdesignedwithSTC89C52chip.ItdetectsconcentrationofCOinairthroughcarbonmonoxidesensors,theroleofalarmandreduceitsconcentrationisachievedbycircuit.ThissystemmainlyconsistsofADC0832chip,detectionofCO,buzzeralarmcircuitandLCDliquidcrystaldisplaycircuit.ThesoftwareisprogrammedwithClanguage.Therefore,thesystemischaracterizedbylowpowerdissipationandlowcost.Keywords:detectionofCO;Singlechipmicrocomputer;alarm

system

目录TOC\o"1-3"\h\u21777第1章绪论 173411.1课题的背景和意义 1125611.2CO检测仪的种类 2280751.3设计任务 222583第2章CO检测系统硬件设计 3200902.1STC89C52单片机简介 3177132.2单片机最小系统的设计 589542.3数据采集系统的简介 762792.4模数转换器的简介 8197352.5按键电路的设计 9271162.6外围扩充存储器的简介 9136452.7上拉电阻电路的设计 10146522.8液晶显示器简介 10225672.9报警电路的设计 119326第3章CO检测系统软件设计 1322943.1软件设计结构 13291753.2主程序模块的设计 14233203.3模数转换的设计 15152253.4按键模块的设计和时钟模块的设计 16282833.5液晶显示模块的设计 178882第4章系统调试及功能实现 183304.1总体系统调试 1828134.1.1软件调试 18306874.1.2软件下载 18255894.2实物展示 1921875结论 2113802参考文献 2213091致谢 2326444附录 24第1章绪论1.1课题的背景和意义一氧化碳是无色、无臭、无味、有毒的气体,熔点﹣199℃,沸点﹣191.5℃。标准状况下气体密度为l.25g/L,和空气密度(标准状况下1.293g/L)相差很小,这也是简洁发生煤气中毒的因素之一。一氧化碳分子中碳元素的化合价是+2价,能进一步被氧比成+4价,从而使一氧化碳具有可燃性和还原性,一氧化碳能够在空气中或氧气中燃烧,生成二氧化碳。一氧化碳中毒(carbonmonoxidepoisoning),亦称煤气中毒。一氧化碳是无色、无臭、无味的气体,故易于忽视而致中毒。常见于家庭居室通风差的状况下,煤炉产生的煤气或液化气管道漏气或工业生产煤气以及矿井中的一氧化碳吸入而致中毒。中毒原理:一氧化碳会与肺部的血红蛋白结合,造成机体缺氧。一是轻度中毒。患者可出现头痛、头晕、失眠、视物模糊、耳鸣、恶心、呕吐、全身乏力、心动过速、短暂昏厥。血中碳氧血红蛋白含量达10%-20%。二是中度中毒。除上述症状加重外,口唇、指甲、皮肤粘膜出现樱桃红色,多汗,血压先上升后降低,心率加速,心律失常,烦躁,一时性感觉和运动分别(即尚有思维,但不能行动)。症状接着加重,可出现嗜睡、昏迷。血中碳氧血红蛋白约在30%-40%。经刚好抢救,可较快醒悟,一般无并发症和后遗症。三是重度中毒。患者快速进入昏迷状态。初期四肢肌张力增加,或有阵发性强直性痉挛;晚期肌张力显著降低,患者面色苍白或青紫,血压下降,瞳孔散大,最终因呼吸麻痹而死亡。经抢救存活者可有严峻合并症及后遗症。一氧化碳的后遗症。中、重度中毒病人有神经衰弱、震颤麻痹、偏瘫、偏盲、失语、吞咽困难、智力障碍、中毒性精神病。部分患者可发生继发性脑病。在当今社会发展中,现代化的发展给人类带了很大的便利,但与此同时,人生平安越来越受到人们的重视,一氧化碳在工业领域所给我们带来的便利不言而喻,但它对人体的危害也是自不待言的。所以我们设计一款基于单片机限制的一氧化碳检测仪,对一氧化碳进行检测,为人们供应了平安的保障。1.2CO检测仪的种类目前,市场上一氧化碳检测仪的种类是多种多样,目前应用得较为广泛的是热催化监测方式,但由于多种可热性气体都能催化氧化燃烧,导致检测精度下降,另外,采纳这种方式的检测仪体积和功率都较大,不便于随身携带,本设计运用的是一种采纳点调制非光红外(NDIR)气体成分分析技术检测一氧化碳气体的方法的一氧化碳传感器,该方法提高了检测精度,大大降低了检测仪的尺度和功耗,延长了电池供应时间,体积和功耗的有效降低。1.3设计任务本设计的任务是设计一个由单片机限制的一氧化碳的浓度检测及报警系统,它将传感器输出的电压信号进行A/D转换、滤波、线性化,由单片机将电压值转换为气体浓度和温度送LCD1602液晶显示,并推断是否超过报警上限,若超过,则发出声光报警,并打开风扇降低一氧化碳的浓度。同时用户可以自己设定报警上限,运用户可以依据实际状况便利的驾驭平安状况。该系统以STC89C52单片机为核心,可以实现声光报警、故障自诊断、浓度显示、报警限设置。它结构简洁、性能稳定、运用便利、价格低廉、智能化,具有肯定的好用价值。第2章CO检测系统硬件设计本论文主要完成一氧化碳检测仪软件和硬件仿真设计,设计内容包括:A/D转换器程序、限制程序、超标报警、键盘检测、数据显示等。硬件设计部分主要包括:单片机、A/D转换器、时钟芯片、LCD、外围扩展数据RAM等芯片的选择;硬件主电路设计、数据采集、模数转换电路设计、液晶显示电路设计、外围扩充存储器接口电路、时钟电路、复位电路、键盘接口电路等功能模块电路设计。硬件结构框图2.1。硬件设计总体电路图见附录A1。图2.1硬件结构框图2.1STC89C52单片机简介本系统采纳STC89C52单片机。而目前世界上较为闻名的8位单片机的生产厂家和主要机型如下:美国Intel公司:MCS—51系列及其增加型系列;美国Motorola公司:6801系列和6805系列;美国Atmel公司:89C51等单片机;美国Zilog公司:Z8系列及SUPER8;美国Fairchild公司:F8系列和3870系列;美国Rockwell公司:6500/1系列;美国TI(德克萨司仪器仪表)公司:TMS7000系列;NS(美国国家半导体)公司:NS8070系列等等。MCS—51系列单片机包括三个基本型8031、8051、8751。本系统采纳STC89C52单片机为限制核心。而相比之下52型功能更为强大,ROM和RAM存储空间更大,52还兼容51指令系统。基于本系统设计内容的须要,综合考虑后,我们选择单片机ATME公司的STC89C52为限制核心;主要基于考虑STC89C52是一个低电压,高性能CMOS8位单片机,片内含8KB的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM)、6个中断源;时钟频率0~24MHz;器件采纳高密度、非易失性存储技术生产,并兼容标准MCS-51指令系统,功能强大。STC89C52是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含8Kbytes的可反复擦写的只读程序存储器(PEROM)和256Kbytes的随机存取数据存储器,器件采纳ATMEL公司的高密度,非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中心处理器和FLASH存储单元,功能强大,STC89C52单片机适合于很多较为困难限制应用场合。图2.2引脚图主要性能参数:与MCS-51产品指令和引脚完全兼容;8K字节可重擦写FLASH闪存存储器;1000次写/擦循环;时钟频率:0Hz~24MHz;三级加密存储器;256字节内部RAM;32个可编程I/O口线;3个16位定时/计数器;6个中断源;可编程串行UART通道。2.2单片机最小系统的设计采纳STC89C52来设计一个单片机系统能运行起来的需求最小的系统[15],电路图见图2.3:图2.3单片机最小系统图上图的最小单片机系统包含有晶振电路和复位电路,STC89C52芯片组成。晶振电路在各种指令的微操作在时间上有严格的次序,这种微操作的时间次序称作时序,STC89C52的时钟产生方式有两种,一种是内部时钟方式,一种是外部时钟方式。本系统中采纳了内部时钟方式,为了尽量降低功耗的原则。电路图见图2.4。图2.4晶振电路图在89C52单片机的内部有一个震荡电路,只要在单片机的XTAL1和XTAL2引脚外接石英晶体(简称晶振)就构成了自激振荡器并在单片机内部产生时钟脉冲信号,图中电容器C1和C2稳定频率和快速起振,晶振CRY选择的是12MHz。复位电路在单片机工作中仍旧是不行缺少的主要部件中,单片机工作时必需处于一种确定的状态。端口线电平和输入输出状态不确定可能使外围设备误动作,导致严峻事故的发生;内部一些限制寄存器(专用寄存器)内容不确定可能导致定时器溢出、程序尚未起先就要中断及串口乱传向外设发送数据[1]。图2.5上电复位电路图本设计中复位电路采纳的是上电复位与手动复位电路,开关未按下是上电复位电路,上电复位电路在上电的瞬间,由于电容上的电压不能突变,电容处于充电(导通)状态,故RST脚的电压与VCC相同。随着电容的充电,RST脚上的电压才渐渐下降。选择合理的充电常数,就能保证在开关按下时是RST端有两个机器周期以上的高电平从而使STC89C52内部复位。开关按下时是按键手动复位电路,RST端通过电阻与VCC电源接通,通过电阻的分压就可以实现单片机的复位[4]。电路图见图2.6:图2.6复位电路图2.3数据采集系统的简介CO传感器选用CO/CF-1000探头组成,如下表2.1。表2.1传感器参数名称一氧化碳传感器CO/CF-1000测量范围0-1000ppm输出100±20nA/ppm辨别率0.05ppm响应时间(T90)﹤50seconds湿度范围15-90%RH(非凝聚)最大零点漂移(20℃to40℃)10ppm长期漂移﹤2%/每月举荐负载值10Ω线性度输出线性测量电路由CO/CF-1000一氧化碳传感器、ADC0832组成。当空气被内部的采样系统接收后,产生一个与一氧化碳浓度成正比的电压信号,该电压信号经ADC0832与STC89C52单片机相连,在显示器上显示出一氧化碳的浓度值,当超过国家规定的标准时报警[5]。2.4模数转换器的简介由于ADC0832模数转换器具有8位辨别率、双通道A/D转换、输入输出电平与TTL/CMOS相兼容、5V电源供电时输入电压在0~5V之间、工作频率为250KHZ、转换时间为32微秒、一般功耗仅为15MW等优点,适合本系统的应用,所以我们采纳ADC0832为模数转换器件[3]。电路图见图2.7如下:图2.7模数转换电路图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模数转换器的位数为8位,所以ADC0832模数转换器的精度为:10ppm/256=0.039ppm。2.5按键电路的设计本系统选择独立式按键。键盘分为:独立式和矩阵式两类,每一类按其编码方法又可以分为编码和非编码两种。本系统具有人机对话功能,该功能即能随时发出各种限制吩咐和数据输入以及和LCD连接显示运行状态和运行结果。由于本系统只有UP、DOWN、OK、CANCEL4个限制吩咐,所需按键较少,所以本系统选择独立式按键[13]。电路图见图2.8。图2.8按键电路图2.6外围扩充存储器的简介由于考虑STC89C52单片机具有8KB的程序存储器(ROM),256B的数据存储器(RAM),由于考虑到本系统的数据处理与存储所需的容量,现在须要扩充存储器的容量。在应用中要保存一些参数和状态,本系统选用AT24C128存储器[8]。电路图见图2.9。图2.9外围扩充存储电路图2.7上拉电阻电路的设计在主电路图中接在P0口处有一个排阻RP1,由于P0口没有内接上拉电阻,为了为P0口外接线路有确定的高电平,所以要接上排阻RP1,以确保有P0口有稳定的电平[11]。电路连接图见图2.10。图2.10上拉电阻电路图2.8液晶显示器简介我们选用了AMPIRE128X64液晶显示模块,是由于本系统要有显示装置完成显示功能,显示器最好能够显示数据、图形,考虑到同种LCD显示器的屏幕越大体积越大,功耗越大的特点,该型号显示器消耗电量比较低,可以满意系统要求。该类液晶显示模块采纳动态的液晶驱动,可用5V供电。AMPIRE128X64液晶共有22个引脚[9]。AMPIRE128X64液晶显示模块与计算机的接口电路有两种方式。分为干脆访问方式和间接限制方式。干脆访问方式是把液晶模块作为存储器或I/O设备干脆接在单片机的总线上,单片机以访问存储器或I/O设备的方式操作液晶显示模块的工作。间接限制方式则不运用单片机的数据系统,而是利用它的I/O口来实与显示模块的联系。即将液晶显示模块的数据线与单片机的Pl口连接作为数据总线,另外三根时序限制信号线通常利用单片机的P3口中未被运用的I/O口来限制。这种访问方式不占用存储器空间,它的接口电路与时序无关,其时序完全靠软件编程实现。本系统采纳间接限制方式[14]。液晶显示电路连接原理图见图下:图2.11液晶显示器电路图2.9报警电路的设计图2.12报警电路接线图报警信号通常有三种类型:一是闪光报警,因为闪动的指示灯更能提示人们留意;二是鸣音报警,发出特定的音响,作用于人的听觉器官,易于引起和加强警觉;三是语音报警,不仅能起到报警作用,还能干脆给出警报种类的信息。其中,前两种报警装置因硬件结构简洁,软件编程便利,经常在单片机应用系统中运用;而语音报警虽然警报信息较干脆,但硬件成本高,结构较困难。单频音报警实现单频音报警的接口电路比较简洁,其发音元件通常可采纳压电蜂鸣器,当在蜂鸣器两引脚上加3~15V直流工作电压,就能产生3kHZ左右的蜂鸣振荡音响。压电式蜂鸣器,约需10mA的驱动电流,可在某端口接上一只三极管和电阻组成的驱动电路来驱动,如图2.12所示。在图2.12中,P1.0接三极管基极输入端,当P1.0输出高电平“1”时,三极管导通,蜂鸣器的通电而发音,当P1.0输出低电平“0”时,三极管截止,蜂鸣器停止发音[12]。第3章CO检测系统软件设计3.1软件设计结构软件设计部分主要包括:主程序/子程序流程的设计、功能模块程序的编写、软/硬件结合调试与演示。主要包括以下功能模块:51驱动、检测、液晶显示、时钟、键盘、模数软换[10],软件结构框图3.1。系统初始化、按键扫描显示选择菜单测量相关设置数据处理串行通信对软件进行处理图3.1软件结构框图系统初始化、按键扫描显示选择菜单测量相关设置数据处理串行通信对软件进行处理3.2主程序模块的设计主程序实现的功能:与硬件相结合实现便携式一氧化碳检测仪的各个功能。主要是检测与显示,时间调整与显示,数据存储,功能子函数的调用,见图3.2。检测主程序程序见附录A2。开始初始化CPU开始初始化CPU初始化时钟初始化LED屏显示开机画面显示时间显示主菜单读键图3.2主程序流程图3.3模数转换的设计ADC0832转换的流程图见下图3.3;ADC0832程序见附录A3。起先使能芯片起先使能芯片产生时钟信号输入通道限制字读取2字节数据读取2字节数据字节数据校正送入指定寄存器结束图3.3数转换流程图3.4按键模块的设计和时钟模块的设计按键查询式的流程图见下图,按键程序见附录A4。按键程序入口按键按下调用延时程序按键释放NY按键程序入口按键按下调用延时程序按键释放NYNN键值传送键值传送图3.4按键查询式的流程图时钟模块操作流程图见下图,时钟程序见附录A5。起先初始化起先初始化爱护寄存器操作向DS写入字节数据向DS读取字节数据结束图3.5时钟模块操作流程图3.5液晶显示模块的设计LCD模块在本系统中主要起着开界面汉字显示,以及各限制效果的显示。采纳干脆访问方式。液晶显示的操作流程图见下图3.6,液晶程序见附录A6。入口入口读状态字读状态字否忙?忙?是写指令代码写指令代码/显示数据读显示数据图3.6液晶显示的操作流程图系统调试及功能实现4.1总体系统调试软件调试打开keil软件,打开程序,检查后单击编译按键,假如未发觉错误和警告则说明程序能够正常运行。编译结果如图所示:图4.1软件编译结果图所以程序能够正常运行。4.1.2软件下载通过串口将电脑中已经编写好的程序传输入51单片机中,打开电源,检查各模块是否正常工作。首先将STC_ISP_V483这个串口通信软件打开,选择打开程序文件选项,找到须要录入单片机的hex文件,选择下载选项,点击后给单片机上电复位,等待信息框中显示已下载胜利,说明程序已经录入单片机。接下来首先通过按键选择工作模式,然后依据传感器模块的类型将相应的气体放置在传感器探头旁边,等待声光报警模块工作,当报警模块工作后,通过按下外部中断按键选择报警模式,按一下则led二极管关闭,按其次下则蜂鸣器关闭,按第三下则led和蜂鸣器都打开。将三个传感器模块都检查完毕后,按下复位键,并关闭电源。通过监测总体系统能够正常工作。4.2实物展示焊接成品如下图4.2所示:4.2焊接成品图在焊接过程中,本设计采纳万能板来焊接,同时外接电源采纳的是USB供电。接通电源初始图如4.3所示:4.3接通电源初始图在电源刚接通时,液晶屏显示当前CO浓度为000PM,设置的界限值为100PM,风扇处于未转动状态,发光二极管未亮并且蜂鸣器不报警。系统工作时如图4.4所示:4.4工作实物图当CO传感器检测到的CO浓度大于国家标准值100ppm时,蜂鸣器报警同时红色指示灯发光、风扇转动。结论本次设计的任务是设计制作CO浓度检测报警器,设计中运用了低电压、高性能CMOS8位微处理器STC89C52单片机作为限制核心,总体电路具有运行速度快,稳定,结构简洁,散热快速等特点,采纳模块化设计,这样不仅有利于系统硬件的设计和调试,同时也便利对系统进行更改和系统硬件的升级。CO/CF-1000气体传感器模块的特点在于其简易性和高效性,由于其输出口在监测到有害气体时干脆输出低电平,这样就免去了从气体传感器上采集信号,这样硬件设计更加简洁,所需的器件也更加易于购买,硬件出错率也就更小,更加符合本设计的目的。本次设计涉及到的学问面较多,由于本人理论水平和实践阅历有限,本次设计还存在一些有待改进和优化的地方,比如在检测气体种类上可以增加对烟雾、NO等方面。在好用性方面可以考虑将浓度监测系统与室内换气系统连接,这样就不仅做到了气体监测和警报,还做到了对有害气体刚好处理,使整个室内监控系统更加完善。参考文献[1]何立民.MCS-51系列单片机应用系统设计[M].北京航空航天高校出版社,1990,34-50.[2]马忠梅.单片机的C语言应用程序设计[M].北京航空航天高校出版社,2001,60-90.[3]陈小忠.单片机接口技术好用子程序[M].人民邮电高校出版社,2005,80-120.[4]张淑清.单片微型计算机接口技术及其应用[M].国防工业高校出版社,2001,60-70.[5]曹琳琳.单片机原理及接口技术[M].国防科技高校出版社,2000,80-102.[6]郭天祥.新概念51单片机C语言教程[M].北京:电子工业出版社,2009,120-140.[7]周航慈.单片机应用程序设计技术[M].北京:北京航空航天高校出版社,2011,70-103.[8]石秀名.嵌入式系统原理与应用[M].北京:北京航空航天高校出版社,2009,30-50.[9]王宜怀.嵌入式技术基础与实践[M].北京:北京航空航天高校出版社,2007,90-100.[10]谭浩强.C程序设计[M].第四版.北京:清华高校出版社,2010,87-90.[11]陈志旺.51系列单片机系统设计与实践[M].北京:电子工业出版社,2008,98-115.[12]余锡存,曹国华.单片机原理及接口技术.其次版.西安:西安电子科技高校出版社,2012,150-170.[13]徐煜明.单片机原理及接口技术[M].电子工业出版社,2005,110-140.[14]赵新民.智能仪器原理及设计[M].哈尔滨工业高校出版社,1995,67-98.[15]徐英慧.嵌入式系统设计[M].北京航空航天高校出版社,2010,35-60.致谢我的毕业课题是便携式一氧化碳检测仪的设计,是一个实际的小工程。作为一个本科的学生,我对实际的工程设计相识不够,阅历不足,难免在设计的整体框架中,有很多的细微环节没有考虑。但**老师和同学们赐予我激励和很多珍贵的建议,并且悉心引导,赐予我一个比较清楚的设计思路,帮助我解决了很多设计上的困难。最终还要感谢在百忙之中进行论文评审的老师们,对论文的不足之处敬请指责点。附录附录A1硬件设计总体电路图附录A2检测主程序程序#include<STC89X52.H>//调用外函数//#include<ctype.h>#include<string.h>#include<stdlib.h>#include<stdio.h>#include<math.h>#include<LCD.h>/**********初始化CPU************[2]/voidinit_cpu()//初始化cpu{EA=1; TR0=1; TR1=1; TMOD=0x11; TH1=0x3c; TL1=0xb0;}/*voidtime1(void)interrupt3using1 {TH1=(65536-50000)/256; TL1=(65536-50000)%256;keyval=P1;}*//初始化CPU结束//voidmain_menu_initial() //LCD主菜单初始化.//{ main1_menu[0].menu_count=4; //有4个菜单项.// main1_menu[0].display=measurearray;//定义一个”起先测量“数组// main1_menu[0].subs=NULL; main1_menu[0].children_menus=measure_menu; //当前菜单子菜单的指针 main1_menu[0].parent_menus=NULL;}voidmeasure_menu_initial()//“起先测量”菜单设置//{measure_menu[0].menu_count=2;measure_menu[0].display=qr; //起先测量函数,确认. measure_menu[0].subs=start_measure_function;//起先测量函数 measure_menu[0].children_menus=NULL; measure_menu[0].parent_menus=main1_menu; measure_menu[1].menu_count=2; measure_menu[1].display=qx; //起先测量函数,取消.measure_menu[1].subs=NULL;measure_menu[1].children_menus=NULL; measure_menu[1].parent_menus=main1_menu; }//还有voidstore_menu_initial()、voidtime_menu_initial()//voidled_menu_pro(){ max_item=menu_led->menu_count; switch(keyval) { case0:break; case1: //向上键. if(user_choosen==0) { user_choosen=max_item; } shuaxin=1; user_choosen--; break; }……//“向上”“向下”“确认”“取消”键//if(shuaxin) //是否须要刷新LCD标记位. {Clr_Scr(); shuaxin=0; } led_menu_show(); }voidled_menu_show() { ucharn; max_item=menu_led->menu_count; if(max_item>=4) //菜单项为3则表示为主菜单. { for(n=0;n<4;n++) {draw_bmp(n*2,20,96,0,menu_led[n].display); } select_item(user_choosen); //标记出当前菜单项. } else { switch(temp_choosen) {case0: draw_bmp(0,20,96,0,measurearray);//“起先测量”数组// break; …… default: break; } for(n=0;n<max_item;n++) { draw_bmp((n+1)*2,20,32,0,menu_led[n].display); } select_item(user_choosen+1); } } voidselect_item(ucharn){ draw_bmp(n*2,2,16,0,curflag);}voidstart_measure_function(void)//起先测量函数//{main_Menu();}/*主函数*/main(){init_cpu();Init_Clock();init_lcd();Disp_Img(FirstPage);delay(2000);//延时//ClockMsg();Refresh();delay(2500);Clr_Scr();main_Menu();Clr_Scr();main_menu_initial();measure_menu_initial();store_menu_initial();time_menu_initial();communication_menu_initial(); while(1){keyval=get_key(); //读键. led_menu_pro();}}//适当延时防止因为不断查忙而耗费大量CUP资源//附录A3ADC0832程序#defineuintunsignedint//常量/变量定义//uchark,i,j;floatxdatalv;sbitADCS=P3^1;//ADC0832chipseclect//接口定义//……//其它引脚略……ucharxdatadsw[20];//存放sprintf转换字符ucharxdatavalue[149];//点阵字符储存ucharcodetable[]={//字符查表0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*".",0*/……};//采集并返回unsignedintAdc0832(unsignedcharchannel)//AD转换,返回结果[6]{uchari=0;ucharj;uintdat=0;ucharndat=0;if(channel==0)channel=2;if(channel==1)channel=3;ADDI=1;_nop_();_nop_();ADCS=0;//拉低CS端_nop_();_nop_();ADCLK=1;//拉高CLK端_nop_();_nop_();ADCLK=0;//拉低CLK端,形成下降沿1_nop_();_nop_();ADCLK=1;//拉高CLK端ADDI=channel&0x1;_nop_();_nop_();ADCLK=0;//拉低CLK端,形成下降沿2_nop_();_nop_();ADCLK=1;//拉高CLK端ADDI=(channel>>1)&0x1;_nop_();_nop_();ADCLK=0;//拉低CLK端,形成下降沿3ADDI=1;//限制吩咐结束_nop_();_nop_();dat=0;for(i=0;i<8;i++){dat|=ADDO;//收数据ADCLK=1;_nop_();_nop_();ADCLK=0;//形成一次时钟脉冲_nop_();_nop_();dat<<=1;if(i==7)dat|=ADDO;}for(i=0;i<8;i++){j=0;j=j|ADDO;//收数据ADCLK=1;_nop_();_nop_();ADCLK=0;//形成一次时钟脉冲_nop_();_nop_();j=j<<7;ndat=ndat|j;if(i<7)ndat>>=1;}ADCS=1;//拉低CS端ADCLK=0;//拉低CLK端ADDO=1;//拉高数据端,回到初始状态dat<<=8;dat|=ndat;return(dat);//returnadk}/*点阵字符采集函数*/voidtra(uchar*p)//数组dsp[]里面的字符查询后,再储储存到另一个显示数组value[]voidmain_Menu(){Clr_Scr();//先清屏//CS2=1;CS1=0;hz_disp16(0,32,1,jiaquan);……//甲//醛//测//量//数//据//存//储//……delay(2000);do{/*k=Adc0832(0);//AD转换结果l=k/255.0*100.0; ltemp=floor(l); dsw[0]=ltemp/10; dsw[1]=ltemp%10;//sprintf(dsw,"%2.3f",l);//dsw[0]=1;switch(dsw[0]){case0:sz_disp16(2,32,1,sz0);break;case1:……sz_disp16(2,32,1,sz9);}switch(dsw[1]){case0:sz_disp16(2,40,1,sz0);break;case1:……sz_disp16(2,40,1,sz9);}*///sz_disp16(2,40,1,sz0);/*tra(dsw); CS2=1;CS1=0;sz_disp16(2,56,1,value); */}while(P1_3);}附录A4按键程序#definenullkey0//定义//……ucharget_key()//读键//{ ucharpass,kcodebuf; staticucharlastkcode,keytime=0; //定义为静态变量,外部不行见,但须要常驻内存. staticucharhavekey=0; staticucharkeylock=0; kcodebuf=P1&0xff; keytime++; if(kcodebuf!=lastkcode)keytime=0; if(kcodebuf==0xff){havekey=0; keylock=0; keytime=0; pass=0;} …… elsepass=nusekey; lastkcode=kcodebuf;return(pass);} /*ucharget_key() elsepass=nusekey;return(pass);}*/附录A5时钟程序/*引脚连接*/sbitRST2=P3^5;//复位线引脚//sbitCLK=P3^6;//时钟线引脚//……//其它引脚略……/*定义时间日期显示缓存*/unsignedcharCurtime[7];idataunsignedcharday,sec,min,hour,date,month,year,hms,n,fla_cou;Unsignedcharcodeyejing[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};/*子函数声明(时钟部分)*/[7]voidInputByte(unsignedcharDate);voidWriteTo1302(unsignedcharAddr,unsignedcharDate);ReadFrom1302(unsignedcharAddr);voidSetTime(unsignedchar*pSecDa);voidGetTime(unsignedcharCurtime[]);voidInit_T0(void);voidFlashKey(void);voidAdd(void);voidInit_Clock(void);voidRefresh(void);voidStartMenu(void)/*时钟固定汉字显示*/voidClockMsg(void){Clr_Scr();//先清屏CS2=1;CS1=0;//左屏hz_disp16(1,32,1,xing);……//星//期//2//0//年//时CS2=0;CS1=1;//右屏hz_disp16(3,0,1,yue);……//月//日//分//秒}/*时钟部分*//*函数:写入字节子函数*/voidInputByte(unsignedchardat){unsignedchari;ACC=dat;for(i=8;i>0;i--){IO=ACC0;CLK=1;//下降沿写入数据//CLK=0;ACC=ACC>>1;}}/*函数:读出字节子函数*/OutputByte(void)//上升沿读出数据//……/*函数:设置初始时间*/voidSetTime(unsignedchar*pSecDa){……WriteTo1302(0x8e,0x00);//限制吩咐,WP=0,写操作//for(i=7;i>0;i--){WriteTo1302(Addr,*pSecDa);//秒分时日月星期年//pSecDa++;Addr+=2;}WriteTo1302(0x8e,0x80);//限制吩咐,WP=1,写爱护//}/*函数:读取DS1302当前时间*/voidGetTime(void){……for(i=0;i<7;i++){Curtime[i]=ReadFrom1302(Addr);Addr+=2;}sec=Curtime[0];……//Min//hour//day//date//month//year}/*函数:初始化定时器T0子函数*/voidInit_T0(void){TMOD=0x01;//定时器T0,工作模式1//TH0=0x3c;//50ms//……}/*函数:产生闪耀信号子函数*/voidT0_flash(void)interrupt1//中断程序,产生时钟秒信号///*函数:时间闪耀子函数*//*功能:选择确定闪耀位等待调整*/voidFlashKey(void)//闪耀子函数//voidAdd(void)//调时子函数//voidInit_Clock(void)//时钟初始化子函数//voidRefresh(void)//刷新显示子函数//voidAdd(void)//调时子函数//{if(P1_2==0)//按P0_2键进行时间调整//{while(P1_2==0)Refresh();if(KT==1)//检验可调标记位KT//{hms++;switch(n){case1:year=hms;break;//依据n不同,返回给不同的位:n=1->返回给小时位//……}if((sec&0x0f)==0x0a){sec&=0xf0;sec+=0x10;}//假如秒位满十,向十秒位进一……if(day==8){day=1;}//假如星期满七,重新从星期一起先计//if((sec&0xf0)==0x60){sec&=0x0f;}//假如十秒位满六,清零//if(((date&0xf0)==0x30)&((date&0x0f)==0x02)){date&=0x00;} if(((month&0xf0)==0x10)&((month&0x0f)==0x03)){month&=0x00;} if((year&0xf0)==0xa0){year&=0x0f;}Curtime[0]=sec;Curtime[1]=min;……SetTime(&Curtime[0]);//将调整过后的时间值写入DS1302//}/*时钟初始化子函数*/voidInit_Clock(void){K1=1;K2=1;K3=1;K4=1;K5=1;K6=1;K7=1;KT=0;n=0;Init_T0();}/*刷新显示子函数*/voidRefresh(void){GetTime();CS1=1;CS2=0;if(K6){sz_disp16(5,40,1,shuzi[sec&0x0f]);//秒位//sz_disp16(5,32,1,shuzi[sec>>4]);}//十秒位//else{hz_disp16(5,32,1,kongbai2);}//秒位十秒位//if(K5){sz_disp16(5,8,1,shuzi[min&0x0f]);//分钟位//sz_disp16(5,0,1,shuzi[min>>4]);}//非常位//else{hz_disp16(5,0,1,kongbai2);}/*状态推断于提示*/voidState(void){CS1=1;CS2=0;if(KT==1){hz_disp16(1,32,1,tiao); hz_disp16(1,48,1,shi2);}else{hz_disp16(1,32,1,kongbai2); hz_disp16(1,48,1,kongbai2);}附录A6液晶程序/*位定义*/sbitRST=P2^0;//复位端//sbitE=P2^1;//使能端//……#defineDisp_On0x3f//显示开指令//#defineDisp_Off0x3e//显示关指令//#defineCol_Add0x40//定位到第0列指令//#definePage_Add0xb8//定位到第0页指令//#defineStart_Line0xc0//定位从DDROM中的第0行起先往屏幕上显示unsignedcharcodemeasurearray[] /*调入了一幅图像:测量:宽度x高度=96x16*/unsignedcharc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论