基于ds18b20的温度控制器内容摘要:
定位一只特定的 DS18B20 只有和 64 位 ROM 序列完全匹配的 DS18B20 才能响应随后的存储器操作命令。 所有和 64 位 ROM 序列埠匹配的从机都将等待复位脉冲。 这条命令在总线上有单个或多个器件时都可以使用。 桂林电子科技大学实训说明书用纸 8 本电 路采用 DS18B20 的 12 位分辨率,即温度时间为 750ms。 而 DS18B20 每次,每一步的工作都是从它的复位开始,并且 DS18B20 只有一根 I/O 线,因此它工作必须严格遵守总线协议,严格遵守时序,此时单片机复位脉冲给 DQ,此过程至少经过 480us,最后DQ会回复一个信号到 上,当信号是 0的时候表明初始化成功,反之,则初始化没成功。 当复位成功之后就表明 DS18B20 已经做好了测温的准备。 接着单片机必须发出SKIP ROM( CCH)命令来访问总线上 DS18B20,并且每次也必须先发出此命令单片机才能控制它 进行温度转换并把温度写进 DS18B20,接着才可以读取温度值到单片机上。 其中DS18B20 测温流程如图 23 所示。 温度值在 DS18B20 内是个 2个字节的数据,因此每次读温度,和写温度则必须进行两次,并且先得到的数是存在低 8 位的,后得到的数据是后 8 位。 初始化 DS18B20 → ROM 匹配 → 温度变换 → 延时 ↓ 跳过 ROM 匹配 ← 读暂存器 ← 转换成显示码 ← 数 码管显示 图 23 测温流程图 测出的温度值是个以 16 位二进制形式来表示的数,其中高 5 位是符号位,当为 1的时候表示温度是负的;反之,为正值。 而当单片机发出读命令的时候也就是把这 16位数据读到单片机内,接着把这个数(正数)乘以 就可以转换成实际的温度值,而当温度为负的时候则必须把这个数取反再加 1 接着再乘以 才可以转换成实际的温度值。 通过程序把这个数分成整数和小数部分进行处理显示,接着通过除整和取余来分别来显示各位上的数。 在最左边的那个数码管是显示符号的。 具体程序如下: ds18b20_init()。 write_byte(0xcc)。 write_byte(0x44)。 //启动温度转换 delay(700)。 match_rom(ds18b20_romA)。 //匹配第一路 write_byte(0xbe)。 //读温度 match_rom(ds18b20_romB)。 //匹配第二路 write_byte(0xbe)。 //读温度 键盘扫描设置温度上下限 K1 和 K4 键用 来进行模式转换,按下 K1 键选择设置温度下限, K2 键选择设置温度桂林电子科技大学实训说明书用纸 9 上限, K2用来加, K3 用来减。 具体 程序如下: void keyscan() while(K4==0) { while(K1==0) { delay(60)。 { delay(60)。 while(K4==0)。 while(K1==0)。 flag=1。 } flag=0。 } while((K2==0)amp。 amp。 (flag==1)) while((K2==0)amp。 amp。 (flag==0)) { delay(60)。 { delay(60)。 while(K2==0)。 while(K2==0)。 TEM_min++。 } TEM_max++。 } while((K3==0)amp。 amp。 (flag==1)) while((K3==0)amp。 amp。 (flag==0)) { delay(60)。 { delay(60)。 while(K3==0)。 while(K3==0)。 TEM_min。 } TEM_max。 } } 报警电路 当测量温度值高于温度上限或低于温度下限,蜂鸣器报警。 程序如下: while(TEM_min=55) TEM_min=55。 while(TEM_min=TEM_max) TEM_min=TEM_max。 while(TEM_max=125) TEM_max=125。 if((TEM_mintemp4)|(TEM_maxtemp5)) { FMQ=0。 delay(30)。 } else FMQ=1。 关照检测 及继电器控制 电路 由于光照强度的不同,光敏电阻两端的电压值会 改变,光照越电压越小, 通过ADC0832 来检测光敏电阻两端的电压值 以此来 显示关照的强度。 当温度低于设置的温度上限 时,继电器接通,外界加热装置工作,当温度高于设置的温度上限时,继电器断开,外界加热装置停止工作,这样来实现恒温控制。 电路接法如图 24: 桂林电子科技大学实训说明书用纸 10 图 24 ADC0832 接法 具体程序如下 : uint Adc0832(unsigned char channel) ADCLK=0。 { _nop_()。 _nop_()。 uchar i=0。 ADDI=1。 //控制命令结束 ,接受数据 uchar j。 _nop_()。 _nop_()。 uint dat=0。 ADDI=0。 //channelamp。 0x01 uchar ndat=0。 _nop_()。 _nop_()。 ADCS=1。 ADCLK=0。 ADCLK=0。 //拉低 CLK 端 ,用于选择通道 if(channel==0)channel=2。 _nop_()。 _nop_()。 if(channel==1)channel=3。 ADCLK=1。 //拉高 CLK 端 ADDI=1。 ADDI=1。 //(channel1)amp。 0x1。 _nop_()。 _nop_()。 dat=0。 ADCS=0。 //拉低 CS 端 for(i=0。 i8。 i++) _nop_()。 _nop_()。 { dat|=ADDO。 //收数据 ADCLK=1。 //拉高 CLK 端 ADCLK=1。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 ADCLK=0。 ADCLK=0。 //形成一次时钟脉冲 //拉低 CLK 端 ,启动转换 _nop_()。 _nop_()。 _nop_()。 _nop_()。 dat=1。 if(i==7)dat|=ADDO。 } if(i7)ndat=1。 } for(i=0。 i8。 i++)//进行数据校验 ADCLK=0。 //拉低 CLK 端 { j=0。 ADDO=1。 //拉高数据端 ,回到初始状态 j=j|ADDO。 //收 数据 dat=8。 ADCLK=1。 dat|=ndat。 _nop_()。 _nop_()。 return(dat)。 //返回 ad值 桂林电子科技大学实训说明书用纸 11 ADCLK=0。 //形成一次时钟脉冲 } _nop_()。 _nop_()。 j=j7。 ndat=ndat|j。 3 电路板的制作与调试 布线及 PCB 图 31 PCB 图 按照原理图进行 电路的制作 与调试 进行电路板焊接时,注意 元器件的管脚 不要焊反。 焊接的时 候要注意不要把不相连的点挂接。 焊接的时候烙铁的温度不要太高,焊接的时间不要太长,以免焊盘脱落和在焊接的时候就把器件烧坏。 焊接完后好对电路图进行检测,看是否所有器件都是好的,位置都是正确的, 看是否有挂接和虚焊的。 在接电之前应该线测电源跟地是否短接,和检测电路是否有不该接的地方接到了一起。 用万用表检测是否有线断路。 接上电后应该检测各个器件的的电源跟地脚的电平是否正确。 接上电后要触摸芯片查看是否有发烫现象,若有则应立即关掉电源。 硬件没有问题后结合软件调试。 桂林电子科技大学实训说明书用纸 12 整机 调试 将 单片机 烧录好程序 , 接上电源,将两个 DS18B20 靠得很近,检查是否温度相差不大。 再将两个置于不同的环境中,检查温度值是否不同。 再检测按键和报警电路,按下按键,检测其是否和预期的变化一致,将温度上限设为低于(或温度下限高于) DS18B20读出的温度值,检测蜂鸣器是否会响。 当现场温度低于设置的温度下限时,检测单片机是否能驱动继电器工作从而实现恒温控制。 检测光照强度时,只需让现场的光照强度改变,检测读出的光照指数是否改变就可以了。 板的参数测试 表 31 参数测试 实际温度( V) 测量结果( V) 4 程序设计 程序流程图 (见附录 2) 具体程序(见附录 1) 程序设计 ( 1) LCD1602 的驱动程序:可根据其具体的资料,按照严格的时序来进行写数据和写命令。 ( 2)延时子程序:由于有按键抖动,要加入延时去除抖动。 该子程序主要一个 for循环来实现延时,通过软件测试,该子程序执行的时间约为 1us。 在写 LCD1602 及 DS18B0的时序时也需要延时子程序。 ( 3) DS18B20 初始化函数:所有与 DS18B20 的通信首先必须初始化。 根据初始化的时序要求,要先拉低总线,再加入延时以保持 DQ 为低至少 480us,随后使 DQ=1,拉高总线等待单片机应答信号。 ( 4)读函数:根据读时序,读函数首先使 DQ=0,拉低总线至少 1us,然后使 DQ=1释放总线,在总线上传送数据。 每次通过右移读一位数据,通过 for 循环实现 8 次右移,从而读出一个字节的数据。 所有读时序必须持续至少 60us,因此要加入延时以完成一次读时序。 桂林电子科技大学实训说明书用纸 13 ( 5)写函数:根据写时序,要将总线拉低( DQ=0)开始写时序,拉低总线 15us 内释放总线。 DS18B20 在单片机发出写时序后的 15us~60us 的时间窗口内采样总线。 通过实现 8 次循环的 for 语句及右移操作,实现写入一个字节的数据。 ( 6)主程序:主程序中首先设 调用初始化程序 , 发 MACTH ROM 命令, 读序号列号的操作发转换温度命令,再进行温度转换。 每次执行循环时都判断各个按键的状态,当有按键按下时,则执行相应的语句以实现按键控制功能。 在循环中,将读取出的温度高字节和低字节通过移位及逻辑与语句,将两个字节合并成一个 16 位数,该 16位数的前5位为符号位。 当温度大于 0 时,该 16位数乘上 即为实际温度值,当温度小于0时,该 16 位数取反加 1 再乘上 即得到实际温度值。 在死循环中将实际温度的整数部分和小数部分分开,并以 LCD1602 显示。 5 结论 本次实训是老师给任务同学自己选择项目。 我选择的是 基于 DS18B20 温度控制。 学完单片机的理论知识之后,我已经对系统的设计有了一定的信心。 本次实训 时间为三周,主要分三个内容:查询、设计电路图以及电路图的仿真;画原理图及 PCB 图;硬件的制作与调试。 第一步是电路的仿真, 实训第一周,选完题目后,我就开始着手查找资料, 因为之前有学过一点 LCD1602 的知识,这次想运用到实际中来,故在显示部分选择了液晶显示。 在弄懂了 LCD1602 和 DS18B20 及 ADC0832 的原理后,我开始做仿真,仿真过程中遇到了很多问题,关于 LCD1602 的驱动程序和 DS18B20 的时序问题和读写命令及 ADC0832 的时序和原理问题。 但 都一一解决了。 第二步是 PCB 的排版,这次的设计用到的芯片比较多, 可是在不线的过程中我学到了很多技巧,比如,在布局的时候要注意芯片的摆放位置,这样会给布线带来很大的方便。 而且要注意元件摆放的间距,避免由于空间太小元件摆 放不下。 第 三 步就是打印腐蚀电路板打孔和焊接了。 这步也是成功的关键,在印制电路板时要注意印制的质量,如果效果不好,要用油性笔把不清楚的或者断的线补上。 腐蚀的时间不能太短,太长也会导致断线。 在这步中,最重要的应该是焊接,有了前面的焊接基础,在这次焊接中我没有出现什么问题,还提高了自己的焊接技术了。 在一本次制作中,最主要的就是接下来的第五步了。 第 四 步是电路的调试。 在调试在本次调试过成中,我在前面学习的基础上,学会了更加灵活地用软件来调试硬件,把硬件调试好后用硬件来调试软件。 在 调试过程中, 我遇到了许多意想不到的 问题,可谓是花样百出,调试过程中发现原来仿真的的时序和实际中的时序得到的结果不一样,经过反复修改才正确读出了温度。 最让我苦恼的是实现扩展程序的 能在同一个 IO 中连接 2个或 2个以上的 D。基于ds18b20的温度控制器
相关推荐
引脚功能描述 1 GND 接地信号 2 DQ 数据输入 /输出引脚。 开漏单总线接口引脚。 当被用着在寄生电源下,也可以向器件提供电源。 3 VDD 可选择的 VDD 引脚。 当工作于寄生电源时,此引脚 必须接地。 DS18B20 的内部结构示意图如下图所示。 I/O C 64 位 ROM 和 单 线 高速缓存 存储器与控制逻辑 温度传感器 高温触发器 TH 低温触发器 TL 配置寄存器 10
if(!Reset) begin H_L_f3=1。 end else if(Count == Delay10ms) begin H_L_f3=Key_in。 end end always @(posedge Clk or negedge Reset ) begin if(!Reset) begin H_L_f4=1。 end else begin H_L_f4=H_L_f3。 end end
B 39。 539。 ,0AH,0DH,39。 $39。 DB 39。 639。 ,0AH,0DH,39。 $39。 16 DB 39。 739。 ,0AH,0DH,39。 $39。 DB 39。 839。 ,0AH,0DH,39。 $39。 DB 39。 939。 ,0AH,0DH,39。 $39。 DB 39。 1039。 ,0AH,0DH,39。 $39。 DB 39。 1139。
10 总体设计方框图 方框图所示为数字温度控制器的单体设计方框图。 其工作原理为:当该电路上电工作以后,首先刷新显示( LED),然后,温度传感器采集温度送单片机检查温度的高低,由单片机送出信号经过驱动电路送往显示电路。 软件设计 整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了。 从软件的功能不同可分为两大类:一是监控软件(主程序),
尽管如此, MAX038 作为一个多功能的高速器件 .仍具有广泛的用途。 随着应用面的扩大,价格也会逐渐下降。 DAC0832 简介 和使用说明 DAC0832 是 8 位分辨率 D/A 转换集成芯片,与处理器完全兼容,其价格低廉,接口简单,转换控制容易等优点,在单片机应用系统中得到了广泛的应用。 其中 DAC0832 芯片为电流输出方式的转换芯片。
信息也通过数据总线传送。 PA0~ PA7:端口 A 输入输出线,一个 8 位的数据输出锁存器 /缓冲器, 一个 8 位的数据输入锁存器。 PB0~ PB7:端口 B 输入输出线,一个 8 位的 I/O 锁存器, 一个 8 位的输入输出缓冲器。 PC0~ PC7:端口 C 输入输出线,一个 8 位的数据输出锁存器 /缓冲器, 一个 8 位的数据输入缓冲器。 端口 C 可以通过工作方式设定而分成