📄 ds18b20.asm
字号:
;这是一个使用DS18B20集成数字温度传感器(参见DS18B20.PDF)测量温度的实用程序.
;第1,2个数码管显示温度值
;硬件:将P1.0口线的跳线器置焊盘位置(下方),连接DS18B20,即可.
;本程序使用DS18B20的12位单点采样模式,采样周期约0.8秒钟,每按键一次就采样一次!
;程序编制人:蔡祥荣 2004/06/20
;----------------------------------------------------------------------------------
TEMP EQU 21H ;当前温度值
BUFF_LED1 EQU 22H ;数码管显示缓存
BUFF_LED2 EQU 23H
BUFF_LED3 EQU 24H
BUFF_LED4 EQU 25H
BUFF_LED5 EQU 26H
BUFF_LED6 EQU 27H
BUFF_LED_LP EQU 28H ;T0键盘显示扫描缓存
BUFF_1820L EQU 30H
BUFF_1820H EQU 31H
F_BEEP BIT 01H
LED_PORT EQU P0
DIG_PORT EQU P2
KEY_PORT EQU P2
KEY BIT P3.3
BEEP BIT P2.0
DS18B20 BIT P1.0
org 000h
JMP main
ORG 00BH
JMP T0_INT
ORG 100H
main:MOV SP ,#40H
MOV PSW,#00H
MOV TMOD,#21h
MOV TH0,#240 ;T0=4MS
MOV TL0,#96
SETB TR0
SETB ET0
SETB EA
MOV R0,#7FH ;初始化RAM区,
CLR_RAM:MOV A,#00H
MOV @R0,A
DJNZ R0,CLR_RAM
MOV P1,0FFH ;INIT
MOV P2,0FFH
MOV P0,0FFH
MOV P3,0FFH
MOV BUFF_LED3,#10H ;将数码管LED3-LED6消隐
MOV BUFF_LED4,#10H
MOV BUFF_LED5,#10H
MOV BUFF_LED6,#10H
WAIT_KEY:JB KEY,$ ;等候按键
SETB F_BEEP
CLR BEEP
LCALL GET_TEMP
LCALL BIN_BCD
MOV BUFF_LED2,B
MOV BUFF_LED1,A
CLR F_BEEP
JMP WAIT_KEY
DEL: MOV R5,#02 ;为演示方便,人为插入的延时
DEL01: MOV R6,#200
DEL02: MOV R7,#200
DJNZ R7,$
DJNZ R6,DEL02
DJNZ R5,DEL01
RET
BIN_BCD: MOV B,#10
DIV AB
RET
;---------------------(ds18b20) 访问子程序,时序参见TRANSDATA.PDF文件----------------------------
DS_hart_RST:CLR DS18B20 ;总线复位
MOV R6,#250 ;>DELAY 480US
DJNZ R6,$
setb ds18B20
MOV R6,#40 ;>DELAY 60US
DJNZ R6,$
mov c,dS18B20
MOV R6,#250 ;>DELAY 480US
DJNZ R6,$
setb DS18B20
RET
DS_hart_RD_BYTE: ;读取一字节数据
MOV R5,#08H
RD_HART_BYTE_LP:
NOP
NOP
CLR DS18B20
NOP
NOP
SETB DS18B20
MOV R6,#06
DJNZ R6,$ ;<DELAY 15US
MOV C,DS18B20
RRC A
MOV R6,#40 ;>DELAY 60US
DJNZ R6,$
DJNZ R5,RD_HART_BYTE_LP
RET
DS_HART_WR_BYTE: ;写入一字节指令
MOV R5,#08H
CLR C
WR_HART_BYTE_LP:
nop
nop
CLR DS18B20
NOP
NOP
RRC A
MOV R6,#06
DJNZ R6,$
setb ds18B20
MOV DS18B20,C
MOV R6,#40 ;>DELAY 60US
DJNZ R6,$
SETB DS18B20
DJNZ R5,WR_HART_BYTE_LP
RET
GET_TEMP: LCALL DS_HART_RST
MOV A,#0CCH
LCALL DS_HART_WR_BYTE
MOV A,#44H
LCALL DS_HART_WR_BYTE
SETB DS18B20
lcall del ;WAIT 750ms
lcall del
LCALL DS_HART_RST
MOV A,#0CCH
LCALL DS_HART_WR_BYTE
MOV A,#0BEH
LCALL DS_HART_WR_BYTE
MOV R4,#02
MOV R1,#BUFF_1820L
SUB_HART_LP1:LCALL DS_HART_RD_BYTE ;读18B20低BYTE(BUFF_1820L)
MOV @R1,A
INC R1 ;读18B20高BYTE(BUFF_1820H)
DJNZ R4,SUB_HART_LP1
setb ds18B20
MOV A,BUFF_1820L
ANL A,#0FH
CJNE A,#10,JUD_HART_INC1 ;四舍五入
JMP JUD_HART_EQU
JUD_HART_INC1:JC JUD_HART_EQU
MOV A,BUFF_1820L
ADD A,#10H
MOV BUFF_1820L,A
MOV A,BUFF_1820H
ADDC A,#00H
MOV BUFF_1820H,A
JUD_HART_EQU:MOV A,BUFF_1820L
ANL A,#0F0H
SWAP A
MOV BUFF_1820L,A
MOV A,BUFF_1820H
ANL A,#0FH
SWAP A
ADD A,BUFF_1820L
CJNE A,#85,END_HART
RET
END_HART: MOV TEMP,A
RET
;------------- T0 INTRRUPT 数码管扫描定时中断---------------------------
T0_INT: PUSH ACC
PUSH PSW
MOV TH0,#240 ;T0=4MS
MOV TL0,#96
INC BUFF_LED_LP
MOV A,BUFF_LED_LP
CJNE A,#06,CONT_SCAN ;250*4MS=1S
MOV BUFF_LED_LP,#00H
CONT_SCAN:MOV A,BUFF_LED_LP
RL A
MOV DPTR,#TAB_SCAN
JMP @A+DPTR
TAB_SCAN: AJMP SCAN_L1
AJMP SCAN_L2
AJMP SCAN_L3
AJMP SCAN_L4
AJMP SCAN_L5
AJMP SCAN_L6
SCAN_L1: MOV DIG_PORT,#01111111B
MOV A,BUFF_LED1
JMP END_SCAN
SCAN_L2: MOV DIG_PORT,#10111111B
MOV A,BUFF_LED2
JMP END_SCAN
SCAN_L3: MOV DIG_PORT,#11011111B
MOV A,BUFF_LED3
JMP END_SCAN
SCAN_L4: MOV DIG_PORT,#11101111B
MOV A,BUFF_LED4
JMP END_SCAN
SCAN_L5: MOV DIG_PORT,#11110111B
MOV A,BUFF_LED5
JMP END_SCAN
SCAN_L6: MOV DIG_PORT,#11111011B
MOV A,BUFF_LED6
END_SCAN: MOV DPTR,#TAB_LED
MOVC A,@A+DPTR
MOV LED_PORT,A
JNB F_BEEP,EXIT_T0
CLR BEEP
EXIT_T0: POP PSW
POP ACC
RETI
TAB_LED: DB 0C0H,0F9H,0A4H,0B0H,99H,92H ;数码管显示字型表
DB 82H,0F8H,80H,90H,88H,83H,0A7H
DB 0A1H,86H,8EH,0FFH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -