DS18B20采集到的温度数据ST89c52单片机_AD,Allegro,pads,PCB设计,电源模块,硬件,stm32,嵌入式,单片机,小北设计 Allegro,pads,PCB电路板设计,硬件及芯片资料分享—小北设计

DS18B20采集到的温度数据ST89c52单片机

51单片机 by AD,Allegro,pads,PCB设计,电源模块,硬件,stm32,嵌入式,单片机,小北设计

1、封装和引脚定义:DS18B20常见的封装为TO-92,也有其他封装形式可选。其针脚定义包括供电(VCC)、地(GND)以及数据线(DQ)。
2、数字输出:DS18B20采集到的温度数据以数字信号形式输出,可直接连接到微处理器等设备进行数据处理和控制。
3、单线接口方式:DS18B20与微处理器之间仅需要一条通信线,大大简化了连接和使用的复杂性。
4、适应电压范围广:DS18B20可以在3.0~5.5V的电压范围内工作,在寄生电源方式下甚至可以通过数据线供电5、
高精度测温:DS18B20具有高精度的温度测量能力,支持的测量分辨率可通过程序设定为9~12位。
6、抗干扰能力强:DS18B20采用了数字信号传输,具备较好的抗干扰能力,适用于各种非极限温度场合。
应用广泛:DS18B20的外观可以根据应用场合的不同进行调整,例如管道式、螺纹式、磁铁吸附式和不锈钢包裹式等,适用于电缆沟测温、锅炉测温、机房测温、农业大棚测温等领域。

通过网盘分享的文件:ds18b20
链接: https://pan.baidu.com/s/16lDv0IKemd-AoDtIe8oy2g 提取码: ew7v

#iclude <reg52.H>
#include <intrins.H>
#include <math.H>
#define uchar unsigned char
#define uint unsigned int
sbit lcden = P2^2; //定义lcd的E端口
sbit lcdrw = P2^1; //定义lcd的rw端口
sbit lcdrs = P2^0; //定义lcd的rs端口
 
//IIC延时函数,延时必须精确,否则无法准确传输
void Delay4us()
{
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
}
 
void DelayMs(uint ms)
{
 uint i;
 while(ms--)
 {
 for(i = 110;i > 0;i--)
 {
 ;
 }
 }
}
//往LCD1602中写命令
void Write_Com(uchar com)
{
 lcdrs = 0; //lcdrs为低电平时,选择指令寄存器
 P0 = com;
 DelayMs(5);
 lcden = 1;
 DelayMs(5);
 lcden = 0;
}
 
//往LCD1602中写数据
void Write_data(uchar date)
{
 lcdrs = 1; //lcdrs为高电平时,选择数据寄存器
 P0 = date;
 DelayMs(5);
 lcden = 1; //当lcden由高电平变为低电平时,LCD1602开始执行命令
 DelayMs(5);
 lcden = 0;
}
 
//LCD1602的初始化函数
void init()
{
 lcdrw = 0; //lcdrw高电平时为读操作,低电平时为写操作 
 lcden = 0;
 Write_Com(0x38);
 Write_Com(0x0c);
 Write_Com(0x06);
 Write_Com(0x01);
}
void writeString(uchar * str, uchar length)
{
    uchar i;
    for(i = 0; i < length; i++)
    {
         Write_data(str[i]);
     }
 }
 
/**//*****************************DS18B20*******************************/
sbit ds = P1^1;
void dsInit()
 {
    
    unsigned int i;  
    ds = 0;
    i = 100;  
    while(i>0) i--;
    ds = 1;   
    i = 4;
    while(i>0) i--;
 }
 
void dsWait()
 {
      unsigned int i;
      while(ds);  
      while(~ds);
      i = 4;
      while(i > 0) i--;
}


bit readBit()
{
    unsigned int i;
    bit b;
    ds = 0;
    i++;   
    ds = 1; 
    i++; i++;  
    b = ds;
    i = 8; 
    while(i>0) i--;
    return b;
}

unsigned char readByte()
{
    unsigned int i;
    unsigned char j, dat;
    dat = 0;
    for(i=0; i<8; i++)
    {
        j = readBit();
      
        dat = (j << 7) | (dat >> 1);
    }
    return dat;
}


void writeByte(unsigned char dat)
{
    unsigned int i;
    unsigned char j;
    bit b;
    for(j = 0; j < 8; j++)
    {
        b = dat & 0x01;
        dat >>= 1;
    
        if(b)   
        {
           ds = 0;          i++; i++;  
            ds = 1;    
            i = 8; while(i>0) i--;  
        }
        else  
        {
            ds = 0;
          i = 8; while(i>0) i--;  
            ds = 1;
           i++; i++;
        }
   }
}


void sendChangeCmd()
{
    dsInit();    
    dsWait();   
    DelayMs(1);    
    writeByte(0xcc);
    writeByte(0x44);
}

void sendReadCmd()
{
    dsInit();
    dsWait();
    DelayMs(1);
    writeByte(0xcc); 
    writeByte(0xbe); 
}


int getTmpValue()
{
    unsigned int tmpvalue;
    int value; 
    float t;
    unsigned char low, high;
    sendReadCmd();
    
    low = readByte(); 
    high = readByte();
   
    tmpvalue = high;
    tmpvalue <<= 8;
    tmpvalue |= low;
    value = tmpvalue;
    t = value * 0.0625;
    value = t * 100 + (value > 0 ? 0.5 : -0.5); 
    return value;
}

void display(int v) 
{
    unsigned char count;
    unsigned char datas[] = {0, 0, 0, 0, 0};
    unsigned int tmp = abs(v);
    datas[0] = tmp / 10000;
    datas[1] = tmp % 10000 / 1000;
    datas[2] = tmp % 1000 / 100;
    datas[3] = tmp % 100 / 10;
    datas[4] = tmp % 10;
    Write_Com(0xc0+3);
    if(v < 0)
    {
        writeString("- ", 2);
   }
    else
    {
       writeString("+ ", 2);
    }
    if(datas[0] != 0)
    {
        Write_data('0'+datas[0]);
    }
    for(count = 1; count != 5; count++)
    {
        Write_data('0'+datas[count]);
        if(count == 2)
        {
            Write_data('.');
        }
    }
}
//*****************************DS18B20*******************************/

void main()
{
    uchar table[] = " xianzaiwendu:";
    sendChangeCmd();
    init();
    Write_Com(0x80);
    writeString(table, 16);
    while(1)
    {
        DelayMs(1000);       //温度转换时间需要750ms以上
        Write_Com(0xc0);
        display(getTmpValue());
        sendChangeCmd();
    }
}

DS18B20单片机LCD显示

    Message:

    Name:
    Email:
    Content:
PgUP ...
Allegro,pads,PCB电路板设计,电源模块件及stm32,嵌入式,单片机资料分享—小北设计