《毕业设计(论文)基于AT89S52单片机的水温检测及报警系统设计.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)基于AT89S52单片机的水温检测及报警系统设计.doc(34页珍藏版)》请在三一办公上搜索。
1、摘 要2第一章 绪 论41.1 系统背景41.2 温度控制系统设计的意义51.3 温度控制系统完成的功能5第二章 系统方案设计62.1 方案一62.2 方案二62.3 方案论证8第三章 硬件电路设计83.1系统总体设计83.2 各部分硬件电路设计93.2.1时钟电路设计93.2.2系统复位电路103.2.3报警与控制电路设计113.2.4 LED显示电路设计123.2.5温度检测电路设计143.2.6按键电路设计173.2.7 继电器控制电路17第四章 软件设计184.1 主程序方案184.2 各个模块子程序设计214.2.1主程序214.2.2读出温度子程序214.2.3数码管显示模块234
2、.2.3温度处理程序24第五章 系统调试245.1测试环境及工具245.2测试方法245.3测试结果分析24结 论25致 谢25参考文献26附录一:系统原理图27附录二: 程序代码28摘 要随着现代信息技术的飞速发展,在生产中温度的准确测量是一个比较困难的事情从最初的酒精、水银温度计到现在的数字化、集成化的温度检测系统。可见传感器的发展是飞快的。它快速的发展必将带来新一轮的工业化的革命和社会发展的飞跃。本文从硬软件两个方面介绍了基于AT89S52单片机水温测量及控制系统的设计。系统硬件由控制电路、温度采集电路、键盘和LED显示电路组成。软件设计从设计思路、软件系统框图出发,先介绍整体的思路后,
3、再逐一分析各模块程序算法的实现,最终编写出满足任务需求的程序。最终通过DS18B20采集温度并显示出来,由此对水的温度进行有效检测与报警。基本上满足了温度检测与报警的要求,具有超调量小,采样值与设定值基本一致,操作简单等优点。本设计创新点在于采用数字式温度传感器DS18B20 作为感温元件, 占用单片机引脚少, 因而可以利用空余引脚通过软件模拟和温度显示。关键词: 温度检测 AT89S52 LED显示器 DS18B20温度传感器第一章 绪 论1.1 系统背景测量控制的作用是从生产现场中获取各种参数,运用科学计算的方法,综合各种先进技术,使每个生产环节都能够得到有效的控制,不但保证了生产的规范化
4、、提高产品质量、降低成本,还确保了生产安全。所以,测量控制技术已经被广泛应用于炼油、化工、冶金、电力、电子、轻工和纺织等行业。单片机以其集成度高、运算速度快、体积小、运行可靠、价格低廉等优势,在过程控制、数据采集、机电一体化、智能化仪表、家用电器以及网络技术等方面得到了广泛的应用,特别是单片机技术的开发与应用,标志着计算机发展史上又一个新的里程碑。作为计算机两大发展方向之一的单片机,以面向对象的实时控制为己任,嵌入到如家用电器、汽车、机器人、仪器仪表等设备中,使其智能化。目前国内外各大电气公司,大的半导体厂商正在不断的开发、使用单片机,使其无论在控制能力,减小体积,降低成本,还是开发环境的改善
5、等方面,都得到空前迅速的发展。温度检测控制系统在工业生产、科学研究和人们的生活领域中,得到了广泛应用。在工业生产过程中,很多时候都需要对温度进行严格的监控,以使得生产能够顺利的进行,产品的质量才能够得到充分的保证。使用自动温度控制系统可以对生产环境的温度进行自动控制,保证生产的自动化、智能化能够顺利、安全进行,从而提高企业的生产效率。温度检测系统应用十分广阔。1.2 温度控制系统设计的意义随着社会的发展,科技的进步,以及测温仪器在各个领域的应用,智能化已是现代温度控制系统发展的主流方向。温度测试控制系统,控制对象是温度。温度控制在日常生活及工业领域应用相当广泛,比如温室、水池、发酵缸、电源等场
6、所的温度控制。而以往温度控制是由人工完成的而且不够重视,其实在很多场所温度都需要监控以防止发生意外。针对此问题,本系统设计的目的是实现一种可连续高精度调温的温度控制系统,它应用广泛,功能强大,小巧美观,便于携带,是一款既实用又廉价的控制系统。特别是近年来,温度控制系统已应用到人们生活的各个方面,但温度控制一直是一个未开发的领域,却又是与人们息息相关的一个实际问题。1.3 温度控制系统完成的功能本器件以AT89S52单片机系统进行温度采集与控制 温度信号由模拟温度传感器DS18B20采集输入AT89S52,主控器能对各温度检测器通过LED进行显示。本机实现的功能:1、利用温度传感器采集到当前的温
7、度,通过AT89S52单片机进行控制,最后通过LED数码管以串行口传送数据实现温度显示。2、可以通过按键任意设定一个恒定的温度。3、将水环境数据与所设置的数据进行比较,当水温低于设定值时,开启加热设备,进行加热;当水温高于设定温度时,停止加热,从而实现对水温的自动控制。4、当系统出现故障,超出控制温度范围时,自动蜂鸣报警。第二章 系统方案设计2.1 方案一采用普通电阻式温度传感器,放大器,A/D转换器作为测量温度的电路。采用两种不同材质的导体,如在某点互相连接在一起,对这个连接点加热,在它们不加热的部位就会出现电位差。这个电位差的数值与不加热部位测量点的温度有关,和这两种导体的材质有关。这种现
8、象可以在很宽的温度范围内出现,如果精确测量这个电位差,再测出不加热部位的环境温度,就可以准确知道加热点的温度。由于它必须有两种不同材质的导体,所以称之为“热电偶”。不同材质做出的热电偶使用于不同的温度范围,它们的灵敏度也各不相同。热电偶的灵敏度是指加热点温度变化1时,输出电位差的变化量。对于大多数金属材料支撑的热电偶而言,这个数值大约在540微伏之间。热电偶传感器有自己的优点和缺陷,它灵敏度比较低,容易受到环境干扰信号的影响,也容易受到前置放大器温度漂移的影响,因此不适合测量微小的温度变化。由于热电偶温度传感器的灵敏度与材料的粗细无关,用非常细的材料也能够做成温度传感器。也由于制作热电偶的金属
9、材料具有很好的延展性,这种细微的测温元件有极高的响应速度,可以测量快速变化的过程。2.2 方案二采用数字可编程温度传感器作为温度检测元件。数字可编程温度传感器可以直接读出被测温度值。不需要将温度传感器的输出信号接到A/D转换器上,减少了系统的硬件电路的成本和整个系统的体积。美国Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。全部传感元件及转换电路集成在形如一只三极管的集成电路内。“一线总线”独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。现在,新一代的DS18B
10、20体积更小、更经济、更灵活。使你可以充分发挥“一线总线”的优点。 同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为-55C+125C,在-10+85C范围内,精度为0.5C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。与前一代产品不同,新的产品支持3V5.5V的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小它还有很多特性:适应电压范围更宽,电压范围:3.05.5V,寄生电源方式下可由数据线供;独特的单线接口方式,DS18B20在与微处理器连接时仅
11、需要一条口线即可实现微处理器与DS18B20的双向通讯;DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温;DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内;温范围55125,在-10+85时精度为0.5;可编程的分辨率为912位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625,可实现高精度测温;在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快;测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校
12、验码,具有极强的抗干扰纠错能力;负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。2.3 方案论证方案一硬件电路复杂,需要设计A/D转换电路,以及与其相关的编程,总体设计起来较困难,软件、硬件调试复杂,硬件成本较高。而且器传感器有以下缺点:它灵敏度比较低,容易受到环境干扰信号的影响,也容易受到前置放大器温度漂移的影响。所以总体来说,方案一在硬件、软件上的成本都比较高,而且易受外部环境的影响,系统工作不稳定。方案二由于采用的是具有一总线特点的温度传感器,所以电路连接简单;而且该传感器拥有强大的通信协议,同过几个简单的操作就可以实现传感器与单片机的交互,包括复位传感器、对传感器读写数
13、据、对传感器写命令。软件、硬件易于调试,制作成本较低。也使得系统所测结果精度大大提高。经过对这两种方案的比较,本设计决定采用方案二。第三章 硬件电路设计3.1系统总体设计本次设计采用采样值和键盘设定值进行比较运算的方法来简单精确地控制温度。它的整体思想是先通过键盘输入设定温度,保存在AT89S52的指定单元中,再利用温度传感器DS18B20进行信号的采集,送入单片机中,保存在采样值单元。然后把采样值与设定值进行比较运算,得出控制量,从而调节继电器触发端的通断,来实现将温度控制在一定的范围内。单片机控制系统是一个完整的智能化的集数据采集、显示、处理、控制于一体的系统。由传感器、LED显示单片机及
14、执行机构控制部分等组成。系统结构框图如图3.1所示。DS18B20LED显示指示灯单 片 机加热继电器按键图3.1 系统硬件结构框图3.2 各部分硬件电路设计3.2.1、时钟电路设计时钟电路是用来产生AT89S52单片机工作时所必须的时钟信号,AT89S52本身就是一个复杂的同步时序电路,为保证工作方式的实现,AT89S52在唯一的时钟信号的控制下严格的按时序执行指令进行工作 ,时钟的频率影响单片机的速度和稳定性。通常时钟由于两种形式:内部时钟和外部时钟。我们系统采用内部时钟方式来为系统提供时钟信号。AT89S52内部有一个用于构成振荡器的高增益反向放大器,该放大器的输入输出引脚为XTAL1和
15、XTAL2,它们跨接在晶体振荡器和用于微调的电容,便构成了一个自激励振荡器。电路中的C1、C2的选择在30PF左右,但电容太小会影响振荡的频率、稳定性和快速性。晶振频率为在1.2MHZ12MHZ之间,频率越高单片机的速度就越快,但对存储器速度要求就高。为了提高稳定性我们采用温度稳定性好的NPO电容,采用的晶振频率为12MHZ。本次系统的时钟电路设计如图3.2所示。 图3.2 时钟电路图3.2.2系统复位电路在图3.3 中复位开关K1 被按下并松开,使端获得低电平,RST 端输出复位信号,单片机复位。或由于( VCC 加入并超过复位门限电压) 引起系统正常复位。图3.3 复位电路图3.2.3报警
16、与控制电路设计 在微型计算机控制系统中,为了安全生产,对于一些重要的参数或系统部位,都设有紧急状态报警系统,以便提醒操作人员注意,或采取紧急措施。其方法就是把计算机采集的数据或记过计算机进行数据处理、数字滤波,标度变换之后,与该参数设定值进行比较,如果高于设置值1度(或低于设置数1度)则进行报警,否则就作为采样的正常值,进行显示和控制。同样水箱内的温度超出低高设定的温度范围内时当P1.4输出高电平“0”时,晶体管导通,压电蜂鸣器两端获得约+5V电压而鸣叫,出报警声音;单片机的P1.1输出低电平,此时红色指示灯亮,直到低于设定的最低温度时,P1.4输出高时,三极管截止,蜂鸣器停止发声,P1.1输
17、出电平高电平,发光二极管灭,报警和控制电路而下图3-4所示:图3.4 报警与控制电路与单片机的连接3.2.4 LED显示电路设计LED数码管是一种半导体发光器件,其基本单元是发光二极管,通过对其不同的管脚输入相对的电流,会使其发亮,从而显示出数字。可以显示:时间、日期、温度等可以用数字代替的参数。 数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳极数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳极数
18、码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,通过由各自独立的I/O线控制,当单片机的P0口输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对P2.0-P2.3位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的COM端,就使各个数码管轮
19、流受控显示,这就是动态驱动。在本设计中采用了四位八段数码管,用动态驱动来显示温度的值,如图3.5所示。图3.5 显示电路图3.2.5温度检测电路设计本次设计所采用的温度传感器为Dallas半导体公司的数字化温度传感器DS18B20,它是世界上第一片支持“一线总线”接口的温度传感器。“一线器件”体积更小、适用电压更宽、更经济。全部传感元件及转换电路集成在形如一只三极管的集成电路内。DS18B20可以程序设定912位的分辨率,精度为0.5。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。DS18B20与AT89S52单片机接口电路的设计
20、DSl8B20数字温度计提供9位(二进制)温度读数,指示器件的温度信息经过单线接口送入DSl8B20或从DSl8B20送出,因此从主机CPU到DSl8B20仅需一条线,当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625LSB形式表示。当符号位S0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据6
21、。图3.6 DS18B20与AT89S52单片机的连接DS18B20支持“一线总线”接口,测量温度范围为 -55C-+125C,在-10-+85C范围内,精度为0.5C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。1.DS18B20产品的特点 (1)只要求一个端口即可实现通信。 (2)在DS18B20中的每个器件上都有独一无二的序列号。 (3)实际应用中不需要外部任何元器件即可实现测温。 (4)测量温度范围在-55C-+125C之间。 (5)数字温度计的分辨率用户可以从9位到12位选择。
22、(6)内部有温度上、下限设置。 2.DS18B20的引脚介绍 TO92封装的DS18B20引脚功能描述见表1。 表1DS18B20详细引脚功能描述序号名称引脚功能描述1GND地信号2DQ数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。3VDD可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。主要首先DS18B20提供以下功能命令之一:读ROM, ROM匹配,搜索ROM,跳过ROM,报警检查。若指令成功地使DS18B20完成温度测量,数据存储在DS18B20的存储器。一个控制功能指挥
23、指示DS18B20的演出测温。测量结果将被放置在DS18B20内存中,并可以让阅读发出记忆功能的指挥,阅读内容的片上存储器。温度报警触发器TH和TL都有一字节EEPROM 的数据。如果DS18B20不使用报警检查指令,这些寄存器可作为一般的用户记忆用途。在片上还载有配置字节以理想的解决温度数字转换。写TH,TL指令以及配置字节利用一个记忆功能的指令完成。所有的数据的读、写都是从最低位开始。3.2.6按键电路设计键盘共有三个键,判断K3K5键是否按下,可采用软件查询和中断的方法,当某个键按下时,低电平有效。3个键K3K5的功能定义如表所示。K3K5键的定义按键键名功能K3功能转换键此键按下,显示
24、温度设定值,按键松开,显示当前温度K4加1键设定温度值加1K5减1键设定温度值减1 图3.7 按键电路3.2.7 继电器控制电路 控制P10的高低电平来控制继电器的断开和闭合,当P10口为低电平时,三极管导通,发光二极管亮,控制继电器开始加热,当P10为高电平时,三极管截止,继电器断开,停止加热。第四章 软件设计4.1 主程序方案首先要根据系统的总体功能和键盘设置选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系。本部分详细介绍了基于AT89S52单片机的多路温度采集控制系统的软件设计。根据系统功能,可以将系统设计分为若干个子程序进行设计,如温度采
25、集子程序,数据处理子程序、显示子程序、执行子程序。采用Kiel uVision3集成编译环境和汇编语言来进行系统软件的设计。本章从设计思路、软件系统框图出发,先介绍整体的思路后,再逐一分析各模块程序算法的实现,最终编写出满足任务需求的程序。并对温度进行实时显示。采用C语言编写代码, 鉴于篇幅限制及DS18B20 的应用已经规范和成熟, 本文仅就主程序流程图和显示子程序流程图及其代码进行说明。通过定时器T0 P3.4口的定时来实现, 在此不再赘述。主程序流程图主程序通过调用温度采集子程序完成温度数据采集, 然后调用温度转换子程序转换读取温度数据,调用显示子程序进行温度显示和判断温度数据。主程序(
26、见附录2)调用四个子程序,分别是温度采集程序、数码管显示程序、温度处理程序和数据存储程序。温度采集程序:对温度芯片送过来的数据进行处理,进行判断和显示。数码管显示程序:向数码的显示送数,控制系统的显示部分。温度处理程序:对采集到的温度和设置的上、下限进行比较,做出判断,向继电器输出。数据存储程序:对键盘的设置的数据进行存储。显示当前温度判断当前温度值超过设定温度1度红灯亮设定温度值是否低于设定温度1度是红灯亮否 图 4-1 系统总流程图4.2 各个模块子程序设计4.2.1主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一
27、秒之内测量一次被测温度,其程序流程见图19所示。通过调用读温度子程序把存入内存储中的整数部分与小数部分分开存放在不同的两个单元中,然后通过调用显示子程序显示出来。图4-2 主程序流程图4.2.2读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。DS18B20复位、应答子程序读温度命令子程序写入子程序跳过ROM匹配命令DS18B20复位、应答子程序显示子程序(延时)写入子程序温度转换命令写入子程序跳过ROM匹配命令终 止 图4-3 读出温度子程序 DS18B20的各个命令对时序的要求特别严格,所以必须按照所要求的时序才能达到预
28、期的目的,同时,要注意读进来的是高位在后低位在前,共有12位数,小数4位,整数7位,还有一位符号位。 4.2.3数码管显示模块 本系统采用共阳极数码管,用模拟串口的动态显示数据。其流程图如图4.3所示:图4-4 数码管显示流程图4.2.3温度处理程序系统通过DS18B20采集到温度和设置的上、下限进行比较得出结果,进行报警。 第五章 系统调试5.1测试环境及工具测试温度:0-100摄氏度。(模拟不同温度值环境)测试仪器及软件:数字万用表,温度计0-100摄氏度。5.2测试方法使系统运行,观察系统硬件检测是否正常(包括单片机控制系统,键盘电路,显示电路,温度测试电路等)。系统自带测试表格数据,观
29、察显示数据是否相符合即可。采用温度传感器和温度计同时测量水温变化情况,目测显示电路是否正常。并记录温度值,与实际温度值比较,得出系统的温度指标。5.3测试结果分析自检正常,温度显示正常。因为芯片是塑料封装,所以对温度的感应灵敏度不是相当高,需要一个很短的时间才能达到稳定。 结 论经过设计和实践,本设计已经完成了一个比较完整的温度检测预与报警系统。它可以通过键盘输入温度上限、下限值,然后计算其上限和下限的中间值作为最适温度值。不断的采集温度值,显示温度值,如果发现采集的温度值高于上限值就通过相应的提示灯亮。如果采集的温度值低于下限值,那么也有相应的灯提示操作人员。如果并没有超过上下限则不会报警。
30、致此本人设计基本完成了预期的目标,系统在温度采集、温度处理和键盘处理方面做的比较好,而在数据的存储和数码管的显示方面不够理想。主要存在以下几个方面:(1) 程序的代码不够精练,浪费AT89S52内的FLASH ROM;(2) 未对以前的温度数值进行存储,使以后不能利用这些数据;(3) 对数码管的控制考虑不周,以致出现闪烁现象;致 谢毕业设计就要结束了,在这一段时间里,我感到自己的收获是非常大的,使我在专业技能、动手能力多方面都有了很大的提高。在整个设计过程中,受到了我们老师和同学的热切关注和耐心辅导,特别是对我进行了系统的讲解和指导,对设计提出了很多建设性的意见及建议,对我的设计起到了指导性和
31、决定性的作用,还教给了我们遇到问题,如何去分析问题、解决问题的方法。使我受益匪浅。从接受课题到现在完成毕业设计论文,尤其是在课题设计的前期准备工作和设计的过程中,导师提出了许许多多宝贵的设计意见,在最后的论证修改过程中老师还在百忙之中,抽出时间对我的论文提供了必要的指导和帮助。这使得我能够顺利的完成毕业设计工作。在这里我向他表示真诚的感谢!同时得到了同组同学的支持与帮助,使我深刻的体会到了良师益友给我带来的帮助,在此表示深深的感谢!感谢母校的辛勤培育之恩!感谢它给我提供的良好学习及实践环境,使我学到了许多新的知识,掌握了一定的操作技能。感谢和我在一起进行课题研究的同学们,和他们在一起讨论、研究
32、使我受益非浅。感激师友的教诲和帮助!参考文献1.张琳娜,刘武发,传感检测技术及应用,中国计量出版社,19992.沈德金,陈粤初,MCS-51系列单片机接口电路与应用程序实例,北京航空航天大学出版社,19903.周立功等, 增强型80C51单片机速成与实战,北京航空航天大学出版社,2003.74.马忠梅 籍顺心 张凯 马 岩, 单片机的C语言应用程序设计-修订版,北京航空航天大学出版社,1998.106. 胡汉才,单片机原理及接口技术,清华大学出版社,19967. 李志全等,智能仪表设计原理及应用,国防工业出版社,1998.68.何立民,MCS-51系列单片机应用系统设计,北京航空航天大学出版社
33、,19901,附录一:系统原理图附录二: 程序代码#include /52系列头文件#include #define uchar unsigned char#define uint unsigned intsbit ds=P34;sbit dula=P26;sbit beep=P14; /定义蜂鸣器sbit led=P11;sbit jdq=P10;uint temp,t,w; /定义整型的温度数据uchar flag;float f_temp; /定义浮点型的温度数据uint low; /定义温度下限值 是温度乘以10后的结果uint high; /定义温度的上限值sbit led1=P10
34、; /控制发光二极管sbit led2=P11; /控制发光二极管sbit s1=P35;sbit s2=P36;sbit s3=P37;uchar flag1,flag2,flag3,flag4,s1num,qian,bai,shi,ge;uchar code table= 0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0xc6 ;/共阳数码管段码表uchar code table1=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;/带小数点的编码 void delay(uchar z
35、) /延时函数 uchar a,b; for(a=z;a0;a-) for(b=100;b0;b-);void init() EA=1; ET1=1; TR1=1; TMOD=0x10; TH1=(65536-4000)/256; TL1=(65536-4000)%256; flag=0; high=100; jdq=1;void didi() beep=0; led=0; delay(500); beep=1; led=1; delay(500);void dsreset(void) /DS18b20复位, 初始化函数 uint i; ds=0; i=103; /延时最短480us whil
36、e(i0) i-; ds=1; /等待16-60us,收到低电平一个约60-240us则复位成功 i=4; while(i0) i-;bit tempreadbit(void) /读1位数据函数 uint i; bit dat; ds=0;i+; ds=1;i+;i+;/i+起到延时作用 dat=ds; i=8; while(i0)i-; return(dat);uchar tempread(void)/读1字节的数据函数 uint i,j,dat; dat=0; for(i=1;i=8;i+) j=tempreadbit(); dat=(j1); /读出的数据最低位在最前面,这样刚好一个字节
37、在dat里 return(dat);void tempwritebyte(uchar dat) /向DS18B20写一个字节的数据函数 uint i; uchar j; bit testb; for(j=1;j1; if(testb) /写1 ds=0;i+;i+;ds=1;i=8;while(i0)i-; else /写0 ds=0;i=8;while(i0) i-;ds=1;i+;i+; void tempchange(void) /DS18B20开始获取温度并转换 dsreset(); delay(1); tempwritebyte(0xcc);/写跳过读ROM指令 tempwriteb
38、yte(0x44); /写温度转换指令uint get_temp()/读取寄存器中存储的温度数据 uchar a,b; dsreset(); delay(1); tempwritebyte(0xcc); /写跳过读ROM指令 tempwritebyte(0xbe); /写温度转换指令 a=tempread(); /读低8位 b=tempread(); /读高8位 temp=256*b+a; f_temp=temp*0.0625; /温度在寄存器中为12位,分辨率为0.0625 temp=f_temp*10+0.5; /乘以10表示小数点后面只取一位 return temp; /temp是整型v
39、oid keyscan() if(s1=0) P2=0xff; delay(5); if(s1=0) while(!s1); s1num+; if(s1num=1) flag=1; if(s1num=2) s1num=0; flag=0; if(s1num=1) flag=1;if(s2=0) delay(5);if(s2=0) while(!s2);high+=10;if(high=1000) high=100;if(s3=0)delay(5);if(s3=0) while(!s3); high-=10; if(high=0) high=100; void main()/主函数 init()
40、; while(1) tempchange(); /温度转换函数 if(temp=high-10)&(temphigh)&(temphigh+10) jdq=1;didi(); void time1() interrupt 3 TH1=(65536-4000)/256; TL1=(65536-4000)%256; t+; keyscan(); if(flag=0) if(t=4)t=0; switch(t) case 1:P0=tableget_temp()/100; P2=0xfd;break; case 2:P0=table1get_temp()%100/10;P2=0xfb;break; case 3:P0=tableget_temp()%10; P2=0xf7;break; if(flag=1) if(t=4)t=0; switch(t) case 0:P0=0xff; P2=0xfe;break; case 1:P0=0xff; P2=0xfd;break; case 2:P0=tablehigh/100; P2=0xfb;break; case 3:P0=tablehigh%100/10; P2=0xf7;break;