📄 jerry.asm
字号:
;====================================================
;晶振为4M,一个指令周期为3μs
;====================================================
ORG 0000H
JMP START
;============================================
;定义管脚
;============================================
COMM DATA 30H
TEMPER_L EQU 27H;用于保存读出温度的低8位
TEMPER_H EQU 26H;用于保存读出温度的高8位
TEMPER_NUM EQU 28H
FIRST EQU 29H ;百位数的BCD码
SECOND EQU 2AH ;十位数的BCD码
THIRD EQU 2BH ;个位数的BCD码
FLAG1 EQU 38H;是否检测到DS18B20标志位
IN EQU P1.3
POWER EQU P1.2
;===========================================
;主程序开始
;===========================================
START:
CLR P1.0
CLR P1.1 ;P1.0和P1.1在不使用上拉电阻的情况下要设置为0,或者使用上拉电阻的情况下置1
WAIT:
LCALL INIT_1820
CALL RE_CONFIG ;调用18B20配置子程序
LCALL GET_TEMPER;调用读温度子程序
MOV A,#0F0H
ANL A,TEMPER_L; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMPER_NUM,A
MOV A,#0FH
ANL A,TEMPER_H
SWAP A
ORL A,TEMPER_NUM
MOV TEMPER_NUM,A
MOV A,TEMPER_NUM
MOV R0,#30H
LCALL TEMP_COV
;==================================================================================
DISP:
MOV R0,#2BH
MOV R3,#3
MOV DPTR,#DUANMA
LLP:
MOV A , @R0
MOVC A,@A+DPTR
MOV R2 , #8
CLR C
LP0: RLC A
NOP
MOV P1.4 , C
NOP
NOP
CPL P1.6
NOP
NOP
CPL P1.6
NOP
NOP
DJNZ R2 , LP0
DEC R0
DJNZ R3,LLP
RET
;==================================================================================
SJMP WAIT
;=============================================
;主程序结束
;=============================================
;=============================================
;输入格式为TEMPER_NUM ,输入为FIRST,SECOND
;如TEMPER_NUM=55H,输入FIRST=00H,SECOND=85H
;===========================================
TEMP_COV:
MOV A, TEMPER_NUM
MOV B,#64H
DIV AB
MOV FIRST,A
MOV A,B
MOV B,#0AH
DIV AB
MOV SECOND,A
MOV A,B
MOV THIRD,A
;SWAP A
;ORL A,B
;MOV SECOND, A
RET
;==========================================================================================
;主机控制DS18B20完成温度转换必须经过三个步骤:初始化、ROM操作指令、存储器操作指令。
;必须先启动DS18B20开始转换,再读出温度转换值。
;外接供电电源,可写出完成一次转换并读取温度值子程序GETWD。
;===========================================================================================
GET_TEMPER:
SETB IN
LCALL INIT_1820;先复位DS18B20
JB FLAG1,TSS2
CLR P1.6 ;复位成功18B20存在
RET ; 判断DS1820是否存在?若DS18B20不存在则返回
TSS2:
CLR P1.5;DS18B20已经被检测到!
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750MS
MOV R2,#70
CON:
MOV R7,#250
call delay
DJNZ R2,CON
LCALL INIT_1820;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200; 将读出的温度数据保存到29H/28H
CLR P1.3;温度成功读出
RET
;=====================================================
;配置18B20温度传感器设置
;=====================================================
RE_CONFIG:
JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH ; 发SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH ; 发写暂存存储器命令
LCALL WRITE_1820
MOV A,#00H ; TH(报警上限)中写入00H
LCALL WRITE_1820
MOV A,#00H ; TL(报警下限)中写入00H
LCALL WRITE_1820
MOV A,#1FH ; 选择9位温度分辨率
LCALL WRITE_1820
RET
;===================================================
;延时子程序,R7传递延时参数,延时为R7*45us
;===================================================
delay: mov r6,#06h
d1: djnz r6,d1 ;延时=r7*45us(15个机器周期) ;;;;
djnz r7,delay
ret
;==================================================
; 这是DS18B20复位初始化子程序
;==================================================
INIT_1820:
SETB IN
NOP
CLR IN
;主机发出延时537微秒的复位低脉冲
MOV R7,#12
CALL delay
SETB IN;然后拉高数据线
NOP
MOV R0,#24
TSR2:
JNB IN,TSR3;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示DS1820不存在
CLR P1.1
LJMP TSR7
TSR5:
MOV R0,#73
TSR6:
DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:
SETB IN
RET
;====================================================
;写命令或数据程序
;写DS18B20的子程序(有具体的时序要求)
;====================================================
WRITE_1820:
MOV R2,#8;一共8位数据
CLR C
WR1:
CLR IN
RRC A
MOV IN,C
MOV R3,#8
NOP
DJNZ R3,$
SETB IN
NOP
DJNZ R2,WR1
SETB IN
RET
;======================================================
;读数据子程序——————————————————————————
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;=======================================================
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8;数据一共有8位
RE01:
CLR C
SETB IN
NOP
CLR IN
NOP
SETB IN
NOP
MOV C,IN
NOP
MOV R3,#10
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
DUANMA: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;LED段码
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -