内容发布更新时间 : 2024/11/5 22:04:19星期一 下面是文章的全部内容请认真阅读。
}
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