18b20-1.asm

来自「比较好用的 DS18b20 单总线温度传感器汇编程序」· 汇编 代码 · 共 87 行

ASM
87
字号
;以下是DS18B20的程序: 
;|--------------------------------------------------------------| 
;| 获取单个ds1820转化的温度值的应用程序,P3.4接ds1820 | 
;|--------------------------------------------------------------| 
ORG 0000H 
AJMP MAIN 
ORG 0020H 
MAIN: 
MOV SP,#60H 
LCALL GET_TEMP 
SJMP $ 

GET_TEMP: 
           CLR PSW.4 
           SETB PSW.3          ;设置工作寄存器当前所在的区域 
           CLR EA              ;使用ds1820一定要禁止任何中断产生 
           LCALL INT           ;调用初使化子程序 
           MOV A,#0CCH 
           LCALL WRITE         ;送入跳过ROM命令 
           MOV A, #44H 
           LCALL WRITE         ;送入温度转换命令 
           LCALL INT           ;温度转换完全,再次初使化ds1820 
           MOV A,#0CCH 
           LCALL WRITE         ;送入跳过ROM命令 
           MOV A,#0BEH 
           LCALL WRITE         ;送入读温度暂存器命令 
           LCALL READ 
           MOV R7,A            ;读出温度值低字节存入R7 
           LCALL READ 
           MOV R6,A            ;读出温度值高字节存入R6 
           SETB EA 
           RET 
;***初始化****************************************************
INT:                           ;初始化ds1820子程序 
           CLR EA 
L0:        CLR P3.4            ;ds1820总线为低复位电平 
           MOV R2,#200 
L1:        CLR P3.4 
           DJNZ R2,L1          ;总线复位电平保持400us 
           SETB P3.4           ;释放ds1820总线 
           MOV R2,#30 
L4:        DJNZ R2,L4          ;释放ds1820总线保持60us 
           CLR C               ;清存在信号(存在C=0,不存在C=1) 
           ORL C,P3.4 
           JC L0               ;存在吗?不存在则重新来 
           MOV R6,#80 
L5:        ORL C,P3.4 
           JC L3 
           DJNZ R6,L5 
           SJMP L0 
L3:        MOV R2,#240 
L2:        DJNZ R2,L2 
           RET 
;****写数据****************************************************
WRITE:                         ;向ds1820写操作命令子程序 
           CLR EA 
           MOV R3,#8           ;写入ds1820的bit数,一个字节8个bit 
WR1:       SETB P3.4 
           MOV R4,#8 
           RRC A               ;把一个字节data(A)分成8个bit环移给 C 
           CLR P3.4            ;开始写入ds1820总线要处于复位(低)状态 
WR2:       DJNZ R4,WR2         ;ds1820总线复位保持16us 
           MOV P3.4,C          ;写入一个bit 
           MOV R4,#20 
WR3:       DJNZ R4,WR3         ;等待40us 
           DJNZ R3,WR1         ;写入下一个bit 
           SETB P3.4           ;重新释放ds1820总线 
           RET 
;****读数据*****************************************************
READ: 
           CLR EA 
           MOV R6,#8           ;连续读8个bit 
RE1:       CLR P3.4            ;读前总线保持为低 
           MOV R4,#4 
           NOP 
           SETB P3.4           ;开始读,总线释放 
RE2:       DJNZ R4,RE2         ;持续8us 
           MOV C,P3.4          ;从ds1820总线读得一个bit 
           RRC A               ;把读得的位值环移给 A 
           MOV R5,#30 
RE3:       DJNZ R5,RE3         ;持续60us 
           DJNZ R6,RE1         ;读下一个bit 
           SETB P3.4           ;重新释放ds1820总线 
           RET 

END 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?