DS18B20怎样使用?

2019-03-24 17:22发布

如题,查看了DS18B20资料,仍不知道程序要干些什么。如果接3个DS18B20温度分别显示在1602上,怎么实现?
我想要个思路:
1、DS18B20本身要干些什么,是否只需硬件连好?所有数据线并一起连到     单片机端口就可以了?
2、用STC的52单片机,单片机要干些什么,要写些什么子程序?
3、DS18B20输出与单片机怎样对接上?DS18B20输出什么,单片机接收后
    怎样处理,处理结果是什么形式,特别是怎样显示成有小数点?
另外,1602显示我知道,写指令和写数据,显示,我会弄,就是不知道怎样操作DS18B20,就算它有返回数据,我也不知道是什么数,还有看网上又怎么*10啦什么的,小数点在哪啊什么的,看不明白,希望大神帮助解答,资料可在论坛说,或发我邮箱:mdt150@163.com。谢谢啦!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
www88988
1楼-- · 2019-03-26 21:05
对于新手要多点耐心,我们也是由不懂学习来的。
先说电路:
3---VCC
1---GND
2---数据线(要加上拉电阻)

再说程序
sbit DQ=P1^7; //单片机P1.7接数据口
unsigned char time;   //设置全局变量,专门用于严格延时
//函数功能:将DS18B20传感器初始化
Init_DS18B20(void)
{
  DQ = 1;           //先将数据线拉高
  delay_us(6); //略微延时约6微秒
  DQ = 0;           //再将数据线从高拉低,要求保持480~960us
  delay_us(600); //略微延时约600微秒,以向DS18B20发出一持续480~960us的低电平复位脉冲
  DQ = 1;              //释放数据线(将数据线拉高)
  delay_us(30);//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)   
  delay_us(200);
}

//从DS18B20读取一个字节数据
unsigned char ReadOneChar(void)
{
   unsigned char i=0;
   unsigned char dat; //储存读出的一个字节数据
   for (i=0;i<8;i++)
   {   
     DQ =1;       // 先将数据线拉高
     _nop_();     //等待一个机器周期
     DQ = 0;      //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
    dat>>=1;
     _nop_();     //等待一个机器周期     
     DQ = 1;     //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
    delay_us(6); //延时约6us,使主机在15us内采样
     if(DQ==1)
        dat|=0x80; //如果读到的数据是1,则将1存入dat
    else
     dat|=0x00;//如果读到的数据是0,则将0存入dat
       //将单片机检测到的电平信号DQ存入r
    delay_us(3);  //延时3us,两个读时序之间必须有大于1us的恢复期
     }                     
return(dat);    //返回读出的十进制数据
}

//向DS18B20写入一个字节数据
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=0; i<8; i++)
   {
    DQ =1;         // 先将数据线拉高
    _nop_();      //等待一个机器周期
    DQ=0;          //将数据线从高拉低时即启动写时序      
    DQ=dat&0x01;   //利用与运算取出要写的某位二进制数据,
                       //并将其送到数据线上等待DS18B20采样
   delay_us(30);//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
    DQ=1;          //释放数据线      
    delay_us(3);//延时3us,两个写时序间至少需要1us的恢复期
    dat>>=1;       //将dat中的各二进制位数据右移1位
   }
   delay_us(5); //稍作延时,给硬件一点反应时间
}


// 读温度
void ReadTemperature(unsigned char *p)
{
unsigned char tempL=0;
unsigned char tempH=0;
unsigned int sdate;//测量到的温度的整数部分
unsigned char xiaoshu1;//小数第一位
unsigned char xiaoshu2;//小数第二位
unsigned char xiaoshu;//两位小数
bit  fg=1;        //温度正负标志

   Init_DS18B20();     //将DS18B20初始化
   WriteOneChar(0xCC); // 跳过读序号列号的操作
   WriteOneChar(0x44); // 启动温度转换   
   delay_us(500); //温度转换需要一点时间
   Init_DS18B20();     //将DS18B20初始化
   WriteOneChar(0xCC); //跳过读序号列号的操作
   WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位
   tempL=ReadOneChar(); //读出温度的低位LSB
   tempH=ReadOneChar(); //读出温度的高位MSB

   if(tempH>0x7f)      //最高位为1时温度是负
                {
                 tempL=~tempL;         //补码转换,取反加一
                 tempH=~tempH+1;      
                 fg=0;      //读取温度为负时fg=0
         }
        sdate = tempL/16+tempH*16;      //整数部分
        xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位
        xiaoshu2 = (tempL&0x0f)*100/16%10;//小数第二位
        xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位

        if(fg==0) *p=1;
        else *p=0;
        *(p+1) =  sdate/10;
        *(p+2) =  sdate%10;
        *(p+3) =  xiaoshu1;
        *(p+4) =  xiaoshu2;
}

应用
unsigned char arTemperature[5];


void main(void)
{
      ......
     ReadTemperature(arTemperature);
     ......
}


那么在数组arTemperature中就是温度。
第一个元素是 正负温度,00是零上,01 是零下
第二、三个元素是温度的整数部分2位 二是十位 三是个位
第四、五个元素是温度的小数部分2位
如: 00  02  06  08  03    就是零上 26.83度。
后期数据处理自己看着办就行了。

一周热门 更多>