自制可调温度控制器74357
温度控制器的设计与制作共13页

温度控制器的设计与制作一、功能要求设计并制作一个温度控制器,用于自动接通或断开室内的电加热设备,从而使室内温度达到设定温度要求,并能实时显示室内温度。
当室内温度大于等于设定温度时,控制器断︒时,控制器接通电加热设备。
开电加热设备;当室内温度比设定温度小2C控温范围:0~51C︒控温精度:≤1C︒二、硬件系统设计1.硬件系统由七部分组成,即单片机及看门狗电路、温度检测电路、控制输出电路、键盘电路、显示电路、设置温度储存电路及电源电路。
(1)单片机及看门狗电路根据设计所需的单片机的内部资源(程序存储器的容量、数据存储器的容量及I/O口数量),选择AT89C51-24PC较合适。
为了防止程序跑飞,导致温度失控,进而引起可怕的后果,本设计加入了硬件看门狗电路IMP813L,如果它的WDI脚不处于浮空状态,在1.6秒内WDI不被触发(即没有检测到上什沿或下降沿),就说明程序已经跑飞,看门狗输出端WDO将输出低电平到手动复位端,使复位输出端RST发出复位信号,使单片机可靠复位,即程序重新开始执行。
(注:如果选用AT89S51,由于其内部已具有看门狗电路,就不需外加IMP813L)(2)温度检测电路温度传感器采用AD590,它实际上是一个与绝对温度成正比的电流源,它的工作电压为4~30V,感测的温度范围为-550C~+1500C,具有良好的线性输出,其输出电流与温度成正比,即1μA/K。
因此在00C时的输出电流为273.2μA,在1000C时输出电流为373.2μA。
温度传感器将温度的变化转变为电流信号,通过电阻后转变电压信号,经过运算放大器JRC4558运算处理,处理后得到的模拟电压信号传输给A/D转换部分。
A/D转换器选用ADC0804,它是用CMOS集成工艺制成的逐次逼近型模数转换芯片,分辨率8位,转换时间100μs,基准电压0~5V,输入模拟电压0~5V。
(3)控制输出电路控制信号由单片机的P1.4引脚输出,经过光耦TLP521-1隔离后,经三极管C8550直接驱动继电器WJ108-1C-05VDC,如果所接的电加热设备的功率≤2KW,则可利用继电器的常开触点直接控制加热设备,如果加热设备的功率>2KW,可以继电器控制接触器,由接触器直接控制加热设备。
室内温度控制器的制作方法

室内温度控制器的制作方法室内温度控制器是一种用来调节和控制室内温度的设备。
通过使用室内温度控制器,我们可以实现室内温度的自动调节,提高室内舒适度,节约能源。
下面我将介绍一种简单的室内温度控制器的制作方法。
制作室内温度控制器的第一步是收集所需材料和工具。
我们需要一个温度传感器、一个温度控制模块、一个继电器、几根导线、一个电源、一个计时器和一个外壳。
工具方面,我们需要一个钳子、一把电钻和一把螺丝刀。
接下来,我们需要将温度传感器连接到温度控制模块上。
首先,使用螺丝刀将外壳打开,然后使用钳子将温度传感器的导线剥开一段。
将温度传感器的导线连接到温度控制模块上,确保连接稳固。
然后,我们需要将继电器连接到温度控制模块上。
使用钳子将继电器的导线剥开一段,然后将其连接到温度控制模块上。
接下来,使用电钻将继电器固定在外壳上,确保牢固不会松动。
接下来,将电源连接到温度控制模块上。
使用钳子将电源的导线剥开一段,然后将其连接到温度控制模块上。
确保连接正确,电源可靠。
最后,将计时器连接到温度控制模块上。
使用钳子将计时器的导线剥开一段,然后将其连接到温度控制模块上。
接下来,使用螺丝刀将计时器固定在外壳上,确保稳固。
经过以上步骤,我们成功制作了一个简单的室内温度控制器。
当室内温度超过设定的温度范围时,温度传感器将检测到这一变化并将信号传递给温度控制模块。
温度控制模块通过继电器控制空调或暖气设备的开启与关闭。
当温度达到设定范围内时,计时器将自动关闭设备,从而实现室内温度的自动调节。
需要注意的是,在制作室内温度控制器时,我们需要确保所有的电线连接正确,不要有任何短路或断路的情况发生。
另外,我们还需要注意选择合适的电源和适当的温度控制模块,以保证设备的稳定性和安全性。
总结起来,制作一个室内温度控制器并不复杂。
我们只需要收集所需材料和工具,然后按照上述步骤进行连接和固定即可。
通过室内温度控制器的使用,我们可以实现室内温度的自动调节,提高室内舒适度,节约能源。
一根导热管和一个机械式温控器,在家自制温度控制器

生活中的一些小创意,有时是来自于自己的一些小需求和探索欲。我有一个朋友想要自己DIY一个烧水的热水装置,就会问 道,一个发热管加一个温控开关能否控制温度,作为专 业 的 温 控 器 及 配 件 生 产 厂 家 --【 滨 州 恒 冠 电 器 】 , 我 很 专 心 的 为 他 讲解了一番,从以下几个方面来了解下,如何利用温控开关制作一个温度控制系统:
3、其它安全方面的考虑,漏电流、短路这些因数也需要考虑在里面,可以在串联了温控开关和发热管后加上过流保护器 和漏电流保护开关。
以上3点如果考虑完全测试没问题的话,恭喜您,DIY一个自己的热水装置已经可以了,滨州恒冠电器在这里祝大家生活 愉快。
1、需要使用多大功率的发热管,不同功率的发热管,将水从常温到一个温度的时间是不同的,这里就需要考虑到选择温 控开关的温度点,因为作为双金属片机械式的温控开关,温度点是在出厂的时候设定了不可以调的,一般一个温控开关 分为两个温度,一个是断开温度,一个是接通温度。如果功率大升温快,可以用温度稍微低点的温控开关,如果功率 小升温慢的话,那就可以选择温度相对接近需要控制的温度点,切记安装温控开关的时候一定要最接近需要控制温度 的 地 方 。 比 如 , 如 果 要 控 制 300度 的 高 温 的 话 , 用 3000瓦 的 加 热 管 , 这 样 温 控 开 关 的 温 度 可 能 就 要 设 定 的 相 对 低 点 , 可 以 选 择 280度 的 温 控 开 关 。
2、需要用多大电压、电流的温控开关,这就需要结合第一定的功率考虑,如果功率在小于2000瓦的情况下,可以选择 10A250V的温控开关,如果2000瓦到3000瓦之间的话可以选择15A的,那当然功率越大就需要更大电流的温控开关,越彬电 子厂的温控开关最大电流可以过63A也就是即热式电热水器上6000瓦用的。
自制恒温控制器

自制恒温控制器该恒温控制器电路能使电器按预定的温度自动开启或关闭。
可用于恒温箱的温度自动控制、电风扇的自动开启,具有制作简单,用途广泛等优点。
其电路原理图如下图所示。
A1为三端稳压集成块,它输出稳定的12V直流电压供整机用电。
RP、R1和Rt组成温度检测电路,Rt为负温度系数的热敏电阻器,它的阻值随环境温度升高而下降。
555时基电路A2接成触发延迟电路,当②脚电位低于l/3V DD时,555时基电路置位,③脚输出高电平,继电器K得电吸合,其触点K一1闭合,接通电器电源使电器得电工作。
此时电路为暂稳态,正电源即通过R2向C4充电,使阈值端⑥脚电位不断上升,当升至复位电平时,电路翻转复位,③脚输出低电平,继电器释放,触点K一1跳开,电器就停止工作。
本电路设计巧妙之处是在其控制端⑤脚与电源正端之间串接了一只二极管VD5,使控制端⑤脚电位被钳位在12V—0.7V=11.3V 左右,从而使⑥脚复位电平由原来的2/3VDD(即8V)抬高到11.3V。
其目的可采用较小定时阻容元件R2与C4,即可获得较长的定时时间。
采用图示数据,延迟时间约3min。
设置延迟电路的目的是为了避免在预定温度附近可能造成电器M频繁开机与停机的不良现象。
恒温控制的具体工作过程是:当室内温度升高到预定值时,Rt阻值小于(R RP+R1)的一半,此时A2的②脚电位低于1/3VDD,电路翻转置位,③脚输出高电平,继电器K吸合,电器运转。
室内温度逐渐下降后,Rt的阻值随之增大,②脚电位开始升高并大于1/3VDD,此时电路仍处在暂态,即C4继续充电,电路不会翻转,电器仍运转。
直至C4电压充至11.3V左右时,电路翻转复位,③脚输出低电平,继电器K释放,电器才停止运转。
显然电路设置的延迟电路可解决当室内温度迅速变化时造成电路在预定温度附近频繁开机与关机。
倘若室内温度又升高到预定温度时,电路能重复上述过程使电器自动重新开机。
Rt可选用NTH2074型负温度系数热敏电阻。
自制可调温度控制器.

