DS18B20的工作原理及应用 下载本文

内容发布更新时间 : 2024/5/4 7:46:05星期一 下面是文章的全部内容请认真阅读。

}

delay(5); }

//读取温度

char Read_Temperature(void) {

union{ byte c[2]; int x; }temp;

ow_reset();

write_byte(0xCC); // Skip ROM

write_byte(0xBE); // Read Scratch Pad temp.c[1]=read_byte(); temp.c[0]=read_byte(); ow_reset();

write_byte(0xCC); //Skip ROM

write_byte(0x44); // Start Conversion return temp.x/2; }

ds18b20汇编程序:

本汇编程序仅适合单个DS18B20和51单片机的连接,晶振为12MHZ左右 DQ:DS18B20的数据总线接脚

FLAG1:标志位,为\时表示检测到DS18B20 TEMPER_NUM:保存读出的温度数据 TEMPER_L EQU 36H TEMPER_H EQU 35H

DQ BIT P1.7

; DS18B20初始化汇编程序

;//*****************************************// INIT_1820: SETB DQ NOP

CLR DQ //拉低 480us MOV R0,#06BH TSR1:

DJNZ R0,TSR1; //(延时作用)先Rn中的内容减1,再判断Rn中的内容是否等于零,若不为零,则转移。

SETB DQ//拉高60~240us MOV R0,#25H TSR2:

11

JNB DQ,TSR3 若(bit)=0,则转移,PC←PC+3+rel;否则程序继续执行 DJNZ R0,TSR2 //(延时作用)先Rn中的内容减1,再判断Rn中的内容是否等于零,若不为零,则转移。 LJMP TSR4; 延时 TSR3:

SETB FLAG1; 置标志位,表示DS1820存在 LJMP TSR5 TSR4:

CLR FLAG1; 清标志位,表示DS1820不存在 LJMP TSR7 TSR5:

MOVR0,#06BH TSR6:

DJNZ R0,TSR6; //(延时作用)先Rn中的内容减1,再判断Rn中的内容是否等于零,若不为零,则转移。 TSR7: SETB DQ

RET //用RET指令实现多分支程序的方法是:先把各个分支的目的地址按顺序组织成一张地址表,在程序中用分支信息去查表,取得对应分支的目的地址,按先低字节,后高字节的顺序压入堆栈,然后执行RET指令,执行后则转到对应的目的位置。

;//*****************************************//

; 重新写DS18B20暂存存储器设定值

; //*****************************************// RE_CONFIG:

JB FLAG1,RE_CONFIG1; 若DS18B20存在,转RE_CONFIG1 RET

RE_CONFIG1:

MOV A,#0CCH; //发SKIP ROM命令 0CCH就是SKIP ROM的代码,资料中已给出 LCALL WRITE_1820 //写DS18B20的程序 MOV A,#4EH; 发写暂存存储器命令 LCALL WRITE_1820

MOV A,#00H; TH(报警上限)中写入00H LCALL WRITE_1820

MOV A,#00H; TL(报警下限)中写入00H LCALL WRITE_1820

MOV A,#1FH; 选择9位温度分辨率DS18B20可以程序设定9~12位的分辨率,对应的可分辨温度分

别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温

LCALL WRITE_1820 RET

;//*****************************************//

; 读出转换后的温度值

;//*****************************************// GET_TEMPER:

SETB DQ; 定时入口

12

LCALL INIT_1820 //先复位DS18B20

JB FLAG1,TSS2 //如果指定的(bit)=1(表示有传感器存在),则转移,否则顺序执行,第二条指令功能相反

RET; 若DS18B20不存在则返回 TSS2:

MOV A,#0CCH; 跳过ROM匹配 LCALL WRITE_1820

MOV A,#44H; 发出温度转换命令

LCALL WRITE_1820 ;// 这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒

LCALL INIT_1820 ; //准备读温度前先复位 MOV A,#0CCH; 跳过ROM匹配 LCALL WRITE_1820

MOV A,#0BEH; 发出读温度命令 LCALL WRITE_1820

LCALL READ_1820 ;// 将读出的温度数据保存到35H/36H MOV TEMPER_NUM,A; 将读出的温度数据保存 RET

;//*****************************************//

; 读DS18B20的程序,从DS18B20中读出一个字节的数据 ;//*****************************************// READ_1820:

MOV R2,#8 ;//数据一共有8位,8位数据分别一个一个读 RE1:

CLR C ;//清零 SETB DQ ;//拉高 NOP NOP CLR DQ NOP NOP NOP

SETB DQ MOV R3,#7 DJNZ R3,$ MOV C,DQ MOV R3,#23 DJNZ R3,$ RRC A

DJNZ R2,RE1 RET

;//*****************************************//

; 写DS18B20的程序

;//*****************************************// WRITE_1820:

13

MOV R2,#8 // 一共8位数据,八位数据一位一位的写 CLR C //清零 WR1:

CLR DQ //清零

MOV R3,#6 //(延时10us )

DJNZ R3,$ //先Rn中的内容减1,再判断Rn中的内容是否等于零,若不为零,则转移。 RRC A //带进位的循环右移,调用WRITE_1820前已对A赋值 MOV DQ,C //因为右移,C有值了 MOV R3,#23

DJNZ R3,$ //(延时27us )该指令的功能是在自己本身上循环,进入等待状态。其中符号 $ 表示转

移到本身,它的机器码为80 FEH。在程序设计中,程序的最后一条指令通常用它,使程序不再向后执行以避免执行后面的内容而出错。 符号“$”,表示程序计数器PC的当前值

SETB DQ NOP

DJNZ R2,WR1 SETB DQ RET

;//*****************************************//

; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据 ;//*****************************************// READ_18200:

MOV R4,#2; 将温度高位和低位从DS18B20中读出

MOV R1,#36H;// 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H) RE00:

MOV R2,#8 RE01: CLR C SETB DQ NOP NOP CLR DQ NOP NOP NOP

SETB DQ MOV R3,#7 DJNZ R3,$ MOV C,DQ MOV R3,#23 DJNZ R3,$

RRC A ;//带进位的循环右移 DJNZ R2,RE01 MOV @R1,A DEC R1

DJNZ R4,RE00

14

RET

;//*****************************************//

; 将从DS18B20中读出的温度数据进行转换

;//*****************************************// TEMPER_COV: MOV A,#0F0H

ANL A,TEMPER_L; 舍去温度低位中小数点后的四位温度数值 SWAP A

MOVTEMPER_NUM,A MOV A,TEMPER_L

JNB ACC.3,TEMPER_COV1; 四舍五入去温度值 INCTEMPER_NUM

TEMPER_COV1: MOV A,TEMPER_H ANL A,#07H SWAPA

ORL A,TEMPER_NUM

MOVTEMPER_NUM,A; 保存变换后的温度数据 LCALLBIN_BCD RET

;//*****************************************//

; 将16进制的温度数据转换成压缩BCD码

;//*****************************************// BIN_BCD:

MOV DPTR,#TEMP_TAB MOV A,TEMPER_NUM MOVC A,@A+DPTR MOV TEMPER_NUM,A RET

TEMP_TAB:

DB00H,01H,02H,03H,04H,05H,06H,07H DB08H,09H,10H,11H,12H,13H,14H,15H DB16H,17H,18H,19H,20H,21H,22H,23H DB24H,25H,26H,27H,28H,29H,30H,31H DB32H,33H,34H,35H,36H,37H,38H,39H DB40H,41H,42H,43H,44H,45H,46H,47H DB48H,49H,50H,51H,52H,53H,54H,55H DB56H,57H,58H,59H,60H,61H,62H,63H DB64H,65H,66H,67H,68H,69H,70H

;//*****************************************//

下面还介绍一个ds18b20汇编程序

;**********************************

15