51单片机DS18B20的使用方法

DS18B20使用方法

  1. 初始化
  2. 写入指令
  3. 读取温度

DS18B20获取温度并开始转换,然后读取寄存器中储存的温度数据

//DS1802测量温度,并且用数码管显示,获取的温度有3个数,比如169就是代表16.9度的意思,而小数点则需要我们人为的添加上去

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit DS=P2^2;           //定义DS18B20的输出端

uint temp;             // 温度的变量

uchar flag1;            // 标志位

sbit dula=P2^6;               //数码管的段

sbit wela=P2^7;               //数码管的位

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,

                        0x87,0xff,0xef};

void delay(uint count)      //延时

{

  uint i;

  while(count)

  {

    i=200;

    while(i>0)

    i--;

    count--;

  }

}

void dsreset(void)       //DS18B20复位、初始化函数

{

  uint i;

  DS=0;                      

  i=103;                           //将总线拉低480us~960us

  while(i>0)i--;

  DS=1;                                 //然后拉高总线,若DS18B20做出反应会将在15us~60us后将总线拉低

  i=4;                                     //15us~60us等待

  while(i>0)i--;

  //while(DS);

}

bit tmpreadbit(void)       //读一字节,看是0还是1

{

   uint i;

   bit dat;

   DS=0;i++;          //i++ for delay

   DS=1;i++;i++;

   dat=DS;

   i=8;while(i>0)i--;

   return (dat);

}

uchar tmpread(void)   //读一字节数据函数

{

  uchar i,j,dat;

  dat=0;

  for(i=1;i<=8;i++)

  {

    j=tmpreadbit();

    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里

  }

  return(dat);

}

void tmpwritebyte(uchar dat)   //向DS18B20写1字节数据函数

{

  uint i;

  uchar j;

  bit testb;

  for(j=1;j<=8;j++)

  {

    testb=dat&0x01;

    dat=dat>>1;

    if(testb)     //写入1

    {

      DS=0;

      i++;i++;

      DS=1;

      i=8;while(i>0)i--;

    }

    else

    {

      DS=0;       //写入0

      i=8;while(i>0)i--;

      DS=1;

      i++;i++;

    }

  }

}

void tmpchange(void)  //DS18B20 开始获取温度并且转换

{

  dsreset();

  delay(1);

  tmpwritebyte(0xcc);  // 写跳过读ROM指令

  tmpwritebyte(0x44);  //  写温度转换指令

}

uint tmp()               //读取寄存器中储存的温度数据

{

  float tt;

  uchar a,b;

  dsreset();

  delay(1);

  tmpwritebyte(0xcc);     //写跳过读ROM指令

  tmpwritebyte(0xbe);     //写读取温度指令

  a=tmpread();                    //读低8位

  b=tmpread();                    //读高8位

  temp=b;

  temp<<=8;             //2字节组合为1个字

  temp=temp|a;

  tt=temp*0.0625;     //温度在寄存器中为12位,分辨率为0.065

  temp=tt*10+0.5;     //乘以10表示小数点后面只取一位,加0.5是四舍五入

  return temp;

}

void display(uint temp)                //显示程序

{

   uchar A1,A2,A2t,A3,ser;

   ser=temp/10;

   SBUF=ser;

   A1=temp/100;

   A2t=temp%100;

   A2=A2t/10;

   A3=A2t%10;

   dula=0;

   P0=table[A1];           //显示百位

   dula=1;

   dula=0;

   wela=0;

   P0=0xfe;

   wela=1;

   wela=0;

   delay(1);

   dula=0;

   P0=table1[A2];         //显示十位

   dula=1;

   dula=0;

   wela=0;

   P0=0xfd;

   wela=1;

   wela=0;

   delay(1);

   P0=table[A3];           //显示个位

   dula=1;

   dula=0;

   P0=0xfb;

   wela=1;

   wela=0;

   delay(1);

}

void main()

{

 uchar a;

  do

  {

    tmpchange();

for(a=100;a>0;a--)

  {   display(tmp());

  }

  }                while(1);

}

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值