自制可调温度控制器(附原理图和源程序)2008年06月18日星期三 15:05自制可调温度控制器作者:温正伟原载:无线电杂志近期我发现很多DIY或是电子爱好的朋友们比较关注电子温度控制器制作的文章,前面我也发过一篇AT89C2051控制的简单温度计制作的文章,但是由于电路比较简易,而且没有调温功能.应部分朋友的要求我在此转载一篇温正伟在无线电杂志上发表过的一款可以方便调节、设定温度的控制器。
1.功能介绍笔者设计的这一款温度控制器是使用仍是比较常用的DS18B20集成温度传感器,还是用七段数码管做显示,完成温度采集与处理控制的CPU仍是AT89C2051单片机,但该电路具有电路简单,制作起来也无需调试,安装好后就可以使用等方便DIY的优点。
该电路最大的特点是用可以直观方便的调节所要限定的温度值,温度值是用3个7段共阳极数码管显示的,上电后会显示当前的温度值,按设定键时会闪烁显示设定温度值,这时可以按上/下调节键调整设定温度值,再次按下设定键时返回当前温度显示同时会对设定温度值进行保存,这个设定值会保存在DS18B20中,掉电后也不会丢失,下次上电时,单片机会自动读入上次的温度设定值。
长按设定键为关闭显示和温控,再次按下时功能再次打开。
电路中还设计了一路继电器控制,程序中设定超出设定温度时继电器被驱动吸合。
2.元器件背景及选用表一是元器件列表。
在这个电路中关键的两个元器件分别是单片机AT89C2051和温度传感传感芯片DS18B20。
AT89C2051具有2K的可多次擦写的FLASH存储器,有15个I/O口,用于做一些小型的控制显示和数据采集系统是很好的选择,本制作中2051单片机除要完成数据采集、处理、控制和显示的任务外,还要完按键值的采集、处理。
如果要用常规的数字加模拟电路实现起来就相对困难多了。
DS18B20是DALLAS半导体公司(现属MAXIM公司)设计生产的单总线数字温度传感器,单总线也就是说只用一根I/O引线完成数据的输入输出功能,所以它的体积很小,而且电压适用范围在3-5.5V,封装形式除有SO/uSO 的8PIN贴片式,还有更方便的三极管形式的TO-92封装(封装形式和引脚说明请看图一)。
温控开关制作方法-概述说明以及解释

温控开关制作方法-概述说明以及解释1.引言1.1 概述温控开关是一种用来控制设备或系统在特定温度范围内工作的关键性器件。
它在许多领域和应用中都扮演着重要的角色,比如家用电器、工业设备、医疗器械等等。
通过监测环境温度并根据设定的参数来控制电路的通断,从而实现对设备工作状态的控制。
本文将介绍如何制作一个简单的温控开关,帮助读者更好地了解其原理和制作方法。
1.2 文章结构文章结构部分需包含以下内容:文章结构部分主要介绍了整篇文章的组织结构,包括引言、正文和结论三个部分的主要内容和分工。
通过文章结构的概述,读者可以清晰地了解到文章的整体框架和各部分之间的逻辑关系,有助于读者更好地把握文章的主题和内容,增强文章的可读性和连贯性。
此外,文章结构部分还可以为读者提供导读,引导读者快速了解文章的重点内容,帮助读者更准确地理解文章的主旨和要点。
1.3 目的:本文旨在介绍温控开关的制作方法,通过详细解释温控开关的原理、制作材料和具体步骤,帮助读者了解温控开关的工作原理,掌握制作温控开关的技术要点。
通过阐述温控开关的应用和意义,使读者更加清晰地认识温控开关在实际生活中的重要性。
最后,展望未来发展方向,不仅可以让读者对温控开关技术有更深入的了解,也可以促进技术的创新和应用。
通过本文的介绍,读者可以对温控开关制作方法有一个全面的了解,从而有助于他们在实践中应用和推广温控开关技术。
2.正文2.1 温控开关的原理温控开关是一种能够根据环境温度自动控制电器开关的装置。
其工作原理基于热膨胀原理和电气传导原理。
当温度升高时,温控开关内部的热敏元件会感知到温度变化,导致热膨胀,从而引起开关动作。
通过控制热敏元件的属性和设置合适的阈值,可以实现在特定温度范围内精确地控制电器的开启和关闭。
在电气传导方面,温控开关内部还包括电路连接和控制元件。
当温度达到设定值时,电路会自动关闭或打开,从而实现对电器的控制。
通过在电路中添加一些保护元件,可以保证温控开关的安全和稳定性。
任务五 电热水器温度控制器的设计与制作

任务一电热水器温度控制器的设计与 制作
• 热敏电阻是由一些金属氧化物,如钻(Co),锰(Mn),镍(Ni)等的氧化物 采用不同比例配方混合,研磨后加入勃合剂,埋入适当引线(铂丝), 挤压成型再经高温烧结而成。 • 热敏电阻根据使用要求不同,可制成珠状、片状、杆状、垫圈状等各 种形状,如图2-2所示。
任务一电热水器温度控制器的设计与 制作
• (4)过载保护。
• 如图2-7所示,Rt1, Rt2, Rt3是热电特性相同的3个热敏电阻,安装在三 相绕组附近。电机正常运行时,电机温度低,热敏电阻高,三极管不 导通,继电器不吸合,使电机正常运行。当电机过载时,电机温度升 高,热敏电阻的阻值减小,使三极管导通,继电器吸合,则电机停止 • 转动,从而实现保护作用。
任务一电热水器温度控制器的设计与 制作
• 2)热电阻的结构和类型
• 金属热电阻按其结构类型来分:普通型、 • 铠装型 • 薄膜型 • 普通型热电阻由感温元件(金属电阻丝)、骨架、引线、保护套管及接 线盒等基本部分组成。
上一页 下一页
返回
任务一电热水器温度控制器的设计与 制作
• (1)感温元件(金属电阻丝)。 • 由于铂的电阻率较大,而且相对机械强度较大,通常铂丝的直径为 (0.03~0.07 ) mm±0.005 mm。可单层绕制,若铂丝太细,电阻体可 做得小些,但强度低;若铂丝粗,虽强度大,但电阻体积大了,热惰 性也大,成本高。由于铜的机械强度较低,电阻丝的直径需较大。一 般为0.1 mm±0.005 mm的漆包铜线或丝包线分层绕在骨架上,并涂 上绝缘漆而成。 • 由于铜电阻的温度低,故可以重叠多层绕制,一般多用双绕法,即两 根丝平行绕制,在末端把两个头焊接起来,这样工作电流从一根热电 阻丝进入,从另一根热电阻丝反向出来,形成两个电流方向相反的线 圈,其磁场方向相反,产生的电感就互相抵消,故又称无感绕法。这 种双绕法也有利于引线的引出。
温度控制器的设计与制作

