|
| 采购元器件好去处--维库电子市场网推荐 |
| 技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
请求高手解答关于DS18B20的问题 |
| 作者:米兰之翼 栏目:单片机 |
| 我在使用DS18B20,在测温过程中,经常会出现不正常的温度值,程序如下,望高手解答疑问,谢谢 YI0912@163.COM ;***************************************************************************** ;进行温度显示,这里考虑用两位数码管来显示温度 ;显示范围00到99度,显示精度为1度 ;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃TEMPER_L的低4位 ;将TEMPER_H中的低4位移入TEMPER_L中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度 ;********************************************************************************** DS18B20: PUSH PSW PUSH ACC LCALL START_Temperature LCALL TIME2 LCALL RD_Temperature MOV A,TEMPER_L MOV C,TEMPER_H.0 ;将TEMPER_H中的最低位移入C RRC A MOV C,TEMPER_H.1 RRC A MOV C,TEMPER_H.2 RRC A MOV C,TEMPER_H.3 RRC A MOV TEMPER_L,A MOV TEMPER,TEMPER_L DS18B20_RET: POP ACC POP PSW RET ;------------------------------------------------------------------------------------------------ INIT_18B20: SETB DQ NOP CLR DQ ;主机发出延时的复位低脉冲501us MOV 3FH,#250 DJNZ 3FH,$ SETB DQ ;拉高数据线 MOV 3FH,#30 TSR: JNB DQ,TSR1 ;等待DS18B20回应,检验是否存在 DJNZ 3FH,TSR CLR FLAG1.0 ;置位标志位,表示DS18B20不存在 RET TSR1: SETB FLAG1.0 ;复位标志位,表示DS18B20存在 MOV 3FH,#250 DJNZ 3FH,$ ;时序要求延时一段时间 RET ;------------------------------------------------------------------------------------------------ ;温度转换 ;初始化DS18B20以后,发送温度转换命令 ;------------------------------------------------------------------------------------------------ START_Temperature: PUSH ACC PUSH PSW SETB DQ LCALL INIT_18B20 ;先复位DS18B20 JNB FLAG1.0,GET_T MOV A,#0CCH ;跳过ROM匹配 LCALL WRITE_18B20 MOV A,#44H ;发出温度转换命令 LCALL WRITE_18B20 CLR FLAG1.0 GET_T: POP PSW POP ACC RET ;------------------------------------------------------------------------------------------------ ;读取温度 ;发出温度转换命令后,最少等待750ms(默认下12位转换精度所需的最多转换时间),读入温度数据: ;------------------------------------------------------------------------------------------------ RD_Temperature: PUSH PSW PUSH ACC LCALL INIT_18B20 ;准备读温度前先复位 MOV A,#0CCH ;跳过ROM匹配 LCALL WRITE_18B20 MOV A,#0BEH ;发出读温度命令 LCALL WRITE_18B20 LCALL READ_18B20 ;读出温度 MOV TEMPER_L,A LCALL READ_18B20 ;调用读操作程序 MOV TEMPER_H,A POP ACC POP PSW RET ;------------------------------------------------------------------------------------------------ ;写操作: ;------------------------------------------------------------------------------------------------ WRITE_18B20: MOV 3FH,#8 ;一共8位数据 CLR C WRI: NOP CLR DQ MOV 3EH,#3 DJNZ 3EH,$ RRC A MOV DQ,C MOV 3EH,#26 DJNZ 3EH,$ SETB DQ DJNZ 3FH,WRI RET ;------------------------------------------------------------------------------------------------ ;读操作: ;------------------------------------------------------------------------------------------------* READ_18B20: MOV 3FH,#8 ;数据一共有8位 READ1: CLR DQ NOP SETB DQ MOV 3EH,#3 DJNZ 3EH,$ MOV C,DQ MOV 3EH,#26 DJNZ 3EH,$ RRC A DJNZ 3FH,READ1 RET ;********************************************************************************** |
| 2楼: | >>参与讨论 |
作者: 米兰之翼 于 2005-10-8 13:52:00 发布:
![]() |
|
|
|
| 免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |