大学生安全教育:DS18B20应用_放松好运|Free&Lucky

来源:百度文库 编辑:偶看新闻 时间:2024/05/04 08:51:26
2007-09-10 13:26        ORG 0000H ;DS18B20.ASM         0-125度的温度计   原创:陈永飞   QQ:49204743   地址:江苏省南京市
TEMPER_L EQU 41H ;用于保存读出温度的低8位           信箱:baiyni888@163.com
TEMPER_H EQU 40H ;用于保存读出温度的高8位
FLAG1 EQU 38H ;是否检测到DS18B20标志位
A_BIT1 EQU 31H ;数码管个位数存放内存位置
B_BIT1 EQU 32H ;数码管十位数存放内存位置
         D_BIT1 EQU 35H      ;数码管百位数存放内存位置
DQ EQU P3.2 ;30H,31H,32H,33H: X 个位 十位 X
MOD7: MOV SP,#60H
LCALL GET_TEMPER ;调用读温度子程序
LCALL TEMPCOV
LCALL DISPLAY ;调用数码管显示子程序
AJMP MOD7
TEMP0: INC A
AJMP TEMP1
TEMPCOV: MOV A,TEMPER_L ;数据处理子程序TEMPCOV
MOV B,#16
DIV AB
JB B.3,TEMP0
TEMP1: MOV 34H,A ;将TEMPER_L的高四位右移四位,存入34H中(温度值)
MOV A,B ;将TEMPER_L的低四位X10/16得小数后一位数.
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV 30H,A ;将小数后一位数.存入30H中
MOV A,TEMPER_H ;TEMPER_H中存放高8位数,权重16
MOV B,#16
MUL AB
ADD A,34H ;34H中存入温度值的整数部分
MOV B,#10
DIV AB
MOV 31H,B ;个位存入31H中
MOV B,#10 ;
DIV AB ;
MOV 32H,B ;十位存入32H中
MOV B,#10 ;
DIV AB ;
MOV 35H,B ;百位存入33H中
MOV A,TEMPER_H
MOV 33H,#10H ;
JB ACC.7,EXIT7
MOV 33H,#00H
EXIT7: RET
INIT_1820: ;这是DS18B20复位初始化子程序
SETB DQ
NOP
CLR DQ ;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB DQ ;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB DQ,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ;延时
TSR3: SETB FLAG1 ;置标志位,表示DS1820存在
LJMP TSR5
TSR4: CLR FLAG1 ;清标志位,表示DS1820不存在
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ;时序要求延时一段时间
TSR7: SETB DQ
RET
;-------------------------------------------------
GET_TEMPER: ;读出转换后的温度值
SETB DQ
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2
RET ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2: MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
LCALL DISPLAY ;等待AD转换结束,12位的话750微秒
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;将读出的温度数据保存到35H/36H
RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820: MOV R2,#8 ;一共8位数据
CLR C
WR1: CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200: MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#TEMPER_L ;低位存入TEMPER_L(TEMPER_L),高位存入(TEMPER_H)
RE00: MOV R2,#8 ;数据一共有8位
RE01: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#9
RE10: DJNZ R3,RE10
MOV C,DQ
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;显示子程序
DISPLAY: MOV DPTR,#TAB ;指定查表启始地址
MOV R0,#4
DPL1: MOV R1,#250 ;显示1000次
DPLOP: MOV A,A_BIT1 ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P1,A ;送出个位的7段代码
CLR P3.7 ;开个位显示
ACALL D1MS ;显示1MS
SETB P3.7
MOV A,B_BIT1 ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P1,A ;送出十位的7段代码
CLR P3.5 ;开十位显示
ACALL D1MS ;显示1MS
SETB P3.5
MOV A,D_BIT1 ;取百位数
MOVC A,@A+DPTR ;查百位数的7段代码
MOV P1,A ;送出百位的7段代码
CLR P3.4 ;开百位显示
ACALL D1MS ;显示1MS
SETB P3.4
MOV P1,#00H
DJNZ R1,DPLOP ;100次没完循环
DJNZ R0,DPL1 ;4个100次没完循环
RET
;1MS延时(按12MHZ算)
D1MS: MOV R7,#0FFH
DJNZ R7,$
; DJNZ R7,$
RET
;实验板上的7段数码管0~9数字的共阴显示代码
TAB:          DB         07DH;0
         DB         018H;1
         DB         06EH;2
         DB         03EH;3
         DB         01BH;4
         DB         037H;5
         DB         077H;6
         DB         01CH;7
         DB         07FH;8
         DB         03FH;9

END