温度控制器的设计与制作一、功能要求设计并制作一个温度控制器,用于自动接通或断开室内的电加热设备,从而使室内温度达到设定温度要求,并能实时显示室内温度。
当室内温度大于等于设定温度时,控制器断开电加热设备;当室内温度比设定温度小2时,控制器接通电加热设备。
控温范围:0~51控温精度:≤1二、硬件系统设计1.硬件系统由七部分组成,即单片机及看门狗电路、温度检测电路、控制输出电路、键盘电路、显示电路、设置温度储存电路及电源电路。
(1)单片机及看门狗电路根据设计所需的单片机的内部资源(程序存储器的容量、数据存储器的容量及I/O口数量),选择AT89C51-24PC较合适。
为了防止程序跑飞,导致温度失控,进而引起可怕的后果,本设计加入了硬件看门狗电路IMP813L,如果它的WDI脚不处于浮空状态,在1.6秒内WDI不被触发(即没有检测到上什沿或下降沿),就说明程序已经跑飞,看门狗输出端WDO将输出低电平到手动复位端,使复位输出端RST发出复位信号,使单片机可靠复位,即程序重新开始执行。
(注:如果选用AT89S51,由于其内部已具有看门狗电路,就不需外加IMP813L)(2)温度检测电路温度传感器采用AD590,它实际上是一个与绝对温度成正比的电流源,它的工作电压为4~30V,感测的温度范围为-550C~+1500C,具有良好的线性输出,其输出电流与温度成正比,即1μA/K。
因此在00C时的输出电流为273.2μA,在1000C时输出电流为373.2μA。
温度传感器将温度的变化转变为电流信号,通过电阻后转变电压信号,经过运算放大器JRC4558运算处理,处理后得到的模拟电压信号传输给A/D转换部分。
A/D转换器选用ADC0804,它是用CMOS集成工艺制成的逐次逼近型模数转换芯片,分辨率8位,转换时间100μs,基准电压0~5V,输入模拟电压0~5V。
(3)控制输出电路控制信号由单片机的P1.4引脚输出,经过光耦TLP521-1隔离后,经三极管C8550直接驱动继电器WJ108-1C-05VDC,如果所接的电加热设备的功率≤2KW,则可利用继电器的常开触点直接控制加热设备,如果加热设备的功率>2KW,可以继电器控制接触器,由接触器直接控制加热设备。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
自制可调温度控制器(附原理图和源程序)2008年06月18日星期三15:05自制可调温度控制器作者:温正伟原载:无线电杂志近期我发现很多DIY或是电子爱好的朋友们比较关注电子温度控制器制作的文章,前面我也发过一篇AT89C2051控制的简单温度计制作的文章,但是由于电路比较简易,而且没有调温功能.应部分朋友的要求我在此转载一篇温正伟在无线电杂志上发表过的一款可以方便调节、设定温度的控制器。
1.功能介绍笔者设计的这一款温度控制器是使用仍是比较常用的DS18B20集成温度传感器,还是用七段数码管做显示,完成温度采集与处理控制的CPU仍是AT89C2051单片机,但该电路具有电路简单,制作起来也无需调试,安装好后就可以使用等方便DIY的优点。
该电路最大的特点是用可以直观方便的调节所要限定的温度值,温度值是用3个7段共阳极数码管显示的,上电后会显示当前的温度值,按设定键时会闪烁显示设定温度值,这时可以按上/下调节键调整设定温度值,再次按下设定键时返回当前温度显示同时会对设定温度值进行保存,这个设定值会保存在DS18B20中,掉电后也不会丢失,下次上电时,单片机会自动读入上次的温度设定值。
长按设定键为关闭显示和温控,再次按下时功能再次打开。
电路中还设计了一路继电器控制,程序中设定超出设定温度时继电器被驱动吸合。
2.元器件背景及选用表一是元器件列表。
在这个电路中关键的两个元器件分别是单片机AT89C2051和温度传感传感芯片DS18B20。
AT89C2051具有2K的可多次擦写的FLASH存储器,有15个I/O口,用于做一些小型的控制显示和数据采集系统是很好的选择,本制作中2051单片机除要完成数据采集、处理、控制和显示的任务外,还要完按键值的采集、处理。
如果要用常规的数字加模拟电路实现起来就相对困难多了。
DS18B20是DALLAS半导体公司(现属MAXIM公司)设计生产的单总线数字温度传感器,单总线也就是说只用一根I/O引线完成数据的输入输出功能,所以它的体积很小,而且电压适用范围在3-5.5V,封装形式除有SO/uSO的8PIN贴片式,还有更方便的三极管形式的TO-92封装(封装形式和引脚说明请看图一)。
DS18B20测量温度范围为 -55°C~+125°C,其A/D转换的分辩率可用程序控制分别为9位、10位、11位和12位,最高分别率可以高达0.0625°C,但在-10~+85°C范围内其精度为±0.5°C,这个精度已可以满足普通型的环境温度控制或测温类消费电子产品的要求。
DS18B20中有三个8位E2RAM单元(非易失性可电擦写储存器),可以读写上下限警报温度值和一个自定义值,在本制作的中就只使用了上限温度值单元。
每个DS18B20出厂时都有一个唯一的序列编号,就是说在同一个单总线系统中可以控制多个DS18B20。
对DS18B20的单总线的操作方法这里因篇幅问题不可能一一说明,有兴趣的读者可以自己多查看些的DS18B20资料。
表1 元件清单图1:温度传感器封装形式及引脚说明3.电路原理制作中DS18B20使用外接电源的供电方式,数据端用4.7K电阻上拉,并联接到2051的11脚上。
晶振选用12M的,使用简单的上电复位电路。
选用共阳极的数码管,用S8550作位驱动,段引脚通过470欧的电限流电阻接入2051的P1口上,如选用的数码管亮度不足可以调小限流电阻值。
笔者也使用过共阴极的数码管,在P1口用1K电阻上拉提供电流,亮度不高,但可以节省三个位驱动IO 脚,电路更是简单。
电路中有三个按键,分别是显示开关/温度设定,温度上调,温度下调,在电路上电运行时程序初始是处于关闭状态的,要按一下S2电路开始显示和监测,如再按一下S2进入温度设定状态,设定值每秒闪烁一次,这时可以按S1或S3进行调节,再按下S2时退回显示当前温度状态并保存温度值到DS18B20。
使用2051的第9脚做控制输出端,低电平有效,笔者用它通过9012去驱动一个5V的继电器。
笔者把这个电路安装到电脑前面板上,继电器触头端接机箱的散热风扇,设定一个温度值如28度,当机箱内的温度超出28度时,控制端为低电平,继电器闭合,风扇启动进行散热。
图三就是装在电脑面板上的实物照片。
图2:电原理图4.软件实现这个温度控制器制作的最大难点应该算是2051程序的编写和调试。
因在电路中有数字显示,按键设定,数据采集和继电器控制。
首先要考虑的是在电路中3个数码管的阴极是接在P1上的,也就是说要使用动态显示的编程方法,笔者在程序中使用了一个定时中断去处理显示,定时器的定时值为20毫秒,每间隔20毫秒程序但会执行定时中断显示所要显示的数字,同时在这个定时中断中还会去扫描按键,看是否有键被按下并对其结果进行处理。
在这20ms的时间里程序还会完成温度数据的采集和转换和对当前温度和设置温度的对比等等。
在编写采集DS18B20数据的函数时运用了DS18B20的单总线协议,在读写DS18B20时IO口的电平时序上应尽可能做到与资料上提供的数据相一致。
程序大部分使用模块化设计,读者朋友修改或使用它的函数编写自己温控程序,程序的最新版本可以访问笔者的个人网站。
图三实物图用实验板搭建的实物图源程序如下:/*-------------------------------温度控制器V1.51显示为三个共阳极LED温度传感器用单总线DS18B20CPU为2051,三个按键,分别为UP,DOWN,SET温度调节上限为125度,下限为-55度只能用于单只18B20本软件仅供学习与参考,引用时请注明版权-------------------------------*/#include <AT89X051.H>#include <intrins.h>#define Key_UP P3_0 //上调温度#define Key_DOWN P3_1 //下调温度#define Key_SET P1_7 //设定键(温度设定,长按开电源)#define RelayOutPort P3_5 //继电器输出#define LEDPort P1 //LED控制口#define LEDOneC P3_2 //LED DS1控制(百位)#define LEDTwoC P3_3 //LED DS2控制(十位)#define LEDThreeC P3_4 //LED DS3控制(个位)#define TMPort P3_7 //DS1820 DataPortunsigned char codeLEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF}; //0-9的LED笔划,0xFF为空,0xF7为负号static unsigned char bdata StateREG; //可位寻址的状态寄存器sbit DS1820ON = StateREG^0; //DS1820是否存在sbit SetTF = StateREG^1; //是否是在温度设置状态sbit KeySETDown = StateREG^2; //是否已按过SET键标识sbit PowTF = StateREG^3; //电源电源标识sbit KeyTF = StateREG^4; //键盘是否允许//sbit KeySETDowning = StateREG^5; //SET是否正在按下static unsigned char bdata TLV _at_ 0x0029; //温度变量高低位static unsigned char bdata THV _at_ 0x0028;static signed char TMV; //转换后的温度值static unsigned char KeyV,TempKeyV; //键值static signed char TMRomV _at_ 0x0027; //高温限制static signed char TMSetV _at_ 0x0026; //温度设定值static unsigned char KSDNum; //SET键连按时的采集次数static unsigned char IntNum,IntNum2,IntNum3; //中断发生次数,IntNum用于SET长按检测,IntNum2用于设定状态时LED闪烁static signed char LED_One,LED_Two,LED_Three; //LED的显示位 LED_One为十位,LED_Two为个位static unsigned char Sign; //负号标识void main(void){void InitDS1820(void); //定义函数void ROMDS1820(void);void TMVDS1820(void);void TMRDS1820(void);void TMWDS1820(void);void TMREDS1820(void);void TMERDS1820(void);void ReadDS1820(void);void WriteDS1820(void);void Delay_510(void);void Delay_110(void);void Delay_10ms(void);void Delay_4s(void);void V2ToV(void);StateREG = 0; //初始化变量SetTF = 1;PowTF = 1; //关电源THV = 0;TLV = 0;TMV = 0;KeyV = 0;TempKeyV = 0;KSDNum = 0;IntNum = 0;IntNum2 = 0;IntNum3 = 0;LED_One = 0;LED_Two = 0;InitDS1820(); //初始化ROMDS1820(); //跳过ROMTMERDS1820(); //E2PRAM中温度上限值调入RAMInitDS1820(); //初始化ROMDS1820(); //跳过ROMTMRDS1820(); //读出温度指令ReadDS1820(); //读出温度值和上限值TMSetV = TMRomV; //拷贝保存在DS18B20ROM里的上限值到TMSetVEA = 1; //允许CPU中断ET0 = 1; //定时器0中断打开TMOD = 0x1; //设定时器0为模式1,16位模式TH0=0xB1;TL0=0xDF; //设定时值为20000us(20ms)TR0 = 1; //开始定时while(1);}//定时器0中断外理中键扫描和显示void KeyAndDis_Time0(void) interrupt 1 using 2{TH0=0xB1;TL0=0xDF; //设定时值为20000us(20ms)LEDPort = 0xFF;if (!Key_UP)KeyV = 1;if (!Key_DOWN)KeyV = 2;if (!Key_SET)KeyV = 3;//KeySETDowning = 0; //清除if (KeyV != 0) //有键按下{Delay_10ms(); //延时防抖按下10ms再测if (!Key_UP)TempKeyV = 1;if (!Key_DOWN)TempKeyV = 2;if (!Key_SET)TempKeyV = 3;if (KeyV == TempKeyV) //两次值相等为确定接下了键{if (KeyV == 3) //按下SET键,如在SET状态就退出,否则进入{//KeySETDowning = 1; //表明SET正在按下PowTF = 0; //电源标识开if (!KeyTF)if (SetTF){SetTF = 0; //标识位标识退出设定InitDS1820(); //初始化ROMDS1820(); //跳过ROMTMWDS1820(); //写温度上限指令WriteDS1820(); //写温度上限到DS18B20ROMWriteDS1820(); //写温度上限到DS18B20ROMWriteDS1820(); //写温度上限到DS18B20ROMInitDS1820(); //初始化ROMDS1820(); //跳过ROMTMREDS1820(); //温度上限值COPY回E2PRAM}elseSetTF = 1;if (!KeySETDown) //没有第一次按下SET时,KeySETDown标识置1KeySETDown = 1;elseKSDNum = KSDNum + 1; //前一秒内有按过SET则开始计数}if (SetTF) //在SET状态下{if ((KeyV == 1) && (!KeyTF))TMSetV = TMSetV + 1; //上调温度if ((KeyV == 2) && (!KeyTF))TMSetV = TMSetV - 1; //下调温度if (TMSetV <= -55) //限制温度上下限TMSetV = -55;if (TMSetV >= 125)TMSetV = 125;}if ((!KeyTF) && (IntNum3 == 0)) KeyTF = 1; //当键盘处于可用时,锁定}if (KeySETDown) //在2秒内按下了SET则计中断发生次数用于长按SET时计时用IntNum = IntNum + 1;if (IntNum > 55) //中断发生了55次时(大约1.2秒)75为1.5秒左右 {IntNum = 0;KeySETDown = 0;if (KSDNum == 55) //如一直长按了SET1.2秒左右{RelayOutPort = 1; //关闭继电器输出PowTF = 1; //电源标识关LEDOneC = 0;LEDTwoC = 0;LEDThreeC = 0;LEDPort = 0xBF; //显示"--"Delay_4s(); //延时LEDOneC = 1;LEDTwoC = 1; //关显示LEDThreeC = 1;Delay_4s();IntNum = 0;IntNum2 = 0;IntNum3 = 0;}KSDNum = 0;}}KeyV = 0;TempKeyV = 0; //清空变量准备下次键扫描if (!PowTF){InitDS1820(); //初始化ROMDS1820(); //跳过ROMTMVDS1820(); //温度转换指令Delay_510();Delay_510(); //延时等待转换完成InitDS1820(); //初始化ROMDS1820(); //跳过ROMTMRDS1820(); //读出温度指令ReadDS1820(); //读出温度值V2ToV(); //转换显示值if (TMV > TMSetV) //根据采集到的温度值控制继电器{RelayOutPort = 0;}else{RelayOutPort = 1;}if (SetTF) IntNum2 = IntNum2 + 1; //用于闪烁计数if (IntNum2 > 50 ) IntNum2 = 0;if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按键连按if (IntNum3 > 25){IntNum3 = 0;KeyTF = 0;}if ((SetTF) && (IntNum2 < 25)) goto InitEnd; //计数在后半段时显示LEDPort = LED_One;LEDOneC = 0;Delay_510();LEDOneC = 1; //显示百位数LEDPort = LED_Two;LEDTwoC = 0;Delay_510();LEDTwoC = 1; //显示十位数LEDPort = LED_Three;LEDThreeC = 0;Delay_510();LEDThreeC = 1; //显示个位数}InitEnd:;}void V2ToV(void) //数值转换{TLV = TLV >> 4;THV = THV << 4; //读出的高低位数值移位TMV = TLV | THV; //合并高低位放入TM为实际温度值Sign = 0;if (SetTF || !Key_SET)Sign = TMSetV >> 7; //取符号elseSign = TMV >> 7;if (Sign){if (SetTF || !Key_SET){LED_One = (~(TMSetV-1)) / 100; //SET状态下显示设定值LED_Two = ((~(TMSetV-1)) - LED_One * 100)/10;LED_Three = (~(TMSetV-1)) - LED_One * 100 - LED_Two * 10;}else{LED_One = (~(TMV-1)) / 100; //转换百位值LED_Two = ((~(TMV-1)) - LED_One * 100)/10;LED_Three = (~(TMV-1)) - LED_One * 100 - LED_Two * 10;}}else{if (SetTF || !Key_SET){LED_One = (TMSetV) / 100; //SET状态下显示设定值LED_Two = (TMSetV - LED_One * 100)/10;LED_Three = TMSetV - LED_One * 100 - LED_Two * 10;}else{LED_One = (TMV) / 100; //转换百位值LED_Two = (TMV - LED_One * 100)/10;LED_Three = TMV - LED_One * 100 - LED_Two * 10;}}//转LED字段if (LED_One) //超过百时十位的处理LED_Two = LEDDis[LED_Two];else{if (LED_Two == 0)LED_Two = LEDDis[10];elseLED_Two = LEDDis[LED_Two];}if (Sign)LED_One = LEDDis[11];else{if (LED_One == 0)LED_One = LEDDis[10];elseLED_One = LEDDis[LED_One];}LED_Three = LEDDis[LED_Three];}void InitDS1820(void) //初始化DS1820{TMPort = 1; //拉高TMPort_nop_(); //保持一个周期TMPort = 0; //拉低TMPortDelay_510(); //延时 DS1820复位时间要500us的低电平TMPort = 1; //拉高TMPort_nop_(); //保持_nop_();_nop_();Delay_110(); //延时110us 等待DS1820回应if (!TMPort) //回应信号为低电平DS1820ON = 1;elseDS1820ON = 0;Delay_110(); //延时Delay_110();TMPort = 1; //拉高TMPort}void ROMDS1820(void) //跳过ROM匹配{#pragma asmMOV A,#0CCHMOV R2,#8CLR CWR1:CLR P3_7MOV R3,#6DJNZ R3,$RRC AMOV P3_7,CMOV R3,#23DJNZ R3,$SETB P3_7NOPDJNZ R2,WR1SETB P3_7#pragma endasm}void TMVDS1820(void) //温度转换指令{#pragma asmMOV A,#44HMOV R2,#8CLR CWR2:CLR P3_7MOV R3,#6DJNZ R3,$RRC AMOV P3_7,CMOV R3,#23DJNZ R3,$SETB P3_7NOPDJNZ R2,WR2SETB P3_7#pragma endasm}void TMRDS1820(void) //读出温度指令{#pragma asmMOV A,#0BEHMOV R2,#8CLR CWR3:CLR P3_7MOV R3,#6DJNZ R3,$RRC AMOV P3_7,CMOV R3,#23DJNZ R3,$SETB P3_7NOPDJNZ R2,WR3SETB P3_7#pragma endasm}void TMWDS1820(void) //写入温度限制指令{#pragma asmMOV A,#04EHMOV R2,#8CLR CWR13:CLR P3_7MOV R3,#6DJNZ R3,$RRC AMOV P3_7,CMOV R3,#23DJNZ R3,$SETB P3_7NOPDJNZ R2,WR13SETB P3_7#pragma endasm}void TMREDS1820(void) //COPY RAM to E2PRAM {#pragma asmMOV A,#48HMOV R2,#8CLR CWR33:CLR P3_7MOV R3,#6DJNZ R3,$RRC AMOV P3_7,CMOV R3,#23DJNZ R3,$SETB P3_7NOPDJNZ R2,WR33SETB P3_7#pragma endasm}void TMERDS1820(void) //COPY E2PRAM to RAM {#pragma asmMOV A,#0B8HMOV R2,#8CLR CWR43:CLR P3_7MOV R3,#6DJNZ R3,$RRC AMOV P3_7,CMOV R3,#23DJNZ R3,$SETB P3_7NOPDJNZ R2,WR43SETB P3_7#pragma endasm}void WriteDS1820(void) //写入温度限制值{#pragma asmMOV A,26H //发出4EH写ROM指令后连发两个字节分别为上下限MOV R2,#8CLR CWR23:CLR P3_7MOV R3,#6DJNZ R3,$RRC AMOV P3_7,CMOV R3,#23DJNZ R3,$SETB P3_7NOPDJNZ R2,WR23SETB P3_7#pragma endasm}void ReadDS1820(void) //读出温度值{#pragma asmMOV R4,#3 ; 将温度高位和低位,高温限制位从DS18B20中读出MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H),高温限制位存入27H(TMRomV) RE00:MOV R2,#8RE01:CLR CSETB P3_7NOPNOPCLR P3_7NOPNOPNOPSETB P3_7MOV R3,#09RE10:DJNZ R3,RE10MOV C,P3_7MOV R3,#23RE20:DJNZ R3,RE20RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00#pragma endasm}void Delay_510(void) //延时510微秒{#pragma asmMOV R0,#7DHMOV R1,#02HTSR1:DJNZ R0,TSR1MOV R0,#7DHDJNZ R1,TSR1#pragma endasm}void Delay_110(void) //延时110微秒{#pragma asmMOV R0,#19HMOV R1,#02HTSR2:DJNZ R0,TSR2MOV R0,#19HDJNZ R1,TSR2#pragma endasm}void Delay_10ms(void) //延时10ms {#pragma asmMOV R0,#19HMOV R1,#0C8HTSR3:DJNZ R0,TSR3MOV R0,#19HDJNZ R1,TSR3#pragma endasm}void Delay_4s(void) //延时4s {#pragma asmMOV R2,#28HTSR5:MOV R0,#0FAHMOV R1,#0C8HTSR4:DJNZ R0,TSR4MOV R0,#0FAHDJNZ R1,TSR4DJNZ R2,TSR5#pragma endasm}。