标题: 51单片机实现多路DS18B20温度测量-proteus仿真 [打印本页]

作者: hesheng    时间: 2013-8-16 21:34
标题: 51单片机实现多路DS18B20温度测量-proteus仿真


源码和仿真文件下载: 多路DS18B20测量.zip (72.04 KB, 下载次数: 1260)

作者: 游侠(单片机开    时间: 2013-10-21 15:35
很好 学习  学习  谢谢,给大家放出楼主的源码 省点黑币:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #define uchar unsigned char
  6. #define uint  unsigned int

  7. sbit RS=  P2^0  ;                                                        //液晶显示引脚定义
  8. sbit RW=  P2^1  ;
  9. sbit EN=  P2^2  ;
  10. uint  t=0,dian=0;
  11. uchar LCD_LINE_ONE[16]={"tp1:           "};                //定义显示屏幕
  12. uchar LCD_LINE_TWO[16]={"tp2:           "};
  13. //uchar LCD_LINE_THR[16]={"                "};

  14. int Tm;
  15. int  fushu=0 ;
  16. sbit DQ= P3^3;                                                                                  
  17. static unsigned char get_serial[]={                  //获取的八个DS18B20内部RAM64位序列号
  18.    224, 0,0,0,  184,  197, 50, 40,
  19.    215, 0,0,0,  184,  197, 51, 40
  20.   //  82, 0,0,0,  184,  197, 52, 40
  21. // 101, 0,0,0,  184,  197,  53,40,
  22.   //60, 0,0,0,  184,  197,  54,40,
  23.    //11, 0,0,0,  184,  197,  55,40,
  24.     //47, 0,0,0,  184,  197,  56,40,
  25.          //185, 0,0,0,  184,  197,  49,40,
  26. };
  27. void delay( ms )                                          //用于液晶显示的延时函数
  28. {
  29.           int i ;
  30.           while(ms--)
  31.           {
  32.                for(i=0 ;i<5 ;i++ )  ;

  33.           }
  34. }

  35. uchar Read_LCD_State()                                  //读取液晶显示的状态
  36. {
  37.         uchar state;
  38.         RS=0;RW=1;EN=1;delay(1);
  39.         state=P0;
  40.         EN = 0;delay(1);
  41.         return state;
  42. }
  43. void LCD_Busy_Wait()                                 //如果忙则等待函数
  44. {
  45.         while((Read_LCD_State()&0x80)==0x80);
  46.         delay(5);
  47. }

  48. void Write_LCD_Zhilin(uchar zl)                          //液晶显示写指令函数
  49. {
  50.         LCD_Busy_Wait();
  51.         RS=0;RW=0;
  52.         EN=0;
  53.         P0=zl;
  54.         EN=1;
  55.         delay(1);
  56.         EN=0;       
  57. }
  58. void Write_LCD_shuju(uchar date)             //液晶显示写数据函数
  59. {
  60.         LCD_Busy_Wait();
  61.         RS=1;RW=0;
  62.         EN=0;
  63.         P0=date;
  64.         EN=1;
  65.         delay(1);
  66.         EN=0;       
  67. }
  68. void LCD_INIT()                                //液晶显示初始化
  69. {
  70.     Write_LCD_Zhilin(0x38);          // 显示模式设置
  71.         delay(1);                                  
  72.         Write_LCD_Zhilin(0x01);          // 显示清屏
  73.         delay(1);                                 
  74.         Write_LCD_Zhilin(0x06);          // 光标移动设置
  75.         delay(1);
  76.         Write_LCD_Zhilin(0x0c);          // 开及光标设置
  77.         delay(1);
  78. }
  79. void Display_LCD_String(uchar p,uchar *s)                  //液晶显示写入函数
  80. {
  81.         uchar i;
  82.         Write_LCD_Zhilin(p|0x80)        ;    //写地址高位为一
  83.         //Write_LCD_Zhilin(0x40|0x80)        ;
  84.         for(i=0;i<16;i++)
  85.         {
  86.                 Write_LCD_shuju(s[i]);
  87.                 delay(1);        
  88.         }
  89. }
  90. /***************************************************************************************/
  91. void delays(int us)                                           //用于DS18B20的延时函数
  92. { int s;
  93. for ( s=0; s<us; s++);
  94. }
  95. void rst(void)                                                //DS18B20初始化
  96. {
  97. DQ = 1;
  98. delays(2);
  99. DQ = 0;
  100. delays(30); //精确延时 480~960us
  101. DQ = 1;
  102. delays(8);
  103. }
  104. void write(unsigned char ku)                //DS18B20写函数
  105. {
  106. int i=0;
  107.      for (i=0;i<8;i++)
  108.     {
  109.                 DQ=0;
  110.                 DQ =ku&0x01;
  111.                 delays(3);
  112.                 DQ=1;
  113.                 ku>>=1;
  114.     }
  115. }
  116. void match_rom(unsigned char *rom)          //DS18B20匹配ROM函数
  117. {
  118. unsigned char i;
  119. rst();                                                          //初始化
  120. write(0x55);                                          //匹配ROM
  121. for(i=8;i>0;i--)
  122. {
  123.           write(*(rom+i-1));
  124. }

  125. }
  126. unsigned int read(void)                          //DS18B20读函数,每次读16位
  127. {
  128.         int i=0;
  129.         unsigned int u=0;
  130.     for (i=0;i<16;i++)
  131.     {
  132.                 DQ=0;
  133.                 u>>=1;
  134.                 DQ=1;
  135.                 if(DQ) u|=0x8000;
  136.                 delays(4);
  137.      }
  138.     return (u);
  139. }
  140. int  read0(unsigned char *seria)        //读取对应温度值并转换函数
  141. {
  142.      int temperature ;
  143.     unsigned int tp;
  144.     unsigned int lsb;
  145.     rst();                                  //初始化
  146.     write(0xCC);                  //跳过RAM
  147.         write(0x44);                  //温度转换
  148.         rst();                                  //再次初始化
  149.         write(0xCC);
  150.         match_rom(seria);    //匹配ROM函数调用
  151.                  write(0xBE);         //读取存储器指令
  152.         tp=read();                         //读取温度值
  153.         if((tp&0xf800)==0xf800)                //判断正负数
  154.             {
  155.                      fushu=1 ;
  156.                       tp=~tp+1 ;
  157.                     lsb=(unsigned int)(tp*6.25);
  158.                         dian=lsb%100;                  //取小数部分
  159.                
  160.                      temperature=lsb/100;

  161.                 }
  162.      else
  163.             {
  164.                     fushu=0;
  165.                     lsb=(unsigned int)(tp*6.25);
  166.                         dian=lsb%100;  
  167.                
  168.                      temperature=lsb/100;

  169.              }
  170.      return(temperature);
  171. }
  172. /*****************************************************************************************/
  173. void main()
  174. {
  175.       uint i ;
  176.           LCD_INIT();
  177.           EA=0 ;                 //使用DS18B20禁止任何中断
  178.           while(1)
  179.          {          
  180.               for(i=0;i<2;i++)
  181.                   {       
  182.                       Tm=read0(get_serial+i*8);
  183.                                 if(i==0)                                   //判断是第几个的数据
  184.                                 {
  185.                                            if(fushu==0)                                           //判断是否加负号
  186.                                                 sprintf(LCD_LINE_ONE+5," %d", Tm);
  187.                                            if(fushu==1)
  188.                                                     sprintf(LCD_LINE_ONE+5,"-%d", Tm);
  189.                                        sprintf(LCD_LINE_ONE+10,".%d",dian);                //加入小数部分
  190.                                            Display_LCD_String(0x00,LCD_LINE_ONE);
  191.                                  }
  192.                                 if(i==1)
  193.                                 {  
  194.                                        if(fushu==0)       
  195.                                                  sprintf(LCD_LINE_TWO+5," %d", Tm);
  196.                                            if(fushu==1)
  197.                                                      sprintf(LCD_LINE_TWO+5,"-%d", Tm);
  198.                                        sprintf(LCD_LINE_TWO+10,".%d",dian);
  199.                                            Display_LCD_String(0x40,LCD_LINE_TWO);
  200.                                 }

  201.                   }

  202.                
  203.          }
  204. }


复制代码



作者: jldqc    时间: 2013-11-1 11:46
51黑有你更精彩!!

作者: 一缕尘埃    时间: 2013-11-28 11:08
我是初学者。就是想看看模拟量是怎样处理的。
作者: Higaye    时间: 2013-12-13 17:22
楼主呀你去哪了  紧急问题啊  求联系我  TEL:18583834210
作者: ·FEELing·    时间: 2013-12-16 16:37
{:soso_e100:}
作者: 星河    时间: 2013-12-19 14:12
很不错
作者: icos    时间: 2013-12-23 13:48
看看呗!
作者: 雨蝶的伤    时间: 2014-1-30 22:42
这里真的好学习啊...我在这里安家了
作者: 5_18。    时间: 2014-3-17 11:39
好好学习
作者: 5_18。    时间: 2014-3-17 17:44
很好,每一次都是小小的进步
作者: 小新灬    时间: 2014-3-18 14:43
楼主威武
作者: txwp    时间: 2014-3-26 11:44
很好 学习  学习  谢谢
作者: zhangxiaoljs    时间: 2014-3-28 19:54
顶。。。。。。。。。。。。。。。
作者: yxz1140    时间: 2014-3-28 22:41
不错!学习学习,谢谢。。
作者: bstele    时间: 2014-4-17 14:09
好好学习
作者: xiaoq560    时间: 2014-4-17 20:40
买板的时候没买DS18B20芯片,先用仿真的试试程序
作者: han1234xiang    时间: 2014-4-22 22:56
很好 学习  学习  谢谢
作者: deng5168    时间: 2014-4-23 12:16
谢谢楼主分享!
作者: tayirvb    时间: 2014-4-24 12:52
下载 看一看 谢谢
作者: a651738901    时间: 2014-4-28 21:08
谢谢楼主慷慨,学习了!
作者: yuhandede00    时间: 2014-5-16 17:04

作者: zuoziji1314    时间: 2014-5-29 12:47
谢谢分享,看到这个感觉会好好学习的 !
作者: sccdy    时间: 2014-5-29 18:25
很好,每一次都是小小的进步
作者: 周安松    时间: 2014-6-1 21:38
51hei(51黑)论坛有你更精彩
作者: cjhk    时间: 2014-6-3 13:19
很好的东西   是哦以匪浅
作者: cjhk    时间: 2014-6-3 13:20
这玩意确实需要花时间好好钻研钻研   
作者: liangbangyong    时间: 2014-6-9 16:41
很好,谢谢!学习,学习!
作者: ekun2006    时间: 2014-6-14 18:15
赞一个
作者: botao258    时间: 2014-6-28 18:21
好东西
作者: 拉风一生    时间: 2014-7-4 09:13
我也来加入
作者: 王子公司法    时间: 2014-8-8 10:12
请问,如何获取的八个DS18B20内部RAM64位序列号
作者: wjhg1026    时间: 2014-9-29 17:01


我用的是LCD1602做的实物,可是25.6度怎么有乱码?

请楼主指点一下,谢谢!我QQ:175283992

作者: longwu4231    时间: 2014-9-29 17:11
很好 学习  学习
作者: gxkgsch    时间: 2014-9-30 11:01
还不错
作者: dafeng201009    时间: 2014-9-30 11:37
很好 学习  学习  谢谢
作者: dafeng201009    时间: 2014-9-30 11:39
很好 学习  学习  谢谢
作者: wjhg1026    时间: 2014-10-4 17:15


用了3个18B20 做出来的,27.18后面一个乱码,其它2个18B20读出来也有乱码,(26.50度那个想办法隐藏掉了,其它的解决不了。)不知道怎么去掉。高手指点一下。
uchar LCD_LINE_TWO[16]={"      M       "};

作者: 雪中梅花    时间: 2014-11-12 14:37
谢谢楼主的奉献
作者: denminshen    时间: 2014-11-25 14:52
我连一个18b20的显示都还没有弄好哦,楼主真牛,有空下载学习学习!
作者: kenweijie136    时间: 2014-12-7 00:56
学习学习
作者: 华一电子    时间: 2014-12-8 11:19
学习  学习  谢谢
作者: hclin    时间: 2014-12-8 21:16
Good Job !!!
作者: dzljp    时间: 2014-12-9 01:52
很好
学习学习
作者: mycookie    时间: 2014-12-9 10:17
多路DS18B20,非常需要研究研究,感谢楼主
作者: 超级口水哥    时间: 2015-1-13 15:52
正在研究多18b20的电路呢
作者: abczzy2012    时间: 2015-1-16 21:42
学习了。。。。
作者: rich3524    时间: 2015-2-5 14:01
谢谢分享
作者: 安装阿斯    时间: 2015-3-13 14:29
挺好的!初学者怎么实现八路都工作呢?在这基础怎么实现上下限报警?大神求指导
作者: 安装阿斯    时间: 2015-3-13 15:45
怎么解决八路的上下限报警?求指导
作者: al.456    时间: 2015-3-18 20:20
这个不错,支持一下
作者: zengmiao    时间: 2015-3-24 17:03
很好,要是多一些就更强大了
作者: uva2015    时间: 2015-4-1 17:51
不错的资料,谢谢。
作者: yangfengyougu    时间: 2015-4-1 19:26
很好 ,学习 , 学习 , 谢谢
作者: qq704661078    时间: 2015-4-5 00:51
我来看看!!
作者: 916117435    时间: 2015-4-18 10:28
#在这里快速回复#很好 学习  学习  谢谢
作者: hlywhp    时间: 2015-4-28 16:28
学习中,谢谢
作者: hlywhp    时间: 2015-4-28 16:28
谢谢共享
作者: 康师佛    时间: 2015-4-28 19:58
很好 学习  学习  谢谢
作者: 康师佛    时间: 2015-4-28 19:58
很好 学习  学习  谢谢1111
作者: Jameszuo    时间: 2015-4-29 08:54
楼主 有心人啊  
作者: goer.lu    时间: 2015-6-4 14:57
好东西,谢谢楼主,问下楼主,ROM的64位序列号是提前测出来的对吗。。。。
作者: 见人无敌55    时间: 2015-6-11 21:28
真心不错 想看一下
作者: zgs660429    时间: 2015-6-29 22:20
多路18b20没有弄过,学习一下,谢谢你。
作者: 咕咕咕    时间: 2015-7-2 15:03
好好好,楼主威武
作者: 咕咕咕    时间: 2015-7-2 15:11
感谢楼主啦,哈哈哈
作者: 咕咕咕    时间: 2015-7-3 10:48
真实太感谢了
作者: 咕咕咕    时间: 2015-7-3 10:49
程序只有两个
作者: 咕咕咕    时间: 2015-7-3 10:49
美中不足啊
作者: 爱生活,爱折腾    时间: 2015-9-6 17:44
顶看看什么东西
作者: semnn    时间: 2015-9-17 09:29
最近正在搞这个,来看看学习下啊
作者: gemxie    时间: 2015-10-18 14:24
好东西啊,学习了。。
作者: xingxing1024    时间: 2015-10-22 08:58
很好 学习  学习  谢谢
作者: nan100610    时间: 2016-3-30 21:15
大感谢楼主的分享
作者: bixiang54    时间: 2016-4-5 16:22
谢谢分享
作者: bh4djj    时间: 2016-4-8 16:09
好资料,
谢谢了.
作者: tanzhishui1    时间: 2016-5-2 18:23
赞!我写的老出不来,这回可以参考了
作者: haoshijie    时间: 2016-5-3 16:46
非常感谢
作者: huanggm    时间: 2016-5-5 14:43
项目需要,参考一下,谢谢!
作者: 朱小虎    时间: 2016-5-18 19:37
楼主啊,有没有测18b20的64位rom编码的程序啊?
作者: weimada    时间: 2016-5-21 09:44
谢谢...多点共享
作者: 潇哥哥    时间: 2016-5-22 20:14
谢谢楼主了的帮助
作者: 潇哥哥    时间: 2016-5-22 20:19
想嘻嘻嘻嘻嘻嘻想
作者: yqs138168    时间: 2016-8-18 11:04
RE: 51单片机实现多路DS18B20温度测量-proteus仿真 [修改]
作者: yqs138168    时间: 2016-8-18 11:08
#在这里快源码和仿真文件下载:   多路DS18B20测量.zip (72.04 KB, 下载次数: 646) 速回复#
作者: zongtong    时间: 2016-12-25 05:26
谢谢分享,正想做这个呢
作者: douyiyi427    时间: 2017-2-1 14:38
非常好,谢谢楼主分享
作者: 哈哈啊    时间: 2017-2-28 21:26
顶一下
作者: 陌上花开123    时间: 2017-4-12 20:39
这个程序可以跑出来吗,我显示错误好多啊
作者: 陌上花开123    时间: 2017-4-12 20:40
wjhg1026 发表于 2014-10-4 17:15
用了3个18B20 做出来的,27.18后面一个乱码,其它2个18B20读出来也有乱码,(26.50度那个想办法隐藏掉 ...

你好我想问一下你那个ds18b20的温度测量做出来了吗,可以发一下程序吗
作者: 陌上花开123    时间: 2017-4-12 20:59
大神我想问一下这个程序编译的时候为什么我显示错误好多啊,是我电脑问题吗
作者: 陌上花开123    时间: 2017-4-12 21:29
yqs138168 发表于 2016-8-18 11:04
RE: 51单片机实现多路DS18B20温度测量-proteus仿真 [修改]

你好我为什么下载不了呢,可以再分享一下吗
作者: 阳光明媚    时间: 2017-4-14 13:59
怎么不能运行
作者: llxl    时间: 2017-5-4 09:37
谢谢楼主分享!
作者: logicvhdl    时间: 2017-11-2 09:26
很好的东西,值得珍藏
作者: Acousitc    时间: 2018-4-6 15:07
谢谢楼主!看了很多 受益匪浅!
作者: twpsuperman    时间: 2018-4-28 10:11
怎么获取的DS18B20内部RAM64位序列号啊?求解,谢谢
作者: shiwenyu    时间: 2018-4-28 21:40
好东西,要好好学习才行啊
作者: 陌沫xrz    时间: 2018-5-13 08:53
准备下载下来试试
作者: w963135423    时间: 2018-5-14 15:33
刚好用到,太感谢了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1