📄 test2.asm
字号:
$include(c8051f020.inc)
WDDATA bit P1.3 ;//数据总线
exist1820 bit 20H;//表示是否检测到18B20的标志位
tempH data 40h ;从18B20读取的温度高位数
tempL data 41h ;从18B20读取的温度低位数
ORG 0000H
LJMP MAIN
MAIN:
MOV SP,#80H
MOV WDTCN,#0DEH
MOV WDTCN,#0ADH
MOV OSCXCN,#67H ;外部晶振11.0592MHz
CLR A
DJNZ ACC,$
DJNZ ACC,$
PORT1: MOV A,OSCXCN
JNB ACC.7,PORT1
MOV OSCICN,#88H ;允许检测到时钟丢失触发复位, 切换为外部时钟
MOV XBR2,#40H
MOV P1MDOUT,#00H
MOV P1,#0FFH
LOOP11: LCALL GETTEMP;(读取的温度值在tempH,tempL中)
SJMP LOOP11;
;温度存放格式(右对齐)
; D7 D6 D5 D4 D3 D2 D1 D0
;tempH 0 0 0 0 0 2_+6 2_+5 2_+4
;tempL 2_+3 2_+2 2_+1 2_0 2_-1 2_-2 2_-3 2_-4
Init_1820:
SETB WDDATA ;按照时序拉高P3.0
MOV R5,#10
DJNZ R5,$ ;延时一个机器周期1.8微秒
CLR WDDATA ;拉低数据线
MOV R5,#36
LCALL Delay ;调用延时子程序,发出一个540微秒的低脉冲
SETB WDDATA ;再次拉高数据线
NOP
NOP
MOV R0,#36
MOV R1,#11
TZ2: JNB WDDATA,TZ3 ;运行36次跳转指令,等待72微秒,其间收到低脉冲,证明18B20存在,否则不存在
DJNZ R0,TZ2
MOV R0,#36
DJNZ R1,TZ2
LJMP TZ4
TZ3: SETB exist1820 ;收到低脉冲,标志位置高,证明18B20存在
LJMP TZ5
TZ4: CLR exist1820 ;没有低脉冲反馈,证明18B20没有连接上,标志位置低
LJMP Init_1820 ;TZ7将P3.0拉高
TZ5: MOV R0,#6EH ;复位成功,按照时序延时240微秒
MOV R1,#11
TZ6: jb WDDATA,tz8
DJNZ R0,TZ6
MOV R0,#6EH
DJNZ R1,TZ6
sjmp Init_1820
; TZ7: SETB WDDATA
tz8: ret;
;540微秒延时;14.5us
Delay:
LOOP:MOV R4,#4EH
LOOP1:DJNZ R4,LOOP1
DJNZ R5,LOOP
ret;
;读出转化后温度值的子程序
GetTemp:
setb WDDATA; //定时入口
lcall Init_1820; //运行前先复位
jnb exist1820,gettempend; //如果检测到18B20存在,跳到退出
mov A,#0cch;
lcall Write1820; //调用SKIP ROM命令
mov A,#044h;
lcall Write1820; //调用CONVERT命令,一定要先执行ROM命令再执行RAM命令
MOV R5,#55 ; //根据时序要求延时750微秒等待A/D转换结束
LCALL Delay;
lcall Init_1820; //在读温度值前先复位
mov A,#0ccH;
lcall Write1820; //每下一个命令都要调用写程序写入
mov A,#0BEH;
lcall Write1820;
lcall Read1820;
mov tempL,A; //低位数
lcall Read1820;
mov tempH,A; //高位数
gettempend:
ret;
Write1820:
;程序入口为ACC
;写温度子程序
MOV R2,#8 ;//一个字节共8位
CLR C ;//清空进位位
wr18201: CLR WDDATA ;//拉低总线
;MOV R5,#10
;DJNZ R5,$ ;延时一个机器周期1.8微秒
MOV R3,#39H
DJNZ R3,$ ;//18B20开始工作,对数据进行采样,等待1
;jnb acc.0,dd0
RRC A ;
MOV WDDATA,C ;//命令字按位依次送给18B20
dd0: MOV R3,#32
MOV R4,#11
DD1: DJNZ R3,DD1 ;//保证写过程持续在60微秒
MOV R3,#32
DJNZ R4,DD1
SETB WDDATA
NOP
DJNZ R2,WR18201 ;//未写完一个字节的话继续进行
SETB WDDATA
ret;
;读温度子程序,可以读出9个8位数据,分别存入以60H开始的9个地址内
Read1820:
RE0: MOV R2,#8 ;//数据共有8位
RE1: CLR C
SETB WDDATA
NOP
NOP ;//
CLR WDDATA
MOV R5,#15
DJNZ R5,$ ;//保持低电平2微秒
SETB WDDATA ;//
nop
;clr wddata
MOV R3,#75
RE2: DJNZ R3,RE2 ;//等待9微秒,让字节传来
MOV C,WDDATA ;//主机按位依次读入18B20数据
RRC A ;//读取数据移入A
MOV R3,#24 ;
MOV R4,#11
RE3: DJNZ R3,RE3
MOV R3,#24
DJNZ R4,RE3
DJNZ R2,RE1
SETB WDDATA
ret; 返回数据在A中
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -