DS18B20实现测温功能Word下载.docx
《DS18B20实现测温功能Word下载.docx》由会员分享,可在线阅读,更多相关《DS18B20实现测温功能Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
33pf电容2
10uf电容1
4.7k电阻7
10k电阻5
0.1k电阻1
1k电阻4
5V电源1
四>
硬件原理图
室内温度检测系统硬件原理图
五>
硬件原理图与其软件配合介绍
DS18B20的DQ端与单片机的P2.0口相连,进行数据传送。
DSl8820内部结构主要由4部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
根据DSl8820的通信协议,主机控制DSl8820完成温度转换必须经过3个步骤:
每一次读写之前都要对其进行复位,复位成功后发送1条ROM指令,最后发送RAM指令,这样才能对DSl8820进行预定的操作。
复位要求主CPU将数据线下拉500μs,然后释放,DSl8820收到信号后等待16~60μs左右,后发出60~240μs的存在低脉冲,主CPU收到此信号表示复位成功。
由于DSl8820采用的是单线进行控制与读取数据,因此对操作的时序要求非常严格,否则由于时序不匹配,将无法完成对器件的正确操作。
P0口与4位LED显示的“字型码”端相连,P1口的低四位与4位LED显示的“位”选择相连,实现将从DS18B20中读取的数据显示出来。
P1口的高四位,分别接四个按钮,实现对温度的设置。
P1.4接“温度设置”按钮,P1.5接“开始测温”按钮,P1.6接“增加温度”按钮,P1.7接“减小温度”按钮。
P3.4口接警铃,当温度高于设定温度时,可实现报警功能。
每次用P1口读入数据时,都要先置1,而后读入数据,如:
SETBP1.4
相关代码如下:
SET_TEMPER;
设置温度上限
LCALLINIT_18B20;
对DS18B20初始化
LCALLGET_TEMPER;
获取温度数据
LCALLCHANGE16;
将得到的16进制温度值转换为10进制数
LCALLDISPLAY;
将得到的温度显示出来
MOVDPTR,#NUMTAB;
采用查表法显示温度
MOVCA,@A+DPTR
六>
程序流程图
温度上限初值设置
读温度初始化DS18B20
写DS18B20获得温度整数部分
结果送显示
七>
源程序清单
;
------------------------------部分内存分配声明-----------------------------
TEMPER_LEQU31H;
用于保存读出温度的低字节
TEMPER_HEQU30H;
用于保存读出温度的高字节
DATBITP2.2;
DS18B20数据线
------------------------------设置上限温度-----------------------------
ORG0000H
MOVSP,#80H
MOV66H,#26;
66H为温度初值存储地址(温度上限)
CLRC;
欲设温度上限为26度
MOVP3.4,C;
关闭蜂鸣器
MOVR3,#0F0H;
延时
WAIT1:
MOV60H,66H;
初始温度送显示,60H为16进制数暂存地址
LCALLCHANGE16_0
LCALLDISPLAY
DJNZR3,WAIT1
CLRP1.4
CLRP1.5
WAIT4:
CLRC
SETBP1.4
SETBP1.5
NOP
JNBP1.4,SET_TEMPER;
判断是否需要设置温度
JNBP1.5,START
AJMPWAIT4
-----------------------设置温度子程序-----------------------
SET_TEMPER:
CLRP1.6
CLRP1.7
SETBP1.6
SETBP1.7
SET_1:
JNBP1.6,UP1;
温度值加1
JNBP1.7,DOWN1;
温度值减1
JNBP1.5,START;
开始测温
AJMPSET_1
------------------------------加温度子程序-----------------------------
UP1:
MOVA,66H
ADDCA,#01H
MOV66H,A
MOVR3,#0FFH
WAIT2:
MOV60H,66H
DJNZR3,WAIT2
LJMPSET_TEMPER
------------------------------减温度子程序-----------------------------
DOWN1:
MOVA,66H
SUBBA,#01H
WAIT3:
DJNZR3,WAIT3
------------------------------主函数开始-----------------------------
START:
LCALLGET_TEMPER;
调用读温度子程序
LCALLCHANGE16;
将读出的2字节温度整合,并转换为压缩BCD码
LCALLDISPLAY;
显示温度
LJMPSTART
-----------------------DS18B20的温度转换子程序-----------------------
GET_TEMPER:
LCALLINIT_18B20
TSS:
MOVA,#0CCH;
跳过ROM匹配
LCALLWRITE_18B20
MOVA,#44H;
发出温度转换命令
LCALLDISPLAY;
用显示温度(持续1s左右)来等待AD转换结束
;
12位的话要转换750ms
LCALLINIT_18B20;
准备读温度前先初始化
MOVA,#0CCH;
MOVA,#0BEH;
发出读温度命令
LCALLREAD_18B20
RET
--------------------------DS18B20初始化程序--------------------------
INIT_18B20:
SETBDAT
CLRDAT
MOVR2,#250;
主机发出延时500微秒的复位低脉冲
DJNZR2,$
SETBDAT;
然后拉高数据线
MOVR2,#30
DJNZR2,$;
延时240us
JNBDAT,INIT1;
数据变高,初始化成功
LJMPINIT_18B20
INIT1:
MOVR2,#120
DJNZR2,$
JBDAT,INIT2
LJMPINIT_18B20
INIT2:
MOVR2,#240
-----------------写DS18B20的子程序(有具体的时序要求)-----------------
WRITE_18B20:
MOVR2,#8;
一共8位数据
CLRC
WR0:
CLRDAT
MOVR3,#5
DJNZR3,$
RRCA
MOVDAT,C
MOVR3,#21
DJNZR2,WR0
----------读DS18B20的程序,从DS18B20中读出两个字节的温度数据--------------------------
READ_18B20:
MOVR4,#2;
将温度高位和低位从DS18B20中读出
MOVR1,#TEMPER_L;
低位存入31H(TEMPER_L)
RE0:
MOVR2,#8
RE1:
CLRC
NOP
MOVR3,#4
MOVC,DAT
MOVR3,#30
DJNZR2,RE1
MOV@R1,A
DECR1;
高位存入30H(TEMPER_H)
DJNZR4,RE0
----------整合读出的两字节温度(关于DS18B20读出的2字节温度格式请参考资料)----------
CHANGE16:
MOVP3.4,C
MOVR0,#65H
MOVA,TEMPER_L
SWAPA
MOV@R0,A
MOVA,TEMPER_H
XCHDA,@R0
MOV60H,A;
获得整数部分(1字节)
SUBBA,60H;
判断实际温度是否高于温度上限
JNBACC.7,CHANGE16_0
SETBC
---------------------------将得到的16进制温度转化为10进制数----------------------------
CHANGE16_0:
MOVA,60H
JBACC.7,FUSHU;
判断是否为负数
MOV64H,#00H
MOVB,#100;
将16进制数转换为10进制数
DIVAB
MOV63H,A
MOVA,B
MOVB,#10
MOV62H,A
MOV61H,A
AJMPBACK1
FUSHU:
MOV64H,#0AH
CPLA
INCA
MOV60H,A
MOVB,#100