• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

项目10—DS18B20温度计设计正负

武飞扬头像
单旦羊
帮助1

DS18B20是一款常用的高精度的单总线数字温度测量芯片。具有体积小,硬件开销低,抗干扰能力强,精度高的特点。

参数:

测温范围为-55℃到 125℃,在-10℃到 85℃范围内误差为±0.4°。

返回16位二进制温度数值

主机和从机通信使用单总线,即使用单线进行数据的发送和接收

在使用中不需要任何外围元件,独立芯片即可完成工作。

掉电保护功能 DS18B20 内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。

每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值

宽电压供电,电压2.5V~5.5V

DS18B20返回的16位二进制数代表此刻探测的温度值,其高五位代表正负。如果高五位全部为1,则代表返回的温度值为负值。如果高五位全部为0,则代表返回的温度值为正值。后面的11位数据代表温度的绝对值,将其转换为十进制数值之后,再乘以0.0625即可获得此时的温度值。

DS18B20一共有三个引脚,分别是:

  • GND:电源地线
  • DQ:数字信号输入/输出端。
  • VDD:外接供电电源输入端。

DS18B20的工作步骤可以分为三步:

1.初始化DS18B20
2.执行ROM指令
3.执行DS18B20功能指令

其中第二步执行ROM指令,也就是访问每个DS18B20,搜索64位序列号,读取匹配的序列号值,然后匹配对应的DS18B20,如果我们仅仅使用单个DS18B20,可以直接跳过ROM指令。而跳过ROM指令的字节是0xCC。

我们这里用74HC573,排阻,51单片机,和DS18B20.

仿真如下: 

学新通

写程序时,我们把main.c和ds18b290.c分开写,即在main.c中包含ds18b20.c。

学新通

主程序如下:

  1.  
    #include<reg51.h>
  2.  
    #include<ds18b20.c>
  3.  
    unsigned char cp,cp1,temp,temp1;
  4.  
    unsigned char seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  5.  
    sbit LE = P1^0;
  6.  
    void timer0_isr(void) interrupt 1
  7.  
    {
  8.  
    TH0 = (65536 - 2500) / 256;
  9.  
    TL0 = (65536 - 2500) % 256;
  10.  
    P0 = 0xff;
  11.  
    if(cp == 0){P0 = 0x01;LE = 0;LE = 1;LE = 0;P0 = seven_seg[c];}
  12.  
    if(cp == 1){P0 = 0x02;LE = 0;LE = 1;LE = 0;P0 = seven_seg[temp1 % 10] & 0x7f;}
  13.  
    if(cp == 2){P0 = 0x04;LE = 0;LE = 1;LE = 0;if(temp1 < 10)P0 = 0xff;else P0 = seven_seg[temp1 / 10];}
  14.  
    if(cp == 3){P0 = 0x08;LE = 0;LE = 1;LE = 0;if((temp & 0x80) == 0x80)P0 = 0xbf;else P0 = 0xff;}
  15.  
    cp ;if(cp >= 4)cp = 0;
  16.  
    //产生时间
  17.  
    cp1 ;
  18.  
    if(cp1 >= 200)
  19.  
    {
  20.  
    cp1 = 0;
  21.  
    temp = Read_Temperature();
  22.  
    if((temp & 0x80) == 0x80)
  23.  
    {
  24.  
    temp1 = 0xff - temp;
  25.  
    c = (0x0f - c)*0.625 1;
  26.  
    if(c == 10){temp1 = temp 1;c = 0;}
  27.  
    }
  28.  
    else {temp1 = temp;c = c*0.625;}
  29.  
    }
  30.  
    }
  31.  
    void timer0_init(void)
  32.  
    {
  33.  
    TMOD = 0x01;
  34.  
    TH0 = (65536 - 2500) / 256;
  35.  
    TL0 = (65536 - 2500) % 256;
  36.  
    EA = 1;
  37.  
    ET0 = 1;
  38.  
    TR0 = 1;
  39.  
    }
  40.  
    void main(void)
  41.  
    {
  42.  
    timer0_init();
  43.  
    while(1);
  44.  
    }
学新通

ds18b20的驱动程序如下:

  1.  
    /*********************************************************************/
  2.  
    //读取DS18B20温度,通过数码管显示,在温度超过35度时继电器吸合
  3.  
    #define uchar unsigned char
  4.  
    #define uint unsigned int
  5.  
    uchar a,b,c;
  6.  
    sbit DQ = P1^2;
  7.  
    void delay(uint x)
  8.  
    {
  9.  
    while(x--);
  10.  
    }
  11.  
    void Init_DS18B20(void)
  12.  
    {
  13.  
    unsigned char x=0;
  14.  
    DQ = 1; //DQ复位
  15.  
    delay(8); //稍做延时
  16.  
    DQ = 0; //单片机将DQ拉低
  17.  
    delay(80); //精确延时 大于 480us
  18.  
    DQ = 1; //拉高总线
  19.  
    delay(14);
  20.  
    x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  21.  
    delay(20);
  22.  
    }
  23.  
    /******************************18B20中读一个字节****************************/
  24.  
    uchar Read_OneChar(void)
  25.  
    {
  26.  
    uchar i = 0;
  27.  
    uchar dat = 0;
  28.  
    for (i=8;i>0;i--)
  29.  
    {
  30.  
    DQ = 0; // 给脉冲信号
  31.  
    dat >>= 1;
  32.  
    DQ = 1; // 给脉冲信号
  33.  
    if(DQ)
  34.  
    dat |= 0x80;
  35.  
    delay(8);
  36.  
    }
  37.  
    return(dat);
  38.  
    }
  39.  
    /******************************18B20中写一个字节****************************/
  40.  
    void Write_OneChar(uchar dat)
  41.  
    {
  42.  
    uchar i=0;
  43.  
    for (i=8; i>0; i--)
  44.  
    {
  45.  
    DQ = 0;
  46.  
    DQ = dat&0x01;
  47.  
    delay(10);
  48.  
    DQ = 1;
  49.  
    dat >>= 1;
  50.  
    }
  51.  
    delay(8);
  52.  
    }
  53.  
    /***********************************读取温度**********************************/
  54.  
    uchar Read_Temperature(void)
  55.  
    {
  56.  
    uchar i = 0,t = 0;
  57.  
    Init_DS18B20();
  58.  
    Write_OneChar(0xcc); // 跳过读序号列号的操作
  59.  
    Write_OneChar(0x44); // 启动温度转换
  60.  
    Init_DS18B20();
  61.  
    Write_OneChar(0xcc); //跳过读序号列号的操作
  62.  
    Write_OneChar(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  63.  
    a = Read_OneChar(); //读取温度值低位
  64.  
    b = Read_OneChar(); //读取温度值高位
  65.  
    c = 0x0f & a; //得到小数部分
  66.  
    a = a >> 4; //低位右移4位
  67.  
    b = b << 4; //高位左移4
  68.  
    t = a | b; //得到8位温度的整数部分,最高为符号位
  69.  
    return(t);
  70.  
    }
  71.  
    /*
学新通

运行结果:

学新通 

学新通 

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgjciah
系列文章
更多 icon
同类精品
更多 icon
继续加载