📄 多点测温.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LU EQU 40H
LU1 EQU 30H
LU2 EQU 38H ;存放第二个1820数据序列号地址
LATCH EQU P1.7 ;595放数
DAT BIT P1.6 ;18B20的数据端
SHU EQU P1.5 ;595数据输入
CP EQU P1.2 ;595时钟输入
TH EQU 100 ;高温报警点100
TL EQU 0 ;低温报警点0
WDG8 DATA 23H ;温度高8位
WDD8 DATA 24H ;温度低8位
WDXS1 DATA 43H ;用三位温度显示
WDXS2 DATA 44H
WDXS3 DATA 45H
POINT BIT 7FH ;小数点标志位,该位为1表示有小数点
K1 BIT P3.1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
LJMP START
ORG 0030H
START: LCALL CRAM
CLR LATCH
MOV DPTR,#TAB
;此处写入ROM1序号
MOV 30H,#28H
MOV 31H,#80H
MOV 32H,#0A4H
MOV 33H,#6EH
MOV 34H,#00H
MOV 35H,#00H
MOV 36H,#00H
MOV 37H,#5DH
;ROM2序号
MOV 38H,#28H
MOV 39H,#3AH
MOV 3AH,#0F6H
MOV 3BH,#78H
MOV 3CH,#01H
MOV 3DH,#00H
MOV 3EH,#00H
MOV 3FH,#19H
XSS: MOV 70H,#004H
XS: LCALL INT ;初始化
LCALL DISPLAY ;显示
LCALL RESET
MOV A,#055H ;Match ROM 1
LCALL WRITE
MOV LU,#01H
MOV R0,#LU1 ;R0保存序列号的初始地址
MOV R7,#08H
LOOP: MOV A,@R0
LCALL WRITE
INC R0
DJNZ R7,LOOP
LCALL READT
LCALL SJZH_1820
LCALL DISPLAY ;显示
LCALL DELAY
DJNZ 70H,XS
MOV 70H,#04H
XS1: LCALL INT ;初始化
LCALL DISPLAY ;显示
LCALL RESET
MOV A,#055H ;Match ROM 1
LCALL WRITE
MOV LU,#02H
MOV R0,#LU2 ;R0保存序列号的初始地址
MOV R7,#08H
LOOP1: MOV A,@R0
LCALL WRITE
INC R0
DJNZ R7,LOOP1
LCALL READT
LCALL SJZH_1820
LCALL DISPLAY ;显示
LCALL DELAY
DJNZ 70H,XS1
LJMP XSS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INT: LCALL RESET ;初始化
MOV A,#0CCH ;跳过ROM
LCALL WRITE
MOV A,#4EH ;写暂存存储器
LCALL WRITE
MOV A,#TH ;高温报警点
LCALL WRITE
MOV A,#TL ;低温报警点
LCALL WRITE
MOV A,#7FH ;取12位精度
LCALL WRITE
LCALL RESET ;调用初使化子程序
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A, #44H
LCALL WRITE ;送入温度转换命令
RET
;;;;;;;;;;;;;;;;;;;数据转换;;;;;;;;;;;;;;;;;;
SJZH_1820: CLR POINT ;;清温度小数点标志位
MOV A,WDG8
JNB ACC.3,WDZS ;;判断正负
WDFU: ;;温度负
MOV A,#00H
SUBB A,WDD8 ;;先减低8位
MOV WDD8,A
MOV A,#00H
SUBB A,WDG8
MOV WDG8,A
MOV WDXS1,#0AH ;存放"-"号代码的位置在表的第十一个
MOV A,WDG8
ANL A,#07H
SWAP A
MOV WDG8,A
MOV A,WDD8
ANL A,#0F0H
SWAP A
ORL A,WDG8
MOV WDG8,A
CLR C
CJNE A,#10,WD_NEXT
WD_NEXT:JNC WD_WUXIAOSHU
SETB POINT
MOV WDXS2,WDG8 ;;有小数部分时显示"-8.2"
;;小数部分
MOV A,WDD8 ;;温度的低8字节
ANL A,#0FH ;;小数部分乖10除16,取商
MOV B,#10
MUL AB ;;BA
MOV B,#16
DIV AB ;;商A余B
MOV WDXS3,A
RET
WD_WUXIAOSHU: ;温度无小数部分
MOV B,#10H
DIV AB
MOV WDXS2,A
MOV WDXS3,B
RET
WDZS: ;;温度为正数
MOV A,WDG8
ANL A,#07H
SWAP A
MOV WDG8,A
MOV A,WDD8
ANL A,#0F0H
SWAP A
ORL A,WDG8
MOV WDG8,A
MOV B,#100
DIV AB
JNZ BAIDU ;;A不为0则上百度的温度
SETB POINT ;置有小数点标志位
MOV A,B
MOV B,#10
DIV AB
MOV WDXS1,A
MOV WDXS2,B
;;;;计算小数部分
MOV A,WDD8 ;;温度的低8字节
ANL A,#0FH ;;小数部分乖10除16,取商
MOV B,#10
MUL AB ;;BA
MOV B,#16
DIV AB ;;商A余B
MOV WDXS3,A
RET
BAIDU: MOV WDXS1,#01H
MOV A,B
MOV B,#10H
DIV AB
MOV WDXS2,A
MOV WDXS3,B
RET
;;;;;;;;;;;;;;;;;;;显示;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY:MOV A,LU
MOVC A,@A+DPTR
LCALL FS
MOV A,WDXS1
CJNE A,#00H,ZZE ;温度第一位为0时显示为黑
MOV A,#0FFH
AJMP ZZZ
ZZE: MOVC A,@A+DPTR
ZZZ: LCALL FS
MOV A,WDXS2 ;温度第二位在100以上,-10以下不带小数点,其它情况都带点
MOVC A,@A+DPTR
JNB POINT,ZZZZ
CLR ACC.7 ;小数点为ACC。7,共阳数码管
ZZZZ: LCALL FS
MOV A,WDXS3
MOVC A,@A+DPTR
LCALL FS
CLR LATCH
NOP
SETB LATCH
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FS: MOV R3,#08H ;发一位数码管
Y8C:RRC A
CLR CP
MOV SHU,C
SETB CP
DJNZ R3,Y8C ;移8次
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
READT: MOV A,#0BEH
LCALL WRITE ;送入读温度暂存器命令
LCALL READ
MOV 24H,A ;读出温度值低字节存入24H
LCALL READ
MOV 23H,A ;读出温度值高字节存入23H
LCALL RESET
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
READ : MOV R6,#08H
RD1: CLR DAT
MOV R5,#6
NOP
SETB DAT
DJNZ R5,$ ;延时12us
MOV C,DAT
RRC A
MOV R4,#30 ;延时60us
DJNZ R4,$
DJNZ R6,RD1
SETB DAT
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRITE: MOV R6,#8
WT1: SETB DAT
MOV R5,#8
RRC A
CLR DAT
DJNZ R5,$ ;延时16us
MOV DAT,C
MOV R4,#30 ;延时60us
DJNZ R4,$
DJNZ R6,WT1 ;移位8次
SETB DAT
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESET: CLR DAT
MOV R7,#250
DJNZ R7,$ ;保持低电平500us
SETB DAT
MOV R7,#30
RE0: JNB DAT,RE1
DJNZ R7,RE0 ;释放等待16~60us
LJMP RE2
RE1: SETB 00H ; 置标志位,表示DS1820存在
LJMP RE3
RE2: CLR 00H ; 清标志位,表示DS1820不存在
LJMP RE4
RE3: MOV R7,#240
DJNZ R7,$
RE4: RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CRAM: MOV R7,#60H ;清内存
MOV A,#00H
MOV R1,#23H
CRAM1: MOV @R1,A
INC R1
DJNZ R7,CRAM1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY: MOV 7DH,#4 ;每秒发一次数据
DL3: MOV 7FH,#0E0H
DL1: MOV 7EH,#00H
DL2: DJNZ 7EH,DL2
DJNZ 7FH,DL1
DJNZ 7DH,DL3
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TAB: ;0-9
DB 081H,0CFH,092H,086H,0CCH,0A4H,0A0H,08FH,080H,084H
; "-"
DB 0FEH
;A,b,C,d,E,F
DB 088H,0e0H,0B1H,0C2H,0B0H,0B8H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -