📄 单点测温.asm
字号:
LATCH EQU P1.7 ;595放数
SHU EQU P1.5 ;595数据输入
CP EQU P1.2 ;595时钟输入
DAT_1820 BIT P1.6 ;18B20的数据端
TH EQU 100 ;高温报警点100
TL EQU 0 ;低温报警点0
WDG8 DATA 30H ;温度高8位
WDD8 DATA 31H ;温度低8位
WDXS1 DATA 33H ;;用三位温度显示
WDXS2 DATA 34H
WDXS3 DATA 35H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;要注意的问题,此程序用了两个0~9的表格,即,先是不带带的0~9,后面是带小数点的0~9
;;表格的最后面,即第21个数据为"-"号,负号,在零下时候使用
;;计算过程中用到了 WDG8,WDD8,WDXS1,WDXS2,WDXS3,A,B,R0,R4,R5,R6,R7和延时里面的单元
;;端口用了一个18B20的一个数据端口,和595的放数端口,显示为三位显示
;;显示格式例如:-10度,-2.5度,05.5度,22.3度,100度
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
LJMP START
ORG 0030H
START: LCALL CRAM
CLR LATCH
MOV DPTR,#TAB
LCALL INT_1820 ;初始化
LCALL DISPLAY ;显示
LOOP: LCALL READT_1820 ;读温度
LCALL SJZH_1820
LCALL DISPLAY ;显示
LCALL DELAY
LCALL INT_1820 ;初始化
LJMP LOOP
;;;;;;;;;;;;;;;;;;;数据转换;;;;;;;;;;;;;;;;;;
SJZH_1820:
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,#15H ;存放"-"号代码的位置在表的第二十一个,即15H
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
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则上百度的温度
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 DPTR,#TAB
MOV A,WDXS1
MOVC A,@A+DPTR
LCALL FS
MOV A,WDXS1
MOVC A,@A+DPTR
LCALL FS
MOV A,WDXS2
MOVC A,@A+DPTR
CLR ACC.7
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INT_1820:
LCALL RESET_1820 ;初始化
MOV A,#0CCH ;跳过ROM
LCALL WRITE_1820
MOV A,#4EH
LCALL WRITE_1820
MOV A,#TH ;高温报警点
LCALL WRITE_1820
MOV A,#TL ;低温报警点
LCALL WRITE_1820
MOV A,#7FH ;取12位精度
LCALL WRITE_1820
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CRAM: MOV R7,#60H ;清内存
MOV A,#00H
MOV R0,#23H
CRAM1: MOV @R0,A
INC R0
DJNZ R7,CRAM1
RET
READT_1820:
LCALL RESET_1820 ;调用初使化子程序
MOV A,#0CCH
LCALL WRITE_1820 ;送入跳过ROM命令
MOV A, #44H
LCALL WRITE_1820 ;送入温度转换命令
LCALL RESET_1820 ;温度转换完全,再次初使化ds1820
MOV A,#0CCH
LCALL WRITE_1820 ;送入跳过ROM命令
MOV A,#0BEH
LCALL WRITE_1820 ;送入读温度暂存器命令
LCALL READ_1820
MOV WDD8,A ;读出温度值低字节存入24H
LCALL READ_1820
MOV WDG8,A ;读出温度值高字节存入23H
LCALL RESET_1820
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRITE_1820: MOV R6,#8
WT1: SETB DAT_1820
MOV R5,#8
RRC A
CLR DAT_1820
DJNZ R5,$ ;延时16us
MOV DAT_1820,C
MOV R4,#30 ;延时60us
DJNZ R4,$
DJNZ R6,WT1 ;移位8次
SETB DAT_1820
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
READ_1820: MOV R6,#08H
RD1: CLR DAT_1820
MOV R5,#6
NOP
SETB DAT_1820
DJNZ R5,$ ;延时12us
MOV C,DAT_1820
RRC A
MOV R4,#30 ;延时60us
DJNZ R4,$
DJNZ R6,RD1
SETB DAT_1820
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESET_1820: CLR DAT_1820
MOV R7,#250
DJNZ R7,$ ;保持低电平500us
SETB DAT_1820
MOV R7,#30
RE0: JNB DAT_1820,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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY: MOV 7DH,#8 ;每秒发一次数据
DL3: MOV 7FH,#00H
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
;A,b,C,d,E,F
DB 088H,0e0H,0B1H,0C2H,0B0H,0B8H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -