DS18B20温度测控系统设计总程序
DS18B20智能温度控制器(附软件程序)
DS18B20智能温度控制器DALLAS最新单线数字温度传感器DS18B20简介新的“一线器件”体积更小、适用电压更宽、更经济 Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
DS18B20、 DS1822 “一线总线”数字化温度传感器同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
DS1822的精度较差为± 2°C 。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同,新的产品支持3V~5.5V 的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18B20、 DS1822 的特性 DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS18B20的性能是新一代产品中最好的!性能价格比也非常出色! DS1822与 DS18B20软件兼容,是DS18B20的简化版本。
省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。
继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。
DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
DS18B20的内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
单片机DS18B20水温控制系统设计
单片机DS18B20水温控制系统设计一.引言在一些温控系统电路中,广泛采用的是通过热电偶、热电阻或PN结测温电路经过相应的信号调理电路,转换成A/D转换器能接收的模拟量,再经过采样/保持电路进行A/D 转换,最终送入单片机及其相应的外围电路,完成监控。
但是由于传统的信号调理电路实现复杂、易受干扰、不易控制且精度不高。
本文介绍单片机结合DS18B20水温控制系统设计,因此,本系统用一种新型的可编程温度传感器(DS18B20),不需复杂的信号调理电路和A/D转换电路能直接与单片机完成数据采集和处理,实现方便、精度高,可根据不同需要用于各种场合。
目录一.引言...二.设计目的...三.系统功能...四.系统设备...五.温度控制总体方案与原理...1.系统模块图...2.系统模块总关系图...六.温度转换核心及其算法...1.温度传感器DS18B20原理与特性...DSl8B20的管脚及特点...DS18B20的内部结构...DS18B20的内存结构...DS18B20的测温功能...DSl820工作过程中的协议...温度传感器与单片机通讯时序...2.温度转换算法及分析...七.硬件设计说明...1.系统总体电路图...2.各个模块电路图...输入系统...输出系统...芯片系统...八.软件设计说明...1.总模块的流程图...2.各个模块的流程图...读取温度DS18B20模块的流程...键盘扫描处理流程...九.操作指引...按键功能...显示温度...设定温度...十.参考文献...程序源代码...二.设计目的设计并制作一个水温自动控制系统,控制对象为1升净水,容器为搪瓷器皿。
水温可以在一定范围内由人工设定,并能在环境温度降低时实现自动控制,以保持设定的温度基本不变。
利用单片机AT89S52实现水温的智能控制,使水温能够在40-90 度之间实现控制温度调节。
利用仪器读出水温,并在此基础上将水温调节到我们通过键盘输入的温度(其方式是加热或降温),而且能够将温度显示在我们的七段发光二极管板上。
DS18B20温度检测
目录1引言 (1)2系统描述 (2)2.1系统功能 (2)2.2系统设计指标 (2)3系统的主要元件 (3)3.1单片机 (3)3.2温度传感元件 (4)3.3LCD显示屏 (6)4硬件电路 (7)4.1系统整体原理图 (7)4.2单片机晶振电路 (7)4.3温度传感器连接电路 (8)4.4LCD电路 (9)4.5报警和外部中断电路 (10)5结论 (11)温度监测系统硬件设计摘要:利用DS18B20为代表的新型单总线数字式温度传感器实现温度的监测,可以简化硬件电路,也可以实现单线的多点分布式温度监测,而不会浪费单片机接口,提供了单片机接口的利用率。
同时提高了系统能够的抗干扰性,使系统更灵活、方便。
本系统主要实现温度的检测、显示以及高低温的报警。
也可以通过单总线挂载多个DS18B20实现多点温度的分布式监测。
关键词: DS18B20,单总线,温度,单片机1引言在科技广泛发展的今天,计算机的发展已经越来越快,它的应用已经越来越广泛。
而单片机的发展和应用是其中的重要一方面。
单片机在工业生产(机电、化工、轻纺、自控等等)和民用家电各方面有广泛的应用。
其中,单片机在工业生产中的应用尤其广泛。
单片机具有集成度高,处理能力强,可靠性高,系统结构简单,价格低廉的优点,因此被广泛应用。
在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要测量参数。
例如:在冶金工业、化工工业、电力工程、机械制造和食品加工等许多领域中,人们都需要对各类加热炉、热处理炉、反映炉和锅炉,尤其是热学试验(如:物体的比热容、汽化热、热功当量、压强温度系数等教学实验)中的温度进行测量,并经常会对其进行控制。
传统的方式是采用热电偶或热电阻,但是由于模拟温度传感器输出为模拟信号,必须经过A/D 转换环节获得数字信号后才能够被单片机等微处理器接收处理,使得硬件电路结构复杂,制作成本较高。
近年来,美国DALLAS公司生产的DS18B20为代表的新型单总线数字式温度传感器以其突出优点广泛使用于仓储管理、工农业生产制造、气象观测、科学研究以及日常生活中。
DS18B20多点温度检测系统的设计
目录摘要2 ABSTRACT 3 第一章绪论4 §1.1 系统背景4 §1.2 系统概述4 第二章方案论证5 §2.1 传感器部分5 §2.2 主控制部分6 §2.3 系统方案6 第三章硬件电路设计7 §3.1 电源以及看门狗电路7 §3.2 键盘以及显示电路9 §3.2 温度测试电路11 §3.3 串口通讯电路15 §3.4 整体电路16 第四章软件设计16 §4.1 概述16 §4.2 主程序方案16 §4.3 各模块子程序设计18 第五章系统调试20 §5.1 分步调试20 §5.2 统一调试20 结束语21 参考文献22 附录一:软件流程图24 附录二:电路原理图25 致谢27多点温度检测系统设计作者:谭诗炜(电信200201 班)指导老师:冯杰摘要DS18B20 是一种可组网的高精度数字式温度传感器,由于其具有单总线的独特优点,可以使用户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠.本文结合实际使用经验,介绍了DS18B20 数字温度传感器在单片机下的硬件连接及软件编程,并给出了软件流程图.该系统由上位机和下位机两大部分组成.下位机实现温度的检测并提供标准RS232 通信接口芯片使用了ATMEL 公司的AT89C51 单片机和DALLAS 公司的DS18B20 数字温度传感器上位机部分使用了通用PC.该系统可应用于仓库测温、楼宇空调控制和生产过程监控等领域关键字:温度测量;单总线;数字温度传感器;单片机AbstractAs a kind of high-accuracy digital net temperature sensor,DS18 B20 can be used building a sensor net easily. It can also make the net simple and reliable with it's special 1-wire interface .This paper introduces the application of DS18B20 with single chip processor.The system is constituted by two parts the temperature measured part and displayed part. The temperature measured part has a RS232 interface. It used AT89C51 of ATMEL company and DS18B20 of DALLAS company .The displayed part uses PC .This system is applied in such domains as warehouse detecting temperature;air-conditioner controlling system in building and supervisory productive process etc.Key words:temperature measure;single bus;digital thermometer;single chip processor;第一章绪论§1.1 系统背景在工、农业生产和日常生活中,对温度的测量及控制占据着极其重要地位.首先让我们了解一下多点温度检测系统在各个方面的应用领域:消防电气的非破坏性温度检测,电力、电讯设备之过热故障预知检测,空调系统的温度检测,各类运输工具之组件的过热检测,保全与监视系统之应用,医疗与健诊的温度测试,化工、机械…等设备温度过热检测•温度检测系统应用十分广阔.§1.2 系统概述本设计运用主从分布式思想,由一台上位机(PC 微型计算机),下位机(单片机)多点温度数据采集,组成两级分布式多点温度测量的巡回检测系统.该系统采用RS-232 串行通讯标准,通过上位机(PC)控制下位机(单片机)进行现场温度采集•温度值既可以送回主控PC进行数据处理由显示器显示.也可以由下位机单独工作,实时显示当前各点的温度值,对各点进行控制. 下位机采用的是单片机基于数字温度传感器DS18B20 的系统.DS18B20 利用单总线的特点可以方便的实现多点温度的测量,轻松的组建传感器网络,系统的抗干扰性好、设计灵活、方便而且适合于在恶劣的环境下进行现场温度测量.本系统可以应用在大型工业及民用常温多点监测场合.如粮食仓储系统、楼宇自动化系统、温控制程生产线之温度影像检测、医疗与健诊的温度测试、空调系统的温度检测、石化、机械…等•第二章方案论证温度检测系统有则共同的特点:测量点多、环境复杂、布线分散、现场离监控室远等.若采用一般温度传感器采集温度信号,则需要设计信号调理电路、A/D 转换及相应的接口电路,才能把传感器输出的模拟信号转换成数字信号送到计算机去处理.这样,由于各种因素会造成检测系统较大的偏差;又因为检测环境复杂、测量点多、信号传输距离远及各种干扰的影响,会使检测系统的稳定性和可靠性下降.所以多点温度检测系统的设计的关键在于两部分:温度传感器的选择和主控单元的设计.温度传感器应用范围广泛、使用数量庞大,也高居各类传感器之首.§2.1 传感器部分采用热敏电阻,可满足40 摄氏度至90摄氏度测量范围,但热敏电阻精度、重复性、可靠性较差,对于检测1 摄氏度的信号是不适用的.而且在温度测量系统中,采用单片温度传感器,比如AD590,LM35 等.但这些芯片输出的都是模拟信号,必须经过A/D 转换后才能送给计算机,这样就使得测温装置的结构较复杂.另外,这种测温装置的一根线上只能挂一个传感器,不能进行多点测量.即使能实现,也要用到复杂的算法,一定程度上也增加了软件实现的难度.方案二:在多点测温系统中,传统的测温方法是将模拟信号远距离采样进行AD 转换,而为了获得较高的测温精度,就必须采用措施解决由长线传输,多点测量切换及放大电路零点漂移等造成的误差补偿问题.采用数字温度芯片DS18B20 测量温度,输出信号全数字化.便于单片机处理及控制,省去传统的测温方法的很多外围电路.且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好.在0—100 摄氏度时,最大线形偏差小于1摄氏度.DS18B20 的最大特点之一采用了单总线的数据传输,由数字温度计DS1820 和微控制器AT89C51 构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接.这样,测温系统的结构就比较简单,体积也不大且由于AT89C51可以带多个DSB1820,因此可以非常容易实现多点测量•轻松的组建传感器网络.采用温度芯片DS18B20 测量温度,可以体现系统芯片化这个趋势•部分功能电路的集成,使总体电路更简洁,搭建电路和焊接电路时更快•而且,集成块的使用,有效地避免外界的干扰,提高测量电路的精确度.所以集成芯片的使用将成为电路发展的一种趋势.本方案应用这一温度芯片,也是顺应这一趋势.§2.2 主控制部分此方案采用PC机实现.它可在线编程,可在线仿真的功能,这让调试变得方便•且人机交互友好但是PC机输出信号不能直接与DS18B20通信•需要通过RS232电平转换兼容,硬件的合成在线调试,较为繁琐,很不简便.而且在一些环境比较恶劣的场合,PC 机的体积大,携带安装不方便,性能不稳定,给工程带来很多麻烦!此方案采用AT89C51 八位单片机实现•单片机软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制•而且体积小,硬件实现简单,安装方便•既可以单独对多DS18B20 控制工作,还可以与PC 机通信•运用主从分布式思想,由一台上位机(PC 微型计算机),下位机(单片机)多点温度数据采集,组成两级分布式多点温度测量的巡回检测系统,实现远程控制•另外AT89C51 在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟•§•3系统方案综上所述,温度传感器以及主控部分都采用第二方案•系统采用针对传统温度测温系统测温点少,系统兼容性及扩展性较差的特点,运用分布式通讯的思想•设计一种可以用于大规模多点温度测量的巡回检测系统•该系统采用的是RS-232 串行通讯的标准,通过下位机(单片机)进行现场的温度采集,温度数据既可以由下位机模块实时显示,也可以送回上位机进行数据处理,具有巡检速度快,扩展性好,成本低的特点•实际采用电路方案如下图:第三章硬件电路设计系统底层电路的功能主要包括:多点温度测试及其相关处理,实时显示温度信息,与上位机通讯传输温度数据•硬件设计主要包括以下几个模块:电源以及看门狗电路,键盘以及显示电路,温度测试电路,串口通讯电路•下面对电路分模块进行说明§3.1电源以及看门狗电路a. 电源电路因为单片机工作电源为+5V,且底层电路功耗很小•采用7805三端稳压片即可满足要求• 具体电路图如下:b. 看门狗电路考虑到底层电路板的工作环境相对恶劣,单片机会受到周围环境的干扰,而出现程序跑飞,死机…等一些不可预知的不正常工作现象•工作人员也不可能到现场对单片机重起,本设计为单片机电路添加一个外部看门狗电路•定时查询单片机的工作状态,一但发现异常即对单片机延时重起•保证系统安全可靠的运行•NE56604能为多种微处理器和逻辑系统提供复位信号,其门限电平为4.2V •在电源突然掉电或电源电压下降到低于门限电平时.NE56604将产生精确的复位信号.NE56604内置一个看门狗定时器,用于监控微处理器,以确保微处理器的正常运行•看门狗能产生一个系统复位信号用来终止任何由于微处理器故障而引发的不正常的系统操作.NE56604 的看门狗的监控周期为100mS(典型值).特性.正负双逻辑输出的有效复位信号..精准的门限电平监测..上电复位内部延时..可利用外部电阻调节的内部看门狗定时器..看门狗定时器的监控周期为100mS 典型值..VCC=0.8VDC 时产生有效的复位信号典型值. .仅需很少的外围元件.具体电路图如下:§3.2 键盘以及显示电路键盘电路单片机应用系统中除了复位按键有专门的复位电路,以及专一的复位功能外,其它的按键或键盘都是以开关状态来设置控制功能或输入数据.键盘有编码和非编码两种.非编码键盘硬件电路极为简单.故本系统采用拨码开关来控制.具体电路如下:A. 开关状态的可靠输入键开关状态的可靠输入有两种解决方法.一种是软件去抖动:它是在检测到有键按下时,执行一个10ms 的延时程序后,再确认该键电平是否仍保持闭合状态电平,如保持闭合状态电平则确认为真正键按下状态,从而消除了抖动影响.另一种为硬件去抖动:即为按键添加一个锁存器.两种方法都简单易行,本设计采用的是硬件去抖.B. 对按键进行编码给定键值或给出键号对于按键无论有无编码,以及采用什么编码,最后都要转换成为与累加器中数值相对应的键值以实现按键功能程序的散转转移.为使编码间隔小, 散转入口地址安排方便, 常采用依次序排列的键号.拨码开关值含义0000 实时显示通道一的温度值0001 实时显示通道二的温度值0010 实时显示通道三的温度值0011 实时显示通道四的温度值0100 实时显示通道五的温度值0101 实时显示通道六的温度值0110 实时显示通道七的温度值0111 实时显示通道八的温度值1*** 自动循环显示所有通道的温度C. 选择键盘监测方法对是否有键按下的信息输入方式有中断方式与查询方式两种.本设计采用的查询法,即在在CPU 空闲时调用键盘扫描子程序.温度显示电路设计采用的是共阴极七段数码管.显示方式有动态扫描和静态显示,两种方法在本设计中皆可由于静态扫描要用到多片串入并出芯片,考虑到电路板成本计算.本人采用是节约硬件资源的动态扫描方式.即用两块芯片就可以完成显示功能.显示数据由4511 译码器输出,ULN2003 为位驱动扫描信号.具体电路图如下:§3.2 温度测试电路这里我们用到温度芯片DS18B20.DS18B20 是DALLAS 公司生产的一线式数字温度传感器, 具有3引脚TO-92小体积封装形式•测温分辨率可达0.0625C,被测温度用符号扩展的16位数字量方式串行输出.其工作电源既可在远端引入,也可采用寄生电源方式产生.CPU 只需一根端口线就能与诸多DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路•DS18B20支持一线总线”接口,测量温度范围为-55 C~+125°C,在-10~+85 °范围内精度为±).5 °现场温度直接以一线总线”的数字方式传输,大大提高了系统的抗干扰性•适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等•DS18B20 内部结构(1) DS18B20 的内部结构如下图所示•DS18B20 内部结构图DS18B20 有4 个主要的数据部件:①64位激光ROM.64位激光ROM从高位到低位依次为8位CRC、48位序列号和8位家族代码(28H) 组成•②温度灵敏元件•③非易失性温度报警触发器TH和TL.可通过软件写入用户报警上下限值.④配置寄存器•配置寄存器为高速暂存存储器中的第五个字节•DS18B20 在0 工作时按此寄存器中的分辨率将温度转换成相应精度的数值,其各位定义如图所示•TM R1 R0 1 1 1 1 1MSB DS18B20 配置寄存器结构图LSB其中,TM:测试模式标志位,出厂时被写入0,不能改变;R0、R1:温度计分辨率设置位,其对应四种分辨率如下表所列,出厂时R0、R1置为缺省值:R0=1,R仁1(即12位分辨率),用户可根据需要改写配置寄存器以获得合适的分辨率• 配置寄存器与分辨率关系表:R0 R1 温度计分辨率/bit 最大转换时间/us0 0 9 93.750 1 10 187.51 0 11 3751 1 12 750(2) 高速暂存存储器高速暂存存储器由9个字节组成,其分配如下图所示.当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0 和第1 个字节.单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如图所示.对应的温度计算:当符号位S=0时, 直接将二进制位转换为十进制;当S=1 时,先将补码变为原码,再计算十进制值.温度低位温度高位TH TL 配置保留保留保留8 位CRCLSB DS18B20 存储器映像图MSB温度值格式图DS18B20 温度数据表:23 22 21 20 2-1 2-2 2-3 2-4MSB LSBS S S S S 26 25 24典型对应的温度值表:温度/c二进制表示十六进制表示+125+25.0625+10.125+0.5-0.5-10.125-25.0625-55 00000111 1101000000000001 1001000100000000 1010001000000000 0000100000000000 0000000011111111 1111100011111111 0101111011111110 0110111111111100 10010000 07D0H0191H00A2H0008H0000HFFF8HFF5EHFE6FHFC90HDS18B20 最大的特点是单总线数据传输方式,DS18B20 的数据I/O 均由同一条线来完成. 硬件连接电路如下图:本系统为多点温度测试.DS18B20 采用外部供电方式,理论上可以在一根数据总线上挂256 个DS18B20, 但时间应用中发现,如果挂接25 个以上的DS18B20 仍旧有可能产生功耗问题.另外单总线长度也不宜超过80M, 否则也会影响到数据的传输.在这种情况下我们可以采用分组的方式,用单片机的多个I/O 来驱动多路DS18B20. 在实际应用中还可以使用一个MOSFET 将I/O 口线直接和电源相连,起到上拉的作用.对DS18B20 的设计, 需要注意以下问题(1) 对硬件结构简单的单线数字温度传感器DS18B20 进行操作,需要用较为复杂的程序完成.编制程序时必须严格按芯片数据手册提供的有关操作顺序进行,读、写时间片程序要严格按要求编写.尤其在使用DS18B20 的高测温分辨力时,对时序及电气特性参数要求更高.(2) 有多个测温点时,应考虑系统能实现传感器出错自动指示,进行自动DS18B20 序列号和自动排序,以减少调试和维护工作量.(3) 测温电缆线建议采用屏蔽4 芯双绞线,其中一对线接地线与信号线,另一组接VCC 和地线, 屏蔽层在源端单点接地.DS18B20 在三线制应用时,应将其三线焊接牢固;在两线应用时,应将VCC与GND 接在一起,焊接牢固若VCC脱开未接传感器只送85.0 C的温度值.⑷实际应用时,要注意单线的驱动能力,不能挂接过多的DS18B20,同时还应注意最远接线距离.另外还应根据实际情况选择其接线拓扑结构.§3.3 串口通讯电路AT89C51 有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯.进行串行通讯时要满足一定的条件,比如电脑的串口是RS232 电平的,而单片机的串口是TTL 电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232 进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠.具体电路如下:我们采用了三线制连接串口,也就是说和电脑的9 针串口只连接其中的3 根线:第5 脚的GND 、第2 脚的RXD 、第3 脚的TXD. 这是最简单的连接方法,但是对本设计来说已经足够使用了,电路如上图所示.通信线采用交叉接法,即两者信号线对应成为R—T,T—R. 具体连接电路如下:§3.4 整体电路见附件二(电路原理图)第四章软件设计§4.1 概述整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了.从软件的功能不同可分为两大类:一是监控软件(主程序),它是整个控制系统的核心专门用来协调各执行模块和操作者的关系.二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等.每一个执行软件也就是一个小的功能执行模块.这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义.各执行模块规划好后就可以规划监控程序了.首先要根据系统的总体功能和键盘设置选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系.§4.2 主程序方案主程序调用了 4 个子程序,分别是数码管显示程序、键盘扫描以及按键处理程序、温度测试程序、中断控制程序、单片机与PC机串口通讯程序.键盘扫描电路及按键处理程序:实现键盘的输入按键的识别及相关处理温度测试程序: 对温度芯片送过来的数据进行处理,进行判断和显示数码管显示程序:向数码的显示送数,控制系统的显示部分. 中断控制程序: 实现循环显示功能.串口通讯程序:实现PC 机与单片机通讯,将温度数据传送给PC 机.将各个功能程序以子程序的形式写好,当写主程序的时候,只需要调用子程序,然后在寄存器的分配上作一下调整,消除寄存器冲突和I/O 冲突即可.程序应该尽可能多的使用调用指令代替跳转指令.因为跳转指令使得程序难以看懂各程序段之间的结构关系.而调用指令则不同,调用指令使得程序结构清晰,无论是修改还是维护都比较方便.将功能程序段写成子程序的形式,除了方便调用之外,还有一个好处那就是以后写程序的时候如果要用到, 就可以直接调用这个单元功能模块.主程序流程图如右图:§4.3 各模块子程序设计下面对主要几个子程序的流程图做介绍:(1) 温度测试子程序设计见附录一:温度测试子程序流程图(2) 中断控制程序设计如右图:(3) 串口通信程序设计本次通讯中,测控系统分位上位机和下位机之间的通信,系统中单片机负责数据采集、处理和控制,上位机进行现场可视化检测,通信协议采用半双工异步串行通信方式,通过RS232 的RTS 信号进行收发转换,传输数据采用二进制数据,上位机与下位机之间采用主从式通讯.本人采用的VB环境下PC机与单片机之间实现串行通讯的软硬件方案.VB是Microsoft公司推出的Windows 应用程序开发工具,因其具有界面友好,编程简便等优点而受到广泛的使用,而且Visual Basic 6.0 版本带有专门实现串行通讯的MSCOMM 控件.MSComm控件串口具有完善的串口数据的发送和接收功能•通过此控件,PC机可以利用串行口与其它设备实现轻松连接,简单高效地实现设备之间的通讯.此控件的事件响应有两种处理方式.事件驱动方式:由MSComm 控件的OnComm 事件捕获并处理通讯错误及事件;查询方式:通过检查CommEvent 属性的值来判断事件和错误.1) MSComm 控件的主要属性和方法a. CommPort:设置或返回串行端口号,其取值范围为1—99,缺省为1b. Sett ing:设置或返回串行端口的波特率、奇偶校验位、数据位数、停止位c. PortOpe n:打开或关闭串行端口d. RThreshold: 该属性为一阀值,它确定当接收缓冲区内字节个数达到或超过该值后就产生MSComml-OnComm 事件.e. In put :从接收缓冲区移走一串字符.f. Output: 向发送缓冲区传送一字符串. 软件流程图如下:单片机程序流程图PC 通讯程序流程图参数设定:通信端口选择COM1,波特率设定为1200B/SmPort=1MSComm.Setting= “1200, n, 8, 1 ”.START: MOV SP,#60HMOV TMOD,#20HMOV TH1,#0E6HMOV TL1,#0E6H ;1200B/S,晶振为12MHZMOV PCON,#00HMOV SCON,#50HSETB TR1第五章系统调试§5.1 分步调试1 、测试环境及工具测试温度:0~100摄氏度.(模拟多点不同温度值环境)测试仪器及软件:数字万用表,温度计0~100 摄氏度,串口调试助手测试方法:目测.2、测试方法使系统运行,观察系统硬件检测是否正常(包括单片机最小系统,键盘电路,显示电路,温度测试电路等).系统自带测试表格数据,观察显示数据是否相符合即可. 采用温度传感器和温度计同时测量多点水温变化情况(取温度值不同的多点), 目测显示电路是否正常.并记录各点温度值,与实际温度值比较,得出系统的温度指标. 使用串口调试助手与单片机通讯,观察单片机与串口之间传输数据正确否.3、测试结果分析自检正常,各点温度显示正常,串口传输数据正确.因为芯片是塑料封装,所以对温度的感应灵敏度不是相当高,需要一个很短的时间才能达到稳定.§5.2 统一调试将硬件及软件结合起来进行系统的统一调试.实现PC 机与单片机通讯,两者可以实时更新显示各点温度值.结束语AT89C51的时钟为12M,I/O 口可达32个,高的时钟频率和丰富的I/O,都为实现电路功能提供了非常有利的条件.同时也AT89C51 内含4KB FLASH ROM, 开发环境友好,易用,方便,大大加快本系统设计开发.拨码开关的使用,使操作更为简洁,易懂.实时显示电路的设计,使温度信息更迅速,直观地发布.本制作的设计中使用了传感器的只是插座电路,因此,该系统的可扩展性很强.整个系统硬件简单、可靠,系统成本低.致此本人设计基本完成了预期的目标,系统在硬件自动测试,键盘操作,实时显示方面做的比较好.但是由于时间仓促、条件有限,设计成果并不是很完美,还存在下面问题:串口通讯不稳定未对温度数值统计处理以及存储.我准备在今后的工作过程中进一步完善此设计.参考文献[1] .贾振国.DS1820及高精度温度测量的实现[J].电子技术应用,2000(1):58 - 59.[2] . 余永权. 单片机原理及应用. 北京:电子工业出版社, 1997[3] . 邦田. 电子电路实用抗干扰技术. 北京: 人民邮电出版社,1994[4] . Dallas semiconductor inc,ds18b20 programmable resolution 1 —wiredigital thermometer 2001[Z] .[5] . 曲喜贵. 电子元件材料手册[ M]. 北京:电子工业出版社,1989.422-430.[6] . 黄贤武,郑筱霞,曲波等. 传感器实际应用电路设计[M]. 成都:电子科技大学出版社,1997.4-10.[7] . 刘君华. 智能传感器系统[M] . 西安:西安电子科技大学出版社,1999.[8] . 余永权. Flash 单片机原理及应用[M]. 北京:电子工业出版社,1997.[9] . 邦田. 电子电路实用抗干扰技术[M] . 北京:人民邮电出版社,1994.[10] . 周云波. 由DS18B20 单线数字温度计构成的单线多点温度测量系统. 电子技术应用,1996(2):15- 20.[11] . 吉鹏,马云峰等. 微机原理与接口技术[M]. 北京:高等教育出版社,2001.[12] . 振国. DS1820 及高精度温度测量的实现[J] . 电子技术应用,2000 (1) .[13] . 东耀,汪仁煌. 数字温度传感器在仓库温度检测系统的应用[J]. 传感器世界,2001(12):30- 33.[14] . 月霞,孙传友. DS18B20 硬件连接及软件编程[J]. 传感器世界,2001(12):25- 29.[15] . 一线数字温度传感器资料[M]. 武汉:武汉力源电子有限公司,1996.[16] . 贤武,郑霞,曲波. 传感器实际应用电路设计[M]. 成都:电子科技大学出版社,1997.[17] . 伟正. 单线数字温度传感器的原理与应用[1]. 电子技术应用,2000,6.66-68[18] . DALLAS 公司.DS18B20 数据手册[Z][19] . 周月霞,孙传友. DS18B20 硬件连接及软件编程[J]. 传感器世界,2001,(12).[20] . 单线数字温度传感器资料[M]. 武汉:武汉力源电子有限公司,1996.[21] . 贾东耀,汪仁煌. 数字温度传感器在仓库温度检测系统的应用[J]. 传感器世界,2001(12).[22] . 余永权. ATMEL 89 系列单片机应用技术[M]. 北京:北京航空航天大学出版社2002.[23] . 胡汉才. 单片机原理及系统设计[M]. 北京:清华大学出版社,2002[24] . 李更祥. 单总线数字式智能型温度传感器在测控领域中的应用[J]. 计算机自动测量与控制,1999,7(3):51-53.[25] . 忠梅. 单片机的C 语言应用程序设计[M]. 北京:北京航空航天大学出版社,1997。
多个DS18B20温度测量程序
#include<reg51.h>#include<intrins.h> //nop函数#include<stdlib.h>#include<math.h>#define uchar unsigned char#define uint unsigned intsbit DS18B20_DQ=P2^7;sbit feng=P2^0;sbit deng=P1^0;#define LCD_data P0 //ch375数据端口uchar count1,count2,count;sbit LCD_RS=P3^5;sbit LCD_RW=P3^6; //ch375的rw也是此口sbit LCD_EN=P3^4;#include<key_fo.h>uchar ds18b20_serial[4][8]={0x28,0x51,0x8c,0x9e,0x03,0x00,0x00,0xfd, //第1个18B20的ID0x28,0x71,0x91,0x9e,0x03,0x00,0x00,0xdb, //第2个18B20的ID0x28,0x43,0xa6,0x9a,0x03,0x00,0x00,0x83, //第3个18B20的ID0x28,0xe3,0x8a,0x9e,0x03,0x00,0x00,0x08 //第4个18B20的ID};#include<12864.h>uchar temp_num1;uchar temp_num2;uint temper=0,yushe1=325,yushe2=325,yushe3=325,yushe4=325,piancha;/****************************************************函数:void Ds18b20_Delay(uint timer)功能:STC单片机严格的us级延时函数*****************************************************/void Ds18b20_Delay(uint timer) //us{while(timer--){_nop_();_nop_();_nop_();}}/***************************************************函数:void rest()功能:DS18B20芯片复位函数说明:复位时,MCU将数据线置为低电平,并且保持480uS-960uS,然后置为高电平,延时一段时间后,然后由MCU接受DS18B20的响应信号。
电子温度计 DS18B20 程序 电路图
它的功能是:1.读出当前温度值。
2.可通过按键调整报警温度上下限。
按第一个键,进入温度上线调节模式,第二个键温度加,第三个键温度减,再按一下第一个键,进入温度下线调节模式,第二个键温度加,第三个键温度键,再按一下第一个键,正常显示当前温度。
3.当进入报警温度上下限调节时,红灯亮,当显示当前温度是,绿灯亮。
4.当当前温度超过上限温度时,或者低于下限温度时,蜂鸣器报警且黄灯闪烁。
需要说明的是,一般情况下,DQ引脚应该有一个上拉电阻来拉高电平,但是我通过观察发现,初始状态下,89C52单片机的引脚都为高电平,故我将上拉电阻去除,1820与单片机正常通信,加上上拉电阻,反而不能正常通信。
#include <reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^0;sbit Speak=P1^7;sbit Out=P3^2;sbit Button1=P1^4;sbit Button2=P1^5;sbit Button3=P1^6;sbit Ledblue=P1^0;sbit Ledred=P1^1;bit Point;uint T;int Up=980,Down=300,Tplace=0;code uchar Ledcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x8f}; /*数码管显示的数字0123456789℃*/code uchar Ledcode_s[]={0xbf,0x86,0xdb,0xcf, /*带小数点数码管显示0123456789-*/0xe6,0xed,0xfd,0x87,0xff,0xef,0x40};code uchar Ledplace[]={0,0x1e,0x1d,0x1b,0x17,0x0f}; /*数码管的位置1 2 3 4 5 位*/void Delay_2us(uchar num_us) /*可调度为2us,最大误差为6us,最大延时510us*/ {while(--num_us);}void Delay_8us(uint num_us) /*延时8微妙最大误差263us*/{while(--num_us);}void Delay_ms(uint num_ms) /*延时1毫秒*/{uint i;while(num_ms--){for(i=0;i<123;i++);}}void Speaker() /*蜂鸣器响*/{uint i=50;while(--i)Speak=~Speak;Delay_8us(500);}}void Nospeaker() /*蜂鸣器不响*/ {Speak=0;}bit Reset() /*复位*/{bit flag;DQ=1;_nop_();DQ=0;Delay_8us(70);DQ=1;Delay_2us(20);flag=DQ;Delay_2us(70);DQ=1;Delay_2us(70);return flag;}void Writedata(uchar dat) /*写数据*/{uchar i;bit flag;for(i=0;i<8;i++){flag=dat&0x01;DQ=1;_nop_();DQ=0;Delay_2us(5);DQ=flag;Delay_2us(40);dat=dat>>1;DQ=1;Delay_2us(2);}Readdata() / *读数据*/ {uchar i=0,dat=0;bit flag=0;for(i=0;i<8;i++){DQ=1;_nop_();DQ=0;Delay_2us(5);DQ=1;flag=DQ;Delay_2us(30);DQ=1;Delay_2us(5);dat=dat>>1;if(flag){dat|=0x80;}Delay_2us(3);}Out=0;return dat;}uint ReadTem() /*温度转换*/ {uint High,Low;Reset();Writedata(0xcc);Writedata(0x44);Delay_8us(85);Reset();Writedata(0xcc);Writedata(0xbe);Delay_8us(85);Low=Readdata();High=Readdata();Point=High&0xf8;if(Point){T=(~((High<<8)|Low)+1)*0.625;}else{T=((High<<8)|Low)*0.625;}return T;}Display(uint T) /*显示*/{if(Point){P2=Ledplace[1];P0=Ledcode_s[10];Delay_ms(5);P0=0;}else{P2=Ledplace[1];P0=0;Delay_ms(5);P0=0;}P2=Ledplace[2];P0=Ledcode[T/100];Delay_ms(5);P0=0;P2=Ledplace[3];P0=Ledcode_s[T%100/10];Delay_ms(5);P0=0;P0=Ledcode[T%10];Delay_ms(5);P0=0;P2=Ledplace[5];P0=Ledcode[10];Delay_ms(5);P0=0;}void Outinter() interrupt 0 /*外部中断*/{if((T>Up&&Point==0)||(T>Down&&Point==1)){Speaker();}else{Nospeaker();}Out=1;}main(void) /*主程序*/{EA=1;EX0=1;IT0=0;while(1){switch(Tplace){case 0: {Ledblue=1;Ledred=0;Display(ReadTem());}break;case 1: {Ledred=1;Ledblue=0;Point=0;Display(Up);}break;case 2: {Ledred=1;Ledblue=0;Point=1;Display(Down);}break;}if(!Button1){Delay_ms(300);if(Tplace==3){Tplace=0;}}if(!Button2&&Tplace==1){Delay_ms(300);Up=Up+10;if(Up>990){Up=0;}}if(!Button3&&Tplace==1){Delay_ms(300);Up=Up-10;if(Up<0){Up=990;}}if(!Button2&&Tplace==2){Delay_ms(300);Down=Down-10;if(Down<0){Down=550;}}if(!Button3&&Tplace==2){Delay_ms(300);Down=Down+10;if(Down>550){Down=0;}}}}用ISIS模拟,显示正常,但是将模拟的电路焊出来,反而出现了几个问题:1.必须去掉第五位数码管选择位管脚的三极管,数码管方能正常显示。
ds18b20程序设计傻瓜式讲解
ds18b20程序设计傻瓜式讲解
DS18B20 是一款数字温度传感器,可以直接读出被测温度,并采用 9 位数字量串行输出。
下面是一个简单的 DS18B20 程序设计讲解:
1. 初始化
在 DS18B20 通信过程中,首先需要初始化数据线,即将其置为高电平。
在初始化时,需要持续至少 480 微秒的高电平。
2. 跳过 ROM
在 DS18B20 中,每个传感器都有一个唯一的 ROM 序列号,可以通过跳过ROM 操作来避免对 ROM 进行操作。
具体操作是先发出一个低电平,然后持续至少 60 微秒的高电平。
3. 发送命令
在跳过 ROM 后,需要向传感器发送命令。
常用的命令有温度转换命令和读取温度命令。
温度转换命令是 0x44,读取温度命令是 0xBE。
4. 读取数据
在发送命令后,需要等待传感器响应。
传感器响应的标志是数据线上的低电平。
在低电平持续约 60-240 微秒后,数据线将变为高电平,此时可以开始读取数据。
每次读取一位数据后,需要将数据线置为低电平,等待传感器响应。
5. 数据解析
DS18B20 的数据由 9 位数字量组成,其中最高位是符号位。
如果最高位为0,则表示温度为正数;如果最高位为 1,则表示温度为负数。
其余 8 位为温度值,可以通过一定的计算公式将其转换为实际温度值。
以上就是 DS18B20 的程序设计流程。
需要注意的是,在实际应用中,还需要考虑数据传输的校验、错误处理等问题。
(完整word版)DS18B20水温控制系统+电路图程序
水温控制系统摘要:该水温控制系统采用单片机进行温度实时采集与控制。
温度信号由“一线总线”数字化温度传感器DS18B20提供,DS18B20在-10~+85°C范围内,固有测温分辨率为0.5 ℃。
水温实时控制采用继电器控制电热丝和风扇进行升温、降温控制.系统具备较高的测量精度和控制精度,能完成升温和降温控制。
关键字:AT89C51 DS18B20 水温控制Abstract: This water temperature control system uses the Single Chip Microcomputer to carry on temperature real-time gathering and controling。
DS18B20,digitized temperature sensor, provides the temperature signal by "a main line”. In -10~+85℃the scope,DS18B20’s inherent measuring accuracy is 0.5 ℃. The water temperature real-time control system uses the electricity nichrome wire carring on temperature increiseament and operates the electric fan to realize the temperature decrease control。
The system has the higher measuring accuracy and the control precision,it also can complete the elevation of temperature and the temperature decrease control. Key Words:AT89C51 DS18B20 Water temperature control目录1.系统方案选择和论证 (2)1。
数字温度传感器ds18b20程序(含1602显示液晶程序)
lcden=0;
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址指针加1
write_com(0x01); //显示清0,数据指针清0
{
uint i; //初始化,先将数据线置高电平(单片机管脚默认高电平,故不用拉高),延时,时间尽可能短
ds=0; //数据线拉到低电平0
i=103;
while(i>0)i--; //循环执行相当于延时,延时480-960us,一条指令周期相当于1~4个及其周期(1us)
b=tempread(); //读高8位
temp=b;
temp<<=8; //temp=temp<<8,左移8位
temp=temp|a; //两个8位数据合并成一个数据,两个字节组合为1个字
f_temp=temp*0.0625; //温度在寄存器中为12位 分辨率位0.0625°
{
do
{
SBUF = *parr++; //发送数据
while(!TI); //等待发送完成标志为1
TI =0; //标志清零
}while(*parr); //保持循环直到字符为'\0'
uint temp;
float f_temp;
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
(整理)电子温度计DS18B20程序电路图
2.(5)建设项目对环境影响的经济损益分析。必须去掉第五位数码管选择位管脚的三极管,数码管方能正常显示。
3.数码管显示的亮度不够亮。
1.准备阶段
焊好的电路图如下:
1.环境影响评价工作等级的划分
(1)资质等级。评价机构的环评资质分为甲、乙两个等级。环评证书在全国范围内使用,有效期为4年。
while(1)
{
switch(Tplace)
{
case 0: {Ledblue=1;Ledred=0;Display(ReadTem());}
break;
case 1: {Ledred=1;Ledblue=0;Point=0;Display(Up);}
break;
case 2: {Ledred=1;Ledblue=0;Point=1;Display(Down);}
}
Delay_2us(3);
}
Out=0;
return dat;
}
uint ReadTem() /*温度转换*/
{
uint High,Low;
Reset();
Writedata(0xcc);
Writedata(0x44);
Delay_8us(85);
Reset();
Writedata(0xcc);
Writedata(0xbe);
}
bit Reset() /*复位*/
{
bit flag;
DQ=1;
_nop_();
DQ=0;
Delay_8us(70);
DQ=1;
Delay_2us(20);
flag=DQ;
Delay_2us(70);
DQ=1;
Delay_2us(70);
基于51单片机和DS18B20的数字温度计设计说明
基于51单片机和DS18B20的数字温度计设计说明
1.硬件设计:
-51单片机:选择合适的型号,如STC89C52或AT89C52等。
-DS18B20温度传感器:该传感器是一种数字温度传感器,具有单总线接口和高精度测量能力。
-接口电路:将51单片机和DS18B20传感器连接起来,要注意电平转换和信号线的阻抗匹配。
2.软件设计:
-初始化:在主函数中,首先对单片机进行初始化设置,包括时钟设置、串口配置等。
-DS18B20通信协议:使用单总线协议与DS18B20传感器进行通信,包括发送复位信号、读写数据等操作。
-温度测量:通过向DS18B20发送读取温度的命令,从传感器中读取温度值并保存。
-数据传输:将温度值转换为可显示的格式,如摄氏度或华氏度,并通过串口输出或LED显示。
3.程序流程:
-初始化单片机,设置时钟和串口参数。
-进入主循环,循环执行以下操作:
-发送复位信号,启动温度转换。
-等待转换完成,发送读取温度命令。
-读取温度值,并进行数据处理转换。
-输出温度值。
4.其他功能:
-可以添加LCD显示模块,将温度值显示在液晶屏上。
-可以添加按键输入模块,通过按键切换温度单位或进行其他操作。
需要注意的是,该设计只是一个简单的示例,实际应用中可能需要根据具体需求进行扩展和修改。
同时,在程序设计过程中,也要注意低功耗和数据稳定性等方面的考虑。
ds18b20数字温度计课程设计
ds18b20数字温度计课程设计ds18b20数字温度计课程设计一、实验目的1、了解ds18b20数字温度计的原理;2、掌握使用单总线、多总线的ds18b20数字温度计的读取方法;3、学会程序设计,编写读取ds18b20数字温度计的程序;二、实验内容1、ds18b20原理介绍和使用指南;2、单总线ds18b20的读取;3、多总线ds18b20的读取;4、ds18b20数字温度计的程序设计。
三、实验准备1、ds18b20数字温度计一个;2、STC89C52单片机一个;3、74HC00芯片一个;4、基础模块一个;5、阻值电阻一块;6、按键一个;7、LED一个;四、实验步骤1、了解ds18b20的原理(1)ds18b20原理介绍:ds18b20是一款以串行通信方式完成温度采集的高精度热敏电阻,具有自带的识别码,可以同时读取多个ds18b20,具有低功耗,精度高,测量范围广等优点。
(2)ds18b20使用指南:ds18b20使用一根数据线进行通信,将这根数据线接到单片机的数据口即可,用来接收和发送数据。
2、单总线ds18b20的读取(1)实验环境搭建:将ds18b20数字温度计接到单片机的数据口上,并将电阻接入,使电路有效;(2)实验程序编写:编写读取单总线ds18b20的程序,实现单总线ds18b20数字温度计的读取;3、多总线ds18b20的读取(1)实验环境搭建:将多个ds18b20数字温度计使用同一个总线接到单片机的数据口上,并将电阻接入,使电路有效;(2)实验程序编写:编写读取多总线ds18b20的程序,实现多总线ds18b20数字温度计的读取;4、ds18b20数字温度计的程序设计(1)实验环境搭建:将ds18b20数字温度计接到单片机的数据口上,并将电阻、按键、LED等电子元件接入,使电路有效;(2)实验程序编写:编写ds18b20数字温度计的程序,实现读取ds18b20数字温度计的功能,并将按键控制LED亮灭,根据温度读取值判断LED是否亮起。
温度传感器ds18b20检测程序说明
DS18B20美国达拉斯公司生产的单总线协议的数字温度检测芯片,数据的写入与读取都在一根总线上进行操作,在总线上可以连接多个DS18B20,因为每个DS18B20都有唯一的光刻ROM序列号,所以可以进行ROM匹配,搜索指令进行选择相应的从机序列号。
编写DS18B20的检测程序主要包括:初始化函数(复位脉冲+存在脉冲),写数据函数,读取数据的函数。
对DS18B20的操作包括:初始化函数,ROM指令,RAM指令这三个部分。
接下来我先说一下这三个部分所对应的时序图的理解吧。
初始化:由于上拉电阻的存在,总线默认状态是高电平,接着主机将总线拉低,维持480us 到960us的时间,再接着就是释放总线,维持时间为15us到60us,接着就由从机发出一个低电平信号,将总线拉低,表示该DS18B20是正常地,或者说是存在的,其维持时间为60us 到240us。
上面一图是写入数据的时序图。
写时序:默认状态为高电平,先将总线拉低,至少维持1us 的延时时间,接着就往总线上进行写数据操作,接着DS18B20就开始采样数据了,整个过程时间为60us到120us。
下面一图是读取数据的时序图。
读时序:默认状态为高电平,先将总线拉低,接着在15us 之前,主机进行数据采样,其维持时间也为60us到120us。
下面是我在理解了DS18B20的原理之后所写的程序,调试成功了,且能实时读取外界温度的功能,这里是不读取小数部分的温度,只读取温度的正数值。
#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};sbit DQ=P2^2;sbit duan=P2^6;sbit wei=P2^7;//是在11.0592M赫兹的频率下void delay_ms(uint t){uint i;for(;t>0;t--)for(i=110;i>0;i--);} //约为tms的延时程序void delay(uint x){while(x--);}void init_ds18b20(){uchar n;DQ=1;delay(2); //约为38usDQ=0;delay(80); //约为800usDQ=1;delay(4); //约为58usn=DQ;delay(10); //约为110us}void write_byte(uchar dat){uchar i;for(i=0;i<8;i++){DQ=0; //无论是写0或写1都要有至少1us的低电平DQ=dat&0x01;//总线直接等于写入的数据(低位在前,高位在后)delay(4); //约为58usDQ=1; //释放总线,为下一步的数据变换做准备dat>>=1;//数据进行移位操作}delay(4);}uchar read_byte(){uchar i,value;for(i=0;i<8;i++){DQ=0;value>>=1; //移位7次DQ=1; //先要释放总线,那样才能采样到有效数据if(DQ) //判断8次{value|=0x80;}delay(6); //约为78us}return value;}uchar read_temperature(){uchar a,b;init_ds18b20(); //每次操作指令前,都必须进行初始化设置write_byte(0xcc);//跳过ROM指令write_byte(0x44);//进行温度转换处理delay(300);//进行一定地延时约为3ms左右init_ds18b20();write_byte(0xcc);//跳过ROM操作write_byte(0xbe);//读取温度a=read_byte();//温度低字节b=read_byte();//温度高字节b<<=4;//b左移四位,低四位为0000b=b+(a&0xf0)>>4;//将a的低四位屏蔽,不取小数点,进行右移四位,合并成一个字节的数据return b;}void display(uchar aa,uchar bb) {duan=1;P0=table[aa];duan=0;P0=0xff;wei=1;P0=0xfe;wei=0;delay_ms(5);duan=1;P0=table[bb];duan=0;P0=0xff;wei=1;P0=0xfd;wei=0;delay_ms(5);}void main(){uchar num,shi,ge;while(1){num=read_temperature();shi=num/10; //分离出十位ge=num%10; //分离出个位display(shi,ge);}}。
DS18B20测温流程图
主程序流程图:
DS18B20程序流程图:
程序按数据手册的时序图编写子函数模块:
1、DS18B20复位函数:resetDS18B20(void)
2、写一位的函数:WriteBit (unsigned char wb)
3、读一位的函数:unsigned char ReadBit (void)
4、读一个字节的函数:unsigned char readByteDS18B20(void)
即将位读取的时序循环8次。
5、写一个字节的函数:void writeByteDS18B20(unsigned char Data)。
即将位写入的时序循环8次。
6、first和next函数流程图:
1、端口初始化子函数;
2、串口初始化;
3、串口发送一个字符函数:void USART_Putchar(unsigned char
send_char)
4、串口发送数组函数:void UsartTransmit(unsigned char *data,
unsigned char len)
5、串口发送字符串函数:void USART1_Putstr(char *s)
即通过字符串长度控制USART_Putchar函数的循环次数。
6、串口发送字符串子程序(带有换行符):
void USART1_Puts(char *s)
7、串口接收字符串函数:unsigned char getchar1(void)
8、串口接收中断子程序:void USART_RXT(void)流程图
1、 数据打包子函数:void Packet_Data(void)
2、。
温度传感器DS18B20测试程序
;**************************************;温度传感器DS18B20测试程序供参考;**************************************DQ BIT P3.7 ;DS18B20的数据口位P3.3 TPL DA TA 50H ;存放温度值的高字节TPH DATA 51H ;存放温度值的低字节TPPL DATA 54H ;十进制TPPH DATA 55HORG 0JMP MAINORG 100HMAIN:CALL DS18B20_Reset ;设备复位MOV A,#0CCH ;跳过ROM命令CALL DS18B20_WriteByte ;送出命令MOV A,#044H ;开始转换CALL DS18B20_WriteByte ;送出命令JNB DQ,$ ;等待转换完成CALL DS18B20_Reset ;设备复位MOV A,#0CCH ;跳过ROM命令CALL DS18B20_WriteByte ;送出命令MOV A,#0BEH ;读暂存存储器CALL DS18B20_WriteByte ;送出命令CALL DS18B20_ReadByte ;读温度低字节MOV TPL,A ;存储数据CALL DS18B20_ReadByte ;读温度高字节MOV TPH,A ;存储数据CALL HZDL0CALL DISJMP MAIN;**************************************; 驱动LED显示器的程序;**************************************PDL BIT 20HDIS: MOV DPTR,#TABDIS1: MOV R0,#TPPLMOV R2,#0FBHMOV R3,#02HCLR PDLDIS2: MOV A,@R0 ;四位扫描显示ANL A, #0FH;SW AP AMOVC A,@A+DPTRORL P3,#3CHMOV A,R2ANL P3,ARL AMOV R2, A;INC R0LCALL DAYMOV A,@R0ANL A, #0F0HSW AP AMOVC A,@A+DPTRORL P3,#3CHJB PDL,DIS3SETB PDL;ORL A, #80HDIS3: MOV P1,AMOV A,R2ANL P3,ARL AMOV R2, ALCALL DAYINC R0DJNZ R3,DIS2RETTAB: DB 03FH,06H,05BH,4FH,66H,6DH,7DH,07H ;DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H,40H ;共阴极代码DAY: MOV R4,#1D1: MOV R5,#248D2: NOPNOPDJNZ R5,D2DJNZ R4,D1RET;**************************************HZDL0: MOV TPPL, #00H ; 十六进制 -> 十进制MOV TPPH, #00HMOV TPPH+1, #00HMOV TPH+1, #00HMOV R3, #04HHZDL2: CLR CMOV A, TPLRLC AMOV TPL,AMOV A, TPHMOV TPH,AMOV A, TPH+1RLC AMOV TPH+1,ADJNZ R3, HZDL2HZDL021: MOV R3, #10HHZDL022: MOV R0, #TPLMOV R2, #03HHZDL026: MOV A, @R0RLC AMOV @R0, AINC R0DJNZ R2, HZDL026MOV R0, #TPPLMOV R2, #03HHZDL028: MOV A, @R0ADDC A, @R0DA AMOV @R0, AINC R0DJNZ R2, HZDL028DJNZ R3, HZDL022RET;**************************************;延时X*10微秒;**************************************DelayX0us: ;2 当改用1T的MCU时,请调整此延时函数NOP ;1NOP ;1NOP ;1NOP ;1NOP ;1NOP ;1NOP ;1NOP ;1DJNZ R7,DelayX0us ;2RET ;2;**************************************;复位DS18B20,并检测设备是否存在;**************************************DS18B20_Reset:CLR DQ ;送出低电平复位信号MOV R7,#48 ;延时至少480usCALL DelayX0usSETB DQ ;释放数据线MOV R7,#6 ;等待60usCALL DelayX0usMOV C,DQ ;检测存在脉冲MOV R7,#42 ;等待设备释放数据线CALL DelayX0usJC DS18B20_Reset ;如果设备不存在,则继续等待RET;**************************************;从DS18B20读1字节数据;**************************************DS18B20_ReadByte:CLR APUSH 0MOV 0,#8 ;8位计数器ReadNext:CLR DQ ;开始时间片NOPNOPSETB DQ ;准备接收NOPNOPMOV C,DQ ;读取数据RRC AMOV R7,#6 ;等待时间片结束CALL DelayX0usDJNZ 0,ReadNextPOP 0RET;**************************************;向DS18B20写1字节数据;**************************************DS18B20_WriteByte:PUSH 0MOV 0,#8 ;8位计数器WriteNext:CLR DQ ;开始时间片NOPNOPRRC A ;输出数据MOV DQ,CMOV R7,#6 ;等待时间片结束CALL DelayX0usSETB DQ ;准备送出下一位数据DJNZ 0,WriteNextPOP 0RETEND。
数字温度传感器DS18B20(含程序)
数字温度传感器DS18B20摘要DS-18B20 数字温度传感器具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
应用范围广泛,适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域,轴瓦,缸体,纺机,空调,等狭小空间工业设备测温和控制和汽车空调、冰箱、冷柜、以及中低温干燥箱等。
一、引脚图DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)二、DS18B20的主要特性1.1、电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电1.2、DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯1.3、多个DS18B20可以并联在唯一的三线上,实现组网多点测温1.4、DS18B20在使用中不需要任何外围元件1.5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃1.6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温1.7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快1.8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力1.9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
三、DS18B20的外形和内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20内部结构图四、DS18B20工作原理DS18B20的温度转换时的延时时间由2s 减为750ms。
DS18B20测温原理如图3所示。
DS18b20温度采集程序
应该温度数据采集好做些吧,用ds18b20,给你代码参考,我的联系方法看我的名字/****************************************//DS18B20温度传感器////作者:jammylee//日期:2008-2-25//版本:V1.0//晶振:12MHZ****************************************///包含头文件#include<reg51.h>#include<stdio.h>/*****************************************************/typedef unsigned char uint8; //定义八位无符号变量/*****************************************************///定义引脚(根据硬件改变)sbit highbit = P2^7;sbit lowbit = P2^6;sbit DQ = P3^0; //温度传感器数据引脚通信定义/**********************************************************************************************/ unsigned char Code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //定义数字显示数组//0, 1, 2 3 4 5 6 7 8 9/**********************************************************************************************///定义延时子函数void mDelay(uint8 Delay){while(Delay--);}/************************************************************///温度传感器DS18B20的初始化函数Init_DS18B20(void){uint8 x = 0;DQ = 1; //DQ复位信号mDelay(8); //延时DQ = 0; //将DQ电平拉低mDelay(80); //延时大于480usDQ = 1; //将DQ电平拉高mDelay(14); //延时x = DQ; //如果x=0则初始化成功,x=1则初始化失败mDelay(20); //延时}/************************************************************///读一个字节ReadOneChar(void){uint8 i = 0;uint8 dat = 0;for(i=8;i>0;i--){DQ = 0; //低电平脉冲信号dat>>=1; //dat右移一位DQ = 1; //高低平脉冲信号if(DQ){dat |= 0x80;}mDelay(4);//延时}return(dat); //返回dat值}/************************************************************///写一个字节WriteOneChar(uint8 dat){uint8 i = 0;for(i=8;i>0;i--){DQ = 0; //低电平脉冲信号DQ = dat&0x01;mDelay(5);//延时DQ = 1; //高电平脉冲信号dat >>= 1;//dat右移一位}mDelay(4);}/************************************************************///读取温度ReadTemperature(void){uint8 L = 0; //定义温度高八位uint8 H = 0; //定义温度低八位uint8 temp = 0;Init_DS18B20(); //温度传感器DS18B20初始化WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度L = ReadOneChar(); //读取温度值低位H = ReadOneChar(); //读取温度值高位L = L>>4;temp = H<<4;temp = temp|L;return(temp);}/******************************************************************///温度显示函数void DisplayTemperture(uint8 temp){P0 = Code[temp%10];lowbit = 0;mDelay(100);lowbit = 1;P0=Code[temp/10];highbit = 0;mDelay(100);highbit = 1;}/*******************************************************************///主函数void main(void)uint8 temp;while(1) //主循环{temp = ReadTemperature();DisplayTemperture(temp);}}。
DS18B20程序
1.单DS18B20温度读取#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit DQ = P1^4; //数据线端口void delayms(uint x) //延时函数{uchar j;while(x--){for(j=0;j<123;j++){;}}}//ROM操作命令#define READ_ROM 0x33 //读ROM#define SKIP_ROM 0xCC //跳过ROM#define MATCH_ROM 0x55 //匹配ROM#define SEARCH_ROM 0xF0 //搜索ROM#define ALARM_SEARCH 0xEC //告警搜索//存储器操作命令#define ANEW_MOVE 0xB8 //重新调出E^2数据#define READ_POWER 0xB4 //读电源#define TEMP_SWITCH 0x44 //启动温度变换#define READ_MEMORY 0xBE //读暂存存储器#define COPY_MEMORY 0x48 //复制暂存存储器#define WRITE_MEMORY 0x4E //写暂存存储器//数据存储结构typedef struct tagTempData{unsigned char btThird; //百位数据unsigned char btSecond; //十位数据unsigned char btFirst; //个位数据unsigned char btDecimal; //小数点后一位数据unsigned char btNegative; //是否为负数}TEMPDATA;void Delay16us() //延时16us子函数{unsigned char a;for (a = 0; a < 4; a++);}void Delay60us() //延时60us子函数{unsigned char a;for (a = 0; a < 18; a++);}void Delay480us() //延时480us子函数{unsigned char a;for (a = 0; a < 158; a++);}void Delay240us() //延时240us子函数{unsigned char a;for (a = 0; a < 78; a++);}void Initialization() //芯片初始化{while(1) //无限循环知道收到了存在脉冲(即DS18B20的应答脉冲){DQ = 0;Delay480us(); //延时480us 复位单总线至少480us的低电平信号DQ = 1;Delay60us(); //延时60us 在复位电平结束后将数据总线拉高,以便在15~60us后接收存在脉冲if(~DQ) //收到ds18b20的应答信号{DQ = 1;Delay240us(); //延时240us 存在脉冲为一个60~240us的低电平信号break;}}}void WriteByte(unsigned char btData) //写ROM(从低位开始写) {unsigned char i, btBuffer;for (i = 0; i < 8; i++){btBuffer = btData >> i; //最低位移出if (btBuffer & 1){DQ = 0;_nop_(); //延时1个机器周期_nop_();DQ = 1;Delay60us(); //延时60us}else{DQ = 0;Delay60us();DQ = 1;}}}unsigned char ReadByte() //读ROM(从低位开始读) {unsigned char i, btDest;for (i = 0; i < 8; i++){btDest >>= 1;DQ = 0;_nop_();_nop_();DQ = 1;Delay16us();if (DQ) btDest |= 0x80;Delay60us();}return btDest;}//读取温度值TEMPDATA ReadTemperature(){TEMPDATA TempData; //定义储存结构用于存储温度的值unsigned int iTempDataH;unsigned char btDot, iTempDataL;TempData.btNegative = 0; //为0温度为正Initialization();WriteByte(SKIP_ROM); //跳过ROM匹配WriteByte(TEMP_SWITCH); //启动温度转换delayms(1); //温度转换需要时间500usInitialization();WriteByte(SKIP_ROM); //跳过ROM匹配(单个芯片时用这句换掉上面的switch)WriteByte(READ_MEMORY); //读暂存储存数据iTempDataL = ReadByte(); //读取温度的低8位iTempDataH = ReadByte(); //读取温度的高8位iTempDataH <<= 8;iTempDataH |= iTempDataL;if (iTempDataH & 0x8000) //判断温度的值是否为负数{TempData.btNegative = 1; //负数标志iTempDataH = ~iTempDataH + 1; //负数求补}btDot = (unsigned char)(iTempDataH & 0x000F); //得到小数部分iTempDataH >>= 4; //得到整数部分btDot *= 5; //btDot*10/16得到转换后的小数数据btDot >>= 3;//数据处理TempData.btThird = (unsigned char)iTempDataH /100; //整数部分的百位TempData.btSecond = (unsigned char)iTempDataH % 100/10;//整数部分的十位TempData.btFirst = (unsigned char)iTempDataH % 10; //整数部分的个位TempData.btDecimal = btDot; //小数点后的一位return TempData; //函数返回温度值的存储结构体}2.多个DS18B20单总线温度读取#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit DQ = P2^7; //数据线端口unsigned char channel,n=0;void delayms(uint x) //延时函数{uchar j;while(x--){for(j=0;j<123;j++){;}}}//ROM操作命令#define READ_ROM 0x33 //读ROM#define SKIP_ROM 0xCC //跳过ROM #define MATCH_ROM 0x55 //匹配ROM #define SEARCH_ROM 0xF0 //搜索ROM//存储器操作命令#define ANEW_MOVE 0xB8//重新调出E^2数据#define READ_POWER 0xB4 //读电源#define TEMP_SWITCH 0x44 //启动温度变换#define READ_MEMORY 0xBE //读暂存存储器#define COPY_MEMORY 0x48 //复制暂存存储器#define WRITE_MEMORY 0x4E //写暂存存储器//数据存储结构typedef struct tagTempData{unsigned char btThird; //百位数据unsigned char btSecond; //十位数据unsigned char btFirst; //个位数据unsigned char btDecimal; //小数点后一位数据unsigned char btNegative; //是否为负数}TEMPDATA;//DS18B20序列号const unsigned char code ROMData1[8] = {0x28, 0x33, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xD7}; //U1const unsigned char code ROMData2[8] = {0x28, 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E}; //U2const unsigned char code ROMData3[8] = {0x28, 0x31, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xB9}; //U3const unsigned char code ROMData4[8] = {0x28, 0x32, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xE0}; //U4const unsigned char code ROMData5[8] = {0x28, 0x34, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x52}; //U5const unsigned char code ROMData6[8] = {0x28, 0x35, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x65}; //U6const unsigned char code ROMData7[8] = {0x28, 0x36, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x3C}; //U7const unsigned char code ROMData8[8] = {0x28, 0x37, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x0B}; //U8void Delay16us() //延时16us子函数{unsigned char a;for (a = 0; a < 4; a++);}void Delay60us() //延时60us子函数{unsigned char a;for (a = 0; a < 18; a++);}void Delay480us() //延时480us子函数{unsigned char a;for (a = 0; a < 158; a++);}void Delay240us() //延时240us子函数{unsigned char a;for (a = 0; a < 78; a++);}void Initialization() //芯片初始化{while(1) //无限循环知道收到了存在脉冲(即DS18B20的应答脉冲){DQ = 0;Delay480us(); //延时480us 复位单总线至少480us的低电平信号DQ = 1;Delay60us(); //延时60us 在复位电平结束后将数据总线拉高,以便在15~60us后接收存在脉冲if(!DQ) //收到ds18b20的应答信号{DQ = 1;Delay240us(); //延时240us 存在脉冲为一个60~240us的低电平信号break;}}}void WriteByte(unsigned char btData) //写ROM(从低位开始写) {unsigned char i, btBuffer;for (i = 0; i < 8; i++){btBuffer = btData >> i; //最低位移出if (btBuffer & 1){_nop_(); //延时1个机器周期_nop_();DQ = 1;Delay60us(); //延时60us}else{DQ = 0;Delay60us();DQ = 1;}}}unsigned char ReadByte() //读ROM(从低位开始读) {unsigned char i, btDest;for (i = 0; i < 8; i++){DQ = 0;_nop_();_nop_();DQ = 1;Delay16us();if (DQ) btDest |= 0x80;Delay60us();}return btDest;}//序列号匹配void MatchROM(const unsigned char *pMatchData) {unsigned char i;Initialization(); //芯片初始化WriteByte(MATCH_ROM); //写入匹配ROM指令for (i = 0; i < 8; i++) WriteByte(*(pMatchData + i)); }//读取温度值TEMPDATA ReadTemperature(){TEMPDATA TempData; //定义储存结构用于存储温度的值unsigned int iTempDataH;unsigned char btDot, iTempDataL;static unsigned char i = 0;TempData.btNegative = 0; //为0温度为正i++;if (i == 9) i = 1;channel=i;Initialization();WriteByte(SKIP_ROM); //跳过ROM匹配WriteByte(TEMP_SWITCH); //启动温度转换if(n==0)delayms(1000); //温度转换需要时间500msn++;if(n==8)n=1;delayms(1);Initialization();//多个芯片的时候用MatchROM(ROMData)换掉WriteByte(SKIP_ROM)switch (i){case 1 : MatchROM(ROMData1); break; //匹配1case 2 : MatchROM(ROMData2); break; //匹配2case 3 : MatchROM(ROMData3); break; //匹配3case 4 : MatchROM(ROMData4); break; //匹配4case 5 : MatchROM(ROMData5); break; //匹配5case 6 : MatchROM(ROMData6); break; //匹配6case 7 : MatchROM(ROMData7); break; //匹配7case 8 : MatchROM(ROMData8); break; //匹配8 }//WriteByte(SKIP_ROM); //跳过ROM匹配(单个芯片时用这句换掉上面的switch)WriteByte(READ_MEMORY); //读暂存储存数据iTempDataL = ReadByte(); //读取温度的低8位iTempDataH = ReadByte(); //读取温度的高8位iTempDataH <<= 8;iTempDataH |= iTempDataL;if (iTempDataH & 0x8000) //判断温度的值是否为负数{TempData.btNegative = 1; //负数标志iTempDataH = ~iTempDataH + 1; //负数求补}btDot = (unsigned char)(iTempDataH & 0x000F); //得到小数部分iTempDataH >>= 4; //得到整数部分btDot *= 5; //btDot*10/16得到转换后的小数数据btDot >>= 3;//数据处理TempData.btThird = (unsigned char)iTempDataH / 100;//整数部分的百位TempData.btSecond = (unsigned char)iTempDataH % 100 / 10;//整数部分的十位TempData.btFirst = (unsigned char)iTempDataH % 10;//整数部分的个位TempData.btDecimal = btDot; //小数点后的一位return TempData; //函数返回温度值的存储结构体}3. DS18B20的序列号读取程序<用LCD1602显示序列号>#include<reg52.h>#include<LCD1602.h>#include<string.h>#define uchar unsigned char#define uint unsigned intuchar sn[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10};uchar t;uchart01,t02,t11,t12,t21,t22,t31,t32,t41,t42,t51,t52,t61,t62,t71,t72;sbit DQ=P2^7;//ds18b20与单片机连接口void delay1ms(unsigned int ms)// 延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void delay_18B20(unsigned int i)// 延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/{unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}////////////////////////读取器件序列号子程序////////////////////////////void rom(void){ds1820rst(); //复位//delay1ms(1); //延时//ds1820wr(0x33); //发送读序列号子程序//sn[0]=ds1820rd(); //连续读出64位ROM t01=sn[0]/16;t02=sn[0]%16; //转为16进制sn[1]=ds1820rd(); //t11=sn[1]/16;t12=sn[1]%16; //转为16进制sn[2]=ds1820rd(); //t21=sn[2]/16;t22=sn[2]%16; //转为16进制sn[3]=ds1820rd(); //t31=sn[3]/16;t32=sn[3]%16; //转为16进制sn[4]=ds1820rd(); //t41=sn[4]/16;t42=sn[4]%16; //转为16进制sn[5]=ds1820rd(); //t51=sn[5]/16;t52=sn[5]%16; //转为16进制sn[6]=ds1820rd(); //t61=sn[6]/16;t62=sn[6]%16; //转为16进制sn[7]=ds1820rd(); //t71=sn[7]/16;t72=sn[7]%16; //转为16进制}void chuan(uchar i,uchar j,uchar x) {if(x<10)DisplayOne(i,j,x,1);if(x==10)DisplayOne(i,j,'A',0);if(x==11)DisplayOne(i,j,'B',0);if(x==12)DisplayOne(i,j,'C',0);if(x==13)DisplayOne(i,j,'D',0);if(x==14)DisplayOne(i,j,'E',0);if(x==15)DisplayOne(i,j,'F',0);}void Displaychar(){chuan(0,0,t01);chuan(0,1,t02);chuan(0,4,t11);chuan(0,5,t12);chuan(0,8,t21);chuan(0,9,t22);chuan(0,12,t31);chuan(0,13,t32);chuan(1,0,t41);chuan(1,1,t42);chuan(1,4,t51);chuan(1,5,t52);chuan(1,8,t61);chuan(1,9,t62);chuan(1,12,t71);chuan(1,13,t72);}/********************主程序***********************************/void main(){Clear();Init();while(1){rom(); //调用读序列号子程序//Displaychar();}}。
DS18B20流程图
初始化
LCD显示数据
延时
定时 5s 检测一次(定 时期间单片机读预制 案件)
光照强度监测并传送 数据回单片机
判断光照强度是否 超出阈值
Y
报警装置启动(即蜂 鸣器发声)
N
复位
开始
是
数据在合理范围内? 系统初始化
否
执行报警子程序
定时秒采集 DS18B20数据
上传至上位机并在 上位机中显示数据
否
延时等待
数据采集完毕?
是
结束 LCD上显示温度数据
开始
是
数据在合理范围内? 系统初始化
否
执行报警子程序
每隔3秒采集一 次GY-30数据
在SD卡中储存 光照数据
否
延时等待
数据采集完毕?
是
上传至上位机并在 上位机中显示数据
ห้องสมุดไป่ตู้
LCD上显示光照数据 结束
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define jump_ROM 0xCC#define start 0x44#define read_EEROM 0xBEsbit DQ = P2^3; //DS18B20数据口sbit BELL = P1^2; //设置P1.2口,为控制蜂鸣器发声的引sbit Warn_High = P1^6;sbit Warn_Low = P1^7;sbit Step_1 = P2^1;sbit Step_2 = P2^2;uint TMPH,TMPL;uint Warn_TL;uint Warn_TH;uchar code Table[10] = {0,1,2,3,4,5,6,7,8,9};//0~9//这三个引脚参考资料sbit E=P2^7; //1602使能引脚sbit RW=P2^6; //1602读写引脚sbit RS=P2^5; //1602数据/命令选择引脚/********************************************************************* 名称: delay()* 功能: 延时,延时时间大概为5US。
* 输入: 无* 输出: 无***********************************************************************/void delays(){_nop_();_nop_();_nop_();_nop_();_nop_();}/********************************************************************* 名称: Delay_1ms()* 功能: 延时子程序,延时时间为1ms * x* 输入: x (延时一毫秒的个数)* 输出: 无***********************************************************************/ void Delay_1ms(uint i){uint x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}void delay(uchar N){int i;for(i=0; i<N; i++) ;}/********************************************************************* 名称: Reset()* 功能: 复位DS18B20* 输入: 无* 输出: 无***********************************************************************/ uchar Reset(void){uchar deceive_ready;DQ = 0;delay(29);DQ = 1;delay(3);deceive_ready = DQ;delay(25);return(deceive_ready);}/********************************************************************* 名称: read_bit()* 功能: 从DS18B20读一个位值* 输入: 无* 输出: 从DS18B20读出的一个位值***********************************************************************/ uchar read_bit(void){uchar i;DQ = 0;DQ = 1;for(i=0; i<3; i++);return(DQ);}/********************************************************************* 名称: write_bit()* 功能: 向DS18B20写一位* 输入: bitval(要对DS18B20写入的位值)* 输出: 无***********************************************************************/ void write_bit(uchar bitval){DQ=0;if(bitval==1) DQ=1;delay(5);DQ=1;}/********************************************************************* 名称: read_byte()* 功能: 从DS18B20读一个字节* 输入: 无* 输出: 从DS18B20读到的值***********************************************************************/ uchar read_byte(void){uchar i,m,receive_data;m = 1;receive_data = 0;for(i=0; i<8; i++){if(read_bit()){receive_data = receive_data + (m << i);}delay(6);}return(receive_data);}/********************************************************************* 名称: write_byte()* 功能: 向DS18B20写一个字节* 输入: val(要对DS18B20写入的命令值)* 输出: 无***********************************************************************/ void write_byte(uchar val){uchar i,temp;for(i=0; i<8; i++){temp = val >> i;temp = temp & 0x01;write_bit(temp);delay(5);}}/********************************************************************* 名称: bit Busy(void)* 功能: 这个是一个读状态函数,读出函数是否处在忙状态* 输入: 输入的命令值* 输出: 无***********************************************************************/ bit Busy(void){bit busy_flag = 0;RS = 0;RW = 1;E = 1;delays();busy_flag = (bit)(P0 & 0x80);E = 0;return busy_flag;}/********************************************************************* 名称: wcmd(uchar del)* 功能: 1602命令函数* 输入: 输入的命令值* 输出: 无***********************************************************************/ void wcmd(uchar del){while(Busy());RS = 0;RW = 0;E = 0;delays();P0 = del;delays();E = 1;delays();E = 0;}/********************************************************************* 名称: wdata(uchar del)* 功能: 1602写数据函数* 输入: 需要写入1602的数据* 输出: 无***********************************************************************/void wdata(uchar del){while(Busy());RS = 1;RW = 0;E = 0;delays();P0 = del;delays();E = 1;delays();E = 0;}/********************************************************************* 名称: L1602_init()* 功能: 1602初始化,请参考1602的资料* 输入: 无* 输出: 无***********************************************************************/ void L1602_init(void){wcmd(0x38);wcmd(0x0c);wcmd(0x06);wcmd(0x01);}/********************************************************************* 名称: L1602_char(uchar hang,uchar lie,char sign)* 功能: 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下L1602_char(1,5,'b')* 输入: 行,列,需要输入1602的数据* 输出: 无***********************************************************************/void L1602_char(uchar hang,uchar lie,char sign){uchar a;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;wcmd(a);wdata(sign);}/********************************************************************* 名称: L1602_string(uchar hang,uchar lie,uchar *p)* 功能: 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下L1602_string(1,5,"ab cd ef;")* 输入: 行,列,需要输入1602的数据* 输出: 无***********************************************************************/void L1602_string(uchar hang,uchar lie,uchar *p){uchar a,b=0;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;while(1){wcmd(a++);if((*p == '\0')||(b==16)) break;b++;wdata(*p);p++;}}//以下两个为温度警报处理函数void Warming_TH(void){uchar i;for(i = 0; i < 100; i++){BELL = 0;Delay_1ms(1); //延时10毫秒BELL = 1;Delay_1ms(1); //延时10毫秒}Delay_1ms(200);Warn_High = 0;}void Warming_TL(void){uchar i;for(i = 0; i < 200; i++){BELL = 0;Delay_1ms(1); //延时10毫秒BELL = 1;Delay_1ms(1); //延时10毫秒}Delay_1ms(200);Warn_Low = 0;}//温度显示函数void Display(uint T){L1602_string(1,1," The temperature is");L1602_char(2,8,'.');L1602_char(2,11,'`');L1602_char(2,12,'C');Delay_1ms(3);L1602_char(2,6,Table[T/1000]+48); //显示十位Delay_1ms(3);L1602_char(2,7,Table[T%1000/100]+48); //显示个位Delay_1ms(3);L1602_char(2,9,Table[T%100/10]+48); //显示小数点后一位Delay_1ms(3);L1602_char(2,10,Table[T%10]+48); //显示小数点后第二位Delay_1ms(3);}//温度比较函数void Compare(uint T){if(T>Warn_TH) Warming_TH();else if(T<Warn_TL) Warming_TL();else if(Warn_TL <= T <= Warn_TH){BELL = 1;Warn_High = 1;Warn_Low = 1;}}/********************************************************************* 名称: Main()* 功能: 主函数* 输入: 无* 输出: 无***********************************************************************/ void main(){uint temp = 0;bit Flag = 0;L1602_init();while(1){while (!Flag){if(Step_1 == 0){Warn_TL = 3770;Warn_TH = 3790;Flag = 1;}if(Step_2 == 0){Warn_TL = 3700;Warn_TH = 3750;Flag = 1;}}Reset();write_byte(jump_ROM);write_byte(start);Reset();write_byte(jump_ROM);write_byte(read_EEROM);TMPL = read_byte();TMPH = read_byte();temp = (TMPL|(TMPH<<8))*0.0625*100+0.5;Display(temp);Compare(temp);}}。