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

📄 18b20.lst

📁 DS18B20温度传感的好程序!!!很有用
💻 LST
字号:
C51 COMPILER V8.02   18B20                                                                 11/19/2008 17:14:39 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18b20.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 18b20.c DEBUG OBJECTEXTEND

line level    source

   1          /********************************************************
   2          * DS18B20温度传感器                                   *
   3          *           C51                                                    *
   4          * yajou 2008-06-28     无CRC                        *
   5          ********************************************************/
   6          
   7          #include "reg51.h"
   8          #include "intrins.h"
   9          //#include "DS18B20.h"
  10          //////////DS18B20.h/////////////////////////
  11          
  12          /********************************************************
  13          * I/O口定义                                                    *
  14          ********************************************************/
  15          sbit dq = P3^7;
  16          sbit dv = P1^4; //DS18B20强上拉电源
  17          int i;
  18          
  19          /********************************************************
  20          * 命令字定义                                                 *
  21          ********************************************************/
  22          #define uchar unsigned char
  23          #define uint unsigned int
  24          
  25          
  26          #define ReleaseDQ()   dq = 1;   //上拉/释放总线
  27          #define PullDownDQ() dq = 0;   //下拉总线
  28          
  29          #define Delay2us()   _nop_();_nop_(); //延时2us,每nop 1us
  30          #define Delay8us()   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  31          
  32          //设置重复检测次次数,超出次数则超时
  33          #define     ReDetectTime    20
  34          
  35          
  36          //ds18b20命令
  37          #define     SkipROM      0xCC
  38          #define     MatchROM     0x55
  39          #define     ReadROM      0x33
  40          #define     SearchROM    0xF0
  41          #define     AlarmSearch 0xEC
  42          
  43          #define     Convert      0x44
  44          #define     WriteScr     0x4E
  45          #define     ReadScr      0xBE
  46          #define     CopyScr      0x48
  47          #define     RecallEE     0xB8
  48          #define     ReadPower    0xB4
  49          
  50          
  51          /********************************************************
  52          * 函数                                                            * 
  53          ********************************************************/
  54          void Delayus(uchar us);    
  55          //void Dog(void);
C51 COMPILER V8.02   18B20                                                                 11/19/2008 17:14:39 PAGE 2   

  56          bit Ds18b20_Init(void); //DS18B20初始化,存在返0,否则返1
  57          void Ds18b20_WriteBit(bit bitdata);   //写bit2DS18B20
  58          void Ds18b20_WriteByte(uchar chrdata); //写Byte DS18B20
  59          void Ds18b20_Write(uchar *p_readdata, uchar bytes); //写 DS18B20
  60          bit Ds18b20_ReadBit(void);   //读bit From DS18B20
  61          uchar Ds18b20_ReadByte(void); //读Byte DS18B20
  62          bit Ds18b20_ReadRom(uchar *p_readdata); //读 DS18B20 ROM:成功返0,失败返1
  63          bit Ds18b20_ReadEE(uchar *p_readdata); //读 DS18B20 EE :成功返0,失败返1
  64          bit TempCal(float *p_wendu); //成功返0,失败返1 (温度范围-55 --- +128)
  65          
  66          
  67          /********************************************************
  68          * us延时程序                                                 *
  69          ********************************************************/
  70          void Delayus(uchar us)   
  71          { 
  72   1          while(us--); //12M,一次6us,加进入退出14us(8M晶振,一次9us)  
  73   1      }
  74          
  75          
  76          /********************************************************
  77          * DS18B20初始化                                         *
  78          ********************************************************/
  79          bit Ds18b20_Init(void) //存在返0,否则返1
  80          {
  81   1      bit temp = 1;
  82   1      uchar outtime = ReDetectTime; //超时时间
  83   1      while(outtime-- && temp)
  84   1      {
  85   2         Delayus(10); //(250)1514us时间可以减小吗
  86   2         ReleaseDQ();
  87   2         Delay2us();
  88   2         PullDownDQ();
  89   2         Delayus(100); //614us(480-960)
  90   2         ReleaseDQ();
  91   2         Delayus(10); //73us(>60)
  92   2         temp = dq;
  93   2         Delayus(70); //us
  94   2      }
  95   1      return temp;
  96   1      }
  97          
  98          /********************************************************
  99          * 写bit2DS18B20                                        *
 100          ********************************************************/
 101          void Ds18b20_WriteBit(bit bitdata)
 102          {
 103   1      if(bitdata)
 104   1      {
 105   2         PullDownDQ();
 106   2         Delay2us();   //2us(>1us)
 107   2         ReleaseDQ(); //(上述1-15)
 108   2         Delayus(12); //86us(45- x,总时间>60)
 109   2      }else
 110   1      {
 111   2         PullDownDQ();
 112   2         Delayus(12); //86us(60-120)
 113   2      }
 114   1      ReleaseDQ();
 115   1      Delay2us();    //2us(>1us) 
 116   1      }
 117          
