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