日志档案

发表于 2007-7-24 16:16:56

8

标签: DS18B20  

用51单片机调DS18B20

      经过几天的努力学习和实践,终于调好了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++)
   {;}
 }
}

系统分类: 单片机   |   用户分类: 我的作品   |   来源: 原创   |   【推荐给朋友】

    阅读(1809)    回复(12)  

投一票您将和博主都有获奖机会!

  • BB.KING

    2007-7-27 23:43:02

    要是有原理图就更好了,呵呵!

  • jaq1217

    2007-7-28 9:25:51

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

  • qingtai0532

    2007-7-31 21:18:51

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

     

  • zdx869

    2007-8-1 9:18:32

    谢谢 很有用!

  • super_gu

    2007-7-26 9:25:10

    干的不错,一线制的DS18B20,编程的关键在于对于时序的掌握。值得大家学习。

  • liuzzcy

    2007-7-26 13:27:26

    还有器件搜索没有完成啊。。。

    还要继续努力哦。。。

    器件搜索可以用二分查找。。。

  • cupid_amny

    2007-7-26 16:20:51

    现在写程序很少有人用汇编写了,全是用C写了

  • liting

    2007-7-25 20:00:42

    呵呵 。。。。

    谢谢

  • wangzc

    2007-8-14 1:41:30

    DS18B20

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

     

     

  • jaq1217

    2007-8-14 23:11:46

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

  • 无名人士

    2007-8-26 21:23:14

    AT89S51?我们用的都是AT89C51.它们有什么区别啊?不好意思,我是初学者,请教一下啊!

  • laogu

    2007-10-5 10:33:41

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