📄 test1.asm
字号:
$include(c8051f020.inc)
WDDATA bit P1.3 ;//数据总线
exist1820 bit 20H;//表示是否检测到18B20的标志位
tempH equ 40h;从18B20读取的温度高位数
tempL equ 41h;从18B20读取的温度低位数
ORG 0000H
LJMP MAIN;
MAIN:
MOV SP,#0B0H
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
LOOP: LCALL GETTEMP;(读取的温度值在tempH,tempL中)
SJMP LOOP;
;温度存放格式(右对齐)
; 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
LCALL DELAY1 ;延时一个机器周期1微秒
LCALL DELAY1
CLR WDDATA ;拉低数据线
MOV R5,#38;38
LCALL Delay ;调用延时子程序,发出一个540微秒的低脉冲
SETB WDDATA ;再次拉高数据线
LCALL DELAY1;
LCALL DELAY1;
MOV R5,#05 ;等待72微秒,其间收到低脉冲,证明18B20存在,否则不存在
LCALL DELAY;
TZ2: JNB WDDATA,TZ3
LJMP TZ4
TZ3: SETB exist1820 ;收到低脉冲,标志位置高,证明18B20存在
LJMP TZ5
TZ4: SETB exist1820;CLR exist1820 ;没有低脉冲反馈,证明18B20没有连接上,标志位置低
LJMP TZ7 ;TZ7将P3.0拉高
TZ5: MOV R5,#18;17;复位成功,按照时序延时240微秒
TZ6: LCALL DELAY1;
TZ7: SETB WDDATA
ret;
;540微秒延时
Delay:
DSDLY0: MOV R4,#230
DJNZ R4,$
DJNZ R5,DSDLY0;
ret;
;延时1us
Delay1:
nop;
nop;
NOP;
ret;
;读出转化后温度值的子程序
GetTemp:
setb WDDATA; //定时入口
lcall Init_1820; //运行前先复位
jnb exist1820,gettempend; //如果检测到18B20存在,跳到退出
mov A,#0cch;
lcall Write1820; //调用SKIP ROM命令
lcall delay1;
mov A,#044h;
lcall Write1820; //调用CONVERT命令,一定要先执行ROM命令再执行RAM命令
MOV R5,#55;54 ; //根据时序要求延时750微秒等待A/D转换结束
LCALL Delay;
lcall Init_1820; //在读温度值前先复位
mov A,#0ccH;
lcall Write1820; //每下一个命令都要调用写程序写入
lcall delay1;
mov A,#0BEH;
lcall Write1820;
lcall Read1820;
mov tempL,A; //低位数
lcall Read1820;
mov tempH,A; //高位数
gettempend:
ret;
Write1820:
;程序入口为ACC
;写温度子程序
setb WDDATA;
LCALL DELAY1;
MOV R2,#8 ;//一个字节共8位
CLR C ;//清空进位位
wr18201: CLR WDDATA ;//拉低总线
MOV R5,#01H;//18B20开始工作,对数据进行采样,等待16US
LCALL DELAY;
;LCALL DELAY1;
RRC A ;
MOV WDDATA,C ;//命令字按位依次送给18B20
MOV R5,#05H;//保证写过程持续在60微秒
LCALL DELAY;
SETB WDDATA
MOV R5,#02H;//30微秒
LCALL DELAY;
;LCALL DELAY1;
DJNZ R2,WR18201 ;//未写完一个字节的话继续进行
SETB WDDATA
MOV R5,#06H;//100微秒
LCALL DELAY;
ret;
;读温度子程序,可以读出9个8位数据,分别存入以60H开始的9个地址内
Read1820:
;setb WDDATA;
;LCALL DELAY1;
RE0: MOV R2,#8 ;//数据共有8位
RE1: CLR C
SETB WDDATA
LCALL DELAY1;
LCALL DELAY1;
CLR WDDATA
LCALL DELAY1;//保持低电平2微秒
LCALL DELAY1
LCALL DELAY1;
SETB WDDATA ;//
MOV R5,#01H;//等待18微秒,让字节传来
LCALL DELAY;
LCALL DELAY1;
LCALL DELAY1
LCALL DELAY1;
;SETB WDDATA;
;MOV R5,#01H;
;LCALL DELAY;
;CLR WDDATA;
;LCALL DELAY1;
;LCALL DELAY1;
;clr wddata;
;mov r5,#01h;
;lcall delay;
;setb wddata;
;lcall delay1;
;lcall delay1;
;lcall delay1;
;lcall delay1;
;mov c,wddata;
;mov r4,#04
;lcall delay;
;rrc a;
MOV C,WDDATA ;//主机按位依次读入18B20数据
MOV R5,#05H;
LCALL DELAY;
RRC A ;//读取数据移入A
DJNZ R2,RE1
LCALL DELAY1;
LCALL DELAY1
;LCALL DELAY1;
SETB WDDATA
ret; 返回数据在A中
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -