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

📄 18b20.lst

📁 读取DS18B20温度传感器程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 251   2                      DQ=1;
 252   2                      if(DQ==1)
 253   2                      u|=0x80;
 254   2                      TempDelay(4);
 255   2                      _nop_();        
 256   2              }
 257   1              return(u);
 258   1      }
 259          //-------------------------------------
 260          void Delay(unsigned int t)   // delay 40us
 261          {
 262   1       for(;t!=0;t--) ;
 263   1      }
 264          //=============================================
 265          void SendCommandByte(unsigned char ch)
 266          {
 267   1         RS=0;
 268   1         RW=0;
 269   1         P0=ch;
 270   1         E=1;
 271   1          Delay(1);
 272   1         E=0;
 273   1         Delay(100);  //delay 40us
 274   1      }
 275          //-------------------------------------------------------
 276          void SendDataByte(unsigned char ch)
 277          {  RS=1;
 278   1         RW=0;
 279   1         P0=ch;
 280   1         E=1;
 281   1             Delay(1);
 282   1         E=0;
 283   1         Delay(100); //delay 40us
 284   1      }
 285          //-------------------------------------------------
 286          void InitLcd()
 287          {SendCommandByte(0x30);
 288   1       SendCommandByte(0x30);
 289   1       SendCommandByte(0x30);
 290   1       SendCommandByte(0x38); //设置工作方式
 291   1       SendCommandByte(0x0c); //显示状态设置
 292   1       SendCommandByte(0x01); //清屏
 293   1       SendCommandByte(0x06); //输入方式设置
 294   1      }
 295          
 296          
 297          /*----------------------I2C要用到的一些子程序---------------------------------*/
 298          /***********************以下为一些用到的子程序*********************************/
 299          /*延时子程序*/
 300          void Delay_1ms(Uchar time)
 301          {
 302   1              Uchar j;
 303   1              while(time--)
C51 COMPILER V7.06   18B20                                                                 12/07/2007 03:15:42 PAGE 6   

 304   1              {
 305   2                      for(j=163;j!=0;j--)
 306   2                      {;}
 307   2              }
 308   1      }
 309          
 310          /*I2C的起动程序*/
 311          void I2CStart(void)     
 312          {
 313   1              SDA = 1;
 314   1              SomeNOP();
 315   1              SCL = 1;
 316   1              SomeNOP();
 317   1              SDA = 0;
 318   1              SomeNOP();
 319   1              SCL = 0;
 320   1              SomeNOP();
 321   1      }
 322          
 323          /*I2C的停止程序*/
 324          void I2CStop(void)
 325          {
 326   1              SDA = 0;
 327   1              SomeNOP();
 328   1              SCL = 1;
 329   1              SomeNOP();
 330   1              SDA = 1;
 331   1              SomeNOP();
 332   1      }
 333          /*
 334          void I2CACK(void)                       //Acknowledge信号
 335          {
 336                  SDA = 0;
 337                  SomeNOP();
 338                  SCL = 1;
 339                  SomeNOP();
 340                  SCL = 0;
 341                  SomeNOP();
 342          }
 343          
 344          void I2CNACK(void)                      //没有Acknowledge信号
 345          {
 346                  SDA = 1;
 347                  SomeNOP();
 348                  SCL = 1;
 349                  SomeNOP();
 350                  SCL = 0;
 351                  SomeNOP();
 352          }
 353          */
 354          void AutoACK(void)              //在一定的时间内自动确定ACK的信号//
 355          {
 356   1              Uchar i = 0;
 357   1              SCL = 1;
 358   1              SomeNOP();
 359   1              while((SDA == 1)&&(i<255))i++;
 360   1              SCL = 0;
 361   1              SomeNOP();
 362   1      }
 363          
 364                  
 365          /*I2C写数据程序(向数据线上写一个BYTE)*/
