找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 29283|回复: 121
收起左侧

51单片机实现多路DS18B20温度测量-proteus仿真

  [复制链接]
ID:53125 发表于 2013-8-16 21:34 | 显示全部楼层 |阅读模式
1.JPG

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

评分

参与人数 2黑币 +10 收起 理由
溯行 + 5 赞一个!
hcx227 + 5 很好 很实用的资料 谢谢分享

查看全部评分

回复

使用道具 举报

ID:55815 发表于 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. }


复制代码


回复

使用道具 举报

ID:14052 发表于 2013-11-1 11:46 | 显示全部楼层
51黑有你更精彩!!
回复

使用道具 举报

ID:57249 发表于 2013-11-28 11:08 | 显示全部楼层
我是初学者。就是想看看模拟量是怎样处理的。
回复

使用道具 举报

ID:57509 发表于 2013-12-13 17:22 | 显示全部楼层
楼主呀你去哪了  紧急问题啊  求联系我  TEL:18583834210
回复

使用道具 举报

ID:57923 发表于 2013-12-16 16:37 | 显示全部楼层
{:soso_e100:}
回复

使用道具 举报

ID:57999 发表于 2013-12-19 14:12 | 显示全部楼层
很不错
回复

使用道具 举报

ID:58142 发表于 2013-12-23 13:48 | 显示全部楼层
看看呗!
回复

使用道具 举报

ID:58986 发表于 2014-1-30 22:42 | 显示全部楼层
这里真的好学习啊...我在这里安家了
回复

使用道具 举报

ID:59748 发表于 2014-3-17 11:39 | 显示全部楼层
好好学习
回复

使用道具 举报

ID:59748 发表于 2014-3-17 17:44 | 显示全部楼层
很好,每一次都是小小的进步
回复

使用道具 举报

ID:59780 发表于 2014-3-18 14:43 | 显示全部楼层
楼主威武
回复

使用道具 举报

ID:34763 发表于 2014-3-26 11:44 | 显示全部楼层
很好 学习  学习  谢谢
回复

使用道具 举报

ID:58796 发表于 2014-3-28 19:54 | 显示全部楼层
顶。。。。。。。。。。。。。。。
回复

使用道具 举报

ID:55219 发表于 2014-3-28 22:41 | 显示全部楼层
不错!学习学习,谢谢。。
回复

使用道具 举报

ID:60790 发表于 2014-4-17 14:09 | 显示全部楼层
好好学习
回复

使用道具 举报

ID:60802 发表于 2014-4-17 20:40 | 显示全部楼层
买板的时候没买DS18B20芯片,先用仿真的试试程序
回复

使用道具 举报

ID:61006 发表于 2014-4-22 22:56 | 显示全部楼层
很好 学习  学习  谢谢
回复

使用道具 举报

ID:60394 发表于 2014-4-23 12:16 | 显示全部楼层
谢谢楼主分享!
回复

使用道具 举报

ID:50727 发表于 2014-4-24 12:52 | 显示全部楼层
下载 看一看 谢谢
回复

使用道具 举报

ID:61227 发表于 2014-4-28 21:08 | 显示全部楼层
谢谢楼主慷慨,学习了!
回复

使用道具 举报

ID:61924 发表于 2014-5-16 17:04 | 显示全部楼层
回复

使用道具 举报

ID:61771 发表于 2014-5-29 12:47 | 显示全部楼层
谢谢分享,看到这个感觉会好好学习的 !
回复

使用道具 举报

ID:45829 发表于 2014-5-29 18:25 | 显示全部楼层
很好,每一次都是小小的进步
回复

使用道具 举报

ID:47760 发表于 2014-6-1 21:38 | 显示全部楼层
51hei(51黑)论坛有你更精彩
回复

使用道具 举报

ID:62553 发表于 2014-6-3 13:19 | 显示全部楼层
很好的东西   是哦以匪浅
回复

使用道具 举报

ID:62553 发表于 2014-6-3 13:20 | 显示全部楼层
这玩意确实需要花时间好好钻研钻研   
回复

使用道具 举报

ID:62770 发表于 2014-6-9 16:41 | 显示全部楼层
很好,谢谢!学习,学习!
回复

使用道具 举报

ID:18916 发表于 2014-6-14 18:15 | 显示全部楼层
赞一个
回复

使用道具 举报

ID:46838 发表于 2014-6-28 18:21 | 显示全部楼层
好东西
回复

使用道具 举报

ID:63533 发表于 2014-7-4 09:13 | 显示全部楼层
我也来加入
回复

使用道具 举报

ID:64065 发表于 2014-8-8 10:12 | 显示全部楼层
请问,如何获取的八个DS18B20内部RAM64位序列号
回复

使用道具 举报

ID:59341 发表于 2014-9-29 17:01 | 显示全部楼层
6666.jpg

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

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

使用道具 举报

ID:66645 发表于 2014-9-29 17:11 | 显示全部楼层
很好 学习  学习
回复

使用道具 举报

ID:41765 发表于 2014-9-30 11:01 来自手机 | 显示全部楼层
还不错
回复

使用道具 举报

ID:66805 发表于 2014-9-30 11:37 | 显示全部楼层
很好 学习  学习  谢谢
回复

使用道具 举报

ID:66805 发表于 2014-9-30 11:39 | 显示全部楼层
很好 学习  学习  谢谢
回复

使用道具 举报

ID:59341 发表于 2014-10-4 17:15 | 显示全部楼层
7777.JPG

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

使用道具 举报

ID:61875 发表于 2014-11-12 14:37 | 显示全部楼层
谢谢楼主的奉献
回复

使用道具 举报

ID:69408 发表于 2014-11-25 14:52 | 显示全部楼层
我连一个18b20的显示都还没有弄好哦,楼主真牛,有空下载学习学习!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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