双路可编程温度控制系统产品使用手册.docx

上传人:b****0 文档编号:18091343 上传时间:2023-08-13 格式:DOCX 页数:44 大小:2.18MB
下载 相关 举报
双路可编程温度控制系统产品使用手册.docx_第1页
第1页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第2页
第2页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第3页
第3页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第4页
第4页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第5页
第5页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第6页
第6页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第7页
第7页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第8页
第8页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第9页
第9页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第10页
第10页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第11页
第11页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第12页
第12页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第13页
第13页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第14页
第14页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第15页
第15页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第16页
第16页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第17页
第17页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第18页
第18页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第19页
第19页 / 共44页
双路可编程温度控制系统产品使用手册.docx_第20页
第20页 / 共44页
亲,该文档总共44页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

双路可编程温度控制系统产品使用手册.docx

《双路可编程温度控制系统产品使用手册.docx》由会员分享,可在线阅读,更多相关《双路可编程温度控制系统产品使用手册.docx(44页珍藏版)》请在冰点文库上搜索。

双路可编程温度控制系统产品使用手册.docx

双路可编程温度控制系统产品使用手册

双路可编程温度控制系统产品使用手册

【简要说明】

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公司生产的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

 

表1 DS18B20详细引脚功能描述

序号

名称

引脚功能描述

1

GND

地信号

2

DQ

数据输入/输出引脚。

开漏单总线接口引脚。

当被用着在寄生电源下,也可以向器件提供电源。

3

VDD

可选择的VDD引脚。

当工作于寄生电源时,此引脚必须接地。

3.DS18B20的使用方法

由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。

由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。

DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。

该协议定义了几种信号的时序:

初始化时序、读时序、写时序。

所有时序都是将主机作为主设备,单总线器件作为从设备。

而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。

数据和命令的传输都是低位在先。

 

【标注说明】

【功能描述】

【原理图】

【PCB图】

【元件清单】

 

元件清单

【应用举例“恒温控制”】

【设定某个温度值,当温度大于这个温度时继电器工作,小于这个设定值时停止。

设定温度值具有掉电记忆功能。

#include

#include

#include"INTRINS.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定时1ms

while

(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(time2>0)

{

time2--;

}

}

elseif(mode==3)

{

if(time3>0)

{

time3--;

}

}

EA=0;

Sector_Erase(0);//擦除0x01地址中的数据

Byte_Program(0x02,time2);

Byte_Program(0x03,time2>>8);

Byte_Program(0x04,time3);

Byte_Program(0x05,time3>>8);

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,time2>>8);

Byte_Program(0x04,time3);

Byte_Program(0x05,time3>>8);

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*10>>4;//注意在这个地方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;//临时变量

tmp=11059200/12;//定时器计数频率注意因为晶振是11.0592,,12个震荡周期才是一个机器周期,所以,计数器加一所用的频率就是11059200/12

tmp=(tmp*ms)/1000;//计算所需的计数值注意上面的计数时间单位是秒,所以除以1000就转化为ms了

tmp=65536-tmp;//计算定时器重载值

tmp=tmp+18;//补偿中断响应延时造成的误差

T0RH=(unsignedchar)(tmp>>8);//定时器重载值拆分为高低字节注意因为是char型所以这个数据如果不向左移动8位他就只能保存低位的8位数据,一个char型变量保存是从低8位先保存,保存完后如果有空间再保存高位,向右移动8位就是让它从高位开始保存,这个16位计数换成二进制是1111100011011110

T0RL=(unsignedchar)tmp;//直接保存低字节数据

TMOD&=0xF0;//清零T0的控制位

TMOD|=0x01;//配置T0为模式1

TH0=T0RH;//加载T0重载值

TL0=T0RL;

ET0=1;//使能T0中断

TR0=1;//启动T0

}

/*按键扫描函数*/

voidkey()

{

staticucharsaomiaozhi[3]={1,1,1};

saomiaozhi[0]=(saomiaozhi[0]<<1)|s1;

saomiaozhi[1]=(saomiaozhi[1]<<1)|s2;

saomiaozhi[2]=(saomiaozhi[2]<<1)|s3;

if(saomiaozhi[0]==0x00)

{

d1=0;

}

if(saomiaozhi[0]==0xff)

{

d1=1;

}

if(saomiaozhi[1]==0x00)

{

d2=0;

}

if(saomiaozhi[1]==0xff)

{

d2=1;

}

if(saomiaozhi[2]==0x00)

{

d3=0;

}

if(saomiaozhi[2]==0xff)

{

d3=1;

}

}

/*T0中断服务函数,完成数码管、按键扫描与秒表计数*/

voidt0()interrupt1

{

staticucharc=0;

staticunsignedinttmr1s=0;

TH0=T0RH;//重新加载重载值

TL0=T0RL;

c++;

tmr1s++;

if(tmr1s>=1000)//定时1s

{

tmr1s=0;

flag1s=1;

}

if(c>=2)

{c=0;

key();//按键扫描函数

}

P0=0xff;

switch(i)

{

case0:

wei1=0;wei2=1;wei3=1;wei4=1;i++;P0=dong[0];break;

case1:

wei1=1;wei2=0;wei3=1;wei4=1;i++;P0=dong[1];break;

case2:

wei1=1;wei2=1;wei3=0;wei4=1;i++;P0=dong[2];break;

case3:

wei1=1;wei2=1;wei3=0;wei4=1;i++;P0=0x7f;break;

case4:

wei1=1;wei2=1;wei3=1;wei4=0;i=0;P0=dong[3];break;

default:

break;

}

}

/******************************掉电储存功能********************************************************/

//读一字节,调用前需打开IAP功能,入口:

DPTR=字节地址,返回:

A=读出字节

INT8UByte_Read(INT16Uadd)

{

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_temp8[0];//设置目标单元地址的高8位地址

IAP_ADDRL=my_unTemp16.un_temp8[1];//设置目标单元地址的低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=须编程字节的数据

voidByte_Program(INT16Uadd,INT8Uch)

{

IAP_CONTR=ENABLE_ISP;//打开IAP功能,设置Flash操作等待时间

IAP_CMD=0x02;//IAP/ISP/EEPROM字节编程命令

my_unTemp16.un_temp16=add;

IAP_ADDRH=my_unTemp16.un_temp8[0];//设置目标单元地址的高8位地址

IAP_ADDRL=my_unTemp16.un_temp8[1];//设置目标单元地址的低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=扇区地址

voidSector_Erase(INT16Uadd)

{

IAP_CONTR=ENABLE_ISP;//打开IAP功能,设置Flash操作等待时间

IAP_CMD=0x03;//IAP/ISP/EEPROM扇区擦除命令

my_unTemp16.un_temp16=add;

IAP_ADDRH=my_unTemp16.un_temp8[0];//设置目标单元地址的高8位地址

IAP_ADDRL=my_un

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2