多点温度监控系统.doc
多点温度监控系统1 方案1.1方案一利用单一单片机同时挂载多个温度传感器实行多点温度采集控制。可最大限度的节约成本。方案具体框图如下:单片机二号传感器一号传感器三号传感器人机交互设备各分机加热设备图1-1方案一设计框图本方案看似节约成本且简单可行,其实在工业现场这个充满干扰的环境中如果只是用传感器单一的将信号与主机进行长距离传送得到的信号常常是失真的信号,无法实现精确控制、所以方案一不可行。1.2 方案二利用单片机串口通信组成测控网络,各从机与主机进行通信交换信息,主机将采集到的温度统一实时显示,管理者可根据实时温度发出控制命令,由主机向从机通过串口通信网络传达决策,再由各从机对温度实施控制。具体设计分以下几个方面实施:(1)本系统最核心就是实现主机与从机间的通信,通信使用串口实现主机“一对多的控制”。(2)本机要实现操作者对其的控制就必须建立良好的人机交互界面,故本机将采用12864液晶实施信息显示,采用键盘读入控制信息,确保本机具有良好的人机交互界面。(3)温度的采集使用DS18B20,优点:单总线,降低系统成本,输出是数字量,易于单片机接口。(4)由于本系统要实现多机通信,应尽量使用同型号单片机,考虑成本采用AT89S52单片机(5)其他事项我们将在实施中改动,努力使系统具有较高的实用性,丰富的功能和低廉的成本。单片机AT89S52一号从机二号从机RS_485RS-48512864液晶显示实时温度键盘输入温控设备温控设备图1-2方案二设计方案因方案一通信距离过短,抗干扰性较差,经过各方面比较论证我们最终采用方案二。2 硬件设计硬件设计共分以下几个模块实施:主机模块、通信网络模块、人机交互模块、传感器模块、继电器控制模块。各部分的设计和器件选型介绍如下:2.1 主机模块主机作为整个系统的核心单元,将决定整个系统的基本性能,考虑到本系统单片机用量大,为了节约成本,并便于系统维护,并缩短开发周期主机模块采用AT89S52单片机。其主要的性能参数如下:为了便于实施串行通信我们统一采用11.0592MHZ的晶振,图2-1 主机模块的电路图并为单片机外围设立了上拉电路和复位电路。具体电路如图3-1所示。2.2 通信网络模块通信是本系统的核心,在本系统中从多点采集温度和像个分机发出温度控制指令都是通过通信网络来实现的。为了实现远距离的信号传输,我们采用RS-485串行通信。因为RS485串行通信利用差分信号传输数据,故其传输距离可以达到千米级,具体硬件电路的实现如下图所示:图2-2 通信模块电路图 TTL电平与RS-485电平的转换采用MAX485芯片,芯片的具体介绍如下: 2-3 MAX485 管脚图2.3 人机交互模块人机交互模块主要用于控制者向系统输入控制命令,监测系统实时运行情况,在输出部分我们采用12864液晶制作了良好的显示界面,在输入部分我们使用4*4键盘。开机时我们使用12864的绘图功能显示待机画面,进入工作状态后屏幕显示三个温度采集点的实时温度,进入设置状态后屏幕显示设置画面和设置提示。液晶显示模块是128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。可与CPU直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。具有多种功能:光标显示、画面移位、睡眠模式等1。图2-4 12864液晶外形图表2-1 12864液晶引脚功能说明引脚名称方向说明引脚名称方向说明1VSS-GND(0V)11DB4I数据42VDD-Supply Voltage For Logic (+5v)12DB5I数据53VO-Supply Voltage For LCD (悬空)13DB6I数据64RS (CS)OH: Data L: Instruction Code14DB7I数据75R/W (SID)OH: Read L: Write15PSBOH: Parallel ModeL: Serial Mode6E (SCLK)OEnable Signal16NC-空脚7DB0I数据017/RSTOReset Signal 低电平有效8DB1I数据118NC-空脚9DB2I数据219LEDA-背光源正极(LED+5V)10DB3I数据320LEDK-背光源负极(LED-OV)2.4 传感器模块温度传感器我们采用DS18B20单总线温度传感器,其具有接口简单、直接输出数字量等优点。图2-5 DS18B20外形及管脚图DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现912位的数字值读数方式。可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。5DS18B20输出的数据格式如下所示:2.5 继电器控制模块为了实现温度控制我们须将控制信号施加在驱动设备上这就需要使用控制元件继电器。继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。电磁式继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)吸合。这样吸合、释放,从而达到了在电路中的导通、切断的目的。对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。3但是单片机端口的驱动能力是非常小的为了实现对继电器的控制我们还需要使用三极管对单片机输出的电流进行放大,经测试我们使用三极管9012放大电流,确保继电器能够可靠地吸合与断开。经过详细设计,我们的硬件设计达到了系统要求,经过仿真,我们搭建了实物电路,系统各部分硬件电路组合后达到了预期设计目标3 软件设计软件的设计是本系统设计的关键,我们采用自上到下逐步细化的思路实施。程序主要分为主程序、通信程序、人机接口程序、控制算法三部分。3.1 主体程序部分设计 主程序主要完成系统初始化、显示刷新、串口通信、键盘监控等任务,主程序流程图图4-1所示,开机后我们首先实现数据、液晶初始化显示初始化数据初始化串口轮流与各从机进行通信是否通信成功更新显示数据扫描键盘更新温控设置否是开始图3-1 主机主程序流程图串口的初始化,接下来我们进入主循环让主机与各分机轮流进行通信,更新实时温度,刷新显示,并监控键盘是否有按键设置动作,如有进入设置状态,进行设置提示,采集设置数据,对数据进行保存,对控制信息进行编码,并通过通信网络向从机发出温度控制命令。控制信息编码格式是:第一位为机号,第二位至第八位为目标温度。各从机根据编码格式解码。3.2 通信程序设计通信中我们使用RS485串行通信,为了延长传输距离,我们使用较低的波特率,降低误码率。在主机及分机初始化完成后,分机处于接收状态,主机发送分机号辨别数据,分机接收到后立即与自身编码对比正确发送数据供主机监控决策。主机发送从机编号从机接受比对是本机编号否接受信息是否图3-2 通信过程程序流3.3 人机接口程序人机接口部分主要采用键盘输入指令,液晶显示输出供操作者决策,键盘扫描采用典型的4乘4键盘扫描模式,逐列进行扫描,延时确认按键动作,查取键码,并进行松手检测否是否是开 始送列扫描码判断是否有键按下延时消抖确定有键按下查找键码,松手检测返回键值图3-3 键盘扫描程序流程图显示采用12864液晶程序严格按照其时序编写,在设置状态设定图3-4 12864液晶写数据时序图光标闪烁,开机时利用绘图模式,显示开机画面。3.4 控制算法软件设计由于我们设计的控制系统需要对广泛的控制对象在不需要精密建模分析的情况下,具有较好的控制效果,同时为了提高系统的实时性,减少单片机的计算任务,经考虑我们采用模糊控制作为控制器的算法。根据偏差大小决定输出控制量的大小。开 始读取温度数据计算目标值与当前值偏差根据偏差对照隶属度函数确定论域查找对应输出值输出控制量结 束图3-5 模糊控制算法软件流程图4 系统调试系统组件完成后为了确保系统的正确性与可靠性我们对系统的软硬件都进行了细致的调试和测试4.1 硬件调试由于我们在设计中严格按照计划进行,对部分程序及硬件进行了周密的设计,并对可测试的部分在电脑上进行了仿真,确认方案可行后我们开始对硬件进行了实物测试,但是实际情况并不是像我们想象的那样好,由于天气寒冷我们大家穿的衣物较多,不同成分的衣服面料摩擦后产生了大量的静电,是我们的液晶工作的不是很正常,最终经过反复调试我们发现了这个问题。在接下来的调试中我们在每次操作前都让手触摸接地金属放去静电以免损坏芯片。在硬件调试中我们设置了各种温度观察实时温度的准确性,对继电器的驱动我们试用了9013和9012及8050三种二极管,经测试,我们发现9012的效果较好,最终我们采用9012驱动。在硬件电路搭建完成后我们让其连续运行一中午测试其能否正常工作。在通信网络搭建后我们测试了正确性,并为电源加上了滤波电容,防止干扰窜入干扰通信的正常进行。在使用MAX485搭建通信网络时,我们的系统经常莫名其妙的出现异常,经过查找我们降低了通信的波特率,但是故障依然存在最终我们发现是电阻不匹配,经过测试与查找资料我们更换了电阻,加入了电容防止干扰,重新布局了电路,并换掉了兼容性较差的芯片,改动后又进行了详细测试,方才确定了通信模式与波特率。4.2 软件调试软件的调试我们主要通过计算机仿真进行,但是在仿真成功之后,在实际烧录运行时偶尔也出了不少错误。仿真毕竟是在一种比较理想的环境下运行,在实际烧录后我们的液晶显示无法正常显示,后来才发现是液晶写指令的时间间隔不够,液晶控制芯片反应时间不足,导致指令写入错误,最终我们我们在指令写入的间隙加入了延时程序最终实现了液晶准确的现实。 主机与分机的通信机制设计,是本系统软件设计的重中之重,考虑到主机较为繁忙,我们设计让分机较多的处于等待状态,等待接收主机信号,接收到后马上能够回复主机,使主机花较少的时间用于通信,由此而节约了主机的时间,使整个系统的效率较高,实时性较好,能够较快的刷新温度,快速的对温度的变化及外界的请求作出回应。结 论本次设计再一次的加深了我们对控制理论与单片机控制技术的理解,锻炼了我们的实践能力。在本次毕业设计以前,我一直认为我已经把单片机学懂了,谁知道到了毕业设计的时候才发现原来并不是那么一回事,学海无涯,我也终于对这句话有了更深刻的认识。在工业生产和日常生活中,对温度控制系统的要求,主要是保证温度在一定温度范围内变化,稳定性好,不振荡,对系统的快速性要求不高。在论文中简单分析单片机温度监控系统设计过程和实现方法。温度监控系统根据用户设定的温度范围完成一定范围的温度控制。AT89S52单片机,体积小,重量轻,抗干扰能力强,对环境要求不高,价格低廉,可靠性高,灵活性好,即使在非电子计算机专业人员,通过学习一些专业基础知识以后也能依靠自己的技术力量,来开发所希望的单片机应用系统。本文的温度控制系统,只是单片机广泛应用于各行各业的一例,相信单片机的应用会更加广泛性。本系统的设计方案有很多种,上述方案是多种方案中的一种,其功能强大,成本低,元件少,精度高,可靠性好,稳定性高,抗干扰能力强。通过对系统的软硬件设计和调试过程,积累了不少实际经验,开拓了了思维,为今后在这方面的工作打下了较为坚实的基础。本文还有很多不足之处,恳请各位专家和老师批评指正。 录 A 元器件清单序号器件规格型号数量序号器件规格型号数量1单片机AT89S5232液晶显示器1286413温度传感器DS18B2034三极管901235继电器SRS-05VDC-SH36键盘4*417晶振11.0592MHZ38电容10uf39瓷片电容22pf610发光二极管311电阻10k312电阻200oh313导线若干14TTL与485 电平转换芯片MAX4853B 总硬件图 录 C 源程序主机程序:4#include<reg52.h>#include<intrins.h>#include<stdlib.h>#define uchar unsigned char#define uint unsigned int#define lcd_data P2sbit lcd_rs=P10;sbit lcden=P11;sfr key=0x80;uint t,t1,t2,t3;sbit DS=P17; /define interface 定义DS18B20接口sbit JR=P13;sbit RT=P32;bit sg;uchar chuan;uchar Tmp2;uchar Tmp3;uchar code dis1="电气系课程设计V "uchar code dis2=" 多点温度采集 "uchar code dis3=" 控制系统 "uchar code dis4="指导教师: "uchar code dis5=" 成 员 "uchar code dis6=" "uchar code dis7=" "uchar code dis8=" "uchar code dis9=" 实时温度 "uchar code disa="1 号机:-85.0C s "uchar code disb="2 号机:-85.0C s "uchar code disc="3 号机:-85.0C s "uchar code dise=" 设置 "uchar code disf="请选择分机号: "uchar code disg="提示:请按机号输"uchar code dish="入,关闭温控按4 "uchar code disi="输入设定温度: "uchar code disj="提示: 输入范围0"uchar code disk="99摄氏度 "uchar code disl="输关闭的机号: "uchar code dism="提示: 将关闭输入"uchar code disn="的分机温控功能 "uchar code disd6416=0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x83,0x1F,0xFE,0x00,0x7F,0xF7,0xFF,0xFC,0x1F,0xFD,0xFF,0xFF,0xFF,0xF8,0x00,0x80,0x61,0x10,0x01,0x00,0x40,0x14,0x00,0x04,0x10,0x05,0x80,0x00,0x00,0x18,0x01,0x00,0x15,0x10,0x00,0x00,0x40,0x14,0x00,0x04,0x10,0x05,0x00,0x00,0x00,0x08,0x02,0x00,0x09,0x10,0x00,0x80,0x40,0x14,0x00,0x04,0x10,0x05,0x00,0x00,0x00,0x08,0x00,0x0E,0x01,0x18,0x00,0x00,0x20,0x17,0x00,0x1C,0x08,0x0D,0x00,0x00,0x00,0x08,0x04,0x11,0x81,0x04,0x00,0x40,0x18,0x40,0x80,0x20,0x04,0x11,0x00,0x00,0x00,0x08,0x00,0x20,0x41,0x00,0x00,0x00,0x08,0x80,0x40,0x20,0x02,0x11,0x07,0xC0,0x1F,0x08,0x08,0x00,0x21,0x01,0x00,0x20,0x08,0x80,0x40,0x20,0x02,0x11,0x08,0x00,0x40,0x08,0x00,0x00,0x11,0x01,0x00,0x00,0x08,0x80,0x40,0x20,0x02,0x11,0x00,0x20,0x40,0x88,0x00,0x00,0x01,0x01,0x00,0x10,0x08,0x80,0x40,0x20,0x02,0x11,0x20,0x20,0x40,0x08,0x10,0x40,0x01,0x01,0x00,0x00,0x08,0x80,0x40,0x20,0x02,0x11,0x00,0x20,0x40,0x48,0x00,0x00,0x09,0x01,0x00,0x08,0x08,0x80,0x40,0x20,0x02,0x11,0x20,0x20,0x40,0x48,0x00,0x00,0x01,0x01,0x00,0x00,0x08,0x80,0x40,0x20,0x02,0x11,0x00,0x20,0x40,0x08,0x00,0x20,0x01,0x01,0x20,0x04,0x08,0x80,0x40,0x20,0x02,0x11,0x20,0x20,0x40,0x28,0x20,0x00,0x05,0x01,0x00,0x00,0x08,0x80,0x40,0x20,0x02,0x11,0x00,0x20,0x40,0x08,0x00,0x10,0x01,0x01,0x30,0x02,0x08,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x28,0x20,0x08,0x01,0x01,0x20,0x00,0x08,0x80,0x40,0x20,0x02,0x10,0xC0,0x20,0x40,0x18,0x00,0x02,0x01,0x01,0x28,0x01,0x08,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x20,0x01,0x03,0x01,0x20,0x00,0x08,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x00,0x00,0x80,0x01,0x24,0x00,0x88,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x10,0x00,0x40,0x01,0x20,0x00,0x08,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x00,0x00,0x10,0x01,0x22,0x00,0x48,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x08,0x00,0x00,0x01,0x20,0x00,0x08,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x01,0x21,0x00,0x28,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x00,0x00,0x04,0x01,0x20,0x00,0x08,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x01,0x20,0x80,0x08,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x02,0x00,0x01,0x01,0x20,0x00,0x08,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x01,0x00,0x00,0x01,0x20,0x40,0x08,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x00,0x80,0x00,0x81,0x20,0x00,0x00,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x00,0x40,0x00,0x01,0x20,0x20,0x00,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x41,0x20,0x00,0x00,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x00,0x10,0x00,0x01,0x20,0x10,0x00,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x38,0x04,0x00,0x41,0x20,0x00,0x00,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x20,0x02,0x00,0x01,0x20,0x08,0x00,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x20,0x01,0x00,0x41,0x20,0x04,0x00,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x24,0x00,0x00,0x01,0x20,0x04,0x00,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x20,0x00,0x40,0x41,0x20,0x02,0x00,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x20,0x00,0x20,0x01,0x20,0x02,0x00,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x20,0x00,0x00,0x41,0x20,0x01,0x00,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x20,0x00,0x00,0x41,0x20,0x00,0x80,0x80,0x40,0x20,0x02,0x10,0x00,0x20,0x40,0x00,0x21,0x00,0x00,0x01,0x20,0x00,0x00,0x80,0x40,0x00,0x00,0x10,0x00,0x20,0x40,0x00,0x20,0x00,0x10,0x41,0x20,0x00,0x40,0x80,0x40,0x20,0x04,0x20,0x00,0x20,0x40,0x00,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x80,0x00,0x10,0x00,0x20,0x00,0x20,0x40,0x00,0x20,0x80,0x00,0x01,0x20,0x00,0x20,0x80,0x20,0x00,0x08,0x40,0x00,0x20,0x40,0x00,0x20,0x00,0x20,0x81,0x00,0x00,0x00,0x80,0x00,0x08,0x10,0x90,0x00,0x20,0x20,0x00,0x20,0x20,0x01,0x00,0x10,0x00,0x10,0x80,0x10,0x04,0x20,0x00,0x00,0x00,0x20,0x00,0x20,0x18,0xC0,0x02,0x08,0x00,0x00,0x80,0x08,0x03,0xC2,0x00,0x00,0x40,0x10,0x00,0x20,0x07,0x02,0x1C,0x06,0x00,0x08,0x80,0x00,0x00,0x00,0x00,0x07,0x00,0x0C,0x00,0x23,0x00,0x04,0x00,0x00,0x00,0x04,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0xC0,0x08,0x00,0x00,0x00,0x04,0x80,0x02,0x00,0x18,0x00,0x04,0x00,0x04,0x00,0x20,0x30,0x20,0x1F,0xFE,0x00,0x00,0x00,0x00,0xC0,0x60,0x00,0x07,0xFF,0xFC,0x00,0x38,0x0F,0xC0,0x00,0x00,0x00,0x01,0x80,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,;uchar kc;uchar code diss="abcdef"uchar z1,z2; /各位置uchar l1,l2,l3; /各分机温度设定uchar h; /分机号bit open; /温控功能打开标志bit s1,s2,s3;uint tcount;uint zhan,zhan1,zhan2;char e;/*a sj b xj c zj d yj*/void delay_1ms(uint x)uint i,j;for(i=x;i>0;i-)for(j=30;j>0;j-);void write_cmd(uchar cmd)lcd_rs=0; lcden=0; lcd_data=cmd; delay_1ms(5); lcden=1; delay_1ms(5); lcden=0;void write_dat(uchar dat) lcd_rs=1; lcden=0; lcd_data=dat; delay_1ms(2); lcden=1; delay_1ms(2); lcden=0;void lcd_pos(uchar x,uchar y) uchar pos; if(x=0) x=0x80; if(x=1) x=0x90; if(x=2) x=0x88; if(x=3) x=0x98; pos=x+y; write_cmd(pos);void init() write_cmd(0x30); delay_1ms(5); write_cmd(0x0C); delay_1ms(5); write_cmd(0x01); delay_1ms(5); h=4; open=0; JR=0;/*/void delay(uint shu) uint i,j; for(i=shu;i>0;i-) for(j=110;j>0;j-);void dsreset(void) /send reset and initialization command uint i; /DS18B20初始化 DS=1; DS=0; i=103; while(i>0)i-; DS=1; i=15; while(i>0)i-; bit tmpreadbit(void) /read a bit 读一位 uint i; bit dat; DS=1; DS=0;i+; /i+ for delay 小延时一下 DS=1;i+;i+; dat=DS; i=8;while(i>0)i-; return (dat); uchar tmpread(void) /read a byte date 读一个字节 uchar i,j,dat; dat=0; for(i=1;i<=8;i+) j=tmpreadbit(); dat=(j<<7)|(dat>>1); /读出的数据最低位在最前面,这样刚好/一个字节在DAT里 return(dat); /将一个字节数据返回 void tmpwritebyte(uchar dat) /write a byte to ds18b20 /写一个字节到DS18B20里 uint i; uchar j; bit testb; for(j=1;j<=8;j+) testb=dat&0x01; dat=dat>>1; if(testb) /write 1 写1部分 DS=0; i+;i+; DS=1; i=8;while(i>0)i-; else DS=0; /write 0 写0部分 i=8;while(i>0)i-; DS=1; i+;i+; void tmpchange(void) /DS18B20 begin change 发送温度转换命令 dsreset(); /初始化DS18B20 delay(1); /延时 tmpwritebyte(0xcc); / 跳过序列号命令 tmpwritebyte(0x44); /发送温度转换命令uint tmp() /get the temperature 获得温度 uint temp; float tt; uchar a,b; dsreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); /发送读取数据命令 a=tmpread(); /连续读两个字节数据 b=tmpr