ds18b20温度计程序

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

ORG 0000H

AJMP MAIN

ORG 0030H

MAIN: MOV R5,#0FFH

MAIN1:MOV P0,#00H ;系统自检。自高位向低位带小数点显示8扫描256次

CLR P2.4

LCALL DELAY

SETB P2.4

CLR P2.5

LCALL DELAY

SETB P2.5

CLR P2.6

LCALL DELAY

SETB P2.6

CLR P2.7

LCALL DELAY

SETB P2.7

DJNZ R5,MAIN1

SETB P2.4 ;关显示

SETB P2.5

SETB P2.6

SETB P2.7

SJMP MAIN2

DELAY:MOV R7 ,#05H //;延时

LP8: MOV R6,#19H

LP7:DJNZ R6,LP7

DJNZ R7,LP8

RET

; DS18B20初始化汇编程序;*****************************************//

MAIN2:LCALL DISP //;主程序

SETB P3.2 // ;18B20DQ置1拉高

LCALL INIT // ;调初始化

MOV A,#0CCH //;跳过ROM匹配------0CC

LCALL WRITE // ;调写DS18B20的程序

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

LCALL WRITE // ;调写DS18B20的程序

MOV R6,#34H //;延时136微秒转换时间,写一个字约需70微秒。

DJNZ R6,$

LCALL DISP

LCALL INIT

MOV A,#0CCH

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

LCALL WRITE

LCALL READ

CLR C

LCALL CONVTEMP

LCALL DISPBCD

LCALL DISP

SJMP MAIN2

WRITE:MOV R0,#8 // ;写子程序

CLR C

WR1: CLR P3.2

MOV 20H,#3 // ;延时17微秒

DJNZ 20H,$

RRC A

MOV P3.2,C

MOV 21H,#10 // ;发送后延时45微秒

DJNZ 21H,$

SETB P3.2

NOP

DJNZ R0,WR1 // ;8位未发送完转

SETB P3.2

RET

READ: MOV R6,#2 // ;读子程序

CLR PSW.5 // ;清清标志F0

RE0:MOV R2,#8

RE1:CLR C

SETB P3.2 // ;拉高DQ

NOP // ;延时2微秒

CLR P3.2 // ;拉低DQ

SETB P3.2

MOV 22H,#3

RE2:DJNZ 22H,RE2

MOV C,P3.2

MOV 23H,#10

RE3:DJNZ 23H,RE3

RRC A

DJNZ R2,RE1 //;8位未读完继续读

CPL PSW.5

JNB PSW.5,RE4 // ;高8位保存至28H

MOV 29H,A // ;低8位及小数保存至29H

RE4:MOV 28H,A

DJNZ R6,RE0 //;高8位未读继续

RET

INIT:SETB P3.2 // ;初始化开始DQ置1(整个时隙和理论值不是很准确) NOP //;延时

L0:CLR P3.2 // ;DQ拉低

MOV 24H,#100 // ;延时400微秒

DJNZ 24H,$

SETB P3.2 // ;DQ拉高

MOV 25H,#10 // ;置40微秒延时常数

L01:JNB P3.2,L2 // ;有18B20响应转L2

DJNZ 25H,L01 // ;无18B20响应等待40微秒

SJMP L0 // ;无18B20重新初始化

L2:MOV R7,#60 // ,延时240微秒

L3:DJNZ R7,L3

SETB P3.2 //;DQ拉高、退出

RET

CONVTEMP:MOV A,28H //;温度转换

ANL A,#80H //;温度正负判别

JZ TEMPC1 //;温度为正转

CLR C // ;温度为负调整

MOV A,29H

CPL A

ADD A,#01H

MOV 29H,A

MOV A,28H

CPL A

ADDC A,#00H

MOV 28H,A

MOV 26H,#0BH // ;温度为负26H内送#0BH

SJMP TEMPC11

TEMPC1:MOV 26H,#0AH //;温度为正26H内送#0AH

TEMPC11:MOV A,26H

SWAP A

MOV 26H,A // ;26H高4位为温度符号

MOV A,29H // ;取温度小数部分

ANL A,#0FH ;去整数个位

MOV DPTR,#DOTTAB

MOVC A,@A+DPTR

MOV 27H,A // ;查表得小数值,并保存至27H单元

MOV A,29H // ;温度整数部分拼装后暂时存入A

ANL A,#0F0H // ;留下整数个位

SWAP A

MOV 29H,A

MOV A,28H

ANL A,#0FH

SWAP A ORL A,29H

HEX2BCD1:MOV B,#64H // ;温度整数部分除100得整数百位,并存入R7中

DIV AB

MOV R7,A // ;R7中为百位,B中为十位和个位

MOV A,#0AH // ;温度整数部分除10得整数十位和个位

XCH A,B // ;除数与被除数交换

DIV AB

SWAP A

ORL A,B

TEMPC10:MOV 29H,A // ;温度十位和个位存入29H单元中,十位在高4位,个位在低4位

ANL A,#0F0H // ;取温度十位

SWAP A

ORL A,26H //;十位加温度符号存入26H单元;高4位为符号

MOV 26H,A

MOV A,29H

ANL A,#0FH // ;取温度个位

SWAP A

ORL A,27H

MOV 27H,A // ;27H单元中高4位为个位,低4位为小数

MOV A,R7

JZ TEMPC12 // ;百位为0退出

ANL A,#0FH // ;百位不为0即温度为正和十位重新拼装后存入26H,高4位为百位

SWAP A // ;

MOV R7,A

MOV A,26H

ANL A,#0FH ; // ;去除26H单元的符号

ORL A,R7 //;百位和十位拼装,放入26H单元高4位为百位

MOV 26H,A // ;低4位为十位

TEMPC12:RET

DOTTAB:DB 00H,01H,01H,02H,03H

DB 03H,04H,04H,05H,06H

DB 06H,07H,08H,08H,09H,09H