双路可编程温度控制系统产品使用手册【简要说明】一、尺寸:长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%RH16、可装入槽型板,并安装在DIN导轨上。【DS18B20基本知识】DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。1、DS18B20产品的特点(1)、只要求一个端口即可实现通信。(2)、在DS18B20中的每个器件上都有独一无二的序列号。(3)、实际应用中不需要外部任何元器件即可实现测温。(4)、测量温度范围在-55。C到+125。C之间。(5)、数字温度计的分辨率用户可以从9位到12位选择。(6)、内部有温度上、下限告警设置。2、DS18B20的引脚介绍TO-92封装的DS18B20的引脚排列见图1,其引脚功能描述见表1。(底视图)图1表1DS18B20详细引脚功能描述序号名称引脚功能描述1GND地信号2DQ数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。3VDD可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。3.DS18B20的使用方法由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。【标注说明】【功能描述】【原理图】【PCB图】【元件清单】元件清单【应用举例“恒温控制”】【设定某个温度值,当温度大于这个温度时继电器工作,小于这个设定值时停止。设定温度值具有掉电记忆功能。】#includereg52.h#includemath.h#includeINTRINS.H#defineucharunsignedchar#defineuintunsignedint//数码管显示段码codeunsignedcharduan[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xBF,0x7f};unsignedchardong[4]={0xFF,0xFF,0xFF,0xFF};//数码管显示缓冲区uchari=0;//数码管扫描动态索引uinttime2,time3;uchargai=0;ucharmode=1;//换页变量/********************掉电存储*********************************************/typedefunsignedcharINT8U;typedefunsignedintINT16U;sfrIAP_DATA=0xC2;sfrIAP_ADDRH=0xC3;sfrIAP_ADDRL=0xC4;sfrIAP_CMD=0xC5;sfrIAP_TRIG=0xC6;sfrIAP_CONTR=0xC7;#defineENABLE_ISP0x82//系统工作时钟20MHz时,对IAP_CONTR寄存器设置此值unionunion_temp16{INT16Uun_temp16;INT8Uun_temp8[2];}my_unTemp16;INT8UByte_Read(INT16Uadd);//读一字节,调用前需打开IAP功能voidByte_Program(INT16Uadd,INT8Uch);//字节编程,调用前需打开IAP功能voidSector_Erase(INT16Uadd);//擦除扇区voidIAP_Disable();//关闭IAP功能voidDelay();/******************************18b20*************************************************************/bitflag1s=0;//1s定时标志externbitStart18B20();//18b20初始化函数externbitGet18B20Temp(int*temp);//18b20温度读取函数/*******************************************************************************************/sbitwei1=P2^3;//数码管的位断开关sbitwei2=P2^4;sbitwei3=P2^5;sbitwei4=P2^6;bitd1=1;//换画面按键当前值bitd2=1;//计数加按键当前值bitd3=1;//计数减按键当前值sbits1=P2^0;//计数加sbits2=P2^1;//计数减sbits3=P2^2;//换画面按钮sbitout1=P1^2;//高温启动sbitout2=P1^3;//低温启动ucharT0RH=0;//T0重载值的高字节ucharT0RL=0;//T0重载值的低字节voidpeizhit0(uintms);//配置t0定时器voidkey();//按键扫描函数voidmain(){bitq1=1;bitq2=1;bitq3=1;/***********************18b20***************************************/intintT,decT;//温度值的整数和小数部分bitres;inttemp;//读取到的当前温度值Start18B20();/*启动DS18B20*//***********************开机读掉电存储内容******************************************************/time2=Byte_Read(0x03)*255+Byte_Read(0x02);//注意这是把高字节和低字节合在一起time3=Byte_Read(0x05)*255+Byte_Read(0x04);//读三的时间EA=1;//开总中断peizhit0(1);//配置T0定时1mswhile(1){/*********************第一个按键换页按键************************************/if(d3!=q3){q3=d3;if(d3==0){mode=mode+1;//功能设置,4个参数,4个周期为一个循环if(mode==4){mode=1;}}}/*******************************第二个按键按下***************************/if(d2!=q2){q2=d2;if(d2==0){if(mode==2){if(time20){time2--;}}elseif(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)//b{time2=(time2+1)%999;}elseif(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){dong[0]=duan[10];dong[1]=duan[intT/100%10];dong[2]=duan[intT/10%10];dong[3]=duan[intT%10];}/*************第二层显示**************************/if(mode==2){dong[0]=duan[11];dong[1]=duan[time2/100%10];dong[2]=duan[time2/10%10];dong[3]=duan[time2%10];}/*************第三层显示**************************/if(mode==3){dong[0]=duan[12];dong[1]=duan[time3/100%10];dong[2]=duan[time3/10%10];dong[3]=duan[time3%10];}/*****************************温控部分**************************************************/if(flag1s)//每秒更新一次温度{flag1s=0;gai++;Start18B20();/*注意一定要随着温度读取函数一起每秒更新启动一次不然就只能读取到刚上电那一瞬间的温度启动DS18B20*/res=Get18B20Temp(&temp);//读取当前温度intT=temp*104;//注意在这个地方temp*10就是精确1位小数点,*100就是精确两位小数点但是只能精确一位小数点分离出温度值整数部分decT=temp&0xF;//分离出温度值小数部分if((intT=time2)&&(intT=time3))//注意控制部分要放到这个函数内不然上电就会先比较会有动作放在这里就可以先读取再比较稳定{out2=1;out1=1;}if(intT=time2){out2=1;//out1=0;if(gai=3){gai=0;out1=~out1;}}if(intT=time3){out1=1;//out2=0;if(gai=3){gai=0;out2=~out2;}}}/************************************************************************/}}/*配置并启动T0,ms-T0定时时间*/voidpeizhit0(uintms){unsignedlongtmp;/