📄 ds1820.asm
字号:
;DS18B20 data-> 20H-28H
DQ EQU P1.0
DISPCENTI EQU 32H ;温度BCD 百分之一位 地址
DISPTENTH EQU 33H ;温度BCD 十分之一位 地址
DISP1 EQU 34H ;温度BCD 个位 地址
DISP10 EQU 35H ;温度BCD 十位 地址
CLK EQU P2.1 ;MAX7219 CLK
LOAD EQU P2.2 ;MAX7219 LOAD
DIN2 EQU P2.3 ;MAX7219 DIN
PULSE EQU P2.7
ORG 0000H
LJMP MAIN
ORG 0013H
LJMP INTER1
ORG 0030H ;FOSC=12MHZ
MAIN: CLR PULSE
; SETB IT1
; SETB EX1
; CLR IE1
; SETB EA
LCALL GET_TEMPER
LJMP MAIN
GET_TEMPER: LCALL RESET ;reset 1820
LCALL SKIP_ROM ;"CCH"
LCALL CONVERT ;"44H"
LCALL DELAY1s ;1S
LCALL RESET ;reset 1820
LCALL SKIP_ROM ;"CCH"
LCALL READ_SCRTCH ;READ CONVERT T DATA 9BYTES
LCALL MATH
LCALL DISPLAY
; LJMP MAIN
RET
;--------- ROM FUNCTION COMMANDS --------
SKIP_ROM: ;Skip ROM [CCh]
MOV A,#0CCH
LCALL WRBYTE
RET
;--------- MEMORY COMMAND FUNCTIONS --------
READ_SCRTCH: ;Read Scratchpad [BEh]
MOV R0,#20H ;9BYTES DATA =>20H-28H
MOV A,#0BEH
LCALL RD9BYTE
RET
CONVERT: ;Convert T [44h]
MOV A,#44H
LCALL WRBYTE
RET
;-------------------------------------------------------------------
RESET: MOV R6,#10H ;RESET 1820
CLR DQ
LCALL DELAY_600
SETB DQ
LCALL DELAY_60
LOOP: JNB DQ,RSTEND
LCALL DELAY_15
DJNZ R6,LOOP
SJMP RESET
RSTEND: JNB DQ,$
RET
;-------------------------------------------------------------------
RD9BYTE:
LCALL WRBYTE
LCALL DELAY_15
MOV R6,#2 ;READ 9BYTES DATA
RD_LOP: MOV R5,#8
RT_LOP: SETB DQ
LCALL DELAY_45 ;H 45US
CLR DQ ;L 2US
NOP
SETB DQ ;H 15US
LCALL DELAY_15
MOV C,DQ
RRC A
LCALL DELAY_45
DJNZ R5,RT_LOP
MOV @R0,A
INC R0
DJNZ R6,RD_LOP
RET
;--------------------------------------------------------------------
WRBYTE: MOV R6,#8 ;WRITR 1 BYTE
WB_LOP: CLR DQ
LCALL DELAY_15
RRC A
MOV DQ,C
LCALL DELAY_45
SETB DQ
LCALL DELAY_15
DJNZ R6,WB_LOP
RET
DELAY_60: MOV R7,#30
DJNZ R7,$
RET
DELAY_45: MOV R7,#28
DJNZ R7,$
RET
DELAY_30: LCALL DELAY_15
DELAY_15: MOV R7,#2
DJNZ R7,$
RET
DELAY_600: MOV R7,#250
DJNZ R7,$
RET
DELAY1s: MOV R7,#0AH
W1: MOV R6,#0C8H
W2: MOV R5,#0FAH
W3: DJNZ R5,W3
DJNZ R6,W2
DJNZ R7,W1
RET
;--------------------------------------------------------------------
MATH:
MOV R0,20H ;R0中存入温度低字节
MOV R1,21H ;R1中存入温度高字节
CLR C
MOV R2,#04H
RM: MOV A,R1 ;将整数温度移动到R0中进行BCD转换
RRC A
MOV R1,A
MOV A,R0
RRC A
MOV R0,A
CLR C
DJNZ R2,RM
LCALL B2BCD
LM: MOV A,20H ;将温度小数位移动到36H处进行BCD转换
SWAP A
ANL A,#0F0H
MOV 36H,A
LCALL BMDBCD
RET
;------转换整数温度为BCD码------
B2BCD: MOV A,R0
MOV B,#64H ;除以100
DIV AB
; MOV R5,A ;温度百位BCD码,一般情况下没有用处
MOV 39H,A
MOV A,#0AH ;除以10
XCH A,B
DIV AB
MOV DISP10,A
MOV A,B
ORL A,#80H
MOV DISP1,A
RET
;------转换小数温度为BCD码------
BMDBCD:
MOV R0,36H ;二进制小数存储地址
MOV R7,#01H ;二进制字节数
MOV R6,#02H ;压缩BCD占用字节数
MOV R1,#37H ;压缩BCD码低字节地址
MOV A,R0
MOV R4,A
MOV A,R1
MOV R5,A
MOV A,R6
MOV R3,A
CLR A
CLBCD:
MOV @R1,A
INC R1
DJNZ R3,CLBCD
MOV A,R6
RL A
MOV R3,A
LP0: MOV A,R4
MOV R0,A
MOV A,R7
MOV R2,A
MOV R1,#00H
CLR C
LP1: MOV A,@R0
MOV B,#0AH
PUSH PSW
MUL AB
POP PSW
ADDC A,R1
MOV @R0,A
MOV R1,B
INC R0
DJNZ R2,LP1
MOV A,R1
ADDC A,#00H
MOV R1,A
MOV A,R6
MOV R2,A
MOV A,R5
MOV R0,A
LP2: MOV A,@R0
SWAP A
MOV @R0,A
XCH A,R1
XCHD A,@R0
INC R0
DJNZ R2,LP2
DJNZ R3,LP0
MOV A,R5
MOV R1,A
MOV R2,38H ;R2中为小数压缩BCD高字节
MOV R3,37H ;R3中为小数压缩BCD低字节
;------压缩BCD转换为一般BCD------
MOV A,R2
SWAP A
ANL A,#0FH
MOV DISPTENTH,A
MOV A,R2
ANL A,#0FH
MOV DISPCENTI,A
RET
;-------------------------------------------------------------
DISPLAY:
MOV R0,#00H
MOV R1,#0CH
LCALL SENDMAX7219 ;关断寄存器0CH D0位送0,处于关断状态
LCALL YAN ;延时
MOV R0,#00H
MOV R1,#0FH
LCALL SENDMAX7219 ;测试寄存器0FH送0,处于正常显示态
MOV R0,#0FH
MOV R1,#09H
LCALL SENDMAX7219 ;译码控制寄存器09H送0FH,0-7位处于译码态
MOV R0,#03H
MOV R1,#0BH
LCALL SENDMAX7219 ;扫描数量(界限)寄存器0BH送07H,表示
MOV R0,#08H
MOV R1,#0AH
LCALL SENDMAX7219 ;亮度控制寄存器0AH送08H,处于半亮态
MOV R0,#01H
MOV R1,#0CH
LCALL SENDMAX7219 ;关断寄存器0CH D0位送1,退出关断状态
MOV R0,DISP10
MOV R1,#01H
LCALL SENDMAX7219 ;给第1位数码管送数字
MOV R0,DISP1
MOV R1,#02H
LCALL SENDMAX7219 ;给第2位数码管送数字
MOV R0,DISPTENTH
MOV R1,#03H
LCALL SENDMAX7219 ;给第3位数码管送数字
MOV R0,DISPCENTI
MOV R1,#04H
LCALL SENDMAX7219 ;给第4位数码管送数字
RET
;------设置MAX7219子程序------
SENDMAX7219: MOV R2,#08H ;移位数目八位
MOV A,R1 ;取出要送的数
LOOP1: RLC A
MOV DIN2,C
CLR CLK ;时钟拉低
NOP
NOP
NOP
NOP
NOP
SETB CLK ;时钟变高,单位读入
DJNZ R2,LOOP1 ;八位未完,继续循环
MOV A,R0 ;取出要送的数
MOV R2,#08H ;移位数目八位
LOOP2: RLC A
MOV DIN2,C
CLR CLK ;时钟拉低
NOP
NOP
NOP
NOP
NOP
SETB CLK ;时钟变高
DJNZ R2,LOOP2 ;八位未完,继续循环
CLR LOAD ;LOAD拉低
NOP
NOP
NOP
NOP
SETB LOAD ;LOAD变高,全部16位读入
RET
;------延时450us------
YAN: MOV R0,#0E0H
YY: DJNZ R0,YY
RET
INTER1: LCALL GET_TEMPER
; LCALL DISPLAY
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -