自制可调温度控制器
单片机可调温度控制器的设计

齐 齐 哈 尔 工 程 学 院 学 报 JOURNAL OF QIQIHAR INSTITUTE OF ENGINEERING
Vo1.1O No.1 Mar.2016
单 片 机 可 调 温 度 控 制 器 的 设 5,-t-
金 钢
(齐 齐哈 尔工程 学 院 信 息 工程 系,黑龙 江 齐 齐哈 尔 161005)
AT89S52是一种低 功耗 、高性能 CMOS8位 微控制器 ,具有 8K在系统可编程 Flash存储器 , 它具有以下标准功能 :8k字节 Flash,256字节 RAM,32位 I/O 口线 ,看门狗定时器 ,2个数据 指 针 ,三个 16位 定 时器 ,计 数器 ,一个 6向量 2 级 中断结 构 ,全 双工 串行 口 ,片 内晶振 及时钟 电 路 。DS18B20是世界上第一片支持 “一线总线” 接 口的温度传感器 ,即单总线器件 。发光二极管 LED是一种能够将 电能转化为可见光 的固态的 半导体器件 ,它可以直接把电转化为光 。
在 主程 序 中 ,当系统 上 电完成 定义 寄存 器 等 初始化操作后 ,首 先判断是否要调整 温度设 定 值 ,也就是判断四个按键是否有按下 ,若有按键 按 下 则修 改 对 应 的温 度 上 下 限值 ,执 行设 置 键 、 选择键 、上限加、上限减、下 限加、下限减的操 作 。之后主程序将调用子程序 ,读取转换结果 , 并将转换结果换算成摄 氏的温度值 。在这之后 , 程 序 将 比较采 集 的温度 值是 否高 于上 限设 定值 或 低于下限设定值 ,温度值若低于下限则启动暖风 机给温室加热 ,若高于上限值则停止暖风机的运 行 。最后主程序将调用显示子程序 ,将上限设定 值 、当前温度值和下限温度值刷新。再判断有无 按键按下 ,开始下一个循环周期的工作。
花了一个月时间给弱势群体DIY了温控器及保温箱~~~

花了一个月时间给弱势群体DIY了温控器及保温箱~~~本帖最后由碧湖山水于 2013-1-4 13:50 编辑忙里偷闲,用了一个月中午下班的时间给龟苗门整了个窝。
在公司弄的,自然材料都是就地取材了。
手动加工的东西太多只能列表说明了!1、选择整理箱:之所以采用整理箱加热,首先带电的东西一定要确保绝缘,其次轻便方便操作。
因为都是苗子比较容易腐皮必须喂食后换水,所以为了省事采用套缸加热法(漏电龟龟也不会被电死)。
为确保换水不影响整体的温度,整理箱要尽量多装水,但是大箱要占地盘。
因此做了点改进,买了大整理箱一个、中塑料盒一个、小塑料盒两个。
大的整理箱可以排着放两个小塑料盒,中塑料盒倒扣刚好可以放在整理箱内底部。
把中塑料盒打满孔(传热用),并在公司割了块尺寸小于中塑料盒的有机玻璃(安加热棒用,整理箱低部吸不了)。
组装是这样的,首先在大整理箱内底部放有机玻璃板,安上加热棒,盖上打满控的中塑料盒,在中塑料盒上面排好两个小塑料盒。
其次往两个小塑料盒放入老水(高度看龟苗而定)后再往大整理箱旁边注自来水,大整理箱的水位高度和小塑料和水面高度一样。
这样花费50大洋防漏电、方便换水的加热箱就做好了。
大整理箱的水还养了几条热带鱼呐。
2、选择加热棒及UVB灯:因为加热的水不是很多并且外部有保温,为了节省成本,所以就在网上买了个25W的不锈钢加热棒、25W-UVB灯、带夹子的灯座,总共花了110大洋。
结果回来的时候测试了几天发现加热棒误差太大了,调29度竟然加热到了33度,还好没放龟,现在只好调25了。
但是还是不放心,后面自己做了个温控器(下文介绍)。
3、制作保温箱:公司最近做烘房有剩余的泡沫板,拿来一块5CM厚的并用透明胶在两个表面贴一层膜(防泡沫掉落及刮伤),之后就用美工刀按尺寸割出6块板,并倒45度角再用透明胶粘好(留一块做盖子,盖子要盖得严所以边缘做了个台阶)。
最后要做的就是在箱的四周开透气方孔(大小和美工刀的刀宽一样)及盖子的UVB灯孔(留着割下的泡沫以备不开灯时堵上)。
室内温度控制器的制作方法

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

