找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15167|回复: 7
打印 上一主题 下一主题
收起左侧

DS18B20温度传感器一直显示0度

[复制链接]
跳转到指定楼层
楼主
如图,用的是下载来的资料自己焊了个板子,但是程序烧进去之后一直显示0.0
求做过这个实验的老哥帮忙看看程序

主程序:

  1. main()
  2. {
  3.         init_various();
  4.         while(1)                                           //不断重复循环
  5.         {
  6.                 if(b10msEvent)
  7.                 {
  8.                         b10msEvent = false;
  9.                         dynamic_display();                        //显示

  10.                         if(b500msEvent)
  11.                         {
  12.                                 b500msEvent = false;
  13.                                 set_temp_data();                        //读温度
  14.                         }
  15.                 }
  16.         }
  17. }

  18. /*********************************************
  19. * 定时器0中断
  20. *********************************************/
  21. void timer0(void) interrupt 1
  22. {
  23.         static u8 SecCount = 0;

  24.         TH0 = TH0HIGH;
  25.         TL0 = TL0LOWW;

  26.         b10msEvent = true;                //10毫秒中断
  27.         if(++SecCount == 50)
  28.         {
  29.                 SecCount = 0;
  30.                 b500msEvent = true;                //1秒到时
  31.         }
  32. }






  33. 芯片程序:
  34. u8 ds18b20_reset(void)
  35. {
  36.         DQ_PIN = HIGH;                //先将数据线拉高
  37.         delay_16us(1);                //稍作延迟
  38.         DQ_PIN = LOW;                //将数据线拉低
  39.         delay_16us(30);                //延时600us
  40.         DQ_PIN = HIGH;                //将数据线再次拉高
  41.         delay_16us(5);                //延时80us
  42.         if(!DQ_PIN)                   //判断如果读到数据线低电平则初始化成功
  43.         {
  44.                 delay_16us(30);        //延时420us
  45.                 return 1;
  46.         }
  47.         else
  48.         return 0;
  49. }
  50. /************************************************
  51. * 函数名称:ds18b20_write_byte
  52. * 功能描述:DS18B20写数据
  53. *************************************************/
  54. void ds18b20_write_byte(u8 wByte)
  55. {
  56.         u8 i;                                   //定义unsigned char类型的i
  57.         for(i=0; i<8; i++)
  58.         {
  59.                 DQ_PIN = LOW;          //数据线拉低
  60.                 NOP();                  
  61.                 NOP();
  62.                 NOP();
  63.                 NOP();
  64.                 NOP();
  65.                 NOP();
  66.                 NOP();                          //进行延时
  67.                 DQ_PIN = wByte & 0x01;        //按低位到高位写数据(每次一位)
  68.                 NOP();
  69.                 NOP();
  70.                 NOP();
  71.                 NOP();
  72.                 NOP();                                        //延时
  73.                 DQ_PIN = HIGH;                        //数据线拉高
  74.                 NOP();
  75.                 NOP();
  76.                 NOP();
  77.                 wByte >>= 1;                        //要写入的数据右移一位后在下一循环写入
  78.         }
  79. }
  80. /************************************************
  81. * 函数名称:ds18b20_read_byte
  82. * 功能描述:DS18B20读数据
  83. *************************************************/
  84. u8 ds18b20_read_byte(void)
  85. {
  86.         u8 rByte;                //存放所读出的数据
  87.         u8 i;
  88.         for(i=0; i<8; i++)
  89.         {
  90.                 DQ_PIN = LOW;
  91.                 NOP();
  92.                 NOP();
  93.                 rByte >>= 1;        //将上次所读数据右移一位,以下一循环读取数据
  94.                 NOP();
  95.                 NOP();
  96.                 NOP();
  97.                 NOP();
  98.                 NOP();
  99.                 NOP();
  100.                 DQ_PIN = HIGH;
  101.                 NOP();
  102.                 NOP();
  103.                 NOP();
  104.                 NOP();
  105.                 NOP();
  106.                 NOP();
  107.                 NOP();
  108.                 if(DQ_PIN)                         //如果读到是1,rByte与0x80相与,最高位写1
  109.                 rByte |= 0x80;
  110.                 NOP();
  111.                 NOP();
  112.                 NOP();
  113.                 NOP();
  114.                 NOP();
  115.                 NOP();
  116.                 NOP();
  117.         }
  118.         DQ_PIN = HIGH;
  119.         return rByte;                   //将所读字节送回
  120. }
  121. /************************************************
  122. * 函数名称:ds18b20_get_temp
  123. * 功能描述:读温度值
  124. *************************************************/
  125. u16 ds18b20_get_temp(void)
  126. {
  127.         u16 Temp;                                                         //定义unsigned short类型变量temp
  128.         if(ds18b20_reset() == 0)                        //若复位程序传回值是0则证明没有成功复位
  129.         return 0;
  130.         ds18b20_write_byte(0xcc);                        //忽略ROM
  131.         ds18b20_write_byte(0x44);                        //发送温度转化命令
  132.         delay_16us(30);
  133.         if(ds18b20_reset() == 0)                        //再次复位
  134.         return 0;
  135.         ds18b20_write_byte(0xcc);                        //忽略ROM
  136.         ds18b20_write_byte(0xbe);                        //读寄存器,共九字节,前两字节为转换值
  137.         Temp = ds18b20_read_byte();
  138.         Temp |= ds18b20_read_byte() << 8;
  139.         return Temp;
  140. }




  141. 中断:

  142. #include <reg52.h>
  143. #include "device_init.h"
  144. #include "ds18b20.h"

  145. /************************************************
  146. * 函数名称:init_c51
  147. * 功能描述:定时器的初始化设置
  148. *************************************************/
  149. void init_c51(void)
  150. {
  151.         TMOD = 0x01;                 //选择工作方式,定时方式,16位计数器
  152.         TH0 = TH0HIGH;
  153.         TL0 = TL0LOWW;            //给定时器赋值,先装高位后装低位
  154.         ET0 = 1;                        //允许IT0中断
  155.         TR0 = 1;                   //启动定时器T0
  156. }
  157. /************************************************
  158. * 函数名称:init_various
  159. * 功能描述:中断设置
  160. *************************************************/
  161. void init_various(void)
  162. {
  163.         EA = 0;        //关闭总中断允许
  164.         init_c51();        //进行定时器初始化设置并启动定时器
  165.         ds18b20_reset(); //DS18B20初始化设置
  166.         ds18b20_get_temp();        //获取温度
  167.         EA = 1;        //开总中断
  168. }


  169. 显示程序:


  170. #include <reg52.h>
  171. #include "typedef.h"
  172. #include "device_init.h"
  173. #include "ds18b20.h"

  174. code u8 float_tab[16] = {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//小数表
  175. code u8 DisCode[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xff, 0xbf};        //字形表

  176. u8 DisNum[4] = {0x0a, 0x0a, 0x00, 0x00};
  177. u8 DisPosition = 0;

  178. /************************************************
  179. * 函数名称:dynamic_display
  180. * 功能描述:动态显示
  181. *************************************************/
  182. void dynamic_display(void)
  183. {
  184.         static u8 DisPinOn = 0x01;

  185.         DisPinOn <<= 1;
  186.         if(DisPinOn == 0x10)
  187.         {
  188.                 DisPosition = 0;
  189.                 DisPinOn = 0x01;
  190.         }
  191.         DIS_DAT = 0xff;
  192.         DIS_POS = DisPinOn;
  193.         DIS_DAT = DisCode[DisNum[DisPosition++]];
  194.         if(DisPinOn == 0x04)
  195.         DIS_DAT &= 0x7f;
  196. }
  197. /************************************************
  198. * 函数名称:set_temp_data
  199. * 输    入:
  200. * 输    出:
  201. * 功能描述:
  202. *************************************************/
  203. void set_temp_data(void)
  204. {
  205.         u16 TempData;
  206.         float Temp;
  207.         u8 Negative;
  208.         s8 i;

  209.         TempData = ds18b20_get_temp();                //度温度数据


  210.         /* 小于零 */
  211.         if(TempData & 0xf000)
  212.         {
  213.                 TempData = ~TempData + 1;
  214.                 TempData &= 0x0fff;
  215.                 Negative = 1;
  216.         }
  217.         /* 大于零 */
  218.         else
  219.         {
  220.                 Negative = 0;
  221.         }

  222.         Temp = (TempData >> 4) * 10;                //温度读数乘以精度(0.0625),显示小数点一位,所以乘以10
  223.         Temp = Temp + float_tab[(TempData & 0x000f)] + 0.5;        //加上小数部分,四舍五入所以加0.5
  224.         TempData = Temp;

  225.         for(i=3; i>=0; i--)
  226.         {
  227.                 DisNum[i] = TempData % 10;
  228.                 TempData /= 10;
  229.         }

  230.         for(i=0; i<2; i++)
  231.         {
  232.                 if(DisNum[i] != 0)
  233.                 {
  234.                         break;
  235.                 }
  236.                 else
  237.                 {
  238.                         DisNum[i] = 0x0a;                        //前面为0不显示
  239.                 }
  240.         }
  241.         /*  显示负号 */
  242.         if(Negative == 1)
  243.         {
  244.                 for(i=2; i>=0; i--)
  245.                 {
  246.                         if(DisNum[i] == 0x0a)
  247.                         {
  248.                                 DisNum[i] = 0x0b;                //'-'
  249.                                 break;
  250.                         }
  251.                 }
  252.         }
  253. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96682 发表于 2018-1-8 22:35 | 只看该作者
粘贴出来的没看到源码中的 DS18B20 要接在哪个 IO 上,另外那个 R2 阻值偏大了( 典型的是:4K7)
回复

使用道具 举报

板凳
ID:268642 发表于 2018-1-10 00:25 | 只看该作者
wc86110 发表于 2018-1-8 22:35
粘贴出来的没看到源码中的 DS18B20 要接在哪个 IO 上,另外那个 R2 阻值偏大了( 典型的是:4K7)

但是在.H文件中有sbit DQ_PIN的定义而C里面没有,明天换成小一点的电阻焊上去试试。

不过目前是一直显示-0.1°是不是代表有数据但是不对呢?

望大神多多指导
回复

使用道具 举报

地板
ID:274121 发表于 2018-1-10 09:16 | 只看该作者
DS18B20定义的接口是单片机哪个脚?要是实物的话可以手触摸DS18B20,看温度有无变化。也许换一个传感器就行。可以焊接试试
回复

使用道具 举报

5#
ID:66761 发表于 2018-1-10 10:32 | 只看该作者
如果再实际应用中,18B20驱动起来其实并不难,时序图也不复杂,,这个需要比较精准的定时,延时时单片机的实际时钟频率要搞明白,不能只查看数据手册数 多少个nop 就是1us,差异较大,,如果实在不行,就先用定时器去计时,,,我第一个驱动18b20时 用nop 搞了好久,就是复位失败或采集不准确,用定时器 计时一次通过,希望能帮到您,,
回复

使用道具 举报

6#
ID:111634 发表于 2018-1-10 15:56 | 只看该作者
本帖最后由 zl2168 于 2018-1-10 15:58 编辑

先读懂读通正确的程序
实例97  一线式DS18B20测温

Proteus仿真一下,确认有效。
实例97 DS18B20测温.rar (51.78 KB, 下载次数: 89)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
回复

使用道具 举报

7#
ID:268642 发表于 2018-1-10 23:49 | 只看该作者
各位老哥我问题没表达清楚,是仿真可以实现但是在自己焊的电路中只有显示0度且不会变化
回复

使用道具 举报

8#
ID:922838 发表于 2021-10-17 11:19 | 只看该作者
a865550942 发表于 2018-1-10 23:49
各位老哥我问题没表达清楚,是仿真可以实现但是在自己焊的电路中只有显示0度且不会变化

你的问题解决没,我现在也有一样的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表