1绪论
1.1设计背景
随着新技术的不断开发与应用,近年来单片机发展十分迅速,一个以微机应用为主的新技术革命浪潮正在蓬勃兴起,单片机的应用已经渗透到电力、冶金、化工、建材、机械、食品、石油等各个行业。传统的温度采集方法不仅费时费力,而且精度差,单片机的出现使得温度的采集和数据处理问题能够得到很好的解决。温度是工业对象中的一个重要的被控参数。然而所采用的测温元件和测量方法也不相同;产品的工艺不同,控制温度的精度也不相同。因此对数据采集的精度和采用的控制方法也不相同。传统的控制方式以不能满足高精度,高速度的控制要求,如温度控制表温度接触器,其主要缺点是温度波动范围大。由于他主要通过控制接触器的通断时间比例来达到改变加热功率的目的,受仪表本身误差和交流接触器的寿命限制,通断频率很低。近几年来快速发展了多种先进的温度控制方式,如:PID控制,模糊控制,神经网络及遗传算法控制等。这些控制技术大大的提高了控制精度,不但使控制变得简便,而且使产品的质量更好,降低了产品的成本,提高了生产效率。
本设计使用单片机作为核心进行控制。单片机具有集成度高,通用性好,功能强,特别是体积小,重量轻,耗能低,可靠性高,抗干扰能力强和使用方便等独特优点,在数字、智能化方面有广泛的用途。
1.2国内外现状
For personal use only in study and research; not for commercial use
温度计在国内各行各业的应用虽然已经十分广泛,但从国内生产的温度计来讲,总体发展水平仍然不高,同日本、美国、德国等先进国家相比,仍然有着较大的差距。温度计测温技术的关键在于温度传感器。目前,国际上新型温度传感器正从模拟式向数字式、由集成化向智能化、网络化的方向发展,同时具有抑制串模干扰能力强、分辨力高、线性度好、成本低等优点。随着我国四个现代化和经济发展,我国在科技和生产各领域都取得了飞速的发展和进步,发展以温度传感器为载体的温度测量技术具有重大意义。传感器属于信息技术的前沿尖端产品,尤其是温度传感器被广泛用于工农业生产、科学研究和生活等领域,数量高居各种传感器之首。温度传感器的发展大
不得用于商业用途
仅供个人参考
致经历了以下三个阶段:传统的分立式温度传感器(含敏感元件);模拟集成温度传感器/控制器;数字温度传感器。
温度传感器的发展现状:温度传感器使用范围广,数量多,居各种传感器之首,其发展大致经历了以下3个阶段:
① 传统的分立式温度传感器(含敏感元件)——热电偶传感器,主要是能够进行非电量和电量之间转换。
② 模拟集成温度传感器/控制器。集成传感器是采用硅半导体集成工艺制成的,因此亦称硅传感器或单片集成温度传感器。
③ 智能温度传感器。它是微电子技术、计算机技术和自动测试技术(ATE_)的结晶。智能温度传感器内部包含温度传感器、A/D传感器、信号处理器、存储器(或寄存器)和接口电路[1]。
从国内外来看工业生产控制中用数字温度计可清晰显示温度来防止元气件失效或损坏等不必要的非人为损失,对做好车间机器维修与保养起很重要的作用。温度是一般工业领域最容易碰到的检测参数,如环境温度的检测,工业工艺温度参数的检测,设备的温度保护检测等,而市场上专用的、通用的各类温控仪产品也比较丰富。国内外的温度检测仪器的发展水平主要体现在仪器的智能化水平、测量的文的范围、测量的精度以及仪器的功耗等技术指标上,目前国内的温度测量,在精度上很少有高于0.1℃的。近年来温度计正处在传统型向新型温度计转型的发展阶段,新型温度计的特点是微型化、数字化、智能化、多功能化、系统化,他不仅促进了传统产业的改造。而且可导致建立新型工业,是21世纪新的经济增长的。
1.3 本课题研究方法及内容
1.3.1 研究方法
本课题的研究方法是利用单片机和数字温度传感器DS18B20设计一台数字温度计。单片机作为主控制器,数字温度传感器DS18B20作为测温元件,传感器DS18B20可以读取被测量温度值,进行转换,从而用4位共阴极LED数码管来显示转换后的温度值。
不得用于商业用途
仅供个人参考
1.3.2 研究内容
本课题的主要研究内容如下:
1. 温度测试基本范围0℃—100℃。 2. 精度为0.5℃。 3. LED液晶显示。
4. 可以设定温度的上下限报警功能。 5. 实现报警提示。
2系统方案设计
2.1 方案选择
方案一:使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或
电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路。此方案数据处理比较麻烦,且容易产生信号失真。
方案二:使用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是
非常容易想到的。所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。而且此方案电路比较简单,软件设计也比较容易实现。
从以上两种方案很容易看出方案二电路比较简单,软件设计容易实现,故实本设计中采用方案二。方案二可以只用一根线实现信号的双向传输,具有接口简单容易扩展等优点,DS18B20可以直接温度转换为串行数字信号,供单片机进行处理,具有低功耗、商性能、抗干扰能力强等优点。
2.1 系统的总体设计方案
本设计采用STC89C52RC单片机实现。单片机软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制。而且体积小,硬件实现简单,安装方便。既可以单独对多DS18B20控制工作,还可以与PC机通信。另外STC89C52RC在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。单总线数字温度计DS1820采用基板专利技术来测量温度 ,温度传感器及各种数字转换电路
不得用于商业用途
仅供个人参考
都集成在一起 ,由总线串行输出测量值(9 位二进制编码) 。测温范围从 - 55~ + 125 ℃, 还可以读内部计数器 ,获得较高的分辨率。同时还可以进行上、 下限温度的设定和报警等。本课题主要研究如何利用DS18B20智能温度传感器实时显示温度,并将其与LED显示键盘合并使用,制成一个能实时显示温度的数字温度计。
本设计将利用DS18B20智能温度传感器和单片小系统,设计一个数字温度采集系统。并设计一个人机接口电路:键盘采用独立按键(功能自定义),显示器采用共阴极4位LED显示。系统的总体设计方案框图如图2.1所示
图2.1 系统总体设计方案框图
按照系统设计功能的要求,系统主要由单片机、温度传感器DS18B20、LED数码显示管和PC机组成。系统的硬件电路主要由复位电路、测温电路、显示电路、晶振电路和报警电路组成,系统总体结构方框图如图2.2所示。
不得用于商业用途
仅供个人参考
图2.2系统总体结构框图
3硬件设计
3.1 STC89C52RC芯片功能简介
3.1.1 STC89C52RC芯片简介
STC89C52RC是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-Flash Programable and Erasable Read Only Memory )的低电、高性能COMOS8的微处理器,俗称单片机。该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
[2]
3.1.2 引脚功能
STC89C52RC芯片的引脚图如图3.1所示:
不得用于商业用途
仅供个人参考
图3.1 STC89C52引脚图
STC89C52RC的引脚功能如下[2]: ① 主电源引脚(2根)
VCC(Pin40):电源输入,接+5V电源 GND(Pin20):接地线 ②外接晶振引脚(2根)
XTAL1(Pin19):片内振荡电路的输入端 XTAL2(Pin20):片内振荡电路的输出端 ③控制引脚(4根)
RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。 ALE/PROG(Pin30):地址锁存允许信号 PSEN(Pin29):外部存储器读选通信号
EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,
不得用于商业用途
仅供个人参考
如果接高电平则从内部程序存储器读指令。
④可编程输入/输出引脚(32根)
STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
PO口(Pin39~Pin32):8位双向I/O口线,名称为P0.0~P0.7 P1口(Pin1~Pin8):8位准双向I/O口线,名称为P1.0~P1.7 P2口(Pin21~Pin28):8位准双向I/O口线,名称为P2.0~P2.7 P3口(Pin10~Pin17):8位准双向I/O口线,名称为P3.0~P3.7
STC89C52主要功能如表3-1所示。
表3-1 STC89C52主要功能
主要功能特性 兼容MCS51指令系统 32个双向I/O口 3个16位可编程定时/计数器中断 2个串行中断 2个外部中断源 2个读写中断口线 低功耗空闲和掉电模式
1.时钟电路
STC89C52内部有一个用于构成振荡器的高增益反相放大器,引脚RXD和TXD分别是此放大器的输入端和输出端。时钟可以由内部方式产生或外部方式产生。内部方式的时钟电路如图3.2(a) 所示,在RXD和TXD引脚上外接定时元件,内部振荡器就产生自激振荡。定时元件通常采用石英晶体和电容组成的并联谐振回路。晶体振荡频率可以在1.2~12MHz之间选择,电容值在5~30pF之间选择,电容值的大小可对频率起微调的作用。
外部方式的时钟电路如图3.2(b)所示,RXD接地,TXD接外部振荡器。对外部振荡信号无特殊要求,只要求保证脉冲宽度,一般采用频率低于12MHz的方波信号。片内时钟发生器把振荡频率两分频,产生一个两相时钟P1和P2,供单片机使用。
不得用于商业用途
8K可反复擦写Flash ROM 256x8bit内部RAM 时钟频率0-24MHz 可编程UART串行通道 共6个中断源 3级加密位 软件设置睡眠和唤醒功能 仅供个人参考
RXD接地,TXD接外部振荡器。对外部振荡信号无特殊要求,只要求保证脉冲宽度,一般采用频率低于12MHz的方波信号。片内时钟发生器把振荡频率两分频,产生一个两相时钟P1和P2,供单片机使用[3]。
(a)内部方式时钟电路 (b)外部方式时钟电路
图3.2时钟电路
2.复位及复位电路
(1)复位操作
复位是单片机的初始化操作。其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。除PC之外,复位操作还对其他一些寄存器有影响,它们的复位状态如表3-2所示[3]。
表3-2 一些寄存器的复位状态
寄存器 PC ACC PSW SP DPTR P0-P3 IP IE TMOD
复位状态 0000H 00H 00H 07H 0000H FFH 0X000000B 0X000000B 00H 寄存器 TCON TL0 TH0 TL1 TH1 SCON SBUF PCON 复位状态 00H 00H 00H 00H 00H 00H 不定 0X000000B 不得用于商业用途
仅供个人参考
(2)复位信号及其产生
RST引脚是复位信号的输入端。复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期)以上。若使用颇率为6MHz的晶振,则复位信号持续时间应超过4us才能完成复位操作。产生复位信号的电路逻辑如图3.3所示:
图3.3复位信号的电路逻辑图
整个复位电路包括芯片内、外两部分。外部电路产生的复位信号(RST)送至施密特触发器,再由片内复位电路在每个机器周期的S5P2时刻对施密特触发器的输出进行采样,然后才得到内部复位操作所需要的信号。
复位操作有上电自动复位和按键手动复位两种方式[4]。
上电自动复位是通过外部复位电路的电容充电来实现的,其电路如图3.4(a)所示。这佯,只要电源Vcc的上升时间不超过1ms,就可以实现自动上电复位,即接通电源就成了系统的复位初始化。
按键手动复位有电平方式和脉冲方式两种。其中,按键电平复位是通过使复位端经电阻与Vcc电源接通而实现的,其电路如图3.4(b)所示;而按键脉冲复位则是利用RC微分电路产生的正脉冲来实现的,其电路如图3.4(c)所示:
(a)上电复位 (b)按键电平复位 (c)按键脉冲复位
图3.4复位电路
不得用于商业用途
仅供个人参考
上述电路图中的电阻、电容参数适用于6MHz晶振,能保证复位信号高电平持续时间大于2个机器周期。
3.2 复位电路设计
复位电路有上电自动复位和按键手动复位两种方式。
上电自动复位是通过外部复位电路的电容充电来实现的,只要电源VCC的上升时间不超过1ms,就可以实现自动上电复位,即接通电源就成了系统的复位初始化。按键手动复位有电平方式和脉冲方式两种。其中,按键电平复位是通过使复位端经电阻与VCC电源接通而实现的,而按键脉冲复位则是利用RC微分电路产生的正脉冲来实现的。
本系统的复位电路采用上电复位方式。复位电路图如图3.5所示:
图3.5复位电路图
3.3 晶振电路设计
对于每个系统工程的晶振电路,都是用于单片机工作所需要的时钟信号,单片机只有在时钟信号的控制下,其各部件之间才能协调一致工作,时钟信号控制着计算机的工作节奏。
在单片机的TXAL1、TXAL12、之间跨接晶体振荡器和微调电容,可以和单片机内部的振荡器构成一个稳定的自激振荡器,这就是单片机的晶振电路。这种方式称之为
不得用于商业用途
仅供个人参考
内部的时钟源方式。电容C1和C2的主要作用是帮助振荡器起振,且振荡器大小对振荡频率有微调作用,在80C51系列中电容的大小30皮法。另外,振荡器的频率只要由石英晶振的频率来决定本次设计选用12MHz。本系统的晶振电路如图3.6所示:
图3.6 晶振电路
3.4 DS18B20芯片简介
3.4.1 芯片简介
(1) 适应电压范围更宽,电压范围:3.0 V~5.5V,在寄生电源方式下可由数据线
供电。
(2) 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现
微处理器与DS18B20的双向通讯。
(3) DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如
一只三极管的集成电路内。
(4) 测温范围-55℃~+125℃,在-10℃~+85℃时精度为±0.5℃。
(5) 可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃
和0.0625℃,可实现高精度测温。
(6) 在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在
750ms内把温度值转换为数字,速度更快。
(7) 测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传
送CRC校验码,具有极强的抗干扰纠错能力。
(8) 负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作[5]。
不得用于商业用途
仅供个人参考
3.4.2 DS18B20的外形和内部结构
DS18B20内部结构如图3.7所示,主要由4部分组成:64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20外形及管脚排列如图3.8和表3-3所示[5]。 I/O C VDD 存储器和控制器 64位ROM和单线接 口 温度传感器 高速缓存 存储器 低温触发器TL 高温触发器TH 电源检测 配置寄存器 8位CRC生成器 图3.7 DS18B20的内部结构
图3.8 DS18B20的管脚排列
不得用于商业用途
仅供个人参考
表3-3 DS18B20引脚定义: 序号 1 2 3
名称 GND DQ VDD 引脚功能描述 地信号 数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。 可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。 (1) 64位ROM
ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的循环冗余校验码(CRC=X8
+X5+X4+1)。ROM的作用是使每一个DS18B20都各不相同, DS18B20中的温度传感器完成对温度的测量,用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。DS18B20温度值格式表4-4如下所示。
ROM中的64位序列号是出厂前被光刻好的,他可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的循环冗余校验码(CRC=X8+X5+X4+1)。ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。DS18B20中温度传感器完成对温度的侧量,用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。DS18B20温度值格式表3-4如下所示。
这是12位转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。例如+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH[5]。
表3-4 DS18B20温度值格式表
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 LS Byte 23 22 21 20 21 22 23 24 bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8
S MS Byte S S S S 26 25 24
不得用于商业用途
仅供个人参考
(2)高低温报警触发器TH和TL
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。 (3)配置寄存器
该字节各位的意义如下表3-5所示。
表3-5 配置寄存器结构
TM
R1 R0 1 1 1 1 1 低五位一直都是“1”,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,如下表3-6所示(DS18B20出厂时被设置为12位)[5]。
表3-6 温度分辨率设置表
R1 0 0 1 1
(4)高速暂存器
R0 0 1 0 1 分辨率 9位 10位 11位 12位 温度最大转换时间 93.75ms 187.5ms 375ms 750ms 高速暂存器是一个9字节的存储器。开始两个字节包含被测温度的数字量信息;第3、4、5字节分别是TH、TL、配置寄存器的临时拷贝,每一次上电复位时被刷新;第6、7、8字节未用,表现为全逻辑1;第9字节读出的是前面所有8个字节的CRC码,可用来保证通信正确。高速暂存器RAM结构图如下表3-7所示[5]。
表3-7 DS18B20暂存寄存器分布 寄存器内容 温度值低位 (LS Byte) 温度值高位 (MS Byte) 高温限值(TH) 低温限值(TL) 配置寄存器 保留 保留 保留 CRC校验值 不得用于商业用途
字节地址 0 1 2 3 4 5 6 7 8 仅供个人参考
3.4.3 DS18B20的工作时序
DS18B20的一线工作协议流程是:初始化→ROM操作指令→存储器操作指令→数据传输。其工作时序包括初始化时序、写时序和读时序,如图3.9 (a)(b)(c)所示[6]。
DS18B20等待 DS18B20Tx产生
15us—16us 脉冲60--240 主机复位脉冲 VCC 480us 图3.9 (a)初始化时序 主机写“0”时隙 主机写“1”时隙 VCC 60us VCC 主机读“0”时隙 主机读“1”时隙 1-Wire Bus 15us 15us 30us 主机采样 15us GND 主机采样 1us 图3.9(c)读时序 主机控制DS18B20完成任何操作之前必须先初始化,即主机发一复位脉冲(最短为480us的低电平),接着主机释放总线进入接收状态,DS18B20在检测到I/O引脚上的上升沿之后,等待15-60us然后发出存在脉冲(60-240us的低电平)。 写时间片:将数据从高电平拉至低电平,产生写起始信号。在15us之内将所需写的位送到数据线上,在15us到60us之间对数据线进行采样,如果采样为高电平, 不得用于商业用途 仅供个人参考 就写1,如果为低电平,写0就发生。在开始另一个写周期前必须有1us以上的高电平恢复期。 读时间片:主机将数据线从高电平拉至低电平1us以上,再使数据线升为高电平,从而产生读起始信号。主机在读时间片下降沿之后15us内完成读位。每个读周期最短的持续期为60us,各个读周期之间也必须有1us以上的高电平恢复期。 3.4.4 DS18B20与单片机的典型接口设计 图3.10以MCS-51系列单片机为例,画出了DS18B20与微处理器的典型连接。图3.10(a)中DS18B20采用寄生电源方式,其VDD和GND端均接地,图3.10(b)中DS18B20采用外接电源方式,其VDD端用3V~5.5V电源供电[6]。 (a) 寄生电源工作方式 (b) 外接电源工作方式 图3.10电源工作方式图 3.4.5 DS18B20的各个ROM命令 (1) Read ROM [33H] 这个命令允许总线控制器读到DS18B20的8位系列编码,惟一的序列号的8位CRC码。只有在总线上存在单只DS18B20的时候才能用这个命令。如果总线上有不止一个从机,当所有从机试图同时传送信号时就会发生数据冲突(漏极开路连在一起形成“与”的效果)。 (2)Match ROM [55H] 这是个匹配ROM命令,后跟64位ROM序列,让总线控制器在多点总线上定位一只特定的DS18B20。只有和64位ROM序列完全匹配的DS18B20才能响应随后的存储器操作。所有和64位ROM序列不匹配的从机都将等待复位脉冲。这条命令在总线上有单个或多个器件时都可以使用。 不得用于商业用途 仅供个人参考 (3) Skip ROM [0CCH] 这个命令允许总线控制器不用提供64位ROM编码就使用存储器操作命令,在单点总线情况下,可以节省时间。如果总线上不止一个从机,在命令之后紧跟着发一条读命令,由于多个从机同时传信号。总线上发生数据冲突(漏极开路连在一起形成“与”的效果)。 (4) Search ROM [0F0H] 当一个系统初次启动时,总线控制器并不知道单线总线上有多少个器件或它们的64位ROM编码。搜索ROM命令允许总线控制器用排除法识别总线上的所有从机的64位编码。 (5) Alarm Search [0ECH] 这条命令的流程和Search ROM相同。然而,只有在最近一次测温后遇到符合报警条件的情况,DS18B20才会响应这条命令。报警条件定义为温度高于TH或低于TL。只要DS18B20不掉电,报警状态将一直保持,直到再一次测得的温度值达不到报警条件。 (6) Write Scratchpad[4EH] 这个命令向DS18B20的暂存器TH和TL中写入数据。可以在任何时刻发出复位命令来中止写入。 (7) Read Scratchpad[0BEH] 这个命令读取暂存器的内容。读取将从第1字节开始,一直进行下去,直到第9(CRC)字节读完。如果不想读完所有字节,控制器可以在任何时刻发出复位命令来中止读取。 (8) Copy Scratchpad[48H] 这个命令把暂存器的内容拷贝到DS18B20的E2ROM存储器里,即把温度报警触发器字节存入非易失性存储器里。如果控制器在这条命令之后跟着发出读时间隙,而DS18B20又忙于把暂存器拷贝到E存储器,DS18B20就会输出一个0,如果拷贝结束的话,DS18B20输出1。如果使用寄生电源,总线控制器必须在这条命令后立即启动强上拉,并最少保持10ms。 (9) Convert T[44H] 这个命令启动一次温度转换而无需其他数据。温度转换命令被执行,而后DS18B20保持等待状态。如果控制器在这条命令之后跟着发出时间隙,而DS18B20有忙于做时间转换的话,DS18B20将在总线上输出一个0,若温度转换完,则输出1。 不得用于商业用途 仅供个人参考 如果使用寄生电源,总线控制器必须在发出这条命令后立即启动强上拉,并最少保持500ms以上时间。 (10)Read E2[0B8H] 这条命令把 触发器里的值拷贝回暂存器。这种拷贝操作在DS18B20上电时自动执行,这样一上电暂存器里马上存在有效的数据了。若在这条命令之后发出读数据隙,器件会输出温度转换忙的标识:0为忙,1为完成。 (11)Read Power Supply[0B4H] 若把这条命令发给DS18B20后发出读时间隙,器件会返回它的电源模式:0为寄生电源,1为外部电源[6]。 3.5 测温电路设计 数字温度传感器DS18B20的测温电路如图所示3.11所示: 图3.11 测温电路 3.6 按键模块设计 利用单片机的IO口实现按键的中断输入。另外需要一个与门实现与中断端口的连接。按键电路如图3.12所示,期中按键K1为进入/退出设置键;K2为增加键;K3为减少键。 不得用于商业用途 仅供个人参考 图3.12按键模块 3.7 报警电路设计 三极管8550驱动蜂鸣器:报警电路如图3.13所示三极管Q5来驱动蜂鸣器BUZ1。 图3.13 报警电路 3.8 显示电路设计 采用四位共阴极LED数码管来显示温度的大小,可以直接读取,温度精确到0. 不得用于商业用途 仅供个人参考 1℃。四位数码管的显示电路如图3.14所示,从左到右依次是百位,十位,个位,十分位。 图3.14 显示电路 3.9 MAX232简介 MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。 MAX232的引脚图如图3.15所示: 图3.15 MAX232引脚图 不得用于商业用途 仅供个人参考 引脚介绍[7]: 第一部分是电荷泵电路。由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。 第二部分是数据转换通道。由7、8、9、10、11、12、13、14脚构成两个数据通道。 其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。 8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。 TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。 第三部分是供电。15脚GND、16脚VCC(+5v)。 MAX232的原理电路图如图3.16所示: 图3.16 MAX电路原理图 不得用于商业用途 仅供个人参考 MAX232的主要特点: 1、符合所有的RS-232C技术标准 2、只需要单一 +5V电源供电 3、片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V电压 V+、V- 4、功耗低,典型供电电流5mA 5、内部集成2个RS-232C驱动器 6、内部集成两个RS-232C接收器 3.10 RS232接口简介 RS-232C是使用最早、 应用最多的一种异步串行通信总线标准, 它是美国电子工业协会EIA(Electronic Industry Association)于1962年公布、 1969年最后修订而成的。 RS表示 Recommended Standard, 232是该标准的标识, C表示最后一次修订。 RS-232C主要用于定义计算机系统的一些数据终端设备(DTE)和数据通信设备(DCE)之间接口的电气特性。 CRT、 打印机与CPU的通信大都采用RS-232C总线[8]。 3.10.1 RS232接口的电平转换 RS-232C标准是在TTL电路之前研制的, 它的电平不是+5 V和地, 而是采用负逻辑, 其逻辑电平为: 逻辑“0”:+3 V~+15 V 逻辑“1”: -3 V~-15 V 因此, RS-232C不能和计算机的TTL电平直接相连, 使用时必须加上适当的电平转换电路芯片, 否则将使TTL电路烧坏。 常用的电平转换接口芯片是传输驱动器MC1488和传输接收器MC1489, 它们是用于计算机(终端)与RS 232C总线间进行电平转换的接口芯片。另一种常用的电平转换芯片是MAX232, 该芯片有两个传输驱动器和两个传输接收器。 不得用于商业用途 仅供个人参考 3.10.2 RS232总线接口标准 RS-232C标准规定的数据传输率为50 b/s、 75 b/s、 100 b/s、 150 b/s、 300 b/s、 600 b/s、 1200 b/s、 2400 b/s、 4800 b/s、 9600 b/s、 19 200 b/s。 驱动器允许有2500 pF的电容负载, 通信距离将受此电容限制。 例如, 采用150 pF/m的通信电缆时, 最大通信距离为 15 m, 若每米电缆的电容量减小, 则通信距离可以增加。 传输距离短的另一原因是RS-232C 属单端信号传送, 存在共地噪声和不能抑制共模干扰等问题。 因此, 它一般用于 20 m 以内的通信。RS -232C总线标准规定了21个信号, 有25条引脚线, 常采用25芯D型插头座, 提供一个主信道和一个辅助信道, 在多数情况下主要使用主信道。 对于一般异步双工通信, 仅需几条信号线就可实现, 如一条发送线、 一条接收线及一条地线。 RS-232C也有9芯标准D型插头座,RS232C9芯排列引脚如图3.7所示,个引脚功能如表3-8所示[9]。 图3.17 RS232C9芯排列引脚图 RS-232C定义了计算机系统的一些数据终端设备(DTE)和数据通信设备(DCE)之间接口的电气特性。RS-232C提供的两个信道中, 辅助串行信道提供数据控制和第二信道, 但其传输速率比主信道要低得多。 除了速率低之外两信道无异, 但辅助信道通常很少使用。信号分为两类: 一类是DTE与DCE交换的信息——TxD和RxD; 另一类是为了正确无误地传输上述信息而设计的联络信号。 不得用于商业用途 仅供个人参考 表3-8 9芯RS232C的引脚功能 3.11 串口电路设计 单片机与上位机(PC机)的接口电路如图3.18所示: 图3.18 接口电路 不得用于商业用途 仅供个人参考 3.12系统总体电路图 系统的总体电路图如图3.19所示: 图3.19 总体电路图 4 系统软件设计 4.1 各模块的程序设计 系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序和按键扫描处理子程序等。 不得用于商业用途 仅供个人参考 主程序的主要功能是负责温度的实时显示、读出并处理DS18B20 的测量的当前温度值,温度测量每1s 进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见图4.1 所示。 图4.1 主程序流程图 4.1.2 读出温度子程序 读出温度子程序的主要功能是读出RAM 中的9 字节,在读出时需进行CRC 校验,校验有错时不进行温度数据的改写。其程序流程图如图4.2示: 不得用于商业用途 仅供个人参考 图4.2 读出温度子程序流程图 4.1.3 温度转换命令子程序 温度转换命令子程序主要是发温度转换开始命令,当采用12 位分辨率时转换时间约为750ms,在本程序设计中采用1s 显示程序延时法等待转换的完成。温度转换命令子程序流程图如图4.3 所示: 不得用于商业用途 仅供个人参考 图4.3 温度转换命令子程序流程图 4.1.4 计算温度子程序 计算温度子程序将RAM 中读取值进行BCD 码的转换运算,并进行温度值正负的判定,其程序流程图如图4.4 所示。 图4.4 计算温度子程序流程图 不得用于商业用途 仅供个人参考 4.1.5 显示数据刷新子程序 显示数据刷新子程序主要是对分离后的温度显示数据进行刷新操作,当标志位位为1时将符号显示位移入第一位。程序流程图如图4.5所示。 图4.5 显示数据刷新子程序流程图 4.1.6 报警子程序 设置报警标志位位beep,当温度大于设置的高限报警值或低于设置的低限报警值是,beep=1报警;当温度值在正常范围内时,beep=0.报警流程图如图4.6所示: 图4.6 报警流程图 不得用于商业用途 仅供个人参考 4.1.7 按键扫描处理子程序 按键采用扫描查询方式,设置标志位,当标志位为1 时,显示设置温度,否则显示当前温度。如下图4.7所示。 图4.7 按键扫描子程序流程图 4.2 Keil C51编程软件 4.2.1 Keil C51简介 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。Keil C51软件是一个基于32位Windows环境的应用程序,支持C语言和汇编语言编程,其6.0以上的版本将编译和仿真软件统一为μVision(通常称为μV2)。Keil提供包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,由以下几部分组成: 不得用于商业用途 仅供个人参考 μVision IDE集成开发环境C51编译器、A51汇编器、LIB51库管理器、BL51连接/定位器、OH51目标文件生成器以及 Monitor-51、RTX51实时操作系统[10]。 4.2.2 Keil C51软件应用 应用Keil进行软件仿真开发的主要步骤为:编写源程序并保存—建立工程并添加源文件—设置工程—编译/汇编、连接,产生目标文件—程序调试。Keil使用“工程”(Project)的概念,对工程(而不能对单一的源程序)进行编译/汇编、连接等操作。工程的建立、设置、编译/汇编及连接产生目标文件的方法非常易于掌握。首先选择菜单File-New…,在源程序编辑器中输入汇编语言或C语言源程序(或选择File-Open…,直接打开已用其它编辑器编辑好的源程序文档)并保存,注意保存时必须在文件名后加上扩展名.asm(.a51)或.c;然后选择菜单Project-New Project…,建立新工程并保存(保存时无需加扩展名,也可加上扩展名.uv2);工程保存后会立即弹出一个设备选择对话框,选择CPU后点确定返回主界面。这时工程管理窗口的文件页(Files)会出现“Target1”,将其前面+号展开,接着选择Source Group1,右击鼠标弹出快捷菜单,选择“Add File to Group ‘Source Group1’”,出现一个对话框,要求寻找并加入源文件(在加入一个源文件后,该对话框不会消失,而是等待继续加入其它文件)。加入文件后点close返回主界面,展开“Source Group1”前面+号,就会看到所加入的文件,双击文件名,即可打开该源程序文件。紧接着对工程进行设置,选择工程管理窗口的Target1,再选择Project-Option for Target‘Target1’(或点右键弹出快捷菜单再选择该选项),打开工程属性设置对话框,共有8个选项卡,主要设置工作包括在Target选项卡中设置晶振频率、在Debug选项卡中设置实验仿真板等,如要写片,还必须在Output选项卡中选中“Creat Hex Fi”;其它选项卡内容一般可取默认值。工程设置后按F7键(或点击编译工具栏上相应图标)进行编译/汇编、连接以及产生目标文件。成功编译/汇编、连接后,选择菜单Debug-Start/Stop Debug Session(或按Ctrl+F5键)进入程序调试状态,Keil提供对程序的模拟调试功能,内建一个功能强大的仿真CPU以模拟执行程序。Keil能以单步执行(按F11或选择Debug-Step)、过程单步执行(按F10或选择Debug-Step Over)、全速执行等多种运行方式进行程序调试。如果发现程序有错,可采用在线汇编功能对程序进行在线修改(Debug-Inline Assambly…),不必执行先退出调试环境、修改源程序、对工程重新进行编译/汇编和连接、然后再次进入调试状态的步骤。对于一些必须满足一定条件(如按键被按下等)才能被执行的、难以用单步执行方式进行 不得用于商业用途 仅供个人参考 调试的程序行,可采用断点设置的方法处理(Debug-Insert/Remove Breakpoint或Debug-Breakpoints…等)。在模拟调试程序后,还须通过编程器将.hex目标文件烧写入单片机中才能观察目标样机真实的运行状况。 4.3 Protues仿真 4.3.1 Protues简介 Proteus软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。 该软件的特点是: 1. 实现了单片机仿真和SPICE电路仿真相结合,具有模拟电路仿真、数字电路仿真、各种单片机(51系列、AVR、PIG等常用的MCU)及其外围电路(如LCD、RAM、ROM、键盘、LED、A/D、D/A……)组成的系统仿真。2. 提供了多种虚拟仪器。如示波器、逻辑分析仪、信号发生器等,调试非常方便。3. 提供软件调试功能,同时支持第三方的软件编译和调试环境,如Keil等软件。4. 具有强大的原理图绘制功能。Proteus与其它单片机仿真软件不同的是,它不仅能仿真单片机CPU的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。因此在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程和结果。对于这样的仿真实验.从某种意义上讲,是弥补了.实验和工程应用阉脱节的矛盾和现象。同时,当硬件调试成功后,利用Proteus ARES软件,很容易获得其PCB图,为今后的制造提供了方便[11]。 不得用于商业用途 仅供个人参考 4.3.2 Protues测温仿真 通过仿真软件验证该原理图的可行性。采用protues软件对电路仿真,可以得到预期效果。仿真图如图4.8示。温度传感器的仿真效果图如图4.9所示,此图验证了传感器的温度与数码管显示的数字一致。STC89C52与AT89C52都属于51系列的单片机,他们是兼容的,所以Protues中没有STC89C52芯片,就由AT89C52芯片代替。 图4.8 Protues仿真图 图4.9 DS18B20仿真图 不得用于商业用途 仅供个人参考 当按下K1 键一次时,进入温度报警上线调节,此时显示软件设置的温度报警上线,按K2或K3分别对报警温度进行加一或减一。当再次按下K1 键时,进入温度报警下线调节,此时显示软件设置的温度报警下线,按K2或K3分别对报警温度进行加一或减一。当第三次按下K1 键时,退出温度报警线设置。显示当前温度。 如图4.10是第一次按下K1键显示的上限温度报警值,此时按K2或K3键分别对上限温度报警值进行加一或减一;图4.11是第二次按下K1键显示的下限温度报警值,此时按K2或K3键分别对下限温度报警值进行加一或减一。 图4.10上限温度报警值 图4.11 下限温度报警值 不得用于商业用途 仅供个人参考 5 系统调试和分析 5.1 系统调试 首先检查电路的焊接是否正确及电路中有没有虚焊等问题,然后用万用表测试电路板上的各个正极和负极是否全部都正确的接在了相应的正极公共端和负极公共端上和检查各元件的引脚是否有接错。具体的调试步骤如下: (1) 通电前检查。任何组装好的电子电路,在通电调试之前,必须认真检查电路连线是否有误。检查的方法是对照设计好的电路图,按一定的顺序逐级对应检查。特别是注意各个部分的电源是否接错,电源与地是否有短接,ATC89C52和4位数码管显示管的引脚是否接错,轻轻拨一拨元器件,观察焊点是否牢固等。 (2)通电检查。在电路板上安装好已经烧写程序成功的ATC89C52,然后再给电路接通电源,正极接+5V的直流电源,负极接地。电源一经接通,先要观察是否有异常现象,如冒烟、异常气味、放电的声光、元器件发烫等。如果有,应立即关断电源,待故障排除后,方可重新接通电源。 经检查一切无误后,温度传感器DS18B20正常工作,测得的现场温度如图5.1所示: 图5.1 系统调试图 不得用于商业用途 仅供个人参考 第一次按下K1键,显示系统的高限报警温度值,按下K2和K3键能对高限报警温度值分别进行加1和减1设置,高限报警温度值如图5.2所示: 图5.2 高限报警温度值 第二次按下K1键,显示系统的低限报警温度值,按下K2和K3键能对低限报警温度值分别进行加1和减1设置,低限报警温度值如图5.3所示: 图5.3 低限报警温度值 不得用于商业用途 仅供个人参考 5.2 结果分析 经过系统的整体调试,本设计达到了规定的设计要求:能用数码管直接显示、能自由设定温度上下限报警值和实现报警。由于本设计采用了集成温度传感器,这样不仅减少了硬件电路的设计与调试,并且此温度传感元件的集成性能比传统的元件要优越得多,这样简化了电路的设计难度还降低了产品的价格。本设计还可以实现高低温报警功能,因此能够适用于多种场合。本课题所设计的数字温度计包括硬件组成和软件的设计。该系统在硬件设计上主要是通过其核心控制器件STC89C52将采集到的数字温度值经单片机处理得到相应的温度值,送到4位数码管进行显示,以数字形式显示测量的温度。整个系统的软件编程就是通过C语言对STC89C52实现其控制功能,整个系统结构紧凑,简单可靠,操作灵活,功能强大,性价比相对较高。 通过理论探讨和实际实验验证,得出以下结论: (1) 本系统采用温度传感器DS18B20取代传统的模拟传感器进行温度测量, 简化了系统前端数据采集本分的结构,降低了成本,且实践证明效果很好,稳定、可靠 (2) 本次设计还存在许多不完善的方面。在整个设计过程中,由于难度的 原因,系统实现的功能有限,与市场上同类产品存在相当的差距;在编程方面,虽然采用C语言编程,但是对其的理解不够透彻,还存在很大的提升空间。 6结果与展望 6.1结果 本次设计主要是通过STC89C52单片机为核心设计的一款数字温度计,该温度计不仅能够实时测量温度值显示出来还能够设定温度上下限进行监控,若温度高于设定上限值或低于下限值,则报警电路将进行报警。 硬件方面 本设计采用的是STC89C52单片机为核心的数字温度计,包含了利用温度传感器DS18B20的测温电路、外接键盘、显示电路、继报警电路、复位电路和晶振电路。以DS18B20为主要测温元件进行实时监控温度值。以4位数码管为显示器件,利用单片机的P0口和上拉电阻来驱动4位数码管的显示;利用单片机的P1.7来驱动温度传感 不得用于商业用途 仅供个人参考 器DS18B20测温;报警电路利用三极管放大作用驱动报警器报警;按键是利用单片机的P1口和上拉电阻来驱动工作 软件方面 本次设计利用Protues软件对系统进行仿真,利用Keil C51 软件对系统进行编程。C语言设计了温度的读、写程序,并利用程序实时对显示电路进行更新操作。本次设计编写了外接键盘的动作程序,能够感应外接键盘的动作情况对系统做出一系列相应的调整和动作。系统包含了通过外接键盘设定一个基准值的程序,能够比较基准值并通过比较之后的结果对外围电路产生相应的控制。 6.2 展望 系统硬件 系统硬件使用51单片机以及一些外围电路,其中51单片机的外围接口资源占用较少,有明显的资源浪费现象,还需要进行进一步的改进以及功能的提升和拓展。4个控制支路分别占用单片机4个独立端口,可以适当考虑合并处理来节约单片机的接口以及将电路和程序进行一步简单化。 系统软件 系统在单片机初始化之后控制端口还有短暂的误动作情况;报警电路有时不能正确的报警,需要改进程序;外接键盘按钮按下的瞬间无法立即判断电平变化并作出相应动作;温度的测量与显示范围有限并且精度不是非常高。在此需要对系统程序进行调整,还有待进一步的优化和改进。 不得用于商业用途 仅供个人参考 谢辞 值此之际,向在我毕业设计期间给予我谆谆教诲的李杰老师表示衷心的感谢! 感谢老师给了我很大的帮助,同时也离不开很多同学的热心帮助,是他们在我遇到难题的时候给了我启发。通过本次毕业设计,我在专业知识、专业技能和解决问题方法方面得到很大的提高。更深入了解并掌握了传感器的基本理论知识, 并在单片机实际电路开发和常用编程设计思路掌握方面有了一定程度的掌握,尽管本次设计还不是很完善,但这为我以后的设计之路积累了宝贵的经验。 不得用于商业用途 仅供个人参考 参考文献 [1] 金发庆.传感器技术与应用.北京:机械工业出版社,2002.34-36 [2] 丁向荣.STC系列增强型8051单片机原理及应用.北京:电子工业出版社,2011.1-2 [3] 求是科技科技.单片机典型模块设计实例导航.北京:人民邮电出版社,2005.7-11 [4] 曹巧媛.单片机原理及应用(第二版). 北京:电子工业出版社,2002.55-57 [5] 金发庆.传感器技术与应用.北京:机械工业出版社,2002.181-183 [6] 沙占友.智能化集成温度传感器原理与应用. 机北京:械工业出版社,2002.89-90 [7] 李建忠.单片机原理及应用. 西安:西安电子科技大学出版社,2008.128-134 [8] 王守中.51单片机开发入门与典型实例.北京:人民邮电出版社,2007:195-198 [9] 李朝青.单片机原理及接口技术(简明修订版).杭州:北京航空航天大学出版社,1998.123-125 [10] 赵文博,刘涛.单片机语言C51程序设计.北京:人民邮电出版社,2005:1-4 [11] 周润景,张丽娜,丁莉.基于PROTUES的电路及单片机设计与仿真.北京:北京航空航天大学出版社,2009:1-2 不得用于商业用途 仅供个人参考 附录 附录1 元器件清单 Bill Of Materials ================= Design: E:\\Program Files\\Labcenter Electronics\\Proteus 7 Professional\\SAMPLES\\aa.DSN Doc. no.: QTY PART-REFS VALUE CODE --- --------- ----- ---- Resistors --------- 1 R1 10k 13 R2-R13,R18 360 1 R14 1k 3 R15-R17 4.7k Capacitors ---------- 2 C1,C2 30pF 1 C3 10uF 4 C4-C7 1uF 1 C8 0.1uF Integrated Circuits ------------------- 1 U1 STC89C52 1 U2 DS18B20 1 U3 MAX232 Transistors ----------- 1 Q5 PNP Miscellaneous ------------- 3 K1-K3 1 LS1 SPEAKER 1 X1 CRYSTAL 不得用于商业用途 仅供个人参考 附录2 全部程序清单 #include #include int temp1=0; //显示当前温度和设置温度的标志位为0 时显示当前温度 uint h; uint temp; uchar r; uchar high=120,low=20; uchar sign; uchar q=0; uchar tt=0; uchar scale; uchar code ditab[16]={0x00,0x01,0x01,0x02, //温度小数部分用查表法 0x03,0x03,0x04,0x04, 0x05,0x06,0x06,0x07, 0x08,0x08,0x09,0x09}; uchar code table_dm[12]={0x3f,0x06,0x5b,0x4f, //小数断码表 不得用于商业用途 仅供个人参考 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x00,0x40}; uchar table_dm1[]={0xbf,0x86,0xdb,0xcf, //共阴LED 段码表\"0\" \"1\" \"2\" \"3\" \"4\" \"5\" \"6\" \"7\" \"8\" \"9\" \"不亮\" \"-\" 0xe6,0xed,0xfd,0x87, 0xff,0xef}; //个位带小数点的断码表 uchar data temp_data[2]={0x00,0x00}; //读出温度暂放 uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4 个数据和一个运算暂用 void delay(uint t) // 延时函数 { for (;t>0;t--); } void scan() { int j; for(j=0;j<4;j++) { switch (j) { case 0: dm=table_dm[display[0]];L4=0;delay(50);L4=1;//小数 case 1: dm=table_dm1[display[1]];L3=0;delay(50);L3=1;//个位 case 2: dm=table_dm[display[2]];L2=0;delay(50);L2=1;//十位 case 3: dm=table_dm[display[3]];L1=0;delay(50);L1=1;//百位 //else{dm=table_dm[b3];w3=0;delay(50);w3=1;} } } } 不得用于商业用途 仅供个人参考 ow_reset(void) //DS18B20 复位函数 { char presence=1; while(presence) { while(presence) { DQ=1; //从高拉倒低 _nop_(); _nop_(); DQ=0; delay(50); //50 us DQ=1; delay(6); //6 us presence=DQ; //presence=0 复位成功,继续下一步 } delay(45); //延时45 us presence=~DQ; } DQ=1; //拉高电平 } void write_byte(uchar val) //DS18B20 写命令函//向1-WIRE 总线上写1 个字节 { uchar i; for(i=8;i>0;i--) { DQ=1;_nop_(); _nop_(); //从高拉倒低 DQ=0; 不得用于商业用途 仅供个人参考 _nop_(); _nop_(); _nop_(); _nop_(); //5 us DQ=val&0x01; //最低位移出 delay(6); //66 us val=val/2; //右移1 位 } DQ=1; delay(1); } uchar read_byte(void) //DS18B20 读1 字节函数//从总线上取1 个字节 { uchar i; uchar value=0; for(i=8;i>0;i--) { DQ=1; _nop_(); _nop_(); value>>=1; DQ=0; _nop_(); _nop_(); _nop_(); _nop_(); //4 us DQ=1; _nop_(); _nop_(); _nop_(); 不得用于商业用途 仅供个人参考 _nop_(); //4 us if(DQ)value|=0x80; delay(6); //延时66 us } DQ=1; return(value); } read_temp() //读出温度函数 { ow_reset(); //总线复位 delay(200); write_byte(0xcc); //发命令 write_byte(0x44); //发转换命令 ow_reset(); delay(1); write_byte(0xcc); //发命令 write_byte(0xbe); temp_data[0]=read_byte(); //读温度值的第字节 temp_data[1]=read_byte(); //读温度值的高字节 temp=temp_data[1]; temp<<=8; temp=temp|temp_data[0]; // 两字节合成一个整型变量。 return temp; //返回温度值 } work_temp(uint tem) //温度数据处理函数//二进制高字节的低半字节和低字节的高半字节组成一字节,这个字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩下的低字节的低半字节转化成十进制后,就是温度值的小数部分 { uchar n=0; 不得用于商业用途 仅供个人参考 if(tem>6348) // 温度值正负判断 {tem=65536-tem;n=1;} // 负温度求补码,标志位置1 display[4]=tem&0x0f; // 取小数部分的值 display[0]=ditab[display[4]]; // 存入小数部分显示值 display[4]=tem>>4; // 取中间八位,即整数部分的值 display[3]=display[4]/100; // 取百位数据暂存 display[1]=display[4]%100; // 取后两位数据暂存 display[2]=display[1]/10; // 取十位数据暂存 display[1]=display[1]%10; //个位数据 r=display[1]+display[2]*10+display[3]*100; if(!display[3])//符号位显示判断 { display[3]=0x0a; //最高位为0 时不显示 if(!display[2]) { display[2]=0x0a; //次高位为0 时不显示 } } if(n){display[3]=0x0b;} //负温度时最高位显示\"-\" } void xianshi(int horl) //设置温度显示转换 { int n=0; if(horl>128) { horl=256-horl;n=1; } display[3]=horl/100; display[3]=display[3]&0x0f; 不得用于商业用途 仅供个人参考 display[2]=horl%100/10; display[1]=horl%10; display[0]=0; if(!display[3]) { display[3]=0x0a; //最高位为0 时不显示 if(!display[2]) { display[2]=0x0a; //次高位为0 时不显示 } } if(n) { display[3]=0x0b; //负温度时最高位显示\"-\" } } void keyscan() //按键查询程序 { int temp1; //最高温度和最低温度标志位 if(set==0) { while(1) { delay(500);//消抖 if(set==0) { temp1++; while(!set) scan(); } 不得用于商业用途 仅供个人参考 if(temp1==1) { xianshi(high); scan(); if(add==0) { while(!add) scan(); high+=1; } if(dec==0) { while(!dec) scan(); high-=1; } } if(temp1==2) { xianshi(low); if(add==0) { while(!add) scan(); low+=1; } if(dec==0) { while(!dec) scan(); low-=1; 不得用于商业用途 仅供个人参考 } scan(); } if(temp1>=3) { temp1=0; break; } } } } void BEEP() { if(r>=high||r void main() //主函数 { dm=0x00; //初始化端口 L4=0; L3=0; L2=0; L1=0; for(h=0;h<4;h++) //开机显示\"0000\" 不得用于商业用途 仅供个人参考 { display[h]=0; } ow_reset(); //开机先转换一次 write_byte(0xcc); //Skip ROM write_byte(0x44); //发转换命令 for(h=0;h<100;h++) //开机显示\"0000\" { scan(); } while(1) { if (temp1==0) { work_temp(read_temp()); //处理温度数据 BEEP(); scan(); //显示温度值 keyscan(); } else keyscan(); } } 不得用于商业用途 仅供个人参考 附录3 系统总设计图 不得用于商业用途 仅供个人参考 仅供个人用于学习、研究;不得用于商业用途。 For personal use only in study and research; not for commercial use. Nur für den persönlichen für Studien, Forschung, zu kommerziellen Zwecken verwendet werden. Pour l 'étude et la recherche uniquement à des fins personnelles; pas à des fins commerciales. только для людей, которые используются для обучения, исследований и не должны использоваться в коммерческих целях. 以下无正文 不得用于商业用途 因篇幅问题不能全部显示,请点此查看更多更全内容