📄 ok_18b20.asm
字号:
;根据逻辑分析仪的检测,在复位拉低总线后497微秒再释放总线时,
;18b20的应答时间为30.8微秒,所以至少等待30微秒以上
;程序功能:读18B20的数据转换后放在固定地址中,72H(百位),73H(十位),74H(个位),75H(小数位)
;2007-07-17
$INCLUDE(C8051F020.INC)
CS1 EQU P0.2
ORG 00H
LJMP MAIN
ORG 100H
MAIN:MOV WDTCN,#0DEH
MOV WDTCN,#0ADH
MOV IE,#00H
;配置系统时钟使用外部晶振22.1184MHz
CLOCK: MOV OSCXCN,#67H ;外部晶振模式,大的晶振驱动电流
CLR A
DJNZ ACC,$
DJNZ ACC,$
LOOP: MOV A,OSCXCN ;OSCXCN.7为0时表明外部晶振没有起振或不稳定,为1时表明稳定运行
JNB ACC.7,LOOP
orl OSCICN,#08H ;内部晶振禁止
;初始化交叉开关
PORT: MOV XBR0,#04H ;UART0 TX0配置到P0.0口,RX0配置到P0.1口
MOV XBR1,#00H ;定时器、中断端口不配置
MOV XBR2,#40H ;交叉开关 Crossbar开启
ORL P0MDOUT,#0FFH ;P0.1推挽
ORL P1MDOUT,#40H
;UART0 用T1作波特率发生器
;UART0_Init:
MOV SCON0,#50H ;SCON0: 模式1, 10-bit UART, 使能RX
MOV TMOD,#20H ;TMOD: 定时器T1, 模式2, 8-bit 自动重载
MOV TH1,#0B8H ;设置定时器1作为波特率的重载值TH1=256-(22118400/19200/16)D
SETB TR1 ;打开定时器1
ORL CKCON,#10H ;定时器1用系统时钟作为它的时基
ORL PCON,#80H ;SMOD0 = 1;波特效率加倍
SETB TI ;初始化发送标志
BEGAIN:
LCALL B20_INIT ;1 初始化
MOV A,#0CCH ;2 跳过读序列号
LCALL WRITE
MOV A,#44H ;3 启动温度转换
LCALL WRITE
LCALL B20_INIT ;1 初始化
MOV A,#0CCH ;2 跳过读序列号,ROM命令
LCALL WRITE
MOV A,#0BEH ;3 读取温度寄存器
LCALL WRITE
LCALL READ ;读取从机发来的数据
MOV R0,A
LCALL DELAY
LCALL READ
MOV R1,A
LCALL DELAY
LCALL EXCHANG
;开始发送
;MOV A,R0
; MOV SBUF0,A
; JNB TI,$
; CLR TI
; MOV A,R1
; MOV SBUF0,A
; JNB TI,$
; CLR TI
LJMP BEGAIN
;===========================================================
;子程序
;===========================================================
;-----------------------------------------------------------
;按位写入
WRITE: MOV R7,#8 ;写8位
CLR C ;清标志位
WR1:
RRC A
CLR CS1 ;写数据都以拉低总线开始
MOV R6,#90
DJNZ R6,$
MOV CS1,C ;延时大概15微秒写位
MOV R6,#255 ;
DJNZ R6,$
MOV R6,#120
DJNZ R6,$
SETB CS1 ;延时50微秒左右置高总线
MOV R6,#130
DJNZ R6,$
DJNZ R7,WR1
RET
;------------------------------------------------------------
;------------------------------------------------------------
;按位读出
READ: MOV R7,#8 ;读8位
RD1: CLR CS1 ;拉低总线
MOV R6,#10
DJNZ R6,$ ;延时至少1微秒
SETB CS1 ;置高总线
MOV R6,#80
DJNZ R6,$
MOV C,CS1 ;延时后读取位数据
MOV R6,#250 ;延时40微秒左右1位读完
DJNZ R6,$
MOV R6,#80
DJNZ R6,$
RRC A
MOV R6,#10
DJNZ R6,$ ;延时1微秒以上为读下一位做准备
DJNZ R7,RD1 ;8位不够接着读下一位
RET
;-------------------------------------------------------------
EXCHANG: MOV A,R0 ;DS18B20采集到的原始数据已存放在R0,R1中.
MOV B,#16 ;数据处理:将原始转换为十进制数据,存放在
DIV AB ;72H(百位),73H(十位),74H(个位),75H(小数位)中.
MOV 74H,A
MOV A,R1
MOV B,#16
MUL AB
ADD A,74H
MOV B,#10
DIV AB
MOV 74H,B
MOV B,#10
DIV AB
MOV 73H,B
MOV 72H,A
MOV 71H,#0
MOV A,21H
ANL A,#0FH
MOV B,#8
DIV AB
MOV 75H,#0
CJNE A,#1,SSS
MOV 75H,#5
SSS: RET
;-------------------------------------------------------------
;18B20初始化
B20_INIT:CLR CS1 ;拉低总线497微秒以上
LCALL DELAY
SETB CS1 ;置高总线
MOV R6,#255 ;延时35微秒,等待18b20响应
DJNZ R6,$
WAIT: MOV C,CS1
JNC WAIT ;c为1说明没有应答,继续等待,为0说明18b20应答,延时3微秒退出复位
RET
DELAY: MOV R5,#255 ;延时497微秒
L1: MOV R3,#13
DJNZ R3,$
DJNZ R5,L1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -