zoukankan      html  css  js  c++  java
  • DS18B20温度传感器

    DS18B20有六条控制命令

      指 令              约定代码        操 作 说 明

      温度转换            44H         启动DS18B20进行温度转换

      读暂存器            BEH         读暂存器9位二进制数字

      写暂存器            4EH         将数据写入暂存器的TH、TL字节

      复制暂存器         48H         把暂存器的TH、TL字节写到E2RAM中

      重新调E2RAM     B8H         把E2RAM中的TH、TL字节写到暂存器TH、TL字节

     

      读电源供电方式 B4H 启动DS18B20发送电源供电方式的信号给主CPU

     

      4.3.4.4 DS18B20的初始化

      (1) 先将数据线置高电平“1”。

      (2) 延时(该时间要求的不是很严格,但是尽可能的短一点)

      (3) 数据线拉到低电平“0”。

      (4) 延时750微秒(该时间的时间范围可以从480到960微秒)。

      (5) 数据线拉到高电平“1”。

      (6) 延时等待(如果初始化成功则在15到60微妙时间之内产生一个由DS18B20所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。

      (7) 若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。

      (8) 将数据线再次拉高到高电平“1”后结束。

     

      4.3.4.5 DS18B20的写操作

     

      (1) 数据线先置低电平“0”。

      (2) 延时确定的时间为15微秒。

      (3) 按从低位到高位的顺序发送字节(一次只发送一位)。

      (4) 延时时间为45微秒。

      (5) 将数据线拉到高电平。

      (6) 重复上(1)到(6)的操作直到所有的字节全部发送完为止。

      (7) 最后将数据线拉高。

     

      4.3.4.6 DS18B20的读操作

      (1)将数据线拉高“1”。

      (2)延时2微秒。

      (3)将数据线拉低“0”。

      (4)延时3微秒。

      (5)将数据线拉高“1”。

      (6)延时5微秒。

      (7)读数据线的状态得到1个状态位,并进行数据处理。

      (8)延时60微秒。

     

      1 /**************************************
      2 ;WWW.STCMCU.COM
      3 ;Mobile:13922805190
      4 ;0755-82948412
      5 温度传感器DS18B20测试程序
      6 主芯片  : STC90C52RC (12T)
      7 工作频率: 12.000MHz
      8 **************************************/
      9 
     10 #include "REG51.H"
     11 #include "INTRINS.H"
     12 
     13 typedef unsigned char BYTE;
     14 
     15 sbit DQ = P3^3;                     //DS18B20的数据口位P3.3
     16 BYTE TPH;                           //存放温度值的高字节
     17 BYTE TPL;                           //存放温度值的低字节
     18 
     19 void DelayXus(BYTE n);
     20 void DS18B20_Reset();
     21 void DS18B20_WriteByte(BYTE dat);
     22 BYTE DS18B20_ReadByte();
     23 
     24 void main()
     25 {
     26     DS18B20_Reset();                //设备复位
     27     DS18B20_WriteByte(0xCC);        //跳过ROM命令
     28     DS18B20_WriteByte(0x44);        //开始转换命令
     29     while (!DQ);                    //等待转换完成
     30 
     31     DS18B20_Reset();                //设备复位
     32     DS18B20_WriteByte(0xCC);        //跳过ROM命令
     33     DS18B20_WriteByte(0xBE);        //读暂存存储器命令
     34     TPL = DS18B20_ReadByte();       //读温度低字节
     35     TPH = DS18B20_ReadByte();       //读温度高字节
     36 
     37     while (1);
     38 }
     39 
     40 /**************************************
     41 延时X*10微秒(STC90C52RC@12M)
     42 不同的工作环境,需要调整此函数
     43 当改用1T的MCU时,请调整此延时函数
     44 **************************************/
     45 void DelayX0us(BYTE n)
     46 {
     47     while (n--)
     48     {
     49         _nop_();
     50         _nop_();
     51     }
     52 }
     53 
     54 /**************************************
     55 复位DS18B20,并检测设备是否存在
     56 **************************************/
     57 void DS18B20_Reset()
     58 {
     59     CY = 1;
     60     while (CY)
     61     {
     62         DQ = 0;                     //送出低电平复位信号
     63         DelayX0us(48);              //延时至少480us
     64         DQ = 1;                     //释放数据线
     65         DelayX0us(6);               //等待60us
     66         CY = DQ;                    //检测存在脉冲
     67         DelayX0us(42);              //等待设备释放数据线
     68     }
     69 }
     70 
     71 /**************************************
     72 从DS18B20读1字节数据
     73 **************************************/
     74 BYTE DS18B20_ReadByte()
     75 {
     76     BYTE i;
     77     BYTE dat = 0;
     78 
     79     for (i=0; i<8; i++)             //8位计数器
     80     {
     81         dat >>= 1;
     82         DQ = 0;                     //开始时间片
     83         _nop_();                    //延时等待
     84         _nop_();
     85         DQ = 1;                     //准备接收
     86         _nop_();                    //接收延时
     87         _nop_();
     88         if (DQ) dat |= 0x80;        //读取数据
     89         DelayX0us(6);               //等待时间片结束
     90     }
     91 
     92     return dat;
     93 }
     94 
     95 /**************************************
     96 向DS18B20写1字节数据
     97 **************************************/
     98 void DS18B20_WriteByte(BYTE dat)
     99 {
    100     char i;
    101 
    102     for (i=0; i<8; i++)             //8位计数器
    103     {
    104         DQ = 0;                     //开始时间片
    105         _nop_();                    //延时等待
    106         _nop_();
    107         dat >>= 1;                  //送出数据
    108         DQ = CY;
    109         DelayX0us(6);               //等待时间片结束
    110         DQ = 1;                     //恢复数据线
    111     }
    112 }
  • 相关阅读:
    BAPI_TRANSACTION_COMMIT的使用方法(转)
    Win7 64bit系统下未能加载文件或程序集“System.Data.SQLite”的解决办法
    在Windows XP环境中配置OPC服务器时的设置方式
    关于异常“The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine”的处理
    MSChart使用做折线图饼图(转)
    C#如何导入内文至SAP(转)
    经典Sql大全转
    工程师突击:SAP ABAP实用程序开发攻略(转)
    如何使用ExtJS Design中生成的代码
    ExtJS 4 学习(1)环境配置及注意点
  • 原文地址:https://www.cnblogs.com/sky1991/p/2572143.html
Copyright © 2011-2022 走看看