基于单片机的便携式甲醛检测仪的控制系统
本文研究设计了一种用于公共场所及室内具有检测及超限报警功能的甲醛
智能测试仪。其设计
基于89C51单片机,选择瑞士蒙巴波公司的CH20/S-10甲醛传感器。系统将传感器输出的4~20mA的
信号通过以AD0832为核心的A/D转换电路调理后,经由单片机进行数据处理,最后由LCD显示甲醛浓度值。
文中详细介绍了数据采集子系统、数据处理过程以及数据显示子系统和报警
电路的设计方法和过程。系统对于采样地点超出规定的甲醛容许浓度时采用三极
管驱动的单音频报警电路提醒监测人员。同时,操作人员对于具体报警点的上限
值可以通过单片机编程进行设置。另外,该系统对浓度信号进行了信号补偿等处
理,减少了测量误差,因此,具有较高的测量精度,而且结构简单,性能优良。
本系统的量程为0-10ppm,精度为0.039ppm。
甲醛检测,数据采集处理系统,硬件电路,软件设计,A/D转换器,AT89C52单片机
1 绪论 .............................................................. 1
1.1引言 ......................................................... 1
1.1.1甲醛的特性及危害 ....................................... 1
1.1.2甲醛的来源 ............................................. 1 1.2甲醛检测仪的种类 ............................................. 1 1.3系统总概述 ................................................... 2
1.4总体方案设计 ................................................. 2
2 硬件设计 .......................................................... 3
2.1硬件设计结构 ................................................. 3
2.2硬件设计主电路图 ............................................. 3 2.3硬件选择 ..................................................... 3
2.3.1MCU的选择与简介 ........................................ 3
2.3.2单片机最小系统的实现 ................................... 9
2.3.3数据采集系统 .......................................... 12
2.3.4模数转换的选择与简介 .................................. 13
2.3.5按键选择与简介 ........................................ 15
2.3.6外围扩充存储器 ........................................ 16
2.3.7时钟芯片选择与简介 .................................... 17
2.3.8上拉电阻 .............................................. 19
2.3.9液晶显示器简介 ........................................ 20
2.3.10报警电路 ............................................. 22
2.3.11硬件仿真环境介绍 ..................................... 24
3 软件设计 ......................................................... 26
3.1软件设计结构 ................................................ 26
3.2编写语言的选择 .............................................. 26
3.3主程序模块 .................................................. 27
3.4模数转换 .................................................... 27
3.4按键模块 .................................................... 28
I
3.6时钟模块 .................................................... 28
3.7液晶显示模块 ................................................ 29
4 系统仿真 ......................................................... 30
5 结束语 ........................................................... 32
致 谢 .............................................................. 33
参考文献 ........................................................... 34
附 录 .............................................................. 35
II
西南科技大学应用型自学考试毕业设计(
) 1.1.1甲醛的特性及危害
甲醛是一种无色,有强烈刺激性气味的气体。易溶于水、醇和醚。甲醛在常
温下是气态,通常以水溶液形式出现。其37%的水溶液称为福尔马林,医学和科研部门常用于标本的防腐保存。此溶液沸点为19.5?故在室温时极易挥发,随着温度的上升甲醛的挥发速度加快。在我国有毒化学品优先控制名单中甲醛列居
第二位。甲醛已被世界卫生组织确定为致癌和致畸形物质。甲醛是原浆毒物,能
与蛋白质结合,吸入高浓度甲醛后会出现呼吸道的严重刺激和水肿、眼刺痛、头
痛,也可发生支气管哮喘皮肤直接接触甲醛,可引起皮炎、色斑、坏死。经常吸
入少量甲醛,能引起慢性中毒,出现粘膜充血、皮肤刺激症、过敏性皮炎、指甲
角化和脆弱等。全身症状有头痛、乏力、心悸、失眠、体重减轻以及植物神经紊
乱等。
1.1.2甲醛的来源
(1)室内装修所用的合成板材,如胶合板、细木工板、高密度板、刨花板。
这些板材中甲醛起胶合剂、防腐剂的作用,主要用于加强板材的硬度、防虫、防
腐。板材中残留的和未参与反应的甲醛逐渐向周围环境释放,是室内空气中甲醛
的主要来源。
(2)用合成板材制造的家具,厂家为了追求利润使用不合格的板材,再粘
贴面材料时使用不合格的胶水,造成家具中甲醛含量超标。
(3)含有甲醛成分并有可能向外界散发的各类装饰材料,如壁纸、地毯、
油漆。
目前,市场上甲醛检测仪的种类是多种多样,其中较常见的是采用试验纸光
电光度法,即:当甲醛气体吹到浸有发色剂的试纸上时,与浸有发色剂的TAB组
合就会因发生化学反应而变色。甲醛同试纸接触后含在纸里的试药就会同甲醛反
应生成化合物,颜色就会从白色变成黄色。变色的程度可反映出所受光的反射光
量,反射光量的强度变化率可以作为被测气体的甲醛含量的应答值。预先设定检
测线,便可通过测量其反应率来测出甲醛气体的浓度值。在气体的采集方面有的
1
西南科技大学应用型自学考试毕业设计(论文) 是采用自动吸引式(内藏微型气泵),有的采用扩散式。对于试验纸光电光度法
来分析甲醛的浓度,它的优点是灵敏度高,操作简便,测定速度快。而该方法在
分析甲醛浓度时往往采用的是目视比色法,它的缺点是:
1.由于许多有色溶液不够稳定,不能久存,经常需要在测定的同时配制溶液,
比较费时费事。
2.目视比色的准确度低,一般相对误差为?5~20%。本论文设计的便携式甲醛检测仪所涉及的甲醛传感器是电化学传感器。它可以将甲醛气体的浓度转换为
微弱的电流信号。这样就可以通过电流电压变换电路将微弱的电流信号转换为可
以测量的稳定的电压信号,增强了电信号的稳定性。
本论文主要完成甲醛检测仪软件设计,设计内容包括:A/D转换器程序、控制程序、超标报警、键盘检测、数据显示等。
本系统采用单片机为控制核心,以实现便携式甲醛检测仪的基本控制功能。
系统主要功能内容包括:数据处理、时间设置、开始测量、超标报警、键盘检测、
自动休眠:仪器若不进行称量操作,5分钟后自动进入休眠模式,以降低电源消
耗。
本系统设计采用功能模块化的设计思想,系统主要分为总体方案设计、硬件
和软件的设计三大部分。
室内甲醛污染对人身体健康影响较大,标准规定的方法绝大多数是化学分析
法,使用的手段是实验室分析仪器,主要有比色计、分光光度计、化学滴定、气
相和液相色谱。但这些方法费力费时、成本高、自动化程度低过程复杂、大多数
过程是人工操作很难做到现场实时控制。本设计可选用基于电化学原理的甲醛传
感器,其原理是空气中的甲醛在电极下发生氧化反应,产生的扩散电极电流与空
气中的甲醛浓度成正比,通过检测放大电路和放大倍数的调整经A/D转换后送单
片机 、由单片机现场自动控制检测并显示甲醛浓度。由于甲醛含量超量的话,
将对人体健康造成很大的影响。具有民用价值的便携式甲醛检测仪的研制受到了
人们的高度重视。设计能够满足生活需要,携带方便的便携式甲醛检测仪迫在眉
睫。针对目前的现状,本系统设计遵守体积小,质量轻,性价比高的原则。
2
西南科技大学应用型自学考试毕业设计(论文)
硬件设计部分主要包括:(MCU、A/D、时钟芯片、LCD、外围扩展数据RAM)等芯片的选择;硬件主电路设计、数据采集、模数转换电路设计、液晶显示电路
设计、外围扩充存储器接口电路、时钟电路、复位电路、键盘接口电路等功能模
块电路设计。硬件结构框图2-1:
图2-1硬件结构框图
硬件设计住电路图见附录一
2.3.1MCU的选择与简介
(1)单片机的概念和特点
现代社会中,尽管PC机的应用已经相当普遍,但是,在工控领域,在日益
追求小而精、轻而薄的自动化控制器、自动化仪器仪表、家电产品等方面,PC机仍有所不相适宜的地方。而工业控制、仪器仪表、家电产品等市场广阔,要求
PC机技术与之相适应。在这种情况下,单片机应运而生了(也称作微型计算机)。
微型计算机的基本机构是由中央处理器、储存器、和I/O设备构成的。所谓的单片机是指将微型计算机3个单元的多个分体中的主要功能用1个集成电路芯片来实现,该芯片具有一个微型计算机的基本功能。这种超大规模集成电路芯片
即称为单片微型计算机,通常简称单片机。
单片机具有以下特点:
3
西南科技大学应用型自学考试毕业设计(论文)
?受集成度限制,片内存储容量较小,一般8位单片机的ROM小于8/16K字节,RAM小于256字节,但可在外部扩展,通常ROM、RAM可分别扩展至64K字节。
?可靠性好。芯片本身是按工业测控环境要求设计的,其抗工业噪声干扰优
于一般通用CPU;程序指令及常数、表格固化在ROM中不易破坏;许多信号通道均在一个芯片内,故可靠性高。
?易扩展。片内具有计算机正常运行所必需的部件。芯片外部有许多供扩展
用的三总线及并行、串行输入/输出管脚,很容易构成各种规模的计算机应用系
统。
?控制功能强。为了满足工业控制要求,一般单片机的指令系统中具有极丰
富的条件分支转移指令、I/O口的逻辑操作以及位处理功能。一般说来,单片机
的逻辑控制功能及运行速度均高于同一档次的微处理器。
?一般单片机内无监控程序或系统通用管理软件,只放置有用户调试好的应
用程序。但近年来也开始出现了在片内固化有BASIC解释程序的单片机。
(2)单片机的发展与趋势
由于单片机具有以上特点,因此在工业控制、数据采集、智能仪器仪表、智
能化设备和各种家用电器等领域得到广泛的应用。随着微电子工艺水平的提高,
近十年来单片微型计算机有了飞速的发展。归纳起来,它是沿着两条路发展的:
?改进集成电路制造工艺,提高芯片的工作速度,降低工作电压和降低功耗:
?在保留共同的CPU体系结构,最基本的外设装置(如异步串行口,定时器
等)和一套公用的指令系统的基础上,根据不同的应用领域,把不同的外设装置
集成到芯片内,在同一个家族内繁衍滋生出各种型号的单片机。另外在单片机的
应用中,可靠性是首要因素,为了扩大单片机的应用范围和领域,提高单片机自
身的可靠性是一种有效方法。近年来,单片机的生产厂家在单片机设计上采用了
各种提高可靠性的新技术,主要表现在一下几点:
a)EFT(Electrical Fast Transient)技术;
b)低噪音布线技术及驱动技术;
c)采用低频时钟。
总之,单片机在目前的发展形势下,表现出几大趋势:
4
西南科技大学应用型自学考试毕业设计(论文)
a)可靠性及应用水平越来越高,和internet连接已是一种明显的走向;
b)所集成的部件越来越多;
c)功耗越来越低;
d)和模拟电路结合越来越多。
(3)单片机选择
?本系统采用单片机为控制核心。单片机/MCU主要有51基本型和52增强型,而相比之下52型比51型功能更为强大,ROM和RAM存储空间更大,52还兼容51指令系统。基于本系统设计内容的需要,综合考虑后,我们选择单片机ATME公司的AT89C52为控制核心;主要基于考虑AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM)、6个中断源;时钟频率0-24MHz;器件采用高密度、非易失性存储技术生产,并兼容标准MCS-51指令系统,功能强大。
?AT89C52介绍
AT89C52是美国ATMEL公司生产的低电压,高性能CMOS 8位单片机,片内含8K bytes的可反复擦写的只读程序存储器(PEROM)和256K bytes的随机存取数据存储器,器件采用ATMEL公司的高密度,非易失性存储技术生产,与标准
MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器和FLASH存储单元,功能强大,AT89C52单片机适合于许多较为复杂控制应用场合。
主要性能参数:
, 与MCS-51产品指令和引脚完全兼容
, 8K字节可重擦写FLASH闪存存储器
, 1000次写/擦循环
, 时钟频率:0Hz—24MHz
, 三级加密存储器
, 256字节内部RAM
, 32个可编程I/O口线
, 3个16位定时/计数器
, 6个中断源
, 可编程串行UART通道 图2-2 引脚图
5
西南科技大学应用型自学考试毕业设计(论文)
, 低功耗的空闲和掉电模式
, 片内振荡器和时钟电路
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,片内振荡器及时钟电路,引脚图见2-2。AT89C52可以按照常规方法进行编程,也可
以在线编程。同时,AT89C52可降至0Hz的静态逻辑操作,并支持两种软件可选的
节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止
其他所有部件工作直到下一个硬件复位。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发本。AT89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。
AT89C52引脚功能:
a)Vcc:电源电压。
b)GND:地。
c)P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问器件激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,
校验时,要求外接上拉电阻。
d)P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上
拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上
拉电阻,某个引脚被外部信号拉低时会输出一个电流(I)。 IL
与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2的外部计数输入(P1.0/T2)和输入(P1.1/T2EX),参见表2-1。
Flash编程和程序校验期间,P1接收低8位地址。表2-1为 P1.0和P1.1的第二功能
6
西南科技大学应用型自学考试毕业设计(论文)
表2-1 P1.0和P1.1的第二功能
引脚号 功能特性
P1.0 T2(定时\计数器2外部计数脉冲输入),时钟输出
P1.1 T2EX(定时\计数2捕获\重装载触发和方向控制) e)P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口P2写“1”,通过内部
的上拉电阻把端口拉到高电平,同时可作输入口,作输入口使用时,因为内部存
在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOV@DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如
执行MOV@RI指令)时,P2口输出P2锁存器的内容。
Flash编程或校验时,P2亦接收高位地址和一些控制信号。
f)P3口:P3口时一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们
被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口作为一般的I/O口线外,更重要的用途是它的第二功能,如表2-2所示:
此外,P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
g)RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电
平将使单片机复位。
ALE/:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每 当访问外部数据存储器时将跳过一个ALE脉冲。
7
表2-2 P3口第二功能 西南科技大学应用型自学考试毕业设计(论文)
端口引脚 第二功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 (外中断0)
P3.3 (外中断1)
P3.4 T0(定时/计数器0)
P3.5 T1(定时/计数器1)
P3.6 (外部数据存储器写选通)
P3.7 (外部数据存储器读选通)
对Flash存储器编程器件,改引脚还用于输入编程脉冲()。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位复位,可禁止ALE操作。该位置复位后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
h):程序储存允许()输出是外部程序存储器的读选通信号,当
AT89C52由外部程序存储器取指令(或数据)时,每个机器周期两次有效,即输出两个脉冲。在次期间,当访问外部数据存储器,将跳过两次信号。
i)/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为
0000H-FFFH),端必须保持低电平(接地)。需要注意的是:如果加密位LB1被编程,复位时内部会锁存端状态。如端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
j)XTAL1:振荡器反相放大器及内部时钟发生器的输入端。
k)XTAL2:振荡器反相放大器的输出端。
8
西南科技大学应用型自学考试毕业设计(论文) 2.3.2单片机最小系统的实现
介绍完以上的单片机系统的核心芯片之后,我们采用AT89C52来实现一个单片机系统能运行起来的需求最小的系统,电路图见图2-3:
图2-3单片机最小系统图
上图由晶振电路和复位电路,AT89C52芯片组成,构成最小的单片机系统, 下面详细介绍其中的两个电路。
(1)晶振电路
单片机工作的过程中各指令的微操作在时间上有严格的次序,这种微操作的
时间次序称作时序,单片机的时钟信号用来为单片机芯片内部各种微操作提供时
间基准,89c52的时钟产生方式有两种,一种是内部时钟方式,一种是外部时钟
方式。内部时钟方式即在单片机的外部接一个晶振电路与单片机里面的振荡器组
合作用产生时钟脉冲信号,外部时钟方式是把外部已有的时钟信号引入到单片机
内,此方式常用于多片89C52单片机同时工作,以便于各单片机的同步,一般要
求外部信号高电平的持续时间大于20ns.且为频率低于12MHz的方波。对于CHMOS工艺的单片机,外部时钟要由XTAL1端引入,而XTAL2端应悬空。
本系统中为了尽量降低功耗的原则,采用了内部时钟方式。电路图见图2-4:
9
西南科技大学应用型自学考试毕业设计(论文)
图2-4晶振电路图
在89C52单片机的内部有一个震荡电路,只要在单片机的XTAL1和XTAL2引脚外接石英晶体(简称晶振)就构成了自激振荡器并在单片机内部产生时钟脉冲
信号,图中电容器C1和C2稳定频率和快速起振,电容值在5—30pF,典型值是22pF,晶振CYS选择的是12MHz。
(2)复位电路
?复位的意义
单片机开始工作的时候,必须处于一种确定的状态,否则,不知哪是第一
条程序和如何开始运行程序。端口线电平和输入输出状态不确定可能使外围设备
误动作,导致严重事故的发生;内部一些控制寄存器(专用寄存器)内容不确定
可能导致定时器溢出、程序尚未开始就要中断及串口乱传向外设发送数据„„因
此,任何单片机在开始工作前,都必须进行一次复位过程,使单片机处于一种确
定的状态。
?复位电路原理
当在89C52单片机的RST引脚引入高电平并保持2个机器周期时,单片机内部就执行复位操作(若该引脚持续保持高电平,单片机就处于循环复位状态)。 实际应用中,复位操作有两种基本形式:一种是上电复位,另一种是上电与按键
均有效的复位,上电复位见图3-5,要求接通电源后,单片机自动实现复位操作。
常用的上电复位电路如下图所示。上电瞬间RST引脚获得高电平,随着电容C1的充电,RST引脚的高电平将逐渐下降。
10
西南科技大学应用型自学考试毕业设计(论文)
图2-5上电复位电路图
RST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进
行复位操作。该电路典型的电阻和电容参数为:晶振为12MHz时,C1为22uF:R1为8.2 ;振为6MHz时,C1为22uF,R1为1。 K,K,
本设计中复位电路采用的是开关复位电路,开关S9未按下是上电复位电路,上电复位电路在上电的瞬间,由于电容上的电压不能突变,电容处于充电(导通)
状态,故RST脚的电压与VCC相同。随着电容的充电,RST脚上的电压才慢慢下降。选择合理的充电常数,就能保证在开关按下时是RST端有两个机器周期以上的高电平从而使AT89C52内部复位。开关按下时是按键手动复位电路,RST端通过电阻与VCC电源接通,通过电阻的分压就可以实现单片机的复位。电路图见图
2-6:
11
西南科技大学应用型自学考试毕业设计(论文)
图2-6复位电路图 2.3.3数据采集系统
(1)从传感器过来的电压信号,必须放大,滤波,采集,转换才能被MCU识
别和处理。由于假若每一路都设置放大、滤波等器件,那么成本会很大,所以信
号的采集一般用多路模拟通路进行选择。然而选择多路模拟开关时必须考虑以下
的几个因素:通道数量、切换速度、开关电阻和器件的封装形式。总之数据采集
与硬件的选择有很大的关系。
(2)甲醛传感器的选择
甲醛传感器由甲醛探头CH20传感器组成。甲醛传感器/甲醛模块(CH2O传
感器)详细介绍如下表2-3:
(3)测量电路
测量电路由CH20/S-10甲醛传感器,ADC0832组成。甲醛传感器由甲醛探头和CH20传感器组成。当空气被内部的采样系统吸收后,产生一个与甲醛浓度成
正比的电压信号, 该电压信号经AD0832与AT89C52单片机相连,在显示器上显示出甲醛的浓度值,当超过国家规定的标准时报警。
12
表2-3 传感器参数表 西南科技大学应用型自学考试毕业设计(论文)
名称 甲醛传感器 CH2O/S-10:
测量范围 0- 10 ppm
最大负荷 50ppm
工作寿命 空气中3年
输 出 1200?300nA/ppm4-20mA(甲醛模块)
分辨率 0.05 ppm
温度范围 -20? to 45?
压力范围 大气压?10%
响应时间 (T 90) 〈 50 seconds
湿度范围 -20? to 45?
零点输出 (纯净空体,20?) 〈 0.1 ppm
最大零点漂移(20?to 40?) 0.1 ppm
长期漂移 〈2% /每月
推荐负载值 10Ω
线性度输出 线性
重 量 约32克 2.3.4模数转换的选择与简介
(1)实现A/D转换的基本方法很多,有计数法、逐次逼近法、双斜积分法
和并行转换法。由于逐次逼近式A/D转换具有速度,分辨率高等优点,而且采用
这种方法的ADC芯片成本低,所以我们采用逐次逼近式A/D转换器。逐次逼近型ADC包括1个比较器、一个模数转换器、1个逐次逼近寄存器(SAR)和1个逻辑控制单元。逐次逼近型是将采样信号和已知电压不断进行比较,一个时钟周期完
成1位转换,依次类推,转换完成后,输出二进制数。这类型ADC的分辨率和采样速率是相互牵制的。优点是分辨率低于12位时,价格较低,采样速率也很好。
(2)由于ADC0832模数转换器具有8位分辨率、双通道A/D转换、输入输出电平与TTL/CMOS相兼容、5V电源供电时输入电压在0~5V之间、工作频率为250KHZ 、转换时间为32微秒、一般功耗仅为15MW等优点,适合本系统的应用,所以我们采用ADC0832为模数转换器件。电路图见图2-7如下:
13
西南科技大学应用型自学考试毕业设计(论文)
图2-7模数转换电路图
(3)ADC0832 具有以下特点:
?8位分辨率;
?双通道A/D转换;
?输入输出电平与TTL/CMOS相兼容;
?5V电源供电时输入电压在0~5V之间;
?工作频率为250KHZ,转换时间为32μS;
?一般功耗仅为15mW;
?8P、14P—DIP(双列直插)、PICC 多种封装;
?商用级芯片温宽为0?C to +70?C,工业级芯片温宽为?40?C to +85?C;
芯片接口说明:
?CS_片选使能,低电平芯片使能。
?CH0模拟输入通道0,或作为IN+/-使用。
?CH1模拟输入通道1,或作为IN+/-使用。
?GND 、芯片参考0电位(地)。
?DI数据信号输入,选择通道控制。
?DO数据信号输出,转换数据输出。
?CLK芯片时钟输入。
?Vcc/REF电源输入及参考电压输入(复用)。
14
西南科技大学应用型自学考试毕业设计(论文)
ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压
输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,
以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂
接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能
的选择。
单片机对ADC0832的控制原理:
正常情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、
DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所
以电路设计时可以将DO和DI并联在一根数据线上使用。当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。
此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能。
(4)测量量程
本系统的量程为0-10ppm。由于我所使用的是8位ADC0832,所以本系统的精度为:10ppm/256=0.039ppm。
2.3.5按键选择与简介
(1)本系统应用有人机对话功能,该功能即能随时发出各种控制命令和数
据输入以及和LCD连接显示运行状态和运行结果。键盘分为:独立式和矩阵式两
类,每一类按其编码方法又可以分为编码和非编码两种。由于本系统只有UP、
DOWN、OK、CANCEL4个控制命令,所需按键较少,所以本系统选择独立式按键。
电路图见图2-8:
15
西南科技大学应用型自学考试毕业设计(论文)
图2-8按键电路图
(2)独立式按键是直接用I/O口线构成的单个按键电路。每个独立式按键
占有一根I/O口线。各根I/O口线之间不会相互影响。在此电路中,按键输入部
采用低电平有效,上拉电阻保证了按键断开时,I/O口线有确定的高电平,(AT89C52.P1口内部接有上拉电阻)所以就不需要再外接上拉电阻。
(3)键盘抖动的消除:抖动的消除大致可以分为硬件削抖和软件削抖。
?硬件削抖是采用硬件电路的方法对键盘的按下抖动及释放抖动进行削抖,
经过削抖电路后使按键的电平信号只有两种稳定状态。
?软件削抖的基本原理是当检测出键盘闭合时,先执行一个延时子程序产生
数毫秒的延时,待接通时的前沿抖动消失后再判别是否有健按下。当按键释放时,
也要经过数毫秒延时,待后沿抖动消失后再判别键是否释放。
?由于应用硬件削抖还需要外加器件,成本相对较高,所以本系统选择软件
延时削抖的方法。
2.3.6外围扩充存储器
基于AT89C52单片机具有8KB的程序存储器(ROM),256B的数据存储器(RAM),由于考虑到本系统的数据处理与存储所需的容量,现在需要扩充存储器
的容量。在应用中要保存一些参数和状态,据了解基于EEPROM的存储芯片是一种很好的选择。我们选定了AT24C128存储器。电路图见图2-9:
16
西南科技大学应用型自学考试毕业设计(论文)
图2-9外围扩充存储电路图
2.3.7时钟芯片选择与简介
因为此系统需要记录测量发生的时间,所以需要时钟芯片来记录不同人在不
同时间的监测数据,因此我们在系统中加入了时钟芯片。对时钟芯片的要求首先
是低功耗,其次是编程简单,缩短程序开发时间,实际上也就缩短了系统用于实
际生产所用的开发周期以及成本,在本系统,我们选择了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:串行时钟输入端。
(4)日历、时钟寄存器与控制字对照表、日历、时钟寄存器命令字、取值
范围以及各位内容对照表。见表2-4:
17
西南科技大学应用型自学考试毕业设计(论文)
表2-4时钟控制字对照表
命令字 各位内容 取值 寄存器名 范围 写操作 读操作 7 6 5 4 3~0
秒寄存器 80H 81H 00~59 CH 10SEC SEC
分寄存器 82H 83H 00~59 0 10MIN MIN
01~12 12/时寄存器 84H 85H 0 10/(A/P) HR HR 00~23 24
01~28,日寄存器 86H 87H 0 0 10DATE DATE 29、30、31
月寄存器 88H 89H 01~12 0 0 0 10M MONTH
周寄存器 8AH 8BH 01~07 0 0 0 0 DAY
年寄存器 8CH 8DH 01~99 10YEAR YEAR 写保护寄存器 8EH 8FH WP 0 0 0 0
DDRR慢充电寄存器 90H 91H TCS TCS TCS TCS S S S S 时钟突发寄存器 BEH BFH
(5)DS1302数据输入/输出时序
数据输入是在输入写命令字的8个SCLK周期之后,在接下来的8个SCLK周期中的每个脉冲的上升沿输入数据,数据从0位开始。如果有额外的SCLK周期,它们将被忽略。
数据输出是在输出命令字的8个SCLK周期之后,在接下来的8个SCLK周期中的每个脉冲的下降沿输出数据,数据从0位开始。需要注意的是,第一个数据
位在命令字节的最后一位之后的第一个下降沿被输出。只要RST保持高电平,如 果有额外的SCLK周期,将重新发送数据字节,即多字节传送。其电路图见图2-10:
18
西南科技大学应用型自学考试毕业设计(论文)
图2-10时钟电路图 2.3.8上拉电阻
在主电路图中接在P0口处有一个排阻RP1,由于P0口没有内接上拉电阻,为了为P0口外接线路有确定的高电平,所以要接上排阻RP1,以确保有P0口有
稳定的电平。电路连接图见图3-11:
图2-11上拉电阻电路图
19
2.3.9液晶显示器简介 西南科技大学应用型自学考试毕业设计(论文)
对于本系统要有显示装置完成显示功能。显示器最好能够显示数据、图形。
考虑到同种LCD显示器的屏幕越大体积越大,功耗越大的特点,在同类产品中选
用了AMPIRE128X64液晶显示模块。该型号显示器消耗电量比较低,可以满足系统
要求。该类液晶显示模块采用动态的液晶驱动,可用5V供电。
(1)AMPIRE128X64液晶模块引脚说明AMPIRE128X64液晶共有22个引脚,引
脚说明如表2-5所示:
管脚名称 管 脚 定 义
/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接地端
表2-5液晶引脚说明图
AMPIRE128X64液晶显示模块与计算机的接口电路有两种方式。它与单片机
的接口方法分为直接访问方式和间接控制方式。直接访问方式是把液晶模块作为
存储器或I/O设备直接接在单片机的总线上,单片机以访问存储器或I/O设备的
方式操作液晶显示模块的工作。间接控制方式则不使用单片机的数据系统,而是
利用它的I/0口来实现与显示模块的联系。即将液晶显示模块的数据线与单片
20
西南科技大学应用型自学考试毕业设计(论文) 机的Pl口连接作为数据总线,另外三根时序控制信号线通常利用单片机的P3口中未被使用的I/O口来控制。这种访问方式不占用存储器空间,它的接口电路
与时序无关,其时序完全靠软件编程实现。本系统采用间接控制方式。
液晶显示工作原理介绍
以下为液晶显示电路接线原理图见图2-1
图2-12液晶电路图
(2)在单片机系统中应用液晶显示器作为输出器件有以下几个有点:
?显示质量高:由于液晶显示器每一个点在收到信号后就一直保持那种色彩
和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
?数字式接口:液晶显示器都是数字式的,和单片机系统的接口更加简单可
靠,操作更加方便。
?体积小、重量轻:液晶显示器通过显示屏上的电极控制液晶分子状态来达
到显示的目的,在重量上比相同显示面积的传统显示器要轻的多。
?功耗低:相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动
IC上,因而耗电量比其他显示器要少的多。
21
西南科技大学应用型自学考试毕业设计(论文)
(3)LCD按其显示方式通常可以分为断式、点字符式、点阵式等。还有黑
白、多灰度、彩色显示等。液晶显示原理是利用液晶的物理特性,通过电压对其
显示区域进行控制,有电就显示黑色,这样就可以显示出图形。针对于本系统要
显示汉字,字母,数字等,以及其在一个界面同时要显示的字数,本系统要以图
形的形式显示各运行结果,我们最终选择AMPIRE128x64型号的LCD。?字符显示:字符显示比较复杂,一个字符由16x8点阵组成,即要找到和显示屏是某几
个位置对应的RAM区的字节,再使不同的位置为‘1’其他的为‘0’;为‘1’的点亮,为‘0’的不亮,这样就显示出一个字符。?汉字显示:汉字显示和字符
显示的原理差不多,就是一个汉字一般采用图形方式,事先从微机中用字模软件
提取要显示的汉字的点阵码,每个汉字占32B,为为两部分,各16B。根据在LCD上开始显示的行列号及每行的列数就可以找出显示RAM的对应地址,送上汉字要
显示的第一字节,以此类推,最后送完32B,这样汉字就显示出来了。
系统的液晶显示字体和字母的显示就是按照上述的原理显示的,点阵码是用
字模软件在相同的设置区域找出的。然后把提取的点阵码放入编写的LCD软件程序里。
(5)阵码获取过程简介:首先,打开软件,然后新建文件,因为汉字占32B所以设置其为高度和宽度16x16。取模方式选择C51格式在文字输入区输入汉字,
在点阵区生成点阵码,例如在文字输入区输入“欢”字,其点阵码生成如下:
图2-13点阵生成截图
2.3.10报警电路
在单片机应用系统中,一般的工作状态可以通过指示灯或数码显示来指示,
供操作人员参考,了解系统的工作状况。但对于某些紧急状态,比如系统检测到
的错误状态等,为了使操作人员不至于忽视,及时采取措施,往往还需要有某种
更能引人注意,提起警觉的报警信号。这种报警信号通常有三种类型:一是闪光
报警,因为闪动的指示灯更能提醒人们注意;二是鸣音报警,发出特定的音响,
作用于人的听觉器官,易于引起和加强警觉;三是语音报警,不仅能起到报警作
22
西南科技大学应用型自学考试毕业设计(论文) 用,还能直接给出警报种类的信息。其中,前两种报警装置因硬件结构简单,软
件编程方便,常常在单片机应用系统中使用;而语音报警虽然警报信息较直接,
但硬件成本高,结构较复杂,软件量也增加。单频音报警实现单频音报警的接口
电路比较简单,其发音元件通常可采用压电蜂鸣器,当在蜂鸣器两引脚上加3~15V直流工作电压,就能产生3kHZ左右的蜂鸣振荡音响。压电式蜂鸣器结构简
单、耗电少,更适于在单片机系统中应用。压电式蜂鸣器,约需10mA的驱动电流,可在某端口接上一只三极管和电阻组成的驱动电路来驱动,如图2-14所示。在图2-14中,P1.0接三极管基极输入端,当P1.0输出高电平“1”时,三极管
导通,蜂鸣器的通电而发音,当P1.0输出低电平“0”时,三极管截止,蜂鸣器
停止发音。
图2-14单频音报警电路图
基于本系统的需求和功耗要求,只需要基本的报警功能即可,我选择采用的
是三极管驱动的单音频报警电路。
以下为报警电路接线图见图2-15:
23
西南科技大学应用型自学考试毕业设计(论文)
图2-15报警电路图
2.3.11硬件仿真环境介绍
Proteus ISIS是英国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软件的工作环境和一些基本操作。
24
西南科技大学应用型自学考试毕业设计(论文)
图2-16ISIS 6 Professional图标
进入Proteus ISIS:双击桌面上的ISIS 6 Professional图标(见图2-16)或者单击屏幕左下方的“开始”?“程序”?“Proteus 6 Professional”?“ISIS 6 Professional”,出现如图2-15所示屏幕,表明进入Proteus ISIS集成环境。工作界面:Proteus ISIS的工作界面是一种标准的Windows界面,如图2-17所示。包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、
预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形
编辑窗口。
图2-17工作界面
25
西南科技大学应用型自学考试毕业设计(论文)
软件设计部分主要包括:编写语言的选择、主程序/子程序流程的设计、功
能模块程序的编写、软/硬件结合调试与演示。主要包括一下功能模块:51驱动、检测、液晶显示、时钟、键盘、模数软换。软件结构框图3-1:
图3-1软件结构框图
对于单片机的开发应用中,逐渐引入了高级语言,C语言就是其中的一种。
汇编语言的可控性较高级语言来说更具优越性。程序编写语言比较常见的有C语言、汇编语言。汇编语言的机器代码生成效率高,控制性好,但就是移植性不高。
C语言编写的程序比用汇编编写的程序更符合人们的思考习惯。还有很多处
理器都支持C编译器,这样意味着处理器也能很快上手。且具有良好的模块化、
容易阅读、维护等优点,且编写的模块程序易于移植。基于C语言和汇编语言的优缺点,本系统采用C语言编写方法。
软件编写的主体思路是将系统按功能模块化划分,然后根据模块要实现的功
能写各个子程序。整个软件程序的编写采用查询式方式编写的。
26
西南科技大学应用型自学考试毕业设计(论文) 主程序实现的功能:与硬件相结合实现便携式甲醛检测仪的各个功能。主要
是检测与显示,时间调整与显示,数据存储。功能子函数的调用。见图3-2:
图3-2主程序流程图 检测主程序程序见附录二。
(1)模数转换模块的主要功能就是将经放大器放大的模拟电压信号转化为
MCU能够处理的数字信号,并传送给MCU。
(2)ADC0832转换的流程图见下图3-3:
图3-3数转换流程图 (3)ADC0832程序见附录三。
27
西南科技大学应用型自学考试毕业设计(论文) (1)按键时显现人机对话的一个控制按钮,通过按键的操作,对系统进行
发送操作指令,后经与MCU串行通信,然后在液晶上显示。 (2)按键查询式的流程图见下图:
图3-4按键查询式的流程图 (3)按键程序见附录四。
(1)DS1302模块主要是用于设置时间和与MCU通信经LCD显示时间。
(2)时钟模块操作流程图见下图:
28
西南科技大学应用型自学考试毕业设计(论文)
图3-5时钟模块操作流程图 (3)时钟程序见附录五。
(1)LCD模块在本系统中主要起着开界面汉字显示,以及各控制效果的显
示。采用直接访问方式。
(2)液晶显示的操作流程图见下图3-6:
图3-6液晶显示的操作流程图 (3)液晶程序见附录六。
29
西南科技大学应用型自学考试毕业设计(论文)
前面已经把单片机系统的硬件设计和软件设计完成了,下一步就可以着手
进行仿真,因为在设计的过程之中肯定有许多的错误,需要进行仿真来发现错误
和调试错误。这样才能使单片机低功耗计数系统的设计更加完善,本次系统仿真
采用的是软件仿真,使用的是proteus软件。
Proteus软件由ISIS和ARES两个软件构成,其中ISIS是原理图编辑与仿真软件,ARES是布线编辑软件。本次系统的硬件设计其中的原理图编辑和PCB布线就是在这个软件环境中完成的,至于软件设计,则是采用proteus软件中的ISIS和Keil uVision进行联合调试。当硬件设计和软件设计都完成的时候就可以看到虚
拟的基于单片机的低功耗计数系统的运行,以下为仿真效果:
(1)编译结束,添加HEX文件单击PROTEUS运行按钮,本系统主界面显示图如
图4-1所示:
图4-1主界面显示图
(2)系统接下来显示,4个基本操作功能,小对号为该操作显示项,如图
4-2:
图4-2功能界面
(3)选择“开始测量”,单击“OK”键,便有下面测量选择界面,如图4-3:
30
西南科技大学应用型自学考试毕业设计(论文)
图4-3测量选择界面
(4)再按“OK”,则显示检测数据,范围0-10ppm.如图4-4
图4-4测量界面显示图
(5)4个功能的操作和演示是相同的,以下为“时间设置”显示图,如图
4-5:
图4-5当前时间显示图
(6)小结:本系统原先打算设计“开始测量”、“数据存储”、“时间设置”
“通讯设置”等4个基本功能,后由于条件所限,我们并未做出全部的功能,但
这次的毕业设计,收获还是很多的!今后我会进一步进完善该系统。
31
西南科技大学应用型自学考试毕业设计(论文)
目前,公共场所民用建筑室内需要检测甲醛气体,同样建筑材料中甲醛含量
也需要检测。由于甲醛含量超量的话,将对人体健康造成很大的影响。具有民用
价值的便携式甲醛检测仪的研制受到了人们的高度重视。设计能够满足生活需
要,携带方便的便携式甲醛检测仪迫在眉睫。针对目前的现状,该系统设计遵守
体积小,质量轻,性价比高的原则。
便携式甲醛检测仪的设计主要分为硬件设计和软件设计。根据设计前对该系
统所要实现功能的要求,综合考虑我采用AT89C52单片机为控制核心。
软件是基于汇编与C语言相结合编写的,结合了两种编写语言的优点,具有
很好的可控性、模块化和移植性。编写的思路就是模块化的思想,将系统的各个
功能进行划分,然后对各个模块进行设计。本系统的主要模块为甲醛检测、A/D转换、液晶显示和时钟设置。
软件与硬件相结合的演示的大体流程是:主页面-----显示4个子菜单功能----按键的4个控制-----进入子菜单-----有确认和取消-----按确认----实现相应功能(按取消则返回)。由于所学知识的限制,本系统实现的功能不是很健
全,但在设计该系统的过程中,让我学会了系统设计的方法,和养成了系统思考
的思维方式。
首先要了解系统所要实现的功能;其次根据功能去选择相应的硬件资源;再次
将一个大的系统进行模块化划分,然后逐一去攻破。最后把所有模块进行优化整
合,便得到了一个完整的系统。基于这样的思路,才完成了便携式甲醛检测仪的
基本设计。
32
西南科技大学应用型自学考试毕业设计(论文)
本论文是在老师的悉心指导下完成的。覃老师渊博的专业知识,严谨的治学
态度,精益求精的工作作风,诲人不倦的高尚师德,严以律己、宽以待人的崇高
风范,朴实无华、平易近人的人格魅力对我影响深远。不仅使我树立了远大的学
术目标、掌握了基本的研究方法,还使我明白了许多待人接物与为人处世的道理。
本论文从选题到完成,每一步都是在覃老师的指导下完成的,倾注了覃老师大量
的心血。在此,谨向覃老师表示崇高的敬意和衷心的感谢!
我的毕业课题是便携式甲醛显示器的设计,是一个实际的小
。作为一个
自学本科的学生,我对实际的工程设计认识不够,经验不足,难免在设计的整体
框架中,有很多的细节没有考虑。我们的指导老师:覃智广老师并没有指责,而
是给予我们鼓励和很多宝贵的建议,并且悉心引导,给予我们一个比较清晰的设
计思路。我们沿着这条经验之路,不断地尝试摸索,慢慢地也掌握了设计的基本
流程和思考的方法。我们遇到了很多的难题,比如硬件器件的选择,功能的实现
等。然而这样的问题并不是我一个能所能解决的,幸运的是有我们的指导老师的
悉心指导和同学的全心帮助,所以一个个看似复杂的问题便迎刃而解。
最后我还要再次深深地感谢各位给予我帮助的老师、同学,正是基于老师的
悉心指点和大家的全心的帮助,我才能比较顺利地完成毕业设计。谢谢你们。
33
西南科技大学应用型自学考试毕业设计(论文) [1] 李维提,郭强.液晶显示应用技术.北京:电子工业出版社,2000年 [2] 赵茂泰.智能仪器原理及应用.北京:电子工业出版社,2001 [3] 赵新民.智能仪器原理及设计.哈尔滨工业大学出版社,1995 [4] 徐爱钧,彭爱华.单片机高级语言C51应用程序设计.北京工业出版社,1999 [5] 严蔚敏,吴伟民.数据结构.清华大学出版社,1996
[6] 马忠梅.单片机的C语言应用程序设计.北京:北京航空航天大学出版社,1997 [7] 华成英,童诗白. 模拟电子技术基础第三版.北京: 高等教育出版社,2004 [8] 丁元杰.单片微机原理及应用.北京:机械工业出版社,1993
[9] 康华光.电子技术基础:模拟部分 武汉:高等教育出版社,1999年
34
西南科技大学应用型自学考试毕业设计(论文)
35
西南科技大学应用型自学考试毕业设计(论文) #include
//调用外函数// #include
#include
#include
#include
#include
#include /**********初始化CPU************/ void init_cpu() //初始化cPu { EA=1;
TR0=1;
TR1=1;
TMOD=0x11;
TH1=0x3c;
TL1=0xb0;
}
/*void time1(void) interrupt 3 using 1
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
keyval=P1;
} * //初始化CPU结束// void main_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;
36
西南科技大学应用型自学考试毕业设计(论文)
„„ //还有“数据存储”、“时间设置”„„//
}
void measure_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;
}
„„ //还有void store_menu_initial()、void time_menu_initial()// void led_menu_pro() {
max_item=menu_led->menu_count;
switch(keyval)
{
case 0: break;
case 1: //向上键.
if(user_choosen==0)
{
user_choosen=max_item;
}
shuaxin=1;
user_choosen--;
37
西南科技大学应用型自学考试毕业设计(论文)
break;
}
„„ //“向上”“向下”“确认”“取消”键//
if(shuaxin) //是否需要刷新LCD标志位.
{ Clr_Scr();
shuaxin=0;
}
led_menu_show();
}
v oid led_menu_show()
{
uchar n;
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)
{ case 0:
draw_bmp(0,20,96,0,measurearray); //“开始测量”数组
//
break;
„„
default:
break;
}
38
西南科技大学应用型自学考试毕业设计(论文)
for(n=0;n>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
_nop_();
_nop_();
dat=0;
41
西南科技大学应用型自学考试毕业设计(论文)
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;
42
西南科技大学应用型自学考试毕业设计(论文)
return(dat); //return ad k
}
/*----------------------点阵字符采集函数--------------------------*/
void tra(uchar *p) //数组dsp[]里面的字符查询后,再储储存到另一个显示数组value[]
void main_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])
{
case 0:
sz_disp16(2,32,1,sz0);
break;
case 1:„„sz_disp16(2,32,1,sz9);
}
switch(dsw[1])
{
case 0:
43
西南科技大学应用型自学考试毕业设计(论文)
sz_disp16(2,40,1,sz0);
break;
case 1:„„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);
}
#define nullkey 0 //定义//
„„
uchar get_key() //读键//
{
uchar pass,kcodebuf;
static uchar lastkcode,keytime=0; //定义为静态变量,外部不可见,
但需要常驻内存.
static uchar havekey=0;
static uchar keylock=0;
kcodebuf=P1 & 0xff;
keytime++;
if (kcodebuf!=lastkcode) keytime=0;
if (kcodebuf==0xff)
{ havekey=0;
keylock=0;
44
西南科技大学应用型自学考试毕业设计(论文)
keytime=0;
pass=0; }
„„
else pass=nusekey;
lastkcode=kcodebuf;
return(pass);
}
/*uchar get_key()
else pass=nusekey;
return(pass);
} */
/*--------------------引脚连接
-------------------------------------*/
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 InputByte(unsigned char Date);
void WriteTo1302(unsigned char Addr,unsigned char Date);
45
西南科技大学应用型自学考试毕业设计(论文)
ReadFrom1302(unsigned char Addr);
void SetTime(unsigned char *pSecDa);
void GetTime(unsigned char Curtime[]);
void Init_T0(void);
void FlashKey(void);
void Add(void);
void Init_Clock(void);
void Refresh(void);
void StartMenu(void)
/*------------------------时钟固定汉字显示-----------------------*/ void ClockMsg(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);„„ //月//日//分//秒
}
/*----------------时钟部分-------------------------------*/
/*----------------函数:写入字节子函数-----------*/ void InputByte(unsigned char dat)
{
unsigned char i;
ACC = dat;
for(i=8; i>0; i--)
46
西南科技大学应用型自学考试毕业设计(论文)
{
IO = ACC0;
CLK = 1; //下降沿写入数据//
CLK = 0;
ACC = ACC >> 1;
}
}
/*----------------函数:读出字节子函数-----------*/ OutputByte(void) //上升沿读出数据// „„
/*----------------函数:设置初始时间-------------------*/ void SetTime(unsigned char *pSecDa)
{ „„
WriteTo1302(0x8e,0x00); // 控制命令,WP=0,写操作 //
for(i =7;i>0;i--)
{
WriteTo1302(Addr,*pSecDa); // 秒 分 时 日 月 星期 年 //
pSecDa++;
Addr +=2;
}
WriteTo1302(0x8e,0x80); // 控制命令,WP=1,写保护 //
}
/*----------------函数:读取DS1302当前时间-------------------*/ void GetTime(void)
{ „„
for (i=0;i<7;i++)
{ Curtime[i] = ReadFrom1302(Addr);
Addr += 2;
}
sec = Curtime[0];„„ //Min//hour //day //date //month //year }
47
西南科技大学应用型自学考试毕业设计(论文) /*----------------函数:初始化定时器T0子函数-------------------*/ void Init_T0(void)
{
TMOD=0x01; //定时器T0,工作模式1//
TH0=0x3c; //50ms//
„„
}
/*----------------函数:产生闪烁信号子函数------------------------*/ void T0_flash(void) interrupt 1 // 中断程序,产生时钟秒信号 //
/*----------------函数:时间闪烁子函数----------------------------*/
/*----------------功能:选择确定闪烁位等待调整--------- -----*/ void FlashKey(void) //闪烁子函数// void Add(void) //调时子函数// void Init_Clock(void) //时钟初始化子函数// void Refresh(void) //刷新显示子函数// void Add(void) //调时子函数//
{
if(P1_2==0) //按P0_2键进行时间调整//
{
while(P1_2==0)
Refresh();
if(KT==1) //检验可调标志位KT//
{
hms++;
switch(n)
{case 1:year=hms;break; //根据n不同,返回给不同的位:n=1 -> 返
回给小时位//
„„}
if((sec&0x0f)==0x0a) {sec&=0xf0; sec+=0x10;} // 如果秒位满十,向十秒位进一
„„
48
西南科技大学应用型自学考试毕业设计(论文)
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
//
}
/ *-------------------------时钟初始化子函数----------------------------*/
void Init_Clock(void)
{
K1=1; K2=1; K3=1; K4=1; K5=1;
K6=1; K7=1; KT=0; n=0;
Init_T0();
}
/*-------------------------- 刷新显示子函数--------------------------*/
void Refresh(void)
{
GetTime();
CS1=1;CS2=0;
if(K6)
{ sz_disp16(5,40,1,shuzi[sec&0x0f]); // 秒位 //
49
西南科技大学应用型自学考试毕业设计(论文)
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); }
/*-----------------------------状态判断于提示
------------------------*/
void State(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); }
/*--------------------------位定义--------------------------*/
sbit RST = P2^0; // 复位端 //
sbit E = P2^1; // 使能端 //
„„
#define Disp_On 0x3f // 显示开指令 //
#define Disp_Off 0x3e // 显示关指令 //
#define Col_Add 0x40 // 定位到第0列指令 //
#define Page_Add 0xb8 // 定位到第0页指令 //
#define Start_Line 0xc0 // 定位从DDROM中的第0行开始往屏幕上显示
50
西南科技大学应用型自学考试毕业设计(论文)
unsigned char code measurearray[] /*调入了一幅图像:测量:宽度x高度=96x16*/
unsigned char code storearray[] /*调入了一幅图像:存储:宽度x高度=96x16*/
„„ //还有时间设置,开始测量等图像„„//
/*------------------------------汉字点阵码————————*/
char code huan[]={ // 欢 16*16 //
0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,0x0F,0xE8,0x08,0x08,0x28,
0x18,0x08,0x00,
0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,0x0C,0x03,0x06,0x18,0x30,
0x60,0x20,0x00
};„„//迎,使,用,等汉字如其所示//
/*------------------------------字母点阵码
---------------------------*/
char code Kg_K[]={ // 字母K 8*16 //
0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,
0x38,0x20,0x00,
};
nsigned char code FirstPage[]={ // 开机画面 DPY工作室 //
void delay(unsigned int t) //延时//
{
unsigned int i,j;
for(i=0;i