C51 COMPILER V7.06   18B20                                                                 12/07/2007 03:15:42 PAGE 7   

 366          void Writex(Uchar j)
 367          {
 368   1              Uchar i,temp;
 369   1              temp = j;
 370   1              for (i=0;i<8;i++)       //串行移位,先送高位,再送低位//
 371   1              {
 372   2                      temp =temp<<1;
 373   2                      SCL = 0;
 374   2                      SomeNOP();
 375   2                      SDA = CY;
 376   2                      SomeNOP();
 377   2                      SCL = 1;
 378   2                      SomeNOP();
 379   2              }
 380   1              SCL = 0;
 381   1              SomeNOP();
 382   1              SDA = 1;
 383   1              SomeNOP();
 384   1      }
 385          /*I2C读数据程序(从数据线上读出一个BYTE)返回值为读出的数据(BYTE型)*/
 386          Uchar Readx(void)
 387          {
 388   1              Uchar i,j,k=0;
 389   1              SCL = 0;
 390   1              SomeNOP();
 391   1              SDA = 1;
 392   1              for (i=0;i<8;i++)       // 串行移位,先读出高位,后读出低位//
 393   1              {
 394   2                      SomeNOP();
 395   2                      SCL = 1;
 396   2                      SomeNOP();
 397   2                      if(SDA ==1) j=1;
 398   2                      else    j=0;
 399   2                      k =(k<<1)|j;
 400   2                      SCL = 0;
 401   2              }
 402   1              SomeNOP();              
 403   1              return(k);              //返回读出的值//
 404   1      }
 405          
 406          //******************以下为对24CXX系列的读写程序******************************//
 407          //*************24CXX的device address 为写0A0H,读为0A1H*********************//
 408          /*某个地址写数据*/
 409          void X24_Write(Uchar Addresslow,Uchar Write_date)
 410          {
 411   1              I2CStart();
 412   1              Writex(0xA0);
 413   1              AutoACK();
 414   1              Writex(Addresslow);
 415   1              AutoACK();
 416   1              Writex(Write_date);
 417   1              AutoACK();
 418   1              I2CStop();
 419   1              Delay_1ms(10);
 420   1      }
 421          
 422          /*对某个地址读操作,函数值为读出的数据*/
 423          Uchar X24_Read(Uchar Addresslow)
 424          {       
 425   1              Uchar i;
 426   1              I2CStart();
 427   1              Writex(0xA0);
C51 COMPILER V7.06   18B20                                                                 12/07/2007 03:15:42 PAGE 8   

 428   1              AutoACK();
 429   1              Writex(Addresslow);
 430   1              AutoACK();
 431   1              I2CStart();
 432   1              Writex(0xA1);
 433   1              AutoACK();
 434   1              i =Readx();
 435   1              //ACK();        //注意:这里不能有ACK应答信号//
 436   1              I2CStop();
 437   1              Delay_1ms(0);
 438   1              return(i);
 439   1      }
 440          
 441          /*对内存中的数据块写入,入口为写EEPROM的地址,内存缓冲中的数据的起始地址(是IDATA的数据)*/       
 442          /*
 443          void X24_WritePage(Uchar Addresshigh,Uchar Addresslow,Uchar idata *Writeip)
 444          {
 445                  Uchar i;
 446                  I2CStart();
 447                  Writex(0xA0);
 448                  AutoACK();
 449                  Writex(Addresshigh);
 450                  AutoACK();
 451                  Writex(Addresslow);
 452                  AutoACK();
 453                  for(i=0;i<16;i++)
 454                  {
 455                          Writex(*Writeip++);
 456                          AutoACK();
 457                  }
 458                  I2CStop();
 459          }
 460          */
 461          /*把EEPROM中的数据读出来存放在内存缓冲中,起始地址为(是IDATA的数据)*/
 462          /*
 463          void X24_ReadPage(Uchar Addresshigh,Uchar Addresslow,Uchar idata *Readip)
 464          {
 465                  Uchar i;
 466                  I2CStart();
 467                  Writex(0xA0);
 468                  AutoACK();
 469                  Writex(Addresshigh);
 470                  AutoACK();
 471                  Writex(Addresslow);
 472                  AutoACK();
 473                  I2CStart();
 474                  Writex(0xA1);
 475                  AutoACK();
 476                  for(i=0;i<16;i++)               //PAGE读的时候最后一个BYTE不要ACK信号//
 477                  {
 478                          *Readip = Readx();
 479                           Readip = Readip++;
 480                           I2CACK();
 481                          }
 482                  *Readip = Readx();
 483                  I2CNACK();
 484                  I2CStop();
 485                  Delay_1ms(0);
 486          }
 487          */
 488          
 489          void ramini(void)
C51 COMPILER V7.06   18B20                                                                 12/07/2007 03:15:42 PAGE 9   

 490          {
 491   1              TMP.cChar[0]=X24_Read(0x10);
 492   1              TMP.cChar[1]=X24_Read(0x11);
 493   1              highwd=TMP.iInt;
 494   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1071    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12       2
   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 + -