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

📄 ds18b20.lst

📁 Keil C 写的51单片机DS18B20温度传感器的驱动
💻 LST
📖 第 1 页 / 共 2 页
字号:
 172   2                      else
 173   2                              crc_data &= 0xF7;
 174   2                      if(1==xor_m)
 175   2                              crc_data |= 0x04;
 176   2                      else
 177   2                              crc_data &= 0xFB;
 178   2              }
C51 COMPILER V8.16   DS18B20                                                               01/11/2009 10:40:51 PAGE 4   

 179   1              
 180   1              return crc_data;                
 181   1      }
 182          
 183          /**********************************************************
 184          *功能描述:获取暂存器中的所有数据--包括CRC
 185          *函数名称:GetRAMData
 186          *函数参数:ramData 指向接收暂存器数据数组的指针
 187          *返回值:
 188          *注意事项:从DS18B20中读出的值全以unsigned char 形式保存在数
 189          *                 组中,有符号数一补码形式存储
 190          **********************************************************/
 191          void GetRAMData(u8 * ramData)
 192          {
 193   1              u8 i,j;
 194   1                              
 195   1              SelectOne();
 196   1              InputByte(DS18B20_CONVERT_TEMPERT);     //温度转换命令
 197   1              for(i=100;i>0;i--)                      //完成温度转换至少需要750ms
 198   1                      for(j=50;j>0;j--)
 199   1                      Delay200us();
 200   1                              
 201   1              SelectOne();
 202   1              InputByte(DS18B20_RD_SCRATCHPAD);       //读DS1820温度暂存器命令
 203   1              for(i=0;i<9;i++)
 204   1                      ramData[i]=OutputByte();        //获取温度数据和报警设置
 205   1      }
 206          
 207          /**********************************************************
 208          *功能描述:获取当前温度并根据参数决定是否进行CRC校验
 209          *函数名称:GetTempert
 210          *函数参数:do_crc 赋值1时进行CRC校验,否则不进行
 211          *返回值:获取温度方法1:
 212          *                       tempert_value = tempert/16.0 
 213          *               获取温度方法2:
 214          *                       tempertH = tempert/16;          //温度值整数部分
 215          *                       tempertL = tempert & 0x0F       //温度值小数部分
 216          *注意事项:      DS18B20的有效温度值为-55——128;本函数以返回
 217          *                       -64即-0x8400表示CRC验证未通过,即获取的温度错误
 218          **********************************************************/     
 219          s16 GetTempert(u8 do_crc)
 220          { 
 221   1              s16 tempert;
 222   1              u8 crc_data=0;
 223   1              u8 ramData[9]={0};
 224   1      
 225   1              GetRAMData(ramData);
 226   1              tempert =(ramData[1] << 8) + ramData[0]; //提取温度数据 
 227   1              
 228   1              if(1 == do_crc)
 229   1              {
 230   2                      crc_data=CRCGenerate(ramData,8);
 231   2                      if(crc_data == ramData[8])
 232   2                              return tempert;
 233   2                      else
 234   2                              return -0x8400;
 235   2              }
 236   1      
 237   1              return tempert;  
 238   1      }                                
 239          /**********************************************************
 240          *功能描述:设置报警温度上限值和下限值
C51 COMPILER V8.16   DS18B20                                                               01/11/2009 10:40:51 PAGE 5   

 241          *函数名称:SetAlarm
 242          *函数参数:Alarm_H 当温度高于这个值时触发报警
 243          *         Alarm_L 当温度低于这个值时触发报警
 244          *返回值:
 245          *注意事项:
 246          **********************************************************/
 247          void SetAlarm(s8 Alarm_H,s8 Alarm_L)
 248          {
 249   1              u8 i;
 250   1      
 251   1              SelectOne();    
 252   1              InputByte(DS18B20_WR_SCRATCHPAD);       //将温度报警触发写入暂存器的地址2、3
 253   1              InputByte(Alarm_H);
 254   1              InputByte(Alarm_L);
 255   1      
 256   1              SelectOne();
 257   1              InputByte(DS18B20_CP_SCRATCHPAD);       //将暂存器中的报警触发值写入ROM相应位置
 258   1              for(i=50;i>0;i--)
 259   1                      Delay200us();                   //写ROM需要一定时间
 260   1      
 261   1              SelectOne();
 262   1              InputByte(DS18B20_RECALL_EEPROM);       //将ROM中报警触发值召回到暂存器                           
 263   1      }
 264          /**********************************************************
 265          *功能描述:获取当前总线上唯一DS18B20的序列号
 266          *函数名称:ReadSerialNO
 267          *函数参数:serialNO 用以传递64位序列号
 268          *                 do_crc 赋值1时进行CRC校验,否则不进行
 269          *返回值:返回0表示校验正确,1为不正确;不进行校验时总返回0
 270          *注意事项:本函数是一个工具函数,可以在总线上只有一个DS18B20时
 271          *         获取他的64位序列号
 272          ************************************************************/ 
 273          u8 GetSerialNO(u8 * serialNO,u8 do_crc)
 274          {
 275   1              u8 i;
 276   1              u8 crc_data;
 277   1      
 278   1              Reset();                //复位
 279   1              InputByte(DS18B20_READ_ROM); 
 280   1              for(i=0;i<8;i++)
 281   1                      serialNO[i]=OutputByte();
 282   1              
 283   1              if(1 == do_crc)
 284   1              {
 285   2                      crc_data=CRCGenerate(serialNO,7);
 286   2                      if(crc_data == serialNO[7])
 287   2                              return 0;
 288   2                      else 
 289   2                              return 1;       
 290   2              }
 291   1      
 292   1              return 0;       
 293   1      } 
 294          /*
 295          void DS18B20_alarmSearch()
 296          {
 297                  bit search_direction =0;
 298                  bit last_device_flag =0;
 299                  bit last_discrepancy =0;
 300                  bit id_bit,id_bit_cmp;
 301                  u8 id_bit_num;
 302                  u8 last_zero=0;
C51 COMPILER V8.16   DS18B20                                                               01/11/2009 10:40:51 PAGE 6   

 303                  byte Rom_Value[8] = {0};
 304          
 305                  Reset();        
 306                  InputByte(0xF0);        //Search ROM命令
 307                  for(id_bit_num=1;id_bit_num !=64;id_bit_num++)
 308                  {
 309                          id_bit=DS18B20_outputBit();
 310                          id_bit_cmp=DS18B20_outputBit();
 311                          if(1==id_bit && 1==id_bit_cmp)  //总线上没有传感器了
 312                          {
 313                                  break;
 314                          }
 315                          else if(1==id_bit && 0==id_bit_cmp)     //参与搜索传感器的ROM 相应位为1
 316                          {
 317                                  search_direction=1;
 318                          }
 319                          else if(0==id_bit && 1==id_bit_cmp)     //参与搜索传感器的ROM 相应位为0
 320                          {
 321                                  search_direction=0;
 322                          }
 323                          else if(0==id_bit && 0==id_bit_cmp)     //参与搜索传感器的ROM 相应位既有0 又有1
 324                          {
 325                                  search_direction=0;
 326                          }
 327          
 328                          if(0==search_direction)
 329                                  Rom_Value[id_bit_num/8] |= 0<<(id_bit_num%8);
 330                          else
 331                                  Rom_Value[id_bit_num/8] |= 1<<(id_bit_num%8);
 332                          DS18B20_inputBit(search_direction);
 333                  }                       
 334          } */


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    578    ----
   CONSTANT SIZE    =     33    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1      38
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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