RET ;------------------------ WRITE:CLREA MOVR3,#8;循环8次,写一个字节 WR11:SETBDAT MOVR4,#8 RRCA;写入位从A中移到CY CLRDAT WR12:DJNZR4,WR12 ;等待16μs MOVDAT,C;命令字按位依次送给DS18B20 MOVR4,#20 WR13:DJNZR4,WR13 ;保证写过程持续60μs DJNZR3,WR11 ;未送完一个字节继续 SETBDAT RET ;------------------------ READ:CLREA MOVR6,#8;循环8次,读一个字节 RD11:CLRDAT MOVR4,#4 NOP;低电平持续2μs SETBDAT;口线设为输入 RD12:DJNZR4,RD12 ;等待8μs MOVC,DAT ;主机按位依次读入DS18B20的数据 RRCA;读取的数据移入A MOVR5,#30 RD13:DJNZR5,RD13 ;保证读过程持续60μs DJNZR6,RD11 ;读完一个字节的数据,存入A中 SETBDAT RET ;------------------------ 主机控制DS18B20完成温度转换必须经过三个步骤:初始化、ROM操作指令、存储器操作指令。必须先启动DS18B20开始转换,再读出温度转换值。假设一线仅挂接一个芯片,使用默认的12位转换精度,外接供电电源,可写出完成一次转换并读取温度值子程序GETWD。 GETWD:LCALLINIT MOVA,#0CCH LCALLWRITE;发跳过ROM命令 MOVA,#44H LCALLWRITE;发启动转换命令 LCALLINIT MOVA,#0CCH;发跳过ROM命令 LCALLWRITE MOVA,#0BEH;发读存储器命令 LCALLWRITE LCALLREAD MOVWDLSB,A ;温度值低位字节送WDLSB LCALLREAD MOVWDMSB,A ;温度值高位字节送WDMSB RET …… 子程序GETWD读取的温度值高位字节送WDMSB单元,低位字节送WDLSB单元,再按照温度值字节的表示格式及其符号位,经过简单的变换即可得到实际温度值。 如果一线上挂接多个DS18B20、采用寄生电源连接方式、需要进行转换精度配置、高低限报警等,则子程序GETWD的编写就要复杂一些,限于篇幅,这一部分不再详述,请参阅相关内容。 我们已成功地将DS18B20应用于所开发的“家用采暖洗浴器”控制系统中,其转换速度快,转换精度高,与微处理器的接口简单,给硬件设计工作带来了极大的方便,能有效地降低成本,缩短开发周期。 (责任编辑:传感器) |