水温控制Word格式.docx
《水温控制Word格式.docx》由会员分享,可在线阅读,更多相关《水温控制Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
-10℃~+85℃范围内的测温准确度为±
0.5℃。
4.
通过编程可实现9~l2位的数字读数方式,可在至多750ms内将温度转换成12位的数字,测温分辨率可达0.0625℃。
5.
独特的单总线接口方式,与微处理器连接时仅需要一条线即可实现与微处理器双向通讯。
DS18B20的内部结构
DS18B20内部功能模块如图2所示,主要由4部分组成:
64位光刻R0M(图3)、温度传感器、非易失性的温度报警触发器TH和TL、配置寄存器。
R0M中的64位序列号是出厂前被光刻好的,他可以看作是该DSISB20的地址序列码,每个DSI8B20的64位序列号均不相同。
高低温报警触发器TH和TL,配置寄存器均由一个字节的E2PROM组成,使用一个存储器功能命令可对TH,TL或配置寄存器写入。
配置寄存器中R1,R0决定温度转换的精度位数:
R1R0=’00’,9位精度,最大转换时间为93.75ms;
R1R0=‘01’,10位精度,最大转换时间为187.5ms;
R1R0=‘10’,11位精度,最大转换时间为375ms;
R1R0=’11’,12位精度,最大转换时间为750ms;
未编程时默认为12位精度。
本系统采用的也是12位的精度。
DS18B20的内存结构
DSI8B20温度传感器的内部存储器包括一个高速暂存RAM(便笺式的内部存储器)和一个非易失性的可电擦除的EEPROM,后者存放高温和低温触发器TH,TL和结构寄存器。
便笺存储器包含了9个连续字节(0~8),前两个字节是测得的温度信息(图4),字节0的内容是温度的低8位,字节1是温度的高8位,字节2是TH(温度上限报警),字节3是TL(温度下限报警),字节4是配置寄存器(图5),用于确定输出分辨率9到12位。
第5、6、7个字节是预留寄存器,用于内部计算。
字节8是冗余检验字节,校验前面所有8个字节的CRC码,可用来保证通信正确。
DS18B20的测温功能
当DSI8B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的0,1字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0.0625℃/LSB形式表示。
温度值格式如图4所示,其中“S”为标志位,对应的温度计算:
当符号位S=0时,直接将二进制位转换为十进制;
当S=1时,先将补码变换为原码,再计算十进制值。
图4下面的表是对应的一部分温度值。
DSI8B20完成温度转换后,就把测得的温度值与TH做比较,若T>
TH或T<
TL,则将该器件内的告警标志置位,并对主机发出的告警搜索命令做出响应。
具体算法分析,会在后文中提到。
DSl820工作过程中的协议
初始化->
RoM操作命令->
存储器操作命令->
处理数据
1初始化
单总线上的所有处理均从初始化开始
2ROM操作品令
总线主机检测到DSl820的存在便可以发出ROM操作命令之一这些命令如
指令
代码
ReadROM(读ROM)
[33H]
MatchROM(匹配ROM)
[55H]
SkipROM(跳过ROM]
[CCH]
SearchROM(搜索ROM)
[F0H]
Alarmsearch(告警搜索)
[ECH]
3存储器操作命令
指令
代码
WriteScratchpad(写暂存存储器)
[4EH]
ReadScratchpad(读暂存存储器)
[BEH]
CopyScratchpad(复制暂存存储器)
[48H]
ConvertTemperature(温度变换)
[44H]
RecallEPROM(重新调出)
[B8H]
ReadPowersupply(读电源)
[B4H]
温度传感器与单片机通讯时序
2.温度转换算法及分析
由于DS18B20转换后的代码并不是实际的温度值,所以要进行计算转换。
温度高字节(MSByte)高5位是用来保存温度的正负(标志为S的bit11~bit15),高字节(MSByte)低3位和低字节来保存温度值(bit0~bit10)。
其中低字节(LSByte)的低4位来保存温度的小数位(bit0~bit3)。
由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取小数舍入,保留一位小数即可。
也就说,本系统的温度精确到了0.1度。
算法核心:
首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LSByte)取反加一变成原码。
处理过后把DS18B20的温度Copy到单片机的RAM中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位,百位的BCD码存入RAM中。
由于百位没有用,默认情况是置为0A,在显示屏上没有任何显示。
温度算法核心代码
DATA_DEAL:
MOV
A,TEMPERATURE_H;
TEMPERATURE_H存放的是DS18B20转换后的高8位的值(上图的MSByte)ANL
A,#80H
;
判温度是否零下
JZ
TEMPC1
A为0,说明是正数,跳往TEMPC1,如果是负数,则对低8为进行补码处理
CLR
C
A,TEMPERATURE_L
;
为负数,对低8位(上图的LSByte)求补
CPL
A
取反加1
ADD
A,#01H
TEMPERATURE_L,A
取补码后存回TEMPERATURE_L,此时TEMPERATURE_L里面的值就可以表示温度了
MOV
A,TEMPERATURE_H
A
ADDC
A,#00H
高位TEMPERATURE_H取反,加上从低位TEMPERATURE_L进来的位
TEMPERATURE_H,A
写回TEMPERATURE_H
TEMPERATURE_HC,#0BH
SJMP
TEMPC11
TEMPC1:
TEMPERATURE_HC,#0AH
TEMPC11:
A,TEMPERATURE_HC
SWAP
TEMPERATURE_HC,A
A,TEMPERATURE_L
ANL
A,#0FH
取A低4位(小数位,单位是0.0625),得出来的数要乘以0.0625,通过查表来算出值
DPTR,#TEMPDOTTAB
MOVC
A,@A+DPTR
查表
TEMPERATURE_LC,A
TEMPERATURE_LC的低四位保存小数部分BCD
DIS_BUF_X,A
小数位的BCD码送入显示buffer中
整数部分
A,#0F0H
得到个位单个数值
SWAP后就得到个位真正的个位
A,#0FH
ORL
TEMPERATURE_ZH,A
组合后的值存入TEMPERATURE_ZH
LCALL
HtoB
转换HEx值成为BCD码
TEMPERATURE_L目前存入的是十位和个位的BCD编码
A,#0F0H
A,TEMPERATURE_HC
TEMPERATURE_HC低4位存放十位数BCD
TEMPERATURE_LC高4位存放个位数BCD
A,TEMPERATURE_LC
TEMPERATURE_LC,A
A,R7
TEMPC12
R7,A
TEMPERATURE_HC高4位存放百位数BCD
TEMPC12:
RET
小数部分码表
TEMPDOTTAB:
DB
00H,01H,01H,02H,03H,03H,04H,04H,05H,06H,06H,07H,08H,08H,09H,09H
结果温度值的BCD码存放到TEMPERATURE_HC(百位和十位),TEMPERATURE_LC(个位和小数位)中
七.硬件设计说明
1.系统总体电路图
2.各个模块电路图
输入系统
1.
键盘模块
我们用的下面四个独立键盘中的三个,分别是:
K2,K3,K4。
温度测量模块
DS18B20通过P3.3口和AT89S52进行通讯。
输出系统
继电器模块
下图是一个蜂鸣器和一个继电器的图,我们只用到了继电器的图,继电器和单片机的P1.3口进行通讯。
显示模块
该显示模块的动态显示数码管,我们用到前面四个数码管,P0口是送字符的,P2口是用来位选数码管的。
芯片系统
本系统采用的是AT89S52芯片。
下面是它的引脚图。
八.软件设计说明
本系统采用的是循环查询方式,来显示和控制温度的。
1.总模块的流程图
2.各个模块的流程图
读取温度DS18B20模块的流程
键盘扫描处理流程
九.操作指引
按键功能
Enter
→
P1.5(k2)2.
Up
P1.6(k3)3.
Down
P1.7(k4)
显示温度
未插DS18B20时,数码管显示错误888.8.
插入DS18B20是,数码管显示当前温度XX.X
设定温度
1.按下Enter,数码管温度显示停止,显示的数字变的比以前亮。
2.这时可以按Up和Down来调节当前温度。
3.调节好后,按Enter退出。
这时数字变的又暗了,数码管继续显示当前温度
继电器随着设定的温度,依据情况跳变。
十.参考文献
[1].
单片机原理与应用技术.江力主编.清华大学出版社.2006
[2].
微型计算机接口技术.王兆月等编著.机械工业出版社.2006
[3].
数字电子技术.江晓安等编著.西安电子科技大学出版社.1993
[4].
ME300B说明书.伟纳电子编著.伟纳电子出版.2006
[5].
DS18B20官方英文文档.DS18B20官方英文站点下载.
程序源代码
TEMPERATURE_LDATA31H;
DS18B20低8位Buffer
TEMPERATURE_HDATA30H;
DS18B20高8位Buffer
TEMPERATURE_HCDATA32H;
计算后的百位和十位的BCD码存放BUFFER
TEMPERATURE_LCDATA33H;
计算后的个位和小数位的BCD码存放BUFFER
TEMPERATURE_ZHDATA34H;
计算后十位和个位HEX码的存放BUFFER
DIS_BUF_XDATA35H;
数码管小数位Buffer
DIS_BUF_GDATA36H;
数码管个位Buffer
DIS_BUF_SDATA37H;
数码管十位Buffer
DIS_BUF_BDATA38H;
数码管百位Buffer
KEY_BUF_GDATA39H;
键盘输入后,的个位值
KEY_BUF_SDATA49H;
键盘输入后,的十位值
KEY_BUF_BDATA41H;
键盘输入后,的百位值
K_UPEQUP1.5;
上调按钮
K_DOWNEQUP1.6;
下调按钮
K_ENTEREQUP1.7;
输入数据确认按钮
P_DS18B20EQUP3.3;
读取DS18B20的输入端口
P_SWITCHEQUP1.3;
继电器控制端口,1-风扇,0-电炉
FLAGEQU20H.0;
标志位,确定是否存在DS18B20
ENTER_FLAGEQU20H.1;
键盘输入的标志位,为0说明键盘正在输入,为1说明键盘输入退出
;
程序开始执行
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVSP,#60H;
初始化
MOVKEY_BUF_G,#00H;
由于KEY_BUF是由用户输入的,所以先赋值初始化
MOVKEY_BUF_S,#00H
MOVKEY_BUF_B,#00H
NEXT:
LCALLREAD_TEMP;
调用读温度子程序
JBFLAG,NORMAL;
判断是否有DS18B20的存在
CALLERR;
不存在时显示错误信息
AJMPNEXT
NORMAL:
LCALLDATA_DEA;
处理从DS18B20得到的数据
LCALLSET_DIS_BUF;
赋值给DIS_BUF_X,G,S,B
LCALLDISPLAY;
调用数码管显示子程序
LCALLSCAN_KEY;
扫描键盘
LCALLSWITCH;
处理继电器
AJMPNEXT
程序名称:
ERR
功能:
程序出错处理,显示四个8,即8888
入口参数:
无
出口参数:
DIS_BUF_X,DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
ERR:
MOVDIS_BUF_X,#08H;
如果没有找到DS18B20,那么就显示错误,错误显示为888
MOVDIS_BUF_G,#08H
MOVDIS_BUF_S,#08H
MOVDIS_BUF_B,#08H
LCALLDISPLAY
RET
DATA_DEAL
处理采集后的的数据
TEMPERATURE_L
DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
MOVA,TEMPERATURE_H;
ANLA,#80H
JZTEMPC1;
CLRC
MOVA,TEMPERATURE_L;
二进制数求补(双字节)
CPLA;
ADDA,#01H
MOVTEMPERATURE_L,A;
取补码后存回TEMPERATURE_L,此时TEMPERATURE_L里面的值就可以表示温
度了,不过还要继续处理一下。
MOVA,TEMPERATURE_H
CPLA
ADDCA,#00H;
MOVTEMPERATURE_H,A;
MOVTEMPERATURE_HC,#0BH
SJMPTEMPC11
MOVTEMPERATURE_HC,#0AH
MOVA,TEMPERATURE_HC
SWAPA
MOVTEMPERATURE_HC,A
MOVA,TEMPERATURE_L
ANLA,#0FH;
MOVDPTR,#TEMPDOTTAB
MOVCA,@A+DPTR;
MOVTEMPERATURE_LC,A;
TEMPERATURE_LCLOW=小数部分BCD
MOVDIS_BUF_X,A;
ANLA,#0F0H;
得到个位‘单个数值
SWAPA;
MOVTEMPERATURE_L,A
ANLA,#0FH
ORLA,TEMPERATURE_L
MOVTEMPERATURE_ZH,A;
LCALLHtoB;
ANLA,#0F0H
ORLA,TEMPERATURE_HC;
TEMPERATURE_HCLOW位=十位数BCD
TEMPERATURE_LCHI位=个位数BCD
ORLA,TEMPERATURE_LC
MOVTEMPERATURE_LC,A
MOVA,R7
JZTEMPC12
MOVR7,A
MOVA,TEMPERATURE_HC;
TEMPERATURE_HCHI=百位数BCD
ORLA,R7
小数部分码表
DB00H,01H,01H,02H,03H,03H,04H,04H,05H,06H,06H,07H,08H,08H,09H,09H
0.0625->
00H
0.0625*2=0.125->
01H
0.0625*3=0.1875->
0.0625*4=0.25->
02H
0.0625*5=0.3125->
03H
以此类推..........
HtoB
十六进制转BCD
R7
HtoB:
MOVB,#064H;
100
DIVAB;
a/100
MOVR7,A;
MOVA,#0AH
XCHA,B
DIVAB
ORLA,B
INIT_TEMP
初始化DS18B20,确定DS18B20是否是存在的
FLAG
INIT_TEMP:
SETBP_DS18B20
NOP
CLRP_DS18B20;
主机发出延时537微秒的复位低脉冲
MOVR0,#6BH
MOVR1,#04H
TSR1:
DJNZR0,$
MOV40,#6BH
DJNZR1,TSR1
SETBP_DS18B20;
然后拉高数据线,释放总线进入接受状态
NO