生活中的一些小创意,有时是来自于自己的一些小需求和探索欲。我有一个朋友想要自己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型负温度系数热敏电阻。
自制简易的水族箱温控器

自制简易的水族箱温控器水族箱温控器主要用于夏天水族箱散热风扇和电子制冷温控,控温的范围设计为23~29℃,实测温精度小于正负0.5℃,很适合DIY水族散热风扇和电子冷水机的朋友制作参考。
由于电路很简单,相信稍为有电子制作经验的朋友都能按图顺利制作。
温控驱动执行电路设计了两种供选择,分别是用N沟道功率MOSFET管和继电器,电路分别如上图和下图所示,可根据实际需要选择制作。
一、工作原理两款电路不同之处,仅在驱动执行电路部分,工作原理基本一样。
现以功率MOSFET管那款作原理介绍。
电路主要由温度传感器RT1、测温桥路、带滞后的电压比较器、工作指示及驱动电路等部分组成。
温度传感器RT1是一只密封在环氧树脂中的负温度系数热敏电阻(NTC)。
这类温度传感器品种及封装形式有很多种,常见的就是本电路采用的那种。
相对于铂电阻和集成温度传感器,NTC热敏电阻的主要缺点是线性度较差,但如果测量范围较小时仍然可以获得较好的精度,完全可以在水族控温领域有良好表现。
事实上现在市场上的水族电子控温器基本都是用NTC热敏电阻作温度探头。
负温度系数热敏电阻(NTC)的标称阻值是指在常温为250C时的电阻值。
测温电桥由温度传感器RT1与R6、VR1、R2、R7组成。
IC1是一块双运放LM358N,在这里只用了其中一运放,接成带滞后的电压比较器。
其同相输入端加有VR1调定的基准电压,调节VR1就可以在控温范围内设定不同的温度;反相输入端则加有R6与RT1的分压,由于RT1的阻值是随被测环境温度变化而改变的,因此ICIA反相端电位也随温度变化而改变。
MOSFET管Q1在ICIA输出电平(L≈0V,H≈10.5V)的控制下对负载散热风扇Fan起电源开关作用。
当水族箱水温高于VR1的调定温度值时,RT1阻值较小,R6和RT1分压后使ICIA反相输入端2脚的电位较低,此时ICIA的同相输入端3脚电位大于反相输入端电位,ICIA因而输出高电平,使MOSFET管Q1饱和导通,负载散热风扇Fan得电工作,对水族箱水降温,同时LED2点亮,显示负载Fan处于工作状态。
自制可调温度控制器.

自制可调温度控制器(附原理图和源程序)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封装(封装形式和引脚说明请看图一)。
用555制作的恒温控制器

用555制作的恒温控制器
这个恒温控制器在塑料大棚、小鸡的孵化等方面具有用途广泛,而且它还有精度较高、造价低廉、装调容易的特点。
工作原理
恒温控制器由热敏电阻Rt1、Rt2、5G1555时基电路、温域调整电阻R1、R2及控制执行机构所组成,电路如下图所示。
Rt1、R1为上限温度检测电阻,Rh、R2为下限温度检测电阻。
当温度升高而使⑥脚电位高于2/3Vcc时,③脚输出低电平,J释放。
当温度下降时,②脚电位低于1/3Vcc时,③脚成高电平,J吸合。
可控硅VSl、VS2导通与截止受触点J
控制,J吸合,VS导通。
J释放,VS中断,从而达到控制温度的目的。
当LEDl亮时,J释放,为恒温。
当LED2亮时,J吸合,开始加热。
元器件选择与制作
Rtl、Rt2均为负温度系数热敏电阻,型号不限。
R1、R2为微调电阻。
J可选用超小型的。
调整时,首先应调整上限温度,把Rtl置于所要求的上限温度的环境中(可用温度计监测),过—分钟后,调R1直到LEDl刚好发亮为止,要反复多调几次,可先将②脚与地短接一下,使③脚输出高平,即LED2亮,这样便于观察翻转状态。
然后调下限温度,过程同上,不过要调整R2使红色LED2亮,也要反复多调几次。
反复调整时应先将⑥脚与电源Vcc短接一下,以使③脚输出低电平,观察电路翻转状态。
电路要用小型稳压电源供电,以保证比较电位的准确。
该电路稍加修改,还能作为超温(如水开、火灾、锅炉),低温等温度报警器。
- 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}。