📄 数字温度计.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; ;;;;;;
;;;; 数字温度计 ;;;;;;
;;;; ;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;定义;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
b_bit EQU 0AAH
a_bit EQU 0ABH
TIMEL EQU 0E0H
TIMEH EQU 0B1H
TEMPHEAD EQU 36H
BITST DATA 20H
TEMPL DATA 26H
TEMPH DATA 27H
TEMPHC DATA 28H
TEMPLC DATA 29H
I_O1820 BIT P2.2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
LJMP START
ORG 100H
;;;;;;;;;;;;;初始化;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START:MOV SP,#60H
CLSRAM:MOV R0,#20H
MOV R1,#60H
CLSRAM1:MOV @R0,#00H
INC R0
DJNZ R1,CLSRAM1
MOV SCON,#00H
SJMP INIT
ERROR:NOP
LJMP START
NOP
INIT:NOP
MOV PSW,#00H
SJMP MAIN
;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN:NOP
LCALL DISP1
LCALL START_TEMP
LCALL read_temp
LCALL cont_temp
LCALL DISPBCD
LCALL DISP1
MAIN2:
LJMP MAIN
;;;;;;;;;;;;;;;18B20复位;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
reset:SETB I_O1820
NOP
NOP
CLR I_O1820
MOV R6,#0A0H
DJNZ R6,$
MOV R6,#0A0H
DJNZ R6,$
SETB I_O1820
MOV R6,#32H
DJNZ R6,$
MOV R6,#3CH
LOOP1820:MOV C,I_O1820
JC resetOUT
DJNZ R6,LOOP1820
MOV R6,#64H
DJNZ R6,$
SJMP reset
RET
resetout:SETB I_O1820
RET
;;;;;;;;;;;;;;;;读ds1820一字节;;;;;;;;;;;;;;;;;;;;;
read:MOV R7,#08
SETB I_O1820
NOP
NOP
readLOOP:CLR I_O1820
NOP
NOP
NOP
SETB I_O1820
MOV R6,#07
DJNZ R6,$
MOV C,I_O1820
MOV R6,#3CH
DJNZ R6,$
RRC A
SETB I_O1820
DJNZ R7,readLOOP
MOV R6,#3CH
DJNZ R6,$
RET
;;;;;;;;;;;;;;;;写DS18B20一字节;;;;;;;;;;;;;;;;;;;;;
write:MOV R7,#08H
SETB I_O1820
NOP
NOP
writeLOP:CLR I_O1820
MOV R6,#07H
DJNZ R6,$
RRC A
MOV I_O1820,C
MOV R6,#34H
DJNZ R6,$
SETB I_O1820
DJNZ R7,writeLOP
RET
;;;;;;;;;;;;温度转换命令;;;;;;;;;;;;;;;;;;;;;;;;;
START_TEMP:
LCALL reset
MOV A,#0CCH
LCALL write
MOV R6,#34H
DJNZ R6,$
MOV A,#44H
LCALL write
MOV R6,#34H
DJNZ R6,$
RET
;;;;;;;;;;;;读取温度;;;;;;;;;;;;;;;;;;;;;;;;;
read_temp:LCALL reset
MOV A,#0CCH
LCALL write
MOV R6,#34H
DJNZ R6,$
MOV A,#0BEH
LCALL write
MOV R6,#34H
DJNZ R6,$
MOV R5,#02H
MOV R0,#TEMPHEAD
MOV B,#00H
START_TEMP2:LCALL read
MOV @R0,A
INC R0
DJNZ R5,START_TEMP2
MOV A,TEMPHEAD+0
MOV TEMPL,A
MOV A,TEMPHEAD+1
MOV TEMPH,A
START_TEMPOUT:RET
;;;;;;;;;;;;温度数据处理;;;;;;;;;;;;;;;;;;;;;;;;;
cont_temp:MOV A,TEMPH
ANL A,#80H
JZ TEMPC1
CLR C
MOV A,TEMPL
CPL A
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A
MOV TEMPHC,#0BH
SJMP TEMPC11
TEMPC1:MOV TEMPHC,#0AH
TEMPC11:MOV A,TEMPHC
SWAP A
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR
MOV TEMPLC,A
MOV A,TEMPL
ANL A,#0F0H
SWAP A
MOV TEMPL,A
MOV A,TEMPH
ANL A,#0FH
SWAP A
ORL A,TEMPL
LCALL HEX2BCD1
MOV TEMPL,A
ANL A,#0F0H
SWAP A
ORL A,TEMPHC
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH
SWAP A
ORL A,TEMPLC
MOV TEMPLC ,A
MOV A,R7
JZ TEMPC12
ANL A,#0FH
SWAP A
MOV R7,A
MOV A,TEMPHC
ANL A,#0FH
ORL A,R7
MOV TEMPHC,A
TEMPC12:RET
TEMPDOTTAB:DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
DISPBCD:MOV A,TEMPLC
ANL A,#0FH
MOV 70H,A
MOV A,TEMPLC
SWAP A
ANL A,#0FH
MOV 71H,A
MOV A,TEMPHC
ANL A,#0FH
MOV 72H,A
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,A
MOV A,TEMPHC
ANL A,#0F0H
CJNE A,#010H,DISPBCD0
SJMP DISPBCD2
DISPBCD0:MOV A,TEMPHC
ANL A,#0FH
JNZ DISPBCD2
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,#0AH
MOV 72H,A
DISPBCD2:RET
;;;;;;;;;;;;;;;;;;;显示;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP1: MOV P1,#00H
mov a,29H;将29H中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
mov dptr,#tab ;指定查表启始地址
mov r0,#4
dpl1: mov r1,#250 ;显示1000次
dplop: mov a,a_bit ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
mov p1,a ;送出个位的7段代码
clr p3.7 ;开个位显示
acall d1ms ;显示1ms
setb p3.7
mov a,b_bit ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
mov p1,a ;送出十位的7段代码
clr p3.6 ;开十位显示
acall d1ms ;显示1ms
setb p3.6
djnz r1,dplop ;100次没完循环
djnz r0,dpl1 ;4个100次没完循环
;1MS延时
D1MS: MOV R7,#80
DJNZ R7,$
RET
;实验板上的7段数码管0~9数字的共阴显示代码
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TAB: DB 3fh,06h,5bh,4fh,66h,6dh,7dh,27h,7fh,6fh,80h,0FFH,00H
; "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮"-" ---共阴段码表
DL1MS:MOV R6,#14H
DL1:MOV R7,#19H
DL2:DJNZ R7,DL2
DJNZ R6,DL1
RET
;;;;;;;;;;;;;;;;;;;;;BCD码调整;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HEX2BCD1:MOV B,#064H
DIV AB
MOV R7,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -