1、第第4 4章章 基于基于RS-485RS-485总线的总线的多点温度测控系统设计多点温度测控系统设计 4.1 引言引言 4.2 多点温度测控系统设计任务书多点温度测控系统设计任务书 4.3 设计方案设计方案 4.4 多点温度采集控制器的硬件电路设计多点温度采集控制器的硬件电路设计 4.5 温度测量控制节点控制器设计温度测量控制节点控制器设计 4.6 软件设计软件设计 4.7 程序清单程序清单 4.1 引引 言言温度的测量、传输和控制是控制领域的老话题,涉及到工农业生产及日常生活中的各个领域。随着技术的进步和人们生活质量的不断改进,智能化、网络化、大范围内的温度测量及控制问题越来越多。本设计针对
2、大范围、相距较远的多点温度测量及控制问题提出了以RS-485总线组成控制网络,以智能温度传感器实现温度的测量,以可远程控制的继电器接点实现温度调节的网络温度测控系统设计方案,为解决类似问题提供了一种简单易行的解决方案。4.2 多点温度测控系统设计任务书多点温度测控系统设计任务书1.设计任务设计任务多点温度测量控制系统的设计从硬件角度划分为两个部分。第一部分是“多点温度采集控制器设计”,该部分要求设计制作一个多点温度采集控制器,该控制器可以通过RS-485总线与底层的温度测控节点通信,采集各个点的温度并通过LCD模块进行显示,还可以通过RS-485总线向控制节点发送控制命令对温度进行调节;第二部
3、分是“温度测控节点控制器设计”,该部分要求设计制作一个通用温度测量及控制节点控制器,要求该控制器能够进行温度测量和存储,并能够通过RS-485总线与上位机通信,实现温度的采集和控制。2设计要求设计要求该控制系统根据硬件的划分其设计要求也分为下述两部分。1)多点温度采集控制器的设计要求(1)实现控制器与温度控制节点的RS-485通信,可连接的温度测量节点数目最多可达255个。(2)采用MCS-51单片机组成单片机控制系统,设计单片机与图形LCD之间的接口电路,用LCD显示器循环显示各温度控制节点的温度及其他信息。(3)在该系统中设计一个键盘接口,用于输入用户命令。(4)编程实现LCD、键盘的驱动
4、,实现友好的人机交互界面;编程实现RS-485的通信功能。2)温度测控节点控制器的设计要求(1)设计并制作以单片机为微处理器的控制电路。(2)温度传感器测温范围:-10120,精度达到9位。(3)可存储温度点数为100。(4)可通过RS-485接口实现温度数据的传输,把本地温度上传到主机。(5)可通过继电器驱动本地的温度调节功率设备工作。4.3 设设 计计 方方 案案根据多点温度测量控制系统的具体任务和设计要求,本设计所要解决的主要问题从硬件的角度来划分包含两多点方面,其一是多点温度采集控制器设计,其二是温度测控节点控制器设计。多个温度测控节点与温度采集控制器通过RS-485总线连接在一起组成
5、一个完整的RS-485网络,其中温度采集控制器作为RS-485网络系统中的主机,控制整个总线,温度测控节点作为从机,响应主机的呼叫请求。RS-485总线通信无疑是这一系统的核心,没有RS-485的通信网络,这一系统是无法实现设计任务所提出的各项要求的。因此从整个系统的角度来看,该系统是一个具有单一主机多个从机的典型RS-485网络测控系统,其系统结构如图4-1所示。图4-1 多点温度采集控制系统结构框图 在该系统中,主机的多点温度采集控制器的主要功能为:通过RS-485总线采集各个从节点的温度信号,并可以通过总线设置各个从机节点的目标温度;为了方便用户操作,主机系统设置了友好的人机接口,通过一
6、个具有8个键的键盘输入用户命令,通过LCD液晶显示屏显示采集的节点温度、节点号、设置信息等内容。从机节点的主要功能为:通过数字化的集成温度传感器测量对应节点的温度,通过RS-485总线把温度信号传送给主机,并接收主机的温度设置命令,如果该节点的温度超过设定温度,继电器控制的功率设备将对温度进行调节。除此之外,从节点还具有E2PROM,可实现温度的存储和记录等功能。4.4 多点温度采集控制器的硬件电路设计多点温度采集控制器的硬件电路设计4.4.1 概述概述多点温度采集控制器的硬件电路设计框图如图4-2所示。在该系统中,主处理器选用了MCS-51系列兼容单片机WINBOND公司生产的W78E58B
7、P,该芯片具有36 KB的程序存储容量,片上资源丰富,并增加了P4口方便用户使用。系统中键盘用于输入用户命令,并通过LCD显示屏显示各种信息。为了较好地实现人机交互界面,该系统设置了具有8个按键的键盘,选用了北京青云创新科技发展有限公司的图形LCD液晶显示屏LCM12864来显示信息。图4-2 多点温度采集控制器结构框图系统中扩展了32 KB的SRAM,用来记录和存储各个节点的历史温度,当系统中的节点数目较多并要求记录较多的历史温度时需要较大的静态存储器,这时可以采用外部的静态RAM来存储这些温度记录。主机RS-485接口用来实现通信,构成网络后该主机是系统中唯一的主机,所有的总线访问都由该主
8、机发起,从机节点响应主机的呼叫完成地址和命令识别、应答、数据的传送等功能,从而实现有序的总线通信。4.4.2 主机及人机交互电路设计主机及人机交互电路设计在该系统的设计中,采用了总线方式进行存储器和I/O端口的扩展。图4-3是主处理器W78E58B及其总线扩展电路。从图中可以看出,AD7.0经过74LS373锁存形成低8位地址A7.0,再与由P2口送出的高8位地址A15.7共同形成16位地址总线A15.0。图4-4是系统中扩展的SRAM与总线之间的连接图,从图中可以看出,当A15为低电平时进行总线访问并选中SRAM芯片62256,其地址范围为0000H7FFFH。图4-3 主处理器及其总线扩展
9、结构图4-4 SRAM扩展连接图 系统中为了实现键盘和LCD接口,采用了一片74LS138进行地址译码。图4-5是I/O端口地址译码电路图,从图中可以看出,当A15为高电平时译码电路工作,采用地址总线信号里的A2、A1、A0作为译码输入信号,即采用了一种部分译码的方式进行译码。译码输出信号和分别用于键盘接口和LCD显示器接口的访问控制。从该译码电路也不难看出,键盘接口和LCD接口映射的端口地址分别为8000H和8001H,其中键盘接口为输入端口,LCD端口为输出端口。键盘接口电路如图4-6所示,从图中可知,当键盘端口为读取状态时,信号和信号同时为低,键盘的状态通过74LS244被单片机读取,在
10、进行键盘扫描的过程中单片机要反复读取该键盘端口的状态。CSKLCDRDCSK图4-5 I/O端口译码电路 图4-6 键盘接口电路 LCD显示器接口电路如图4-7所示。该端口为一输出端口,当写该端口时,信号和信号同时有效,通过单片机总线送出的LCD操作命令和数据就被写入并锁存到74LS374的输出端,再通过LCD的控制端口操作把命令或者数据送到LCD显示模块的内部。此次设计中选用的LCD显示模块LCM12864是北京青云创新科技发展有限公司的产品,下面就该模块的结构和操作加以简要介绍。1LCM12864的外形结构及引脚的外形结构及引脚所选液晶显示模块的外形如图4-8所示。该液晶模块共有20个引脚
11、,通过这些引脚外部的处理器可以控制LCD显示器工作。各引脚的序号与名称的对应关系如表4-1所示。LCDWR图4-7 LCD显示器接口电路 图4-8 LCM12864外形结构 表表4-1 LCM12864模块引脚模块引脚是LCD模块063列的控制使能端,是LCD模块64127列的控制使能端;GND接电源地端,VCC为模块逻辑电源输入端,接+5 V;VO为LCD的工作电压,用于调节LCD显示的对比度;RS为指令/数据的选择信号,当RS为高电平时D0D7为数据信号,当RS为低电平时D0D7为指令信号;R/W为读/写控制信号,当R/W为高电平时表示当前进行的操作为读操作,当R/W为低电平时表示当前的操
12、作为写操作;E为模块操作使能信号,低电平有效;D0D7为8位数据端,用来向LCD模块写入数据/命令或从LCD模块中读取状态数据;A为背光电源正端,K为背光电源负端,当A、K间加正向电压并提供足够强的电流时LCD模块背光就会点亮;为复位信号,VOUT为负电源输出端,为-10 V。1CS2CSRST图4-9是LCD模块内部结构框图。对于用户来讲,要对LCD模块进行操作只需通过模块的接口向LCD模块内部的控制器发送正确的命令和数据即可,其他工作由LCD内部的处理器来完成。图4-9 LCD模块内部结构 2LCD模块的基本操作模块的基本操作(1)显示开关控制代码见表4-2。D=1表示显示开(DISPLA
13、Y ON),D=0表示显示关(DISPLAYOFF)。该操作用来控制LCD模块显示的开或关,不管开或关,LCD模块内部的状态保持不变。(2)设置页地址(X地址)操作代码见表4-3。LCD模块显示屏上的每一个点与模块内部的显示RAM存储器的一位相对应。该模块共有12864个点,这些点被排列成64行128列,其中每8行称为一页,共8页。设置页地址实际上就是设置显示区域所对应的RAM的地址,把数据写入到对应的RAM中就可以显示在对应的区域中。DB7DB0的低3位用来表示页地址。读/写数据对页地址没有影响,页地址由本指令或RST信号改变,复位后页地址为0。页地址也称为X地址。表表4-2 显示开关控制代
14、码显示开关控制代码 表表4-3 设置页地址操作代码设置页地址操作代码(3)设置列地址(Y地址)操作代码见表4-4。该指令的作用是将A5A0送入列地址计数器,作为显示RAM的Y地址指针,在对显示RAM进行读/写操作后,Y地址指针自动加1,指向下一个RAM单元。要在LCD屏上显示图形或者文字信息,首先就要指定显示的区域,页地址X和列地址Y的设置指令实际上就是指定显示区域的左上角的起始坐标。图4-10表明了行列地址的关系。(4)设置显示起始行操作代码见表4-5。表表4-4 设置列地址操作代码设置列地址操作代码图4-10 行列地址之间的关系表表4-5 设置显示起始行操作代码设置显示起始行操作代码(5)
15、读状态操作代码见表4-6。BF=0表示LCD模块当前空闲,可进行外部操作;BF=1表示模块正进行内部操作,不能响应外部操作。ON/OFF=0表示当前显示关;ON/OFF=1表示当前显示开。RST=1表示模块当前处于复位状态;RST=0表示处于正常操作状态。(6)写显示数据操作代码见表4-7。当执行该操作时,DB7DB0引脚上的数据D7D0被写入到模块内部的显示存储器中,并且列地址会自动加1。(7)读显示数据操作代码见表4-8。当执行该操作时,LCD模块显示存储器中的内容通过DB7DB0被读出,并由外部处理器取走,每次操作列地址自动加1。此次设计中LCD端口仅作为输出口,单片机通过接口向LCD模
16、块写入命令和数据,不去读取LCD的状态和数据。表表4-6 读状态操作代码读状态操作代码表表4-7 写显示数据操作代码写显示数据操作代码表表4-8 读显示数据操作代码读显示数据操作代码 4.4.3 RS-485通信电路设计通信电路设计为了采集多个点的温度,取得较远的传输距离,提高数据传输的可靠性并且简化电路,降低硬件成本,本设计采用了RS-485总线来实现温度的采集传输。RS-485总线是一种性能优良的半双工通信线路,由于采用了差分信号进行数据的传输,因而总线的抗干扰性能较强,传输速度可以达到10 Mb/s。RS-485总线规范更多的是规定了总线传输的电气特性,并没有严格的软件通信协议,通常情况
17、下用户需要自己编制通信的协议及软件。此次设计中选用了MAX485芯片来实现RS-485接口,该芯片有8个引脚,各引脚的定义如表4-9所示。表表4-9 MAX485引脚引脚 图4-11为RS-485接口电路图。图中MAX485的2、3脚并接在一起由单片机控制,当DE/RE为低电平时总线处于接收状态,总线上的差分信号经MAX485转换成单端信号由单片机的串行口线RXD接收;当DE/RE为高电平时总线处于发送状态,由单片机串口线TXD发送出的数据经MAX485转换为差分信号发送出去。在差分对线上并接120 的终端电阻,用以吸收信号反射。图4-11 RS-485通信接口 4.5 温度测量控制节点控制器
18、设计温度测量控制节点控制器设计4.5.1 温度测量控制节点控制器电路设计温度测量控制节点控制器电路设计温度测量控制节点控制器(以下简称从机节点)电路包含温度传感器电路、继电器驱动电路、RS-485总线接口及键盘指示电路等。温度传感器用于温度的测量,根据设计要求选用了集成数字化温度传感器DS18B20。单片机主处理器选用了89C2051,通过串口对DS18B20进行操作,完成温度的测量工作。通过RS-485总线,从机节点可以接收主机的呼叫,并与主机进行通信。主机可以通过这种方式采集从机节点的温度,并可以设置从机节点的运行温度值。当从机节点的温度达到设定温度值时,从机控制的继电器对温度进行调节。从
19、机节点电路中设置了简单的键盘和LED指示,主要用于从机节点地址的设置和通信状态的指示。图4-12是温度测量控制节点控制器电路图。图4-12 温度测量控制节点控制器电路4.5.2 DS18B20原理与操作原理与操作1DS18B20概况概况DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式,测温分辨率可达0.0625,被测温度用带符号扩展的16位数字量方式串行输出。其工作电源可采用直接供电方式,也可采用寄生电源供电方式。CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口线少,构成系统时硬件结构简单。DS18B20测量温度范围为-55+1
20、25,在-10+85范围内,精度为0.5。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。DS18B20适合于恶劣环境的现场温度测量,应用范围广。2DS18B20内部结构内部结构图4-13为DS18B20内部结构框图。当DS18B20工作时,温度传感器进行温度转换并把转换结果存入高速缓存存储器内的两个字节中,通过单总线接口,用户可以读取到温度转换结果。其中64位的ROM从高位到低位依次为8位CRC、48位序列号和8位产品代码(28H),每一个DS18B20都有唯一的48位序列号,这是区分不同传感器芯片的标识,这也正是DS18B20可以采用单总线结构的原因。高速缓存存储器由9
21、个字节组成,其中第1、2个字节用来存储温度转换结果,第3、4个字节用于存放温度报警值的备份。DS18B20内部有两个E2PROM寄存器TH、TL,分别用于存放高、低温报警值,DS18B20工作时将这两个寄存器内的值复制到高速缓存寄存器中。高速缓存寄存器的第5个字节为配置寄存器,第68个字节保留未用,第9个字节为前8个字节数据内容的CRC校验码。图4-13 DS18B20内部结构图 3DS18B20的配置的配置DS18B20的配置是通过配置寄存器实现的,配置寄存器的结构如表4-9所示。其中,TM为测试模式标志位,出厂时被写入0,用户不能改变;R0、R1为温度分辨率设置位,其对应四种分辨率,如表4
22、-10所示,出厂时R0、R1置为缺省值:R0=1,R1=1(即12位分辨率),用户可根据需要改写配置寄存器以获得合适的分辨率。分辨率越高,单次转换时间越长。表表4-9 配置寄存器的结构配置寄存器的结构 表表4-10 配置寄存器与分辨率的关系配置寄存器与分辨率的关系 4DS18B20温度的存储温度的存储DS18B20温度转换结果被存放在高速缓存的第1、2个字节单元中。数据的存放格式如表4-11所示。其中,高字节的高5位为温度值的符号,S=0表示转换的结果为正,S=1表示转换的结果为负。温度值的整数部分为8位,小数部分为4位,采用不同的转换精度时,小数部分的有效位数不同。表4-12为典型温度转换结
23、果对照表。5DS18B20的接口的接口本次设计中DS18B20采用直接供电方式,并且一个测温节点只接一个传感器,电路结构简单,具有较高的可靠性。图4-14为单片机与其接口连接图。表表4-11 温度的存放格式温度的存放格式 表表4-12 典型温度转换结果对照典型温度转换结果对照 图4-14 DS18B20与单片机的接口 4.5.3 RS-485通信接口设计通信接口设计从机节点的RS-485总线接口与主机的RS-485总线接口类似,不同点在于每一个从机节点均有两个总线连接口,这样做的主要目的是为了实现菊花链形式的总线连接。图4-15为从机节点总线接口电路。对每一个从机节点,一个接口用于连接RS-4
24、85总线输入,另一个接口用于连接其他的总线节点,这样通过级联就可以在系统中连接多个从机节点。每一个从机节点均有一个120 的终端电阻,但是该终端电阻是通过一个跳线J1连接的,如果节点不是总线上的最后一个节点,则可以断开跳线,不连接该终端电阻。如果该从机节点为总线系统中的最末一个节点,则该节点上的终端电阻必须连接。图4-15 从机节点总线接口电路 4.5.4 其他电路其他电路1键盘与显示电路键盘与显示电路从机节点系统中设置有3个按键和4个LED发光管,按键主要用于从机节点地址号的设置。使用从机节点时必须设置正确的节点地址号,当一个节点第一次接入到总线系统中时其地址号是不确定的,因此必须进行设置,
25、设置的方法为:节点上电后进入一个10 s的等待时间,在该时间内如果S2键按下即进入到地址设置模式,通过S3、S4两个键可以设置节点号的大小,设置的节点号通过4位LED以二进制的形式显示出来,再次按下S2键则设置的从机节点编号就被存入到E2PROM芯片AT24C02中,主机工作时会读出该编号作为该从机的节点地址。如果一个节点的地址已经被设置过,下次上电时用户无需设置,系统会在等待10 s之后进入工作模式,从E2PROM中读取前面设置好的地址进行工作。2E2PROM电路电路从机节点中E2PROM的用途主要有两个:一个用于记录设定温度和该节点的历史温度,另一个用于记录本节点的节点地址。3继电器接点继
26、电器接点继电器接点在温度调节时使用,主机通过RS-485总线设置从机节点的工作温度,当从机节点的温度超过或者低于设定温度时,继电器接点闭合,驱动本节点上的温度调节设备工作,使温度维持在设定温度。4.6 软软 件件 设设 计计4.6.1 系统程序结构系统程序结构该系统的硬件结构分为主机和从机两个部分,这也就决定了整个系统的软件也分主机程序和从机程序两个部分。主机程序的主要功能包括:通过RS-485总线采集各个从机节点的温度,并通过LCD显示器把采集到的温度进行显示;可以通过键盘输入各个从机节点的设定温度,并通过RS-485总线把设定温度传送给对应的从机。主机监视从机温度时可以采用自动循环模式,也
27、可以采用手动模式,为操作带来了方便。从机程序的主要功能包括:进行温度测量,把测量的温度值与设定的温度值进行比较,控制本节点的继电器进行动作,驱动相应的温度调节设备对温度进行调节;从机节点还要响应主机的呼叫,将该从机节点的当前温度值和设定温度值发送给主机,或者接收主机对从机节点运行温度的设置。除此之外,从机节点程序还可以实现从机地址的设置功能等。4.6.2 主机程序设计主机程序设计主机程序的结构框图如图4-16所示。主机上电之后,先进行基本的初始化操作,包括LCD端口、串行口、键盘及指示灯的初始化操作等。初始化完成之后主机会自动进入自动扫描工作模式,在该模式下主机逐一地访问各个从机节点,从机节点
28、响应主机呼叫并把该节点的当前温度和设定温度传送给主机,主机显示从机节点送回的温度和设定温度值。如果用户要单独查看某个节点的温度情况,则可以通过键盘进入手动模式进行操作,具体的操作方法为:在自动扫描工作模式下按1号键,则进入到手动操作模式,进入后系统首先与1号节点进行通信,并把1号节点的当前温度和设定温度显示在LCD屏上,用户如果要查看其他节点的情况,则可以通过2号和3号键来切换当前的节点号,主机访问切换到的节点并把其温度和设定温度显示出来。图4-16 主机程序结构如果被访问的节点不存在或者通信发生错误,则对应节点的温度和温度的设定值显示将被忽略,并通过指示灯指示当前通信出错。主机可以设置每一个
29、节点的运行温度,设置操作也是在手动操作模式下完成的。在手动模式下,按5号键即进入温度设定界面,LCD屏显示当前节点的设置温度值,用户可以通过2号和3号键来调整设定温度值,调整完毕后再次按下5号键即可退出温度设定界面。此时主机把设定温度值发送给从机节点,温度设定工作完成,LCD又返回到手动操作模式。要对某个节点的温度进行设置,必须在手动模式下先切换到该节点与之通信。如果要退出手动操作模式重新进入自动操作模式,则可以在手动操作模式下按1号键,即可返回到自动操作模式。主机循环对各节点的温度情况进行采集显示,对于不存在的节点和通信出错的节点,温度和温度的设定值将被忽略。4.6.3 从机程序设计从机程序
30、设计图4-17是从机程序的结构框图。温度控制从机节点主要完成温度的测量、与主机通信及温度的控制。节点控制器上电之后先进行必要的初始化操作,主要完成指示和串行口E2PROM端口的初始化,随后进入到节点号设置程序,该部分程序的功能是完成从机节点编号的设置和修改。如果该节点的编号已经设置过,则可以不进行设置,经过几秒钟的等待之后会退出节点编号设置程序;如果用户没有对节点进行编号或需要修改节点编号,可以通过修改程序完成节点号的设置。设置好的节点编号会被存入E2PROM芯片,下次上电该节点编号可以从E2PROM中读出,因此不用再设置。图4-17 从机程序结构 为了使用户能够清楚地知道节点的编号,在执行完
31、节点号设置程序之后,控制器会把设置的节点编号从E2PROM中读出并通过LED指示灯显示出来。RS-485串行口的初始化设置是在主循环之前完成的。从机节点的主循环为:检测本节点的温度查看有没有主机的通信请求,如果有予以响应,没有则跳过检查当前温度是否超过设置温度,如果超过,则设置温度继电器接点闭合,温度调节设备运行。4.6.4 RS-485总线通信程序设计总线通信程序设计在该系统中是以RS-485总线为介质把主机与各个从机相连接起来的,只有主机拥有RS-485总线的控制权,由它发起总线访问,各个从机只对主机的总线命令做出响应,不能主动发起总线访问。主机与从机之间的通信过程如下:主机需要与某个从机
32、进行通信,先进行地址呼叫,即主机发送待访问的从机地址,并等待从机进行应答;此时各个从机均处于地址接收模式,当总线连接的各从机接收到地址信息后,会把接收到的地址与自身的地址编号相比较,如果地址不符则该从机继续保持地址监听状态,如果从机接收到的地址与自身的地址相符,说明主机呼叫该从机,则该从机转换为发送状态,把自己的地址标号发送到总线上作为向主机的应答信号,之后从机转入数据接收状态,等待主机的进一步通信请求。主机如果得到正确的从机应答,即被呼叫的从机回送了正确的地址号,主机立刻转换为数据发送模式,此时主机与被呼叫的从机之间就建立起了数据通信链路,主机可以向从机发送命令和数据,从机相应地要对主机的命
33、令进行响应,接收或发送数据给主机。在主机与被呼叫的从机进行数据通信的过程中,其他从机由于处于地址监听模式,因而不会对通信造成影响。当主机与被呼叫从机之间的通信结束后,当前的从机又会转入到地址监听模式,而主机则重新转入到地址发送模式,如果有新的通信主机又会重复前面的过程。这里主机与从机之间进行通信主要完成两个任务,其一是获取各个从机节点的温度,其二是设置从机节点的动作温度值,实现这些操作的方法是:主机先呼叫要访问的从机,建立起数据通信模式,然后主机通过发送不同的命令表示不同的操作,从机接收到这些命令后解释执行,如果主机发送获取温度的命令,则从机转为发送状态发送温度数据;如果主机发送设置的温度值的
34、命令,则从机等待接收要设置的数据。主机发送完命令之后,本身也会根据所发送的命令转换自身的状态,以配合从机的通信,直至通信过程结束。4.7 程程 序序 清清 单单1主控制器程序清单主控制器程序清单/*/文件名:define.h/功 能:定义端口和变量/作 者:hadaqu/时 间:2009-4-15/*#define uchar unsigned char#define uint unsigned int#define nop _nop_();#definekey_port XBYTE0 x8000#define dateport XBYTE0 x8001sbit lcd_rs=P12;sbit
35、 lcd_rw=P13;sbit lcd_en=P14;sbit left=P11;sbit right=P10;sbit lcdback=P33;sbit RE_DE=P35;sbit LED3 =P17;sbit LED2 =P16;sbit LED1 =P15;bit com_error,over_time_flag;uchar flag;uchar key;uchar time_count;uchar temp,set_value;uchar add,point,p;/*/文件名:lcd12864.h/功 能:LCD操作函数/作 者:hadaqu/时 间:2009-4-15/*#inc
36、lude#includevoid delay(uint z)uint x,y;for(x=z;x0;x-)for(y=220;y0;y-);/*void check_busy()dateport=0 xff;lcd_rs=0;lcd_rw=1;lcd_en=1;while(dateport&=0 x80)lcd_en=1;lcd_en=0;*/void write_com(uchar com,uchar lcd_left,uchar lcd_right)left=lcd_left;right=lcd_right;/check_busy();lcd_rs=0;lcd_rw=0;dateport=
37、com;lcd_en=1;lcd_en=0;void write_data(uchar date,uchar lcd_left,uchar lcd_right)left=lcd_left;right=lcd_right;/check_busy();lcd_rs=1;lcd_rw=0;dateport=date;lcd_en=1;lcd_en=0;void display_on(uchar o)o=o+0 x3e;write_com(o,0,0);void start_line(uchar i)i=i+0 xc0;write_com(i,0,0);void set_xy(uchar x,ucha
38、r y)x=x+0 xb8;y=y+0 x40;write_com(x,0,0);write_com(y,0,0);void wdata(uchar date,uchar x,uchar y)if(y=64)set_xy(x,y-64);write_data(date,0,1);else set_xy(x,y);write_data(date,1,0);void clear()uchar x,y;for(x=0;x8;x+)for(y=0;y128;y+)wdata(0,x,y);void disp_Hz(uchar x,uchar y,uchar n,uchar fb)/x为该行第x个字,共
39、8字,y为第几行,共8行uchar i,dx;for(i=0;i16;i+)dx=Hz2*i+n*32;/2*i为选择偶数行,因其为列扫描 if(fb)dx=dx;wdata(dx,y,x*16+i);dx=Hz(2*i+1)+n*32;if(fb)dx=dx;wdata(dx,y+1,x*16+i);void disp_Ez(uchar x,uchar y,uchar n,uchar fb)/显示数字或英语 uchar i,dx;for(i=0;i8;i+)dx=Ez2*i+n*16;if(fb)dx=dx;wdata(dx,y,x*8+i);/dx=Ez(2*i+1)+n*16;if(fb
40、)dx=dx;wdata(dx,y+1,x*8+i);void disp_tu(void)/画图 uchar j;uint i;for(j=0;j8;j+)/页码 set_xy(j,0);for(i=1;i=64;i+)write_data(tui+j*128,1,0);write_data(tu63+i+j*128,0,1);void floor1()disp_Hz(0,2,10,1);/disp_Hz(1,2,6,0);/显示“节”disp_Hz(2,2,7,0);/显示“点”disp_Hz(3,2,8,0);/显示“编”disp_Hz(4,2,9,0);/显示“号”disp_Ez(10,
41、2,10,0);/显示“:”disp_Hz(7,2,9,0);/显示“号”disp_Hz(0,4,11,1);/disp_Hz(1,4,0,0);/显示“当”disp_Hz(2,4,1,0);/显示“前”disp_Hz(3,4,2,0);/显示“温”disp_Hz(4,4,3,0);/显示“度”disp_Ez(10,4,10,0);/显示“:”disp_Hz(7,4,3,0);/显示“度”disp_Hz(0,6,15,1);/disp_Hz(1,6,4,0);/显示“设”disp_Hz(2,6,5,0);/显示“置”disp_Hz(3,6,2,0);/显示“温”disp_Hz(4,6,3,0)
42、;/显示“度”disp_Ez(10,6,10,0);/显示“:”disp_Hz(7,6,3,0);/显示“度”if(flag=0)disp_Ez(3,0,23,1);/显示“=”disp_Hz(2,0,12,1);/disp_Ez(6,0,11,0);/显示“A”disp_Ez(7,0,12,0);/u disp_Ez(8,0,13,0);/t disp_Ez(9,0,14,0);/o disp_Hz(5,0,12,1);/disp_Ez(12,0,23,1);/=else if(flag=1)disp_Ez(3,0,23,1);/=disp_Hz(2,0,12,1);/disp_Ez(6,0
43、,19,0);/M disp_Ez(7,0,20,0);/e disp_Ez(8,0,21,0);/n disp_Ez(9,0,22,0);/u disp_Hz(5,0,12,1);/disp_Ez(12,0,23,1);/=else if(flag=2)disp_Ez(3,0,23,1);/=disp_Hz(2,0,12,1);/disp_Ez(6,0,15,0);/H disp_Ez(7,0,16,0);/a disp_Ez(8,0,17,0);/n disp_Ez(9,0,18,0);/d disp_Hz(5,0,12,1);/disp_Ez(12,0,23,1);/=void floo
44、r2()/设置节点温度界面 disp_Hz(0,0,10,0);/disp_Hz(1,0,10,0);/disp_Hz(2,0,10,0);/disp_Hz(3,0,10,0);/disp_Hz(4,0,10,0);/disp_Hz(5,0,10,0);/disp_Hz(6,0,10,0);/disp_Hz(7,0,10,0);/disp_Hz(1,3,4,0);/设 disp_Hz(2,3,5,0);/置 disp_Hz(3,3,2,0);/温 disp_Hz(4,3,3,0);/度 disp_Ez(10,3,10,0);/:disp_Ez(11,3,set_value/10,0);disp
45、_Ez(12,3,set_value%10,0);disp_Hz(7,3,3,0);/度 disp_Hz(0,6,10,0);/disp_Hz(1,6,10,0);/disp_Hz(2,6,10,0);/disp_Hz(3,6,10,0);/disp_Hz(4,6,10,0);/disp_Hz(5,6,10,0);/disp_Hz(6,6,10,0);/disp_Hz(7,6,10,0);/void lcdinit()lcdback=0;display_on(0);clear();display_on(1);start_line(0);disp_tu();delay(3000);clear()
46、;/*/文件名:keyscan.h/功 能:键盘扫描操作/作 者:hadaqu/时 间:2009-4-15/*uchar key_scan(void)uchar tep;tep=key_port;tep=tep;if(tep=0)key=0 xff;return key;else delay(10);/tep=key_port;tep=tep;if(tep=0)key=0 xff;return key;else switch(tep)case 0 x01:key=0 x01;break;case 0 x02:key=0 x02;break;case 0 x04:key=0 x03;break;
47、case 0 x08:key=0 x04;break;case 0 x10:key=0 x05;break;case 0 x20:key=0 x06;break;case 0 x40:key=0 x07;break;case 0 x80:key=0 x08;break;default:key=0 xff;break;do tep=key_port;tep=tep;while(tep!=0 x00);return key;/*/文件名:zimo.h/功 能:定义LCD操作字模/作 者:hadaqu/时 间:2009-4-15/*uchar const code Hz=0 x20,0 x10,0
48、x22,0 x11,0 x24,0 x11,0 x2C,0 x11,0 x20,0 x11,0 x20,0 x11,0 x3F,0 x11,0 x20,0 x11,0 x20,0 x11,0 x28,0 x11,0 x24,0 x11,0 xE6,0 x1F,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,/当,0*/0 x04,0 x00,0 xF4,0 x1F,0 x55,0 x02,0 x55,0 x12,0 x57,0 x12,0 xF4,0 x1F,0 x04,0 x00,0 x04,0 x00,0 xE6,0 x03,0 x05,0
49、x08,0 x05,0 x10,0 xF4,0 x0F,0 x04,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,/前,1*/0 x08,0 x01,0 x11,0 x1F,0 x82,0 x00,0 x44,0 x10,0 x00,0 x1F,0 x7F,0 x11,0 x49,0 x1F,0 x49,0 x11,0 x49,0 x11,0 x49,0 x1F,0 x7F,0 x11,0 x00,0 x1F,0 x00,0 x10,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,/温,2*/0 x00,0 x18,0 xFE,0
50、x07,0 x12,0 x10,0 x12,0 x11,0 x12,0 x13,0 x7E,0 x15,0 x53,0 x09,0 x53,0 x09,0 x7E,0 x15,0 x12,0 x13,0 x12,0 x11,0 x12,0 x10,0 x02,0 x10,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,/度,3*/0 x20,0 x00,0 x21,0 x00,0 xE6,0 x1F,0 x00,0 x08,0 x20,0 x14,0 x50,0 x10,0 xCF,0 x08,0 x41,0 x05,0 x41,0 x02,0 x4F,0 x05,0