原创 用51单片机调DS18B20

2007-7-24 16:16 5845 7 18 分类: MCU/ 嵌入式

      经过几天的努力学习和实践,终于调好了DS18B20.呵呵,现在27.0625摄氏度.虽然是一个小程序,不过还是挺有成就感的.将源程序代码贡献出来,相互交流一下.(不包含1602显示的驱动程序)


  //将DQ与Vcc之间接入4.7K上拉电阻
#include "reg52.h"
#include "INTRINS.H"
#include "1602.c"
#define uchar unsigned char
#define uint  unsigned int
//#define CLEARSCREEN LCD_en_command(0x01)   1602清屏
sbit DQ="P1"^0;
/*操作命令代码
  跳过ROM 0xCC
  发送温度转换 0xBE
  写EEPROM  0x4E
*/


/////////////低层驱动子程序///////////
void Init18B20(void); //初始化
void Write18B20(uchar ch);//写数据
unsigned char Read18B20(void);//读数据 
void Delay15(uchar n);  
void Delay10ms(uint delay_num);
void Display(void);
///////////////////////////////////// 
code uchar decimalH[]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93};
code uchar decimalL[]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75};
uint ResultTemperatureH ,ResultTemperatureLH,ResultTemperatureLL;//整数,小数高位,小数低位
uint  ResultSignal;//符号位


 



main()
{  uint TemH,TemL,delay,k=0;
   for(; ; )
 {
   Init18B20();


   Write18B20(0xCC);//跳过ROM
   _nop_();
   //Write18B20(0x4E);//写EEPROM
  // Write18B20(0x00);//Th
   //Write18B20(0x00);//Tl
   Write18B20(0x7f);//12 bits温度分辨率
   Init18B20();


   Write18B20(0xCC);//跳过ROM
   _nop_();



   Write18B20(0x44);//发送温度转换指令
   Delay10ms(25);
   Delay10ms(25);
   Delay10ms(25);
   Delay10ms(25);//等待1s转换


   Init18B20();
   Write18B20(0xCC);//跳过ROM
   Write18B20(0xBE);//发送温度转换指令
   TemL="Read18B20"();  //读低位温度值
   TemH="Read18B20"();  //读高位温度值                                                        


   Delay10ms(2);
  
  TemH=(TemH<<4)|(TemL>>4);
   TemL="TemL"&0x0f;   //取低4位
   if(TemH&0x80)
    {  TemH=~TemH;
    TemL=~TemL+1;
       ResultSignal="1";     //负
    }
     else  ResultSignal="0";   //正


   ResultTemperatureLH="decimalH"[TemL];
   ResultTemperatureLL="decimalL"[TemL];
   ResultTemperatureH="TemH";
   Display();


  for(delay=0;delay<60000;delay++);
  for(delay=0;delay<20000;delay++);
  
  }  
}


 


void  Display(void)
{  uint i,j,q;
   LCD_init();
     CLEARSCREEN;
  LCD_en_command(0x01);
  delay_nms(2);
 
     q="ResultTemperatureH/100";
     i=(ResultTemperatureH%100)/10;
     j="ResultTemperatureH-"(i*10+q*100);
  LCD_write_string(0,LINE1," Jaq1217 18B20  ");
 if(ResultSignal)  
   { LCD_write_string(0,LINE2," T is:-   .     ");  }
   else {LCD_write_string(0,LINE2," T is:+   .     ");}
    LCD_write_char(0x07,LINE2,q|0x30);
    LCD_write_char(0x08,LINE2,i|0x30);
    LCD_write_char(0x09,LINE2,j|0x30);
    LCD_write_char(0x0b,LINE2,(ResultTemperatureLH/10)|0x30);
 LCD_write_char(0x0c,LINE2,(ResultTemperatureLH%10)|0x30);
 LCD_write_char(0x0d,LINE2,(ResultTemperatureLL/10)|0x30);
 LCD_write_char(0x0e,LINE2,(ResultTemperatureLL%10)|0x30);
   }


unsigned char Read18B20(void)
 { unsigned char ch;
   unsigned char q ;
   for(q=0;q<8;q++)
    {ch=ch>>1;
 DQ=0;
  _nop_();
  DQ="1";
  _nop_();_nop_();_nop_();_nop_();
     if(DQ==1)  ch="ch|0x80";
   else     ch="ch"&0x7f;
     Delay15(3);
   DQ="1";
 
     } 
 return (ch);
   }
void Write18B20(uchar ch)
 { uchar i;
   for(i=0;i<8;i++)
   { DQ="0";
  Delay15(1);
  DQ="ch"&0x01;
  Delay15(3);
  DQ="1";
  ch="ch">>1;
  _nop_();
    }
 }


void Init18B20(void)
 { DQ="0";
   Delay15(33);//至少延时480us
   DQ="1";
   Delay15(10);//至少延时100us
   /*if(DQ==1)  return 0;   //初始化失败
    else  return 1;
 DQ=1; Delay15(18);  */
   }
void Delay15(uchar n)
 {  do{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_();
  n--;
 
       }while(n);
  }
void Delay10ms(uint delay_num)
{
 uchar i;
 while(delay_num--)
 {
  for(i=0;i<125;i++)
   {;}
 }
}

PARTNER CONTENT

文章评论11条评论)

登录后参与讨论

用户451177 2015-12-17 22:01

说的很对,ESP这种东西国内做的也没主机厂愿意去用的,国内的汽车电子都是非安全件,所以还是去外企才有机会接触到这种安全件

dongbei06_409353400 2015-1-18 10:05

国内的汽车电子行业大约2009年以ISO26262(汽车行业的功能安全标准)最终颁布为契机,开始风行功能安全。至于现状的,由于目前国内厂商的控制器多限于不涉及行车安全的零部件,涉及行车安全的零部件都有外资或外资的合资公司来配套。所以,我个人觉得国内汽车电子的功能安全应该处于扫盲和入门的阶段。ESP的话,基本都是博世和大陆的天下,他们作为零部件的领头羊,水平应该比ISO26262更高,毕竟标准是他们参与制定的,而且他们未必会公开内部的设计秘密。

用户1362114 2015-1-17 23:41

兄台是做汽车电子的,现在国内汽车电子行业对功能安全是什么状况呢?像ESP之类都是符合功能安全的吗?

用户97183 2007-10-5 10:33

一个(S)可在线编程,另一个(C)不行

用户1675593 2007-8-14 23:11

呵呵,是嘛!!程序是乱了点,不过我认为条理还算清楚。还有,这个程序是精度最高的了,是0.0025度。而且好像没有0.01的精度设置吧?!!

用户98578 2007-8-14 01:41

DS18B20

我做过,还用VB给它做发了一个上位机监控系统。硬件搭接很方便,核心蕊片用的是AT89S51,程序用C编程。基于楼主的C编程风格很有个性,程序写有点乱,不整齐,不简洁,调试难以修改。我这有上位机和下位机的源程序,调试精度可达到0.01度。有感兴趣都请联系我,邮箱是adou2240@126.com。

 

 

用户385254 2007-8-1 09:18

谢谢 很有用!

用户82784 2007-7-31 21:18

我也在学单片机,刚入门,前几天买了一块ds18b20,还不会用,有用汇编语言的程序吗?方便的话指点一下,不胜感激,先谢过了。邮箱,qingtai0532@sohu.com

 

用户1675593 2007-7-28 09:25

还要什么原理图啊,数据线就一根,数据线上接一个上拉电阻,至于管教,也定义出来了 ,呵呵!!!

用户90929 2007-7-27 23:43

要是有原理图就更好了,呵呵!
相关推荐阅读
用户1675593 2007-08-30 20:49
TLC1549程序
       TLC1549是美国德州仪器公司生产的10位模数转换器。它采用CMOS工艺,具有内在的采样和保持,采用差分基准电压高阻输入,抗干扰,可按比例量程校准转换范围,总不可调整误差达到±1LSB...
用户1675593 2007-08-08 22:13
点亮12864了
          一晚上的调调弄弄,把12864点亮了。实话说程序是一位师兄的。不过看着一些细节不符合我的习惯,所以给改了一下。另外的一些管教也是能省则省。呵呵,准备做一块板子,把管教规整一下,也顺...
用户1675593 2007-05-30 20:00
Keil C166
     刚从Keil公司下载的Keil C166,不敢独享,供献出来.呵呵                 好象上传不了,太大了,对不住啊,有需要的话找我把,呵呵 ...
用户1675593 2007-05-26 20:10
数字电路如何抗干扰
在电子系统设计中,为了少走弯路和节省时间,应充分考虑并满足抗干扰性 的要求,避免在设计完成后再去进行抗干扰的补救措施。形成干扰的基本要素有三个: (1)干扰源,指产生干扰的元件、设备或信号,用数学语言...
用户1675593 2007-05-24 21:23
国产3G从10月起对公众放号 有望占领五成市场
在国产3G标准TD-SCDMA进入商用试验后,记者获悉,相关配套产品招投标工作正在进行中,7月至9月将进行终端测试和招投标,在四季度提供给用户使用。   昨天,由中国信息产业商会和国产3G联盟共同举办...
我要评论
11
7
关闭 站长推荐上一条 /2 下一条