⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.lst

📁 Keil C 写的51单片机DS18B20温度传感器的驱动
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.16   DS18B20                                                               01/11/2009 10:40:51 PAGE 1   


C51 COMPILER V8.16, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN .\bin\DS18B20.obj
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE src\DS18B20.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND PRINT(.\
                    -bin\DS18B20.lst) OBJECT(.\bin\DS18B20.obj)

line level    source

   1          /*******************************************************************************
   2          *
   3          *file: DS18B20.c
   4          *
   5          *功能描述:DS18B20温度传感器的驱动
   6          *编写人员:传承科技 吴明显
   7          *编写日期:2009/01/10
   8          *
   9          *第一次修改人员:
  10          *第一次修改日期:
  11          ********************************************************************************/
  12          
  13          #include<reg51.h>
  14          #include"inc/define.h"          //数据类型定义
  15          #include"inc/exactdly.h"        //精确延时函数
  16          #include"inc/ds18b20.h"
  17          
  18          /*给ROM命令字取个易记的名称 */
  19          #define DS18B20_READ_ROM        0x33            //读取ROM中的64位序列号及CRC
  20          #define DS18B20_MATCH_ROM       0x55            //让总线控制器选取多个DS18B20中的特定一个
  21          #define DS18B20_SKIP_ROM        0xCC            //跳过ROM命令字直接对RAM进行操作
  22          #define DS18B20_SEARCH_ROM      0xF0            //用以获取总线上所有DS18B20的64位序列号及CRC
  23          #define DS18B20_ALARM_SEARCH    0xEC    //搜索有报警的所有DS18B20
  24          /*给RAM命令字取个易记的名称 */
  25          #define DS18B20_CONVERT_TEMPERT 0x44    //开始温度转换
  26          #define DS18B20_RD_SCRATCHPAD 0xBE              //读取暂存器和CRC中的值,共9个字节
  27          #define DS18B20_WR_SCRATCHPAD 0x4E              //把字节写入暂存器的地址2和3--报警触发
  28          #define DS18B20_CP_SCRATCHPAD 0x48              //把暂存器内容(报警触发)拷贝到非易失的EEPROM
  29          #define DS18B20_RECALL_EEPROM 0xB8              //把EEPROM中值召回暂存器
  30          #define DS18B20_RD_POWER_MODE 0xB4              //用以判断DS18B20的供电方式
  31          
  32          
  33          /*The DS18B20s' ROM Serial NUmbers    */
  34          u8 code DS18B20_NO[DS18B20_MAX_COUNT][8] = 
  35                                     {{0x28,0x30,0xC5,0xB8,0x00,0x00,0x00,0x8E},          
  36                                          {0x28,0xE5,0xE0,0xC9,0x01,0x00,0x00,0x07}};
  37                                                                                                                                          
  38          u8 gActive_DS18B20  = 0;
  39          
  40          /*******************************************************************
  41          *功能描述:DS18B20复位及存在检测(通过存在脉冲判断有无正常工作的DS1820)
  42          *函数名称:Reset
  43          *函数参数:
  44          *返回值:  0 存在正常工作的DS18B20;其他 不存在正常工作的 DS18B20
  45          *注意事项:
  46          ********************************************************************/
  47          u8  Reset()
  48          {
  49   1              u8 flag=0;
  50   1                  
  51   1              DS18B20_DQ = 0;         //单片机拉低总线以产生复位脉冲
  52   1              Delay200us();           //延时480us--960us完成复位
  53   1              Delay200us();
  54   1              Delay200us();
C51 COMPILER V8.16   DS18B20                                                               01/11/2009 10:40:51 PAGE 2   

  55   1              DS18B20_DQ = 1;         //单片机释放总线
  56   1              Delay50us();            //等待60--240us
  57   1              Delay10us();
  58   1              flag=DS18B20_DQ;        //低电平表示有DS18B20回应
  59   1              Delay200us();           //延时至少240us等待总线恢复
  60   1              Delay200us();
  61   1      
  62   1              return flag;  
  63   1      }
  64          
  65          /**********************************************************
  66          *功能描述:写一个字节数据到DS18B20
  67          *函数名称:InputByte
  68          *函数参数:
  69          *返回值:
  70          *注意事项:
  71          **********************************************************/
  72          void InputByte(u8 ibyte)
  73          {
  74   1              u8 i;
  75   1              u8 delay;
  76   1      
  77   1              for (i=8;i>0;i--)
  78   1              {
  79   2                      DS18B20_DQ = 0;         //拉低总线,产生写信号
  80   2                      for(delay=2;delay>0;delay--) ;  //延时4us
  81   2                      DS18B20_DQ = ibyte&01;          //发送1位
  82   2                      Delay50us();            //写时序至少要60us--120us
  83   2                      Delay50us();
  84   2                      DS18B20_DQ = 1;         //释放总线,等待总线恢复
  85   2                      ibyte>>=1;                      //准备下一位数据的传送
  86   2              }
  87   1      }
  88          
  89          /**********************************************************
  90          *功能描述:从DS18B20中读出一个字节数据
  91          *函数名称:OutputByte
  92          *函数参数:
  93          *返回值:
  94          *注意事项:
  95          **********************************************************/
  96          u8       OutputByte()
  97          {
  98   1              u8 i,delay;
  99   1              u8 obyte=0;
 100   1      
 101   1              for (i=8;i>0;i--)
 102   1              {
 103   2                      obyte>>=1;
 104   2      
 105   2                      DS18B20_DQ = 0;         //拉低总线,产生读信号
 106   2                      for(delay=2;delay>0;delay--);   //延时4us
 107   2                      DS18B20_DQ = 1;         //释放总线,准备读数据
 108   2                      for (delay=4;delay>0;delay--);  //延时8微秒读数据
 109   2                      if (DS18B20_DQ == 1)
 110   2                      obyte |= 0x80;
 111   2                      Delay50us();            //延时100us
 112   2                      Delay50us();
 113   2                      DS18B20_DQ = 1;         //拉高总线,准备下一位数据的读取                         
 114   2              }
 115   1      
 116   1              return obyte;//返回读到的数据
C51 COMPILER V8.16   DS18B20                                                               01/11/2009 10:40:51 PAGE 3   

 117   1      }
 118          
 119          /**********************************************************
 120          *功能描述:从单总线上所有DS18B20中选中一个进行后续操作
 121          *函数名称:SelectOne
 122          *函数参数:
 123          *返回值:
 124          *注意事项:在总线上只有一个DS18B20时,可以用不提供序列号使用
 125          *         此器件,只要置同文件中的宏ONLY_ONE为1即可
 126          **********************************************************/
 127          void SelectOne( )
 128          {
 129   1              u8 i;
 130   1      
 131   1              if(1==ONLY_ONE)
 132   1              {
 133   2                      Reset();    //复位
 134   2                      InputByte(DS18B20_SKIP_ROM);    //跳过ROM命令,当总线上只有一个DS18B20时此命令可简化操作
 135   2              }
 136   1              else
 137   1              {
 138   2                      Reset();    //复位
 139   2                      InputByte(DS18B20_MATCH_ROM);   //DS18B20匹配,后跟64位序列号用以选中总线上特定DS18B20
 140   2                      for(i=0;i<8;i++)
 141   2                              InputByte(DS18B20_NO[gActive_DS18B20 ][i]);
 142   2              }        
 143   1      }
 144          
 145          /**********************************************************
 146          *功能描述:从给定的一组数据产生一个8位的CRC码
 147          *函数名称:CRCGenerate
 148          *函数参数:
 149          *返回值:
 150          *注意事项:要把给定数据的低字节存在数组的低地址
 151          **********************************************************/
 152          u8 CRCGenerate(u8 * to_data,u8 num)
 153          {
 154   1              u8 i;
 155   1              u8 crc_data;
 156   1      
 157   1              crc_data=0;
 158   1              for(i=0;i<num * 8;i++)
 159   1              {
 160   2                      u8 xor_l,xor_m,xor_r;
 161   2                      xor_r=((to_data[i/8] >> i%8) & 0x01) ^ (crc_data & 0x01);
 162   2                      xor_l=((crc_data >> 4) & 0x01) ^ xor_r;
 163   2                      xor_m=((crc_data >> 3) & 0x01) ^ xor_r;
 164   2                      
 165   2                      crc_data >>=1;
 166   2                      if(1==xor_r)
 167   2                              crc_data |= 0x80;
 168   2                      else
 169   2                              crc_data &= 0x7F;
 170   2                      if(1==xor_l)
 171   2                              crc_data |= 0x08;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -