双路可编程温度控制系统产品使用手册.doc_第1页
双路可编程温度控制系统产品使用手册.doc_第2页
双路可编程温度控制系统产品使用手册.doc_第3页
双路可编程温度控制系统产品使用手册.doc_第4页
双路可编程温度控制系统产品使用手册.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

双路可编程温度控制系统产品使用手册【简要说明】1、 尺寸:长72mmX宽99mmX高20mm二、主要芯片:单片机、DS18B20、数码管三、工作电压:输入电压小于12V,另有24V 可选。功耗小于2W四、特点:1、具有输出电压指示灯。2、输出具有指示灯。 3、采用螺旋压接端子。4、强大的滤波电路。5、具有四位数码管显示,可以显示小数点。 6、具有系统复位功能7、具有完善的保护电路:电流限制、热关断电路、电源防接反功能、续流保护、光耦隔离等8、可接两个DS18B20传感器9、两路继电器独立工作控制 10、可以自由编程,提供参考程序11、继电器所有触点全部输出 12、三个输入控制按键,通过程序也可以自由设定13、工作稳定可靠。 14、工作温度范围-40+70 15、工作湿度 40% 80%RH 16、可装入槽型板,并安装在DIN导轨上。【DS18B20基本知识】DS18B20数字温度计是DALLAS公司生产的1Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。 1、DS18B20产品的特点 (1)、只要求一个端口即可实现通信。 (2)、在DS18B20中的每个器件上都有独一无二的序列号。 (3)、实际应用中不需要外部任何元器件即可实现测温。 (4)、测量温度范围在55。C到125。C之间。 (5)、数字温度计的分辨率用户可以从9位到12位选择。 (6)、内部有温度上、下限告警设置。 2、DS18B20的引脚介绍 TO92封装的DS18B20的引脚排列见图1,其引脚功能描述见表1。 (底视图)图1 表1DS18B20详细引脚功能描述 序号名称引脚功能描述1GND地信号2DQ数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。3VDD可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。3 DS18B20的使用方法 由于DS18B20采用的是1Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。 由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。 【标注说明】【功能描述】【原理图】【PCB图】【元件清单】元件清单【应用举例“恒温控制”】【设定某个温度值,当温度大于这个温度时继电器工作,小于这个设定值时停止。设定温度值具有掉电记忆功能。】#include#include#include INTRINS.H #define uchar unsigned char#define uint unsigned int/数码管显示段码 code unsigned char duan=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88, 0x83, 0xC6, 0xBF,0x7f; unsigned char dong4 = 0xFF, 0xFF, 0xFF, 0xFF;/数码管显示缓冲区uchar i = 0; /数码管扫描动态索引uint time2,time3;uchar gai = 0;uchar mode = 1; /换页变量/*掉电存储*/typedef unsigned char INT8U;typedef unsigned int INT16U;sfr IAP_DATA = 0xC2;sfr IAP_ADDRH = 0xC3;sfr IAP_ADDRL = 0xC4;sfr IAP_CMD = 0xC5;sfr IAP_TRIG = 0xC6;sfr IAP_CONTR = 0xC7;#define ENABLE_ISP 0x82 /系统工作时钟0)time2-;else if(mode =3)if(time30)time3-;EA = 0;Sector_Erase(0); /擦除0x01地址中的数据Byte_Program(0x02,time2); Byte_Program(0x03,time28); Byte_Program(0x04,time3); Byte_Program(0x05,time38); EA = 1; /*第二个按键按下*/ if(d1 != q1) q1 = d1;if(d1 = 0) if(mode =2) / btime2 = (time2+1)%999; else if(mode =3)time3 = (time3+1)%999;/c EA = 0;Sector_Erase(0); /擦除0x01地址中的数据Byte_Program(0x02,time2); Byte_Program(0x03,time28); Byte_Program(0x04,time3); Byte_Program(0x05,time38); EA = 1; /*第一层显示*/ if(mode = 1) dong0 = duan 10;dong1 = duan intT/100%10; dong2 = duan intT/10%10; dong3 = duan intT%10; /*第二层显示*/ if(mode = 2) dong0 = duan 11;dong1 = duan time2/100%10; dong2 = duan time2/10%10; dong3 = duan time2%10; /*第三层显示*/ if(mode = 3) dong0 = duan 12;dong1 = duan time3/100%10; dong2 = duan time3/10%10; dong3 = duan time3%10; /*温控部分*/ if (flag1s) /每秒更新一次温度 flag1s = 0; gai+; Start18B20(); /* 注意 一定要随着温度读取函数一起每秒更新启动一次 不然就只能读取到刚上电那一瞬间的温度 启动DS18B20*/ res = Get18B20Temp(&temp); /读取当前温度 intT = temp*10 4; / 注意在这个地方temp*10就是精确1位小数点,*100就是精确两位小数点 但是只能精确一位小数点 分离出温度值整数部分 decT = temp & 0xF; /分离出温度值小数部分 if(intT = time3) /注意 控制部分要放到 这个函数内 不然上电就会先比较 会有动作 放在这里就可以先读取再比较 稳定 out2 = 1;out1 = 1; if(intT = time2) out2 = 1;/out1 = 0;if(gai = 3)gai = 0;out1 = out1; if(intT = 3)gai = 0;out2 = out2; /*/* 配置并启动T0,ms-T0定时时间 */void peizhit0(uint ms) unsigned long tmp; /临时变量 tmp = 11059200 / 12; /定时器计数频率 注意 因为晶振是11.0592,,12个震荡周期才是一个机器周期,所以,计数器加一所用的频率就是11059200/12 tmp = (tmp * ms) / 1000; /计算所需的计数值 注意 上面的计数时间单位是秒,所以除以1000就转化为ms了 tmp = 65536 - tmp; /计算定时器重载值 tmp = tmp + 18; /补偿中断响应延时造成的误差 T0RH = (unsigned char)(tmp8); /定时器重载值拆分为高低字节注意 因为是char型所以这个数据如果不向左移动8位他就只能保存低位的8位数据,一个char型变量保存是从低8位先保存,保存完后如果有空间再保存高位,向右移动8位就是让它从高位开始保存,这个16位计数换成二进制是 1111 1000 1101 1110 T0RL = (unsigned char)tmp; /直接保存低字节数据 TMOD &= 0xF0; /清零T0的控制位 TMOD |= 0x01; /配置T0为模式1 TH0 = T0RH; /加载T0重载值 TL0 = T0RL; ET0 = 1; /使能T0中断 TR0 = 1; /启动T0/*按键扫描函数*/void key()static uchar saomiaozhi3 = 1,1,1;saomiaozhi0 = (saomiaozhi01) | s1;saomiaozhi1 = (saomiaozhi11) | s2;saomiaozhi2 = (saomiaozhi2= 1000) /定时1s tmr1s = 0; flag1s = 1; if(c = 2) c = 0; key(); /按键扫描函数P0 = 0xff;switch (i) case 0: wei1 = 0; wei2 = 1; wei3 = 1;wei4 = 1; i+; P0 = dong0; break; case 1: wei1 = 1; wei2 = 0; wei3 = 1;wei4 = 1; i+; P0 = dong1; break; case 2: wei1 = 1; wei2 = 1; wei3 = 0;wei4 = 1; i+; P0 = dong2; break; case 3: wei1 = 1; wei2 = 1; wei3 = 0;wei4 = 1; i+; P0 = 0x7f; break; case 4: wei1 = 1; wei2 = 1; wei3 = 1;wei4 = 0; i=0; P0 = dong3; break; default: break; /*掉电储存功能*/读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节INT8U Byte_Read(INT16U add) IAP_DATA = 0x00; IAP_CONTR = ENABLE_ISP; /打开IAP 功能, 设置Flash 操作等待时间 IAP_CMD = 0x01; /IAP/ISP/EEPROM 字节读命令 my_unTemp16.un_temp16 = add; IAP_ADDRH = my_unTemp16.un_temp80; /设置目标单元地址的高8 位地址 IAP_ADDRL = my_unTemp16.un_temp81; /设置目标单元地址的低8 位地址 /EA = 0; IAP_TRIG = 0x5A; /先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此 IAP_TRIG = 0xA5; /送完A5h 后,ISP/IAP 命令立即被触发起动 _nop_(); /EA = 1; IAP_Disable(); /关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态, /一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关 return (IAP_DATA);/字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据void Byte_Program(INT16U add, INT8U ch) IAP_CONTR = ENABLE_ISP; /打开 IAP 功能, 设置Flash 操作等待时间 IAP_CMD = 0x02; /IAP/ISP/EEPROM 字节编程命令 my_unTemp16.un_temp16 = add; IAP_ADDRH = my_unTemp16.un_temp80; /设置目标单元地址的高8 位地址 IAP_ADDRL = my_unTemp16.un_temp81; /设置目标单元地址的低8 位地址 IAP_DATA = ch; /要编程的数据先送进IAP_DATA 寄存器 /EA = 0; IAP_TRIG = 0x5A; /先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此 IAP_TRIG = 0xA5; /送完A5h 后,ISP/IAP 命令立即被触发起动 _nop_(); /EA = 1; IAP_Disable(); /关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态, /一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关/擦除扇区, 入口:DPTR = 扇区地址void Sector_Erase(INT16U add) IAP_CONTR = ENABLE_ISP; /打开IAP 功能, 设置Flash 操作等待时间 IAP_CMD = 0x03; /IAP/ISP/EEPROM 扇区擦除命令 my_unTemp16.un_temp16 = add; IAP_ADDRH = my_unTemp16.un_temp80; /设置目标单元地址的高8 位地址 IAP_ADDRL = my_unTemp16.un_temp81; /设置目标单元地址的低8 位地址 /EA = 0; IAP_TRIG = 0x5A; /先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此 IAP_TRIG = 0xA5; /送完A5h 后,ISP/IAP 命令立即被触发起动 _nop_(); /EA = 1; IAP_Disable(); /关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态, /一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关void IAP_Disable() /关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态, /一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关 IAP_CONTR = 0; /关闭IAP 功能 IAP_CMD = 0; /清命令寄存器,使命令寄存器无命令,此句可不用 IAP_TRIG = 0; /清命令触发寄存器,使命令触发寄存器无触发,此句可不用 IAP_ADDRH = 0; IAP_ADDRL = 0;void Delay() INT8U i; INT16U d=5000; while (d-) i=255; while (i-); 【应用举例“比较控制系统”】功能描述:板子;双路温控继电器,两个温控探头,上面的温控探头是A面显示的温度,下面的温控探头是B面显示的温度,操作过程; 下完程序先设定C,先按加温度键,然后再按减温键,断一下电再上电,这样是为了设定掉电存储板子功能; 当A的温度大于B的温度到设定值时,继电器A吸合,当再这个设定范围时,断开。有个问题,当B大于A时也会吸合。#include#include#include INTRINS.H #define uchar unsigned char#define uint unsigned int/数码管显示段码 code unsigned char duan=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88, 0x83, 0xC6, 0xBF,0x7f; unsigned char dong4 = 0xFF, 0xFF, 0xFF, 0xFF;/数码管显示缓冲区uchar i = 0; /数码管扫描动态索引uint time2,time3;uchar gai = 0;uchar mode = 1; /换页变量/*掉电存储*/typedef unsigned char INT8U;typedef unsigned int INT16U;sfr IAP_DATA = 0xC2;sfr IAP_ADDRH = 0xC3;sfr IAP_ADDRL = 0xC4;sfr IAP_CMD = 0xC5;sfr IAP_TRIG = 0xC6;sfr IAP_CONTR = 0xC7;#define ENABLE_ISP 0x82 /系统工作时钟0)time2-;else if(mode =3)if(time30)time3-;EA = 0;Sector_Erase(0); /擦除0x01地址中的数据Byte_Program(0x02,time2); Byte_Program(0x03,time28); Byte_Program(0x04,time3); Byte_Program(0x05,time38); EA = 1; /*第二个按键按下*/ if(d1 != q1) q1 = d1;if(d1 = 0) if(mode =2) / btime2 = (time2+1)%999; else if(mode =3)time3 = (time3+1)%999;/c EA = 0;Sector_Erase(0); /擦除0x01地址中的数据Byte_Program(0x02,time2); Byte_Program(0x03,time28); Byte_Program(0x04,time3); Byte_Program(0x05,time38); EA = 1; /*第一层显示*/ if(mode = 1) dong0 = duan 10;dong1 = duan intT/100%10; dong2 = duan intT/10%10; dong3 = duan intT%10; /*第二层显示*/ if(mode = 2) dong0 = duan 11;dong1 = duan intTT/100%10; dong2 = duan intTT/10%10; dong3 = duan intTT%10; /*第三层显示*/ if(mode = 3) dong0 = duan 12;dong1 = duan time3/100%10; dong2 = duan time3/10%10; dong3 = duan time3%10; /*温控部分*/ if (flag1s) /每秒更新一次温度 flag1s = 0; gai+; Start18B20(); / 注意 一定要随着温度读取函数一起每秒更新启动一次 不然就只能读取到刚上电那一瞬间的温度 启动DS18B20 res = Get18B20Temp(&temp); /读取当前温度 intT = temp*10 4; / 注意在这个地方temp*10就是精确1位小数点,*100就是精确两位小数点 但是只能精确一位小数点 分离出温度值整数部分 decT = temp & 0xF; /分离出温度值小数部分 /* if(intT = time3) /注意 控制部分要放到 这个函数内 不然上电就会先比较 会有动作 放在这里就可以先读取再比较 稳定 out2 = 1;out1 = 1; if(intT = time2) out2 = 1;/out1 = 0;if(gai = 3)gai = 0;out1 = out1; if(intT = 3)gai = 0;out2 = out2; */ if (flag1ss) /每秒更新一次温度 flag1ss = 0; Start18B200(); / 注意 一定要随着温度读取函数一起每秒更新启动一次 不然就只能读取到刚上电那一瞬间的温度 启动DS18B20 ress = Get18B20Tempp(&tempp); /读取当前温度 intTT = tempp*10 4; / 注意在这个地方temp*10就是精确1位小数点,*100就是精确两位小

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论