;**************************端口的定义*************************************
;*************************************************************************
CONFIG12 EQU 7FH ;DS18B20的转换精度选择(0、R1、R2、1、1、1、1、1)
; 0 0 9位测量
; 0 1 10位测量
; 1 0 11位测量
; 1 1 12位测量
TEMPH EQU 71H ;高位温度原始数据的读入地址
TEMPL EQU 70H ;低位温度原始数据的读入地址
ZHENG EQU 73H ;温度中的整数部分数据暂存空间
XIAO EQU 72H ;温度中的小数部分数据暂存空间
BAIWEI EQU 77H ;温度的百位数据
SHIWEI EQU 76H ;温度的十位数据
GEWEI EQU 75H ;温度的个位数据
DIANWEI EQU 74H ;温度的小数点后一位数据
DAT EQU P1.0 ;DS18B20与单片机通信的口线
;**********************初始化子程序和主程序******************************
;************************************************************************
ORG 0000H
LJMP START
ORG 0030H
START:
MOV TEMPL,#0
MOV TEMPH,#0
LCALL INIT ;调用初始化子程序
MAIN:
LCALL RDTEMP ;调用读子程序,从DS18B20中读取出温度值
LCALL DIVV ;调用运算子程序
LCALL DISPLAY ;调用显示子程序显示当前温度值
LJMP MAIN
;************************数据处理子程序*********************************
;***********************************************************************
DIVV: ;数据处理子程序,负责将温度数据转换为BCD码
MOV A,TEMPL
MOV B,#16
DIV AB ;分离温度数据低8位中的整数部分和小数部分(因为低字节第4位代表1度,但实际数值却是2的4次方=16,所以需要缩小16倍)
MOV ZHENG,A ;将从温度数据低8位中分离出来的整数存放在整数存储空间中
MOV XIAO,B ;将从温度数据低8位中分离出来的小数存放在小数存储空间中
MOV A,XIAO
MOV B,#10
MUL AB ;将分离出的小数部分乘以10,即扩大10倍
MOV B,#16
DIV AB ;将已经扩大了10倍的小数再除以16,以求出小数点后一位的数据(例如90/13=6余12,12*10/13=9余3,那么9就是小数点后一位)
MOV DIANWEI,A ;将小数点后一位数据存入小数点位
MOV A,B
MOV B,#10
MUL AB
MOV B,#16
DIV AB ;用同样的方法求出小数点后第二位
CLR C
SUBB A,#4 ;判断小数点后的第二位是否大于或等于5
JC BUJIN ;如果有借位说明小数点后第二位小于5,则不向小数点后第一位产生进位
INC DIANWEI ;如果小数点后第二位大于等于5,则有借位产生,根据四舍五入原则,给小数点后第一位加1进位
BUJIN:
MOV A,TEMPH
MOV B,#16
MUL AB ;将温度数据高8位乘以16(因为高字节第0位代表2的4次方=16,但实际数值却是2的0次方=1,所以需要扩大16倍)
ADD A,ZHENG ;将温度数据高8位和低8位中代表整数的数据相加
MOV ZHENG,A ;将最终求得的整数存放在整数存储空间中
MOV A,ZHENG
MOV B,#100
DIV AB
MOV BAIWEI,A ;求出整数中百位的BCD码,并存入百位存储空间中
MOV A,B
MOV B,#10
DIV AB
MOV SHIWEI,A ;求出整数中十位的BCD码,并存入十位存储空间中
MOV GEWEI,B ;剩下的余数就是个位的BCD码,并存入个位存储空间中
RET
;***************************数据显示子程序*****************************
;**********************************************************************
DISPLAY:
MOV DPTR,#TAB ;通过查表来显示数据
MOV A,BAIWEI ;显示百位
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#11110111B
MOV R7,#0FFH ;延时一下
DJNZ R7,$
MOV A,SHIWEI ;显示十位
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#11111011B
MOV R7,#0FFH
DJNZ R7,$
MOV A,GEWEI ;显示个位
MOVC A,@A+DPTR
ANL A,#0FEH
MOV P0,A
MOV P2,#11111101B
MOV R7,#0FFH
DJNZ R7,$
MOV A,DIANWEI ;显示小数点后一位
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#11111110B
MOV R7,#0FFH
DJNZ R7,$
RET
DELAY:
MOV 30H,#200
D1:
MOV 31H,#250
DJNZ 31H,$
DJNZ 30H,D1
RET
;******************************DS18B20控制子程序*******************************
;******************************************************************************
INIT: ;DS18B20初始化子程序
LCALL RESET ;调用DS18B20复位子程序
MOV A,#CONFIG12 ;将DS18B20的转换精度控制数据写入DS18B20,为提高转换精度选用12位精度
LCALL WRITE ;调用向DS18B20的写子程序
RET
RDTEMP:
LCALL RESET ;调用DS18B20复位子程序
MOV A,#0CCH ;使DS18B20跳过读序列号的操作
LCALL WRITE
MOV A,#44H ;命令DS18B20启动温度转换操作
LCALL WRITE
LCALL RESET ;在重新写入命令之前再次进行复位操作
MOV A,#0CCH
LCALL WRITE
MOV A,#0BEH ;从DS18B20中将转换好的温度数据读出命令
LCALL WRITE
LCALL READ ;调用读程序将低8位温度数据读入A
MOV TEMPL,A ;将低8位温度数据存入TEMPL寄存器中
LCALL READ
MOV TEMPH,A
RET
RESET: ;DS18B20复位子程序
LA:
SETB DAT
MOV R2,#200
LB:
CLR DAT
DJNZ R2,LB
SETB DAT
MOV R2,#30
LC:
DJNZ R2,LC
CLR C
ORL C,DAT
JC LB
MOV R6,#80
LD:
ORL C,DAT
JC LP
DJNZ R6,LD
SJMP LA
DJNZ R6,LD
LP:
MOV R2,#250
LF:
DJNZ R2,LF
RET
WRITE: ;DS18B20写子程序
MOV R3,#8
WR1A:
SETB DAT
MOV R4,#8
RRC A
CLR DAT
WR2A:
DJNZ R4,WR2A
MOV DAT,C
MOV R4,#30
WR3A:
DJNZ R4,WR3A
DJNZ R3,WR1A
SETB DAT
RET
READ: ;DS18B20读子程序
CLR EA
MOV R6,#8
RD1A:
CLR DAT
MOV R4,#6
NOP
SETB DAT
RD2A:
DJNZ R4,RD2A
MOV C,DAT
RRC A
MOV R5,#30
RD3A:
DJNZ R5,RD3A
DJNZ R6,RD1A
SETB DAT
RET
TAB:
DB 03H 9FH 25H 0DH 99H 49H 0C1H 1FH 01H 19H
vb编写的真没有