C51 COMPILER V8.02   18B20                                                                 11/19/2008 17:14:39 PAGE 3   

 118          /********************************************************
 119          * 写Byte DS18B20                                       *
 120          ********************************************************/
 121          void Ds18b20_WriteByte(uchar chrdata)
 122          {
 123   1      uchar ii;
 124   1      for(ii = 0; ii < 8; ii++)
 125   1      {
 126   2         Ds18b20_WriteBit(chrdata & 0x01);
 127   2         chrdata >>= 1;
 128   2      }
 129   1      }
 130          
 131          /********************************************************
 132          * 写 DS18B20                                              *
 133          ********************************************************/
 134          //void Ds18b20_Write(uchar *p_readdata, uchar bytes)
 135          //{
 136          // while(bytes--)
 137          // {
 138          //   Ds18b20_WriteByte(*p_readdata);
 139          //   p_readdata++;
 140          // }
 141          //}
 142          
 143          
 144          /********************************************************
 145          * 读bit From DS18B20                                 *
 146          ********************************************************/
 147          bit Ds18b20_ReadBit(void)
 148          {
 149   1      bit bitdata;
 150   1      PullDownDQ();
 151   1      Delay2us();   //2us( >1us) 
 152   1      ReleaseDQ();
 153   1      Delay8us();   //8us( <15us)
 154   1      bitdata = dq;
 155   1      Delayus(7); //86us(上述总时间要>60us)
 156   1      return bitdata;
 157   1      }
 158          
 159          
 160          /********************************************************
 161          * 读Byte DS18B20                                      *
 162          ********************************************************/
 163          uchar Ds18b20_ReadByte(void)
 164          {
 165   1      uchar ii,chardata;
 166   1      for(ii = 0; ii < 8; ii++)
 167   1      { 
 168   2         chardata >>= 1;
 169   2         if(Ds18b20_ReadBit()) chardata |= 0x80; 
 170   2      }
 171   1      return chardata;
 172   1      }
 173          
 174          
 175          /********************************************************
 176          * 读 DS18B20 ROM                                    *
 177          ********************************************************/
 178          bit Ds18b20_ReadRom(uchar *p_readdata) //成功返0,失败返1
 179          {
C51 COMPILER V8.02   18B20                                                                 11/19/2008 17:14:39 PAGE 4   

 180   1      uchar ii = 8;
 181   1      if(Ds18b20_Init()) return 1;
 182   1      Ds18b20_WriteByte(ReadROM);
 183   1      while(ii--)
 184   1      {
 185   2         *p_readdata = Ds18b20_ReadByte();
 186   2         p_readdata++;
 187   2      }
 188   1      return 0;
 189   1      }
 190          
 191          
 192          /********************************************************
 193          * 读 DS18B20 EE                                        *
 194          ********************************************************/
 195          bit Ds18b20_ReadEE(uchar *p_readdata) //成功返0,失败返1
 196          {
 197   1      uchar ii = 2;
 198   1      
 199   1      if(Ds18b20_Init()) return 1;
 200   1      Ds18b20_WriteByte(SkipROM);
 201   1      Ds18b20_WriteByte(ReadScr);
 202   1      while(ii--)
 203   1      {
 204   2         *p_readdata = Ds18b20_ReadByte();
 205   2         p_readdata++;
 206   2      }
 207   1      return 0;
 208   1      }
 209          
 210          
 211          /********************************************************
 212          * 温度采集计算                                             *
 213          ********************************************************/
 214          bit TempCal(float *p_wendu) //成功返0,失败返1 (温度范围-55 --- +128)
 215          {
 216   1      uchar temp[9],ii;
 217   1      uint tmp;
 218   1      float tmpwendu;
 219   1      
 220   1      TR1 = 0;
 221   1      TR0 = 0;
 222   1      
 223   1      //读暂存器和CRC值-----------------------
 224   1      if(Ds18b20_ReadEE(temp))
 225   1      {
 226   2         TR1 = 1;
 227   2         TR0 = 1;
 228   2         return 1;
 229   2      }
 230   1      //-------------------------------------
 231   1      
 232   1          //CRC校验------------------------------
 233   1      //
 234   1      //此处应加入CRC校验等
 235   1      //
 236   1      //
 237   1      //-------------------------------------
 238   1      
 239   1      
 240   1      //使温度值写入相应的wendu[i]数组中-----
 241   1      for(ii = i; ii > 0; ii--)  
C51 COMPILER V8.02   18B20                                                                 11/19/2008 17:14:39 PAGE 5   

 242   1      {
 243   2         p_wendu++;
 244   2      }
 245   1      i++;
 246   1      if(i > 4) i = 0;
 247   1      //-------------------------------------
 248   1      
 249   1      
 250   1      //温度正负数处理-----------------------
 251   1      //
 252   1      
 253   1      //-------------------------------------
 254   1      
 255   1      
 256   1      //温度计算-----------------------------
 257   1      tmp = temp[1];   //
 258   1      tmp <<= 8;    //
 259   1      tmp |= temp[0];   //组成温度的两字节合并
 260   1      tmpwendu = tmp;
 261   1      *p_wendu = tmpwendu / 16;
 262   1      //-------------------------------------
 263   1      
 264   1      
 265   1      //开始温度转换-------------------------
 266   1      if(Ds18b20_Init()) 
 267   1      {
 268   2         TR1 = 1;
 269   2         TR0 = 1;
 270   2         return 1;
 271   2      }
 272   1      Ds18b20_WriteByte(SkipROM);
 273   1      Ds18b20_WriteByte(Convert);
 274   1      ReleaseDQ(); //寄生电源时要拉高DQ
 275   1      //------------------------------------
 276   1      
 277   1      TR1 = 1;
 278   1      TR0 = 1;
 279   1      return 0;
 280   1      }
 281          
 282          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    393    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2      20
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       3
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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