📄 deng1.asm
字号:
;*********************************************************
; 变量定义区
;*********************************************************
DCLK BIT P1.0
DIN BIT P1.1
LOAD BIT P1.2
DOUT BIT P1.3
SHUJU BIT P2.0
TIMER1 DATA 3AH
TIMER2 DATA 39H
TIMER3 DATA 38H
WENDU EQU 37H ;实际温度地址
WENDUD EQU 35H ;温度低位地址
WENDUG EQU 36H ;温度高位地址
FLAG BIT 00H
;*********************************************************
; 主程序
;*********************************************************
ORG 0000H
AJMP 0030H
ORG 0030H
MAIN:
LCALL GET_WENDU
RET
GET_WENDU:
SETB SHUJU
S1:
LCALL INIT_1820
JB FLAG,S2
RET
S2:
MOV A,#0CCH ;ROM匹配命令
LCALL XIEB20
MOV A,#044H ;发出温度转换命令
LCALL XIEB20
LCALL INIT_1820
MOV A,#0BEH ; 发写暂存存储器命令
LCALL XIEB20
LCALL DU18B20
RET
;-----------初始化DS18B20程序----------------------
INIT_1820:
SETB SHUJU ;初始化DS18B20程序
NOP
CLR SHUJU ;DS18B20总线为低电平复位
MOV R0,#250
L1:
DJNZ R0,L1 ;保持总线复位电平500us
SETB SHUJU ;释放总线
NOP
NOP
MOV R1,#25H
L2:
JNB SHUJU,L3
DJNZ R1,L2 ;释放总线,保持60us
LJMP L4
L3:
SETB FLAG
LJMP L5
L4:
CLR FLAG
LJMP L7
L5:
MOV R2,#064H;
L6:
DJNZ R2,L6
L7:
SETB SHUJU
RET
;写入18B20指令
;===========================================================
XIEB20:
MOV R2,#8 ;一共8位数据
CLR C
XIE:
CLR SHUJU ;开始写入DS18B20总线要处于复位(低)状态
NOP
NOP
MOV R3,#06
DJNZ R3,$ ;总线复位保持18微妙以上
RRC A ;把一个字节DATA 分成8个BIT环移给C
MOV SHUJU,C ;写入一个BIT
MOV R3,#23
DJNZ R3,$ ;等待46微妙
SETB SHUJU ;重新释放总线
NOP
NOP
DJNZ R2,XIE ;写入下一个BIT
SETB SHUJU
RET
;----------------------------
;--------------------------------------------------------------
; 读18B20温度
;***********************************************************
DU18B20:
;------------------------------
;读温度子程序
;从DS18B20中读出温度低位、高位,
;存入35H,36H
;****************************************************
MOV R4,#2
MOV R1,#35H ; 存入35H,36H
RE00: MOV R2,#8
RE01:
CLR C
SETB SHUJU
NOP
NOP
CLR SHUJU ;读前总线保持为低
NOP
NOP
NOP
SETB SHUJU ;开始读总线释放
MOV R3,#06 ;延时15微妙
DJNZ R3,$
MOV C,SHUJU ;从DS18B20总线读得一个BIT
MOV R3,#23
DJNZ R3,$ ;等待46微妙
RRC A ;把读得的位值环移给A
NOP
NOP
DJNZ R2,RE01 ;读下一个BIT
MOV @R1,A
INC R1
DJNZ R4,RE00
LCALL WDCZ
RET
WDCZ:
MOV A,WENDUD ;整数部分
ANL A,#0F0H ;取出高四位
SWAP A
MOV WENDUD,A
MOV A,WENDUG
ANL A,#0FH
SWAP A
ORL A,WENDUD ;重新组合温度数据
MOV WENDU,A ;重新组合的温度数据存入WENDU
LCALL HEX2BCD1
MOV WENDUD,A ;(A)=十位数和个位数
ANL A,#0F0H
SWAP A
MOV 75H,A ;十位数 BCD
MOV A,WENDUD
ANL A,#0FH
MOV 74H,A ;个位数 BCD
LCALL DELAY_1S
LJMP START ;调数码管显示程序
RET
;==============================================================
;单字节十六进制转BCD
;入口:(A)=单字节十六进制的温度值
;出口:(A)=十位数和个位数
;==============================================================
HEX2BCD1:
MOV B,#0AH
DIV AB
SWAP A
ORL A,B ;(A)=个位数和十位数
RET
;延时子程序
;**********************************************
DELAY2:MOV R5,#01H
H0: MOV R7,#0FFH
H1: DJNZ R7,H1
DJNZ R5,H0
RET
;*********************************************************
; 初始化CH451子程序
;*********************************************************
INIT_451:
MOV SP,#60H
CLR DIN ;先低后高,输出上升沿通知CH451选择4线串行接口
NOP
SETB DCLK ;置为默认的高电平
SETB DIN
SETB LOAD
SETB DOUT
RET
;***********************************
;数码管显示程序
;***********************************
START:
MOV B,#04H ;设置CH451
MOV A,#07H ;关看门狗开显示键盘
NOP
LCALL WRITE
MOV B,#05H;设置显示参数
MOV A,#080H;BCD译码
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -