DS18B20温度传感器实验

  • 格式:doc
  • 大小:65.50 KB
  • 文档页数:6

下载文档原格式

  / 19
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DS18B20温度传感器实验

TEMP1 EQU 5AH ;符号位和百位公用的存放单元TEMP2 EQU 5BH ;十位存放单元

TEMP3 EQU 5CH ;个位存放单元

TEMP4 EQU 5DH ;

TEMP5 EQU 5EH

TEMP6 EQU 5FH ;数据临时存放单元

TEMP7 EQU 60H

TEMP8 EQU 61H

ORG 0000H

AJMP MAIN

ORG 0020H

MAIN:

MOV SP,#70H

LCALL INT ;调用DS18B20初始化函数MAIN1:

LCALL GET_TEMP ;调用温度转换函数

LCALL CHULI ;调用温度计算函数

LCALL DISP ;调用温度显示函数

AJMP MAIN1 ;循环

INT:

L0:

SETB P3.7 ;先释放DQ总线

MOV R2,#250 ;给R2赋延时初值,同时可让DQ保持高电平2us L1:

CLR P3.7 ;给DQ一个复位低电平

DJNZ R2,L1 ;保持低电平的时间至少为480us

SETB P3.7 ;再次拉高DQ释放总线

MOV R2,#25

L2:

DJNZ R2,L2 ;保持15us-60us

CLR C

ORL C,P3.7 ;判断是否收到低脉冲

JC L0

MOV R6,#100

L3:

ORL C,P3.7

DJNZ R6,L3 ;存在低脉冲保持保持60us-240us

; JC L0 ;否则继续从头开始,继续判断

SETB P3.7

RET

;调用温度转换函数

GET_TEMP:

CLR PSW.4

SETB PSW.3 ;设置工作寄存器当前所在的区域

CLR EA ;使用DS18B20前一定要禁止任何中断

LCALL INT ;初始化DS18B20

MOV A,#0CCH ;送入跳过ROM命令

LCALL WRITE

MOV A,#44H ;送入温度转换命令

LCALL WRITE

LCALL INT ;温度转换完成,再次初始化18b20

MOV A,#0CCH ;送入跳过ROM命令

LCALL WRITE

MOV A,#0BEH ;送入读温度暂存器命令

LCALL WRITE

LCALL READ

MOV TEMP4,A ;读出温度的低字节存在TEMP4

LCALL READ

MOV TEMP5,A ;读出温度的高字节存在TEMP5

SETB EA

RET

CHULI : MOV A,TEMP5 ;将温度的高字节取出

JNB ACC.7,ZHENG

;判断最高位是否为0,为0则表示温度为正,则转到ZHENG

MOV A,TEMP4 ;否则温度为负,将温度的低字节取出

CPL A ;求反

INC A ;加1

MOV TEMP8,A ;存到TEMP8中

ANL A,#0FH ;保留低四位

LCALL MULD ;调用乘以625子程序

LCALL HB2 ;调用双字节16进制数转换成BCD码子程序

MOV A,R4 ;将结果的千位百位取出

ANL A,#0F0H ;保留千位

SWAP A ;

MOV TEMP7,A ;把小数结果保存在TEMP7中

MOV A,TEMP4 ;再次取出温度的低字节

ANL A,#0FFH ;判断是否为0

JZ XX ;为0则转到XX执行

MOV A,TEMP5 ;

CPL A ;不为0则直接将温度的高字节取反

SJMP YY ;

XX: MOV A,TEMP5 ;为0则求补码

CPL A ;

INC A ;

YY: ANL A,#0FH ;保留高字节的低四位

SWAP A ;将其换到高4位

MOV R5,A ;暂时保存于R5中

MOV A,TEMP8 ;取出求反后的低位字节

ANL A,#0F0H ;取其高4位

SWAP A ;将其换到低4位

ORL A,R5 ;合并成温度的整数部分

MOV TEMP6,A ;将整数部分存到TEMP6中

LCALL HBCD ;调用一字节的16进制数转换BCD数的子程序

MOV TEMP1,#0BH ;将"-"号的段选值存到符号位

MOV A,TEMP2 ;取出十位

CJNE A,#00H,NEXT

MOV TEMP2,#0CH ;十位为0不显示

RET

ZHENG: MOV A,TEMP4 ;将温度的低字节取出

ANL A,#0FH ;保留低四位

LCALL MULD ;调用乘以625子程序

LCALL HB2 ;调用双字节16进制数转换成BCD码子程序

MOV A,R4 ;将结果的千位百位取出

ANL A,#0F0H ;保留千位

SWAP A ;

MOV TEMP7,A ;把小数结果保存在TEMP7中

MOV A,TEMP4 ;再次取出温度的低字节

ANL A,#0F0H ;保留高4位

SWAP A ;换到低4位