版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、自制可调温度控制器 (附原理图和源程序 自制可调温度控制器近期我发现很多 DIY 或是电子爱好的朋友们比较关注电子温度控制器制作的文章,前 面我也发过一篇 AT89C2051控制的简单温度计制作的文章 , 但是因为电路比较简易 ,而且没有调温功 能. 应部分朋友的要求我在此转载一篇温正伟在无线电杂志上发表过的一款可以方便调节、设定温度 的控制器。1 功能介绍 笔者设计的这一款温度控制器是使用仍是比较常用的 DS18B20集成温度传感器,还是用七段数 码管做显示,完成温度采集与处理控制的 CPU仍是 AT89C2051单片机,但该电路具有电路简单,制 作起来也无需调试,安装好后就可以使用等方便
2、DIY 的优点。该电路最大的特点是用可以直观方便的调节所要限定的温度值,温度值是用3个 7段共阳极数码管显示的,上电后会显示当前的温度值,按设定键时会闪烁显示设定温度值,这时可以按 上/ 下调节键调整设定温度值,再次按下设定键时返回当前温度显示同时会对设定温度值进行保存, 这个设定值会保存在 DS18B20中,掉电后也不会丢失,下次上电时,单片机会自动读入上次的温度 设定值。长按设定键为关闭显示和温控,再次按下时功能再次打开。电路中还设计了一路继电器控 制,程序中设定超出设定温度时继电器被驱动吸合。2 元器件背景及选用表一是元器件列表。在这个电路中关键的两个元器件分别是单片机AT89C2051
3、和温度传感传感芯片 DS18B20。AT89C2051具有 2K的可多次擦写的 FLASH存储器,有 15 个 I/O 口,用于做一些小型 的控制显示和数据采集系统是很好的选择,本制作中2051 单片机除要完成数据采集、处理、控制和显示的任务外,还要完按键值的采集、处理。如果要用常规的数字加模拟电路实现起来就相对困难 多了。 DS18B20是 DALLAS半导体公司 现属 MAXIM公司)设计生产的单总线数字温度传感器,单总 线也就是说只用一根 I/O 引线完成数据的输入输出功能,所以它的体积很小,而且电压适用范围在 35.5V,封装形式除有 SO/uSO的 8PIN贴片式,还有更方便的三极管
4、形式的 TO92 封装封装形式 和引脚说明请看图一)。 DS18B20测量温度范围为 - 55C+125C,其 A/D 转换的分辩率可用程序 控制分别为 9位、 10位、 11位和 12位,最高分别率可以高达 0.0625C,但在 - 10+85C范围内 其精度为 0.5 C,这个精度已可以满足普通型的环境温度控制或测温类消费电子产品的要求。 DS18B20中有三个 8 位 E2RAM单元 非易失性可电擦写储存器),可以读写上下限警报温度值和一个 自定义值,在本制作的中就只使用了上限温度值单元。每个DS18B20出厂时都有一个唯一的序列编号,就是说在同一个单总线系统中可以控制多个 DS18B2
5、0。对 DS18B20的单总线的操作方法这里因 篇幅问题不可能一一说明,有兴趣的读者可以自己多查看些的DS18B20资料。表 1 元件清单元件名 数 量 说 明AT89C20511AT89C4051 也可DS18B201温度传感器七段数码管3共阳极LM78051稳压三极管小按钮3100uF,10uF 电解电容各11 / 170.1uF瓷片电容130pF212M 晶振1也可以用 11.0592M90121也可用同类小功率三极管S85503同上8.2K,4.7K 电阻各1470 欧电阻7可以根据数码管的亮度选用或不用1K 电阻4继电器1驱动电压为 5V图 1 :温度传感器封装形式及引脚说明3 电路
6、原理制作中 DS18B20使用外接电源的供电方式,数据端用 4.7K 电阻上拉,并联接到 2051的 11 脚上。晶振选用 12M的,使用简单的上电复位电路。选用共阳极的数码管,用S8550作位驱动,段引脚通过 470欧的电限流电阻接入 2051的 P1口上,如选用的数码管亮度不足可以调小限流电阻值。 笔者也使用过共阴极的数码管,在 P1 口用 1K电阻上拉提供电流,亮度不高,但可以节省三个位驱 动 IO 脚,电路更是简单。电路中有三个按键,分别是显示开关 / 温度设定,温度上调,温度下调,/ 17在电路上电运行时程序初始是处于关闭状态的,要按一下 S2 电路开始显示和监测,如再按一下 S2
7、进入温度设定状态,设定值每秒闪烁一次,这时可以按S1 或 S3 进行调节,再按下 S2时退回显示当前温度状态并保存温度值到 DS18B20。使用 2051的第 9脚做控制输出端,低电平有效,笔者用它通 过 9012 去驱动一个 5V的继电器。笔者把这个电路安装到电脑前面板上,继电器触头端接机箱的散 热风扇,设定一个温度值如 28 度,当机箱内的温度超出 28度时,控制端为低电平,继电器闭合, 风扇启动进行散热。图三就是装在电脑面板上的实物照片。4 软件实现这个温度控制器制作的最大难点应该算是 2051 程序的编写和调试。因在电路中有 数字显示, 按键设定,数据采集和继电器控制。首先要考虑的是在
8、电路中 3 个数码管的阴极是接在 P1上的,也 就是说要使用动态显示的编程方法,笔者在程序中使用了一个定时中断去处理显示,定时器的定时 值为 20 毫秒,每间隔 20 毫秒程序但会执行定时中断显示所要显示的数字,同时在这个定时中断中 还会去扫描按键,看是否有键被按下并对其结果进行处理。在这20ms的时间里程序还会完成温度数据的采集和转换和对当前温度和设置温度的对比等等。在编写采集DS18B20数据的函数时运用了DS18B20的单总线协议,在读写 DS18B20时 IO 口的电平时序上应尽可能做到与资料上提供的数据相 一致。程序大部分使用模块化设计,读者朋友修改或使用它的函数编写自己温控程序,程
9、序的最新 版本可以访问笔者的个人网站。/ 17图三实物图用实验板搭建的实物图源程序如下 :/* 温度控制器 V1.51 显示为三个共阳极 LED 温度传感器用单总线 DS18B20CPU为 2051,三个按键,分别为 UP, DOW,NSET 温度调节上限为 125 度,下限为 -55 度 只能用于单只 18B20本软件仅供学习与参考,引用时请注明版权/ 17*/#include #include #define Key_UP #define Key_DOWN #define Key_SET #define RelayOutPort #define LEDPort #define LEDOne
10、C #define LEDTwoC #define LEDThreeC#define TMPortP3_0 / 上调温度P3_1P1_7P3_5 / 下调温度/ 设定键 温度设定,长按开电源) 继电器输出P1 /LED 控制口P3_2/LED DS1 控制 百位)P3_3/LED DS2 控制 十位)P3_4 /LED DS3 控制 void InitDS1820(void 。void ROMDS1820(void。void TMVDS1820(void 。 void TMRDS1820(void 。/ 17void TMWDS1820(void。 void TMREDS1820(void。v
11、oid 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
12、 = 0 。/ 初始化变量/ 关电源EA = 1 。ET0 = 1 。 TMOD = 0 x1。 TH0=0 xB1。TL0=0 xDF。TR0 = 1 。 while(1 。LED_One = 0。LED_Two = 0。InitDS1820( 。 / 初始化ROMDS1820。( / 跳过 ROMTMERDS1820(。 /E2PRAM 中温度上限值调入 RAMInitDS1820( 。 / 初始化ROMDS1820。( / 跳过 ROMTMRDS1820(。 / 读出温度指令ReadDS1820(。 / 读出温度值和上限值TMSetV = TMRom。V / 拷贝保存在 DS18B20R
13、O里M的上限值到 TMSetV/ 允许 CPU中断/ 定时器 0 中断打开/ 设定时器 0 为模式 1, 16位模式/ 设定时值为 20000us interrupt 1 using 2 TH0=0 xB1。TL0=0 xDF。/ 设定时值为 20000usLEDPort = 0 xFF 。if (!Key_UPKeyV = 1 。if (!Key_DOWNKeyV = 2 。if (!Key_SETKeyV = 3 。/KeySETDowning = 0 。 / 清除 if (KeyV != 0 / 有键按下Delay_10ms( 。 / 延时防抖 按下 10ms再测 if (!Key_UP
14、TempKeyV = 1 。 if (!Key_DOWNTempKeyV = 2 。 if (!Key_SETTempKeyV = 3 。 if (KeyV = TempKeyVif (KeyV = 3/KeySETDowning = 1/两次值相等为确定接下了键/ 按下 SET键,如在 SET状态就退出,否则进入PowTF = 0 if (!KeyTFif (SetTF表明 SET正在按下电源标识开/InitDS1820(ROMDS1820(。TMWDS1820(。WriteDS1820(WriteDS1820(WriteDS1820(InitDS1820(/SetTF = 0 / 初始化
15、跳过 ROM 写温度上限指令/ 写温度上限到 / 写温度上限到 / 写温度上限到/ 初始化 跳过 ROM/ 标识位标识退出设定DS18B20ROMDS18B20ROMDS18B20ROMROMDS1820(。 / TMREDS1820(。 / 温度上限值 COPY回 E2PRAM elseSetTF = 1/ 17if (!KeySETDown / 没有第一次按下 SET时, KeySETDown标识置 1 KeySETDown = 1。elseKSDNum = KSDNum + 。1 / if (SetTF / 在 SET状态下if (KeyV = 1 & (!KeyTFTMSetV = T
16、MSetV + 1 。if (KeyV = 2 & (!KeyTFTMSetV = TMSetV - 1 。 if (TMSetV TMSetV = -55 。前一秒内有按过 SET则开始计数/ 上调温度/ 下调温度/ 限制温度上下限if (TMSetV = 125 TMSetV = 125 。if (!KeyTF & (IntNum3 = 0 KeyTF = 1。 / 当键盘处于可用时,锁定if (KeySETDown / 在 2 秒内按下了 SET则计中断发生次数用于长按 SET时计时用IntNum = IntNum + 1 。if (IntNum 55/ 中断发生了 55次时RelayO
17、utPort = 1 PowTF = 1 。 LEDOneC = 0。 LEDTwoC = 0。 LEDThreeC = 0 。 LEDPort = 0 xBF Delay_4s( 。 LEDOneC = 1。 LEDTwoC = 1。 LEDThreeC = 1 。 Delay_4s( 。IntNum = 0 。IntNum2 = 0 。IntNum3 = 0 。KSDNum = 0。/ 如一直长按了 SET1.2 秒左右/ 关闭继电器输出/ 电源标识关/ 显示 -/ 延时/ 关显示/ 17KeyV = 0 。TempKeyV = 0。/ 清空变量准备下次键扫描if (!PowTFInitD
18、S1820( 。 / 初始化ROMDS1820(。 / 跳过 ROMTMVDS1820(。 / 温度转换指令Delay_510( 。Delay_510( 。 / 延时等待转换完成InitDS1820( 。 / 初始化ROMDS1820(。 / 跳过 ROMTMRDS1820(。 / 读出温度指令ReadDS1820(。 / 读出温度值V2ToV( 。/ 转换显示值if (TMV TMSetV/ 根据采集到的温度值控制继电器RelayOutPort = 0 。elseRelayOutPort = 1 。if (SetTF IntNum2 = IntNum2 + 1。 / 用于闪烁计数if (In
19、tNum2 50 IntNum2 = 0。if (KeyTF IntNum3 = IntNum3 + 1。 / 用于防止按键连按if (IntNum3 25IntNum3 = 0 。KeyTF = 0 。if (SetTF & (IntNum2 goto InitEnd。 / 计数在后半段时显示LEDPort = LED_One 。LEDOneC = 0。Delay_510( 。LEDOneC = 1。/ 显示百位数LEDPort = LED_Two 。LEDTwoC = 0。/ 17Delay_510( 。LEDTwoC = 1。/ 显示十位数LEDPort = LED_Three 。LED
20、ThreeC = 0 。Delay_510( 。LEDThreeC = 1 。/ 显示个位数InitEnd: 。void V2ToV(void / 数值转换TLV = TLV 4 。THV = THV Sign = TMSetV 7 。/ 取符号elseSign = TMV 7 。if (Signif (SetTF | !Key_SETLED_One = (TMSetV-1 / 100 。 /SET 状态下显示设定值 LED_Two = (TMSetV-1 - LED_One * 100/10 。LED_Three = (TMSetV-1 - LED_One * 100 - LED_Two *
21、 10 。 elseLED_One = (TMV-1 / 100 。/ 转换百位值LED_Two = (TMV-1 - LED_One * 100/10 。 LED_Three = (TMV-1 - LED_One * 100 - LED_Two * 10 。elseif (SetTF | !Key_SETLED_One = (TMSetV / 100 。/SET 状态下显示设定值LED_Two = (TMSetV - LED_One * 100/10 。LED_Three = TMSetV - LED_One * 100 - LED_Two * 10 。/ 17elseLED_One = (
22、TMV / 100 。/ 转换百位值LED_Two = (TMV - LED_One * 100/10 。LED_Three = TMV - LED_One * 100 - LED_Two * 10 。/ 转 LED字段if (LED_One / 超过百时十位的处理LED_Two = LEDDisLED_Two。elseif (LED_Two = 0LED_Two = LEDDis10 。elseLED_Two = LEDDisLED_Two。if (SignLED_One = LEDDis11 。elseif (LED_One = 0LED_One = LEDDis10 。elseLED_O
23、ne = LEDDisLED_One。LED_Three = LEDDisLED_Three 。void InitDS1820(void/ 初始化 DS1820TMPort = 1 。 nop(。TMPort = 0 。/ 拉高 TMPort/ 保持一个周期/ 拉低 TMPortDelay_510( 。TMPort = 1 。_nop_(。/延时 DS1820复位时间要 500us 的低电平/ 拉高 TMPort/ 保持_nop_(。_nop_(。Delay_110( 。 / 延时 110us 等待 DS1820回应 if (!TMPort / 回应信号为低电平DS1820ON = 1。els
24、e11 / 17DS1820ON = 0。Delay_110( 。 / 延时Delay_110( 。TMPort = 1 。 / 拉高 TMPortvoid 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 endasmvoid TMVDS1820(void / 温度转换指令#pragma asmMOV A,#44H
25、MOV R2,#8CLR CWR2:CLR P3_7MOV R3,#6DJNZ R3,$RRC AMOV P3_7,CMOV R3,#23DJNZ R3,$SETB P3_7NOPDJNZ R2,WR212 / 17SETB P3_7#pragma endasmvoid 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 e
26、ndasmvoid 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 endasm13 / 17void TMREDS1820(void#pragma asmMOV A,#48HMOV R2,#8CLR CWR33:CLR P3_7MOV R3,#6DJNZ R3,$RRC AMOV P3_7,CMOV R3,#2
27、3DJNZ R3,$SETB P3_7NOPDJNZ R2,WR33SETB P3_7#pragma endasmvoid TMERDS1820(void#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 endasmvoid WriteDS1820(void /COPY RAM to E2PRAM/COPY E2PRAM to RAM写入温度限制值14 / 17#pragma asmMOV A,26H / 发出 4EH写 ROM指令后连发两个字节分别为上下限MOV R2,#8CLR CWR23:CLR P3_7MOV R3,#6DJNZ R3,$RRC AMOV P3_7,CMOV R3,#2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国铁路青藏集团招聘考试试卷真题
- 2025年福建高校毕业生服务社区计划招募考试试卷真题
- 2026年小学六年级英语第二学期期末考试卷及答案(二十)
- 中间代码优化2
- 婚恋情感心理障碍疏导干预
- 营业部经理如何平衡评估中的公平性和公正性
- 《铁路桥梁施工与维护(第2版)》课件 项目10 铁路顶进桥涵施工
- 译林版英语四年级下册第8单元作业单(一)
- (2026年)学年第一学期市场营销学期末试卷A答案
- (新)医疗价格调整制度2篇
- 物业水电工应知应会培训
- 药品儿童用药管理制度
- 白细胞瘀滞症诊疗研究进展
- 恙虫病临床诊疗专家共识指南
- 水利安全风险防控“六项机制”与安全生产培训
- 25年小升初作文押题+范文
- TCPQSXF006-2023消防水带产品维护更换及售后服务
- 教科版小学四年级科学下册复习教案
- 健康体重管理指导课件
- 杭州市住宅品质提升设计导则(试行)2025
- 黑龙江省大庆市祥阁学校2024-2025学年五年级上学期期末语文试题
评论
0/150
提交评论