📄 temp.asm
字号:
; 本程序采用DS18B20实现温度的采集。本系统中晶振采用12M,数据线为DQ,本程序没有对负温度进行
; 处理。采用3位数码进行显示,精度为1C度.
; DQ EQU P3.2
;DQ EQU P1.0 (89C51)
DQ EQU P1.7
ST_LED EQU P1.6
STATUS_LED EQU P3.7
FAMILYCODE DATA 30H
SERIAL1 DATA 31H
SERIAL2 DATA 32H
SERIAL3 DATA 33H
SERIAL4 DATA 34H
SERIAL5 DATA 35H
SERIAL6 DATA 36H
CRCCODE DATA 37H
TEMPL DATA 38H
TEMPH DATA 39H
TEMP0 DATA 40H
TEMP1 DATA 41H
TEMP2 DATA 42H
ORG 0000H
AJMP MAIN
ORG 0050H
MAIN:
MOV SP,#60H
MOV R7,#5
CLEAR: ;清数码显示
MOV DPTR,#LED
MOV A,#0
MOVC A,@A+DPTR
MOV SBUF,A
JBC TI,$
DJNZ R7,CLEAR
LCALL GET_TEMP
CLR STATUS_LED
LCALL CONV_DEFINITION
MORE:
LCALL GET_TEMP
CPL STATUS_LED
LCALL CONV_DEFINITION
LCALL HBCD
LCALL SEND
MOV R2,#2
BBBB:
MOV R6,#0
AAAA:
MOV R4,#0
DJNZ R4,$
DJNZ R6,AAAA
; DJNZ R2,BBBB
AJMP MORE
SEND:
MOV DPTR,#LED
MOV R0,#TEMP0
MOV A,@R0
ANL A,#0FH
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI,$
CLR TI
INC R0
MOV A,@R0
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,@R0
ANL A,#0FH
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI,$
CLR TI
SETB ST_LED
NOP
NOP
CLR ST_LED
RET
GET_TEMP:
PUSH PSW
MOV PSW,#00001000B; ;设置工作寄存器当前所在的区域
CLR EA ;使用ds1820一定要禁止任何中断产生
LCALL INIT_DS18B20
MOV A,#0CCH
LCALL WRITE
MOV A,#0B8H
LCALL WRITE
LCALL INIT_DS18B20 ;调用初使化子程序
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A, #44H
LCALL WRITE ;送入温度转换命令
LCALL INIT_DS18B20 ;温度转换完全,再次初使化ds1820
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A,#0BEH
LCALL WRITE ;送入读温度暂存器命令
LCALL READ
MOV TEMPL,A ;读出温度值低字节存入TEMPL
LCALL READ
MOV TEMPH,A ;读出谩度值高字节存入TEMPH
SETB EA
POP PSW
RET
INIT_DS18B20: ;初始化ds1820子程序
CLR EA
L0:CLR DQ ;ds1820总线为低复位电平
MOV R2,#200
L1:CLR DQ
DJNZ R2,L1 ;总线复位电平保持400us
SETB DQ ;释放ds1820总线
MOV R2,#30
L4:DJNZ R2,L4 ;释放ds1820总线保持60us
CLR C ;清存在信号(存在C=0,不存在C=1)
ORL C,DQ
JC L0 ;存在吗?不存在则重新来
MOV R6,#80
L5:ORL C,DQ
JC L3
DJNZ R6,L5
SJMP L0
L3:MOV R2,#240
L2:DJNZ R2,L2
RET
WRITE: ;向ds1820写操作命令子程序
CLR EA
MOV R3,#8 ;写入ds1820的bit数,一个字节8个bit
WR1:SETB DQ
MOV R4,#8
RRC A ;把一个字节data(A)分成8个bit环移给 C
CLR DQ ;开始写入ds1820总线要处于复位(低)状态
WR2:DJNZ R4,WR2 ;ds1820总线复位保持16us
MOV DQ,C ;写入一个bit
MOV R4,#20
WR3:DJNZ R4,WR3 ;等待40us
DJNZ R3,WR1 ;写入下一个bit
SETB DQ ;重新释放ds1820总线
RET
READ:
CLR EA
MOV R6,#8 ;连续读8个bit
RE1:CLR DQ ;读前总线保持为低
MOV R4,#4
NOP
SETB DQ ;开始读,总线释放
RE2:DJNZ R4,RE2 ;持续8us
MOV C,DQ ;从ds1820总线读得一个bit
RRC A ;把读得的位值环移给 A
MOV R5,#30
RE3:DJNZ R5,RE3 ;持续60us
DJNZ R6,RE1 ;读下一个bit
SETB DQ ;重新释放ds1820总线
RET
;功能:单字节十六进制整数转换成单字节BCD码整数
;入口条件:待转换的单字节十六进制整数在累加器A中。
;出口信息:转换后的BCD码整数(十位和个位)仍在累加器A中,百位在R3中。
;影响资源:PSW、A、B、R3 堆栈需求: 2字节
HBCD:
MOV A, TEMPL
MOV B,#100 ; 分离出百位,存放在R3中
DIV AB
MOV R3,A
MOV A,#10 ; 余数继续分离十位和个位
XCH A,B
DIV AB
SWAP A
ORL A,B ; 将十位和个位拼装成BCD码
MOV TEMP1,A
MOV TEMP0,R3
RET
;功能:双字节十六进制整数转换成双字节BCD码整数
;入口条件:待转换的双字节十六进制整数在R6、R7中,R6为高字节,R7为低字节。
;出口信息:转换后的三字节BCD码整数在R3、R4、R5中,R3为高位,R5为低位。
;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
BINBCD:
PUSH PSW
MOV PSW,#00010000B
MOV R6,TEMPH
MOV R7,TEMPL
HB2: CLR A ; BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ; 转换双字节十六进制整数
HB3: MOV A,R7 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -