📄 tmp.asm
字号:
;以下程序测试控制程序
;
TIME0 EQU 0FC67H ;1MS
LEDPORT EQU P0
NOWTMPH EQU 30H ;现在测到的温度整数部分
NOWTMPL EQU 31H ;现在测到的温度的小数部分
DPLED1 EQU 32H ;显示LED第1位
DPLED2 EQU 33H ;显示LED第2位
DPLED3 EQU 34H ;显示LED第3位
LEDCOUNT EQU 35H ;LED扫描计数器
TMPCOUNT EQU 36H
T0COUNT EQU 37H
DS1820H EQU 38H
DS1820L EQU 39H
W1_PORT BIT P3.4 ;1820接到的口线
;***********************************************************
E BIT P3.5 ;LCD口线的定义
RW BIT P3.6
RS BIT P3.7
DSOKBIT BIT 02H ;1820在线上标志
GET1_2BIT BIT 03H ;是发转换指令,还是读温度
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIME0_1
;以下为主程序的开始,完成对内存变量的初始化
ORG 0100H
MAIN: CLR E ;取消LCD对LED的影响
CLR RW
SETB RS
MOV R0,#20H
CLR0: MOV @R0,#00H
INC R0
CJNE R0,#60H,CLR0
MOV TH0,#HIGH(TIME0)
MOV TL0,#LOW(TIME0)
MOV TMOD,#01H
SETB TR0
MOV IE,#82H
MOV T0COUNT,#14H
MOV TMPCOUNT,#0AH
MAIN4: ORL PCON,#01H
AJMP MAIN4
;以下为定时器中断程序
ORG 0200H
TIME0_1: MOV TH0,#HIGH(TIME0)
MOV TL0,#LOW(TIME0)
DJNZ T0COUNT,TODISPM
MOV T0COUNT,#14H
TIME0_2: DJNZ TMPCOUNT,TODISPM
MOV TMPCOUNT,#0AH ;每200MS测一次温度
AJMP TPTMP_ST
TODISPM: AJMP TODISP
;开始测1820的温度
TPTMP_ST: JB GET1_2BIT,GETTP2
LCALL GET_TMPER_1
AJMP JS_TMP
GETTP2: LCALL GET_TMPER_2
JS_TMP: MOV A,DS1820H
ANL A,#0FH
SWAP A
MOV B,A
MOV A,DS1820L
ANL A,#0F0H
SWAP A
ORL A,B
MOV NOWTMPH,A
MOV A,DS1820L
ANL A,#0FH
MOV B,#0AH ;X10先算出小数点后一位
MUL AB
MOV B,A
ANL A,#0F0H ;再除16,就是向右移4位
SWAP A
MOV NOWTMPL,A
MOV A,B
ANL A,#0FH
MOV B,#0AH ;再把余数X10
MUL AB
ANL A,#0F0H ;小数点后第二位四舍五入
SWAP A
CJNE A,#05H,JS_TMP1
JS_TMP1: JC TODISP
INC NOWTMPL
MOV A,NOWTMPL
CJNE A,#0AH,TODISP
MOV NOWTMPL,#00H
INC NOWTMPH
TODISP: NOP
;显示当前测到的温度
DISPNOW:
MOV A,NOWTMPH
MOV B,#0AH
DIV AB
ANL A,#0FH
MOV DPLED1,A
MOV A,B
ANL A,#0FH
MOV DPLED2,A
MOV A,NOWTMPL
ANL A,#0FH
MOV DPLED3,A
JB DSOKBIT,TODISP_1
MOV DPLED1,#10H
MOV DPLED2,#10H
MOV DPLED3,#10H
;开始进行扫描显示
TODISP_1: MOV LEDPORT,#0FFH ;先关闭显示
INC LEDCOUNT
MOV A,LEDCOUNT
CJNE A,#03H,TODPLED2
MOV LEDCOUNT,#00H
MOV P2,#0F7H
MOV DPTR,#0700H
MOV A,DPLED1
MOVC A,@A+DPTR
AJMP TOLEDPORT
TODPLED2: CJNE A,#01H,TODPLED3
MOV P2,#0EFH
MOV DPTR,#0700H
MOV A,DPLED2
MOVC A,@A+DPTR
CLR ACC.7
AJMP TOLEDPORT
TODPLED3: MOV P2,#0DFH
MOV DPTR,#0700H
MOV A,DPLED3
MOVC A,@A+DPTR
TOLEDPORT: MOV LEDPORT,A
TIME0_RE: RETI
;测18B20要用到的子程序
;DS复位初始化程序
INIT_1820: SETB W1_PORT
NOP
CLR W1_PORT
MOV R1,#03H
TSR1: MOV R0,#6BH
DJNZ R0,$
DJNZ R1,TSR1
SETB W1_PORT
NOP
NOP
NOP
MOV B,#25H
TSR2: JNB W1_PORT,TSR3
DJNZ B,TSR2
LJMP TSR4
TSR3: SETB DSOKBIT ;表示DS1820存在
LJMP TSR5
TSR4: CLR DSOKBIT ;表示DS1820不存在
LJMP TSR7
TSR5: MOV B,#117
DJNZ B,$
TSR7: SETB W1_PORT
RET
;读出转换后的温度值
GET_TMPER_1: SETB W1_PORT ;发出转换命令,要780MS才能转换完成
LCALL INIT_1820
JB DSOKBIT,TSS2
CLR GET1_2BIT
RET
TSS2: MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
SETB GET1_2BIT
MOV TMPCOUNT,#32H ;要780MS才能转换完成,就等1S后读
RET
GET_TMPER_2: LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH
LCALL WRITE_1820
LCALL READ_1820 ;将读出的温度数据保存在DS1820H,DS1820L
CLR GET1_2BIT
RET
;写DS1820的子程序
WRITE_1820: MOV R2,#08H
CLR C
WR1: CLR W1_PORT
MOV R3,#05H
DJNZ R3,$
RRC A
MOV W1_PORT,C ;把数据写到1W总线上
MOV R3,#15H
DJNZ R3,$
SETB W1_PORT
NOP
DJNZ R2,WR1
SETB W1_PORT
RET
;读DS1820的子程序
READ_1820: MOV R2,#08H
RE01: CLR C
SETB W1_PORT
NOP
NOP
CLR W1_PORT
NOP
NOP
NOP
SETB W1_PORT
MOV R3,#08H
DJNZ R3,$
MOV C,W1_PORT
MOV R3,#15H
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV DS1820L,A
MOV R2,#08H
RE02: CLR C
SETB W1_PORT
NOP
NOP
CLR W1_PORT
NOP
NOP
NOP
SETB W1_PORT
MOV R3,#08H
DJNZ R3,$
MOV C,W1_PORT
MOV R3,#15H
DJNZ R3,$
RRC A
DJNZ R2,RE02
MOV DS1820H,A
RET
;重新写DS1820暂存存储器设定值
RE_CONFIG: JB DSOKBIT,RE_CONFIG1
RET
RE_CONFIG1: MOV A,#0CCH ;发SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH ;发写暂存存储器命令
LCALL WRITE_1820
MOV A,#00H
LCALL WRITE_1820
MOV A,#00H
LCALL WRITE_1820
MOV A,#7FH
LCALL WRITE_1820
RET
ORG 0700H
;8字LED的连接方法
;P0.7 P.06 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0
; H G F E D C B A
;LED字段码表
LEDCODE: DB 0C0H ;0
DB 0F9H ;1
DB 0A4H ;2
DB 0B0H ;3
DB 99H ;4
DB 92H ;5
DB 82H ;6
DB 0F8H ;7
DB 80H ;8
DB 90H ;9
DB 88H ;A
DB 83H ;B
DB 0C6H ;C
DB 0A1H ;D
DB 86H ;E
DB 8EH ;F
DB 0BFH ;-
DB 0FFH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -