No.67978 作者:怒海骄阳 邮件:bigsphinx@163.com ID:28575 登陆:2次 文章数:2篇 最后登陆IP:221.4.182.126 最后登陆:2004/12/5 22:43:40 注册:2004/12/4 20:51:23 财富:110 发帖时间:2004/12/4 21:04:17 发贴者IP:221.4.182.126 标题:怒海骄阳:请问有没有那位在用DS18B20时,出现过读出的温度是15度的 摘要:No.67978请问有没有那位在用DS18B20时,出现过读出的温度是15度的 小弟刚开始学习单片机,就学着做个数字温度计,用DS18B20和80C51,现在只能读出15度,请问是怎么回事呢。下面是程序,谢谢!! ORG 0000H ;ds18b20----p2.2 ;p1.7用来检查是否检测到DS18B20 ;p2.7个位显示 data_line equ p3.4 ;单片机内存分配申明! TEMPER_L EQU 29H ;用于保存读出温度的低8位 TEMPER_H EQU 28H ;用于保存读出温度的高8位 FLAG1 EQU 38H ;是否检测到DS18B20标志位 a_bit equ 20h ;数码管个位数存放内存位置 b_bit equ 21h ;数码管十位数存放内存位置 MAIN: ;clr p3.0 ;clr p3.1 LCALL GET_TEMPER;调用读温度子程序 ;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度 ;显示范围00到99度,显示精度为1度 ;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位 ;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度 ;这个转化温度的方法可是我想出来的哦~~非常简洁无需乘于0.0625系数 MOV A,29H MOV C,40h ;将28H中的最低位移入C RRC A ;带进位循环右移 MOV C,41h RRC A MOV C,42h RRC A MOV C,43h RRC A MOV 29H,A LCALL DISPLAY;调用数码管显示子程序 AJMP MAIN ; 这是DS18B20复位初始化子程序-------------------- INIT_1820: SETB data_line ;初始化程序的时序要求 NOP CLR data_line MOV R1,#3 TSR1:MOV R0,#107 DJNZ R0,$ DJNZ R1,TSR1 ;主机发出延时537微秒的复位低脉冲(我计算为660US) SETB data_line ;然后拉高数据线 NOP NOP NOP MOV R0,#25H TSR2: JNB data_line,TSR3 ;等待DS18B20回应 BIT=0 转移 DJNZ R0,TSR2 LJMP TSR4 ; 延时 TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在 ;CLR P3.5 ;检查到DS18B20就点亮P3.5LED LJMP TSR5 TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在 LJMP TSR7 TSR5: MOV R0,#117 TSR6: DJNZ R0,TSR6 ; 时序要求延时一段时间 TSR7: SETB data_line RET ; 读出转换后的温度值 GET_TEMPER: SETB data_line LCALL INIT_1820 ;先复位DS18B20 JB FLAG1,TSS2 RET ; 判断DS1820是否存在?若DS18B20不存在则返回 TSS2: ;DS18B20已经被检测到!!!!!!!!!!!!!!!!!!;*****先实现温度转换 MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_1820 MOV A,#44H ; 发出温度转换命令 LCALL WRITE_1820 ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒 LCALL DISPLAY ......
>>返回讨论的主题
|