dq bit p3.3 ;ds18b20的数据口位p3.3 tph data 20h ;存放温度值的高字节 tpl data 21h ;存放温度值的低字节 org 0 jmp reset org 100h reset: call ds18b20_reset ;设备复位 mov a,#0cch ;跳过rom命令 call ds18b20_writebyte ;送出命令 mov a,#044h ;开始转换 call ds18b20_writebyte ;送出命令 jnb dq,$ ;等待转换完成 call ds18b20_reset ;设备复位 mov a,#0cch ;跳过rom命令 call ds18b20_writebyte ;送出命令 mov a,#0beh ;读暂存存储器 call ds18b20_writebyte ;送出命令 call ds18b20_readbyte ;读温度低字节 mov tpl,a ;存储数据 call ds18b20_readbyte ;读温度高字节 mov tph,a ;存储数据 jmp $ ;************************************** ;延时x*10微秒(12m) ;不同的工作环境,需要调整此函数 ;************************************** delayx0us: ;2 当改用1t的mcu时,请调整此延时函数 nop ;1 nop ;1 nop ;1 nop ;1 nop ;1 nop ;1 nop ;1 nop ;1 djnz r7,delayx0us ;2 ret ;2 ;************************************** ;复位ds18b20,并检测设备是否存在 ;入口参数:无 ;出口参数:无 ;************************************** ds18b20_reset: clr dq ;送出低电平复位信号 mov r7,#48 ;延时至少480us call delayx0us setb dq ;释放数据线 mov r7,#6 ;等待60us call delayx0us mov c,dq ;检测存在脉冲 mov r7,#42 ;等待设备释放数据线 call delayx0us jc ds18b20_reset ;如果设备不存在,则继续等待 ret ;************************************** ;从ds18b20读1字节数据 ;入口参数:无 ;出口参数:acc ;************************************** ds18b20_readbyte: clr a push 0 mov 0,#8 ;8位计数器 readnext: clr dq ;开始时间片 nop nop setb dq ;准备接收 nop nop mov c,dq ;读取数据 rrc a mov r7,#6 ;等待时间片结束 call delayx0us djnz 0,readnext pop 0 ret ;************************************** ;向ds18b20写1字节数据 ;入口参数:acc ;出口参数:无 ;************************************** ds18b20_writebyte: push 0 mov 0,#8 ;8位计数器 writenext: clr dq ;开始时间片 nop nop rrc a ;输出数据 mov dq,c mov r7,#6 ;等待时间片结束 call delayx0us setb dq ;准备送出下一位数据 djnz 0,writenext pop 0 ret end