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

📄 read-ds18b20-lcd1602-c51.lst

📁 读取ds18b20的序列号的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 236          /*                                                                 */
 237          /* 写一位                                                          */
 238          /*                                                                 */
 239          /*******************************************************************/
 240          void write_bit(char bitval) 
 241          {
C51 COMPILER V7.06   READ_DS18B20_LCD1602_C51                                              05/02/2009 22:07:12 PAGE 5   

 242   1      DQ = 0;                                        // 将DQ 拉低开始写时间隙
 243   1      if(bitval==1) DQ =1;     // 如果写1,DQ 返回高电平
 244   1      Delay(5);                                     // 在时间隙内保持电平值,
 245   1      DQ = 1;                  // Delay函数每次循环延时16μs,因此delay(5) = 104μs
 246   1      }       
 247          
 248          /*******************************************************************/
 249          /*                                                                 */
 250          /* 写一个字节                                                      */
 251          /*                                                                 */
 252          /*******************************************************************/
 253           WriteOneChar(unsigned char dat)
 254          {
 255   1        unsigned char i = 0;
 256   1        unsigned char temp;
 257   1      //  for (i = 8; i > 0; i--)
 258   1      //  {
 259   1         for (i=0; i<8; i++)  // 写入字节, 每次写入一位 
 260   1         {
 261   2      //    DQ = 0;
 262   2      //    DQ = dat&0x01;
 263   2      //    Delay(5);
 264   2      
 265   2      //    DQ = 1;
 266   2         temp = dat>>i;               
 267   2         temp &= 0x01;                
 268   2         write_bit(temp);
 269   2      //    dat>>=1;
 270   2         
 271   2        }
 272   1        Delay(5);
 273   1      }
 274          
 275          /*******************************************************************/
 276          /*                                                                 */
 277          /* 读取64位序列码                                                  */
 278          /*                                                                 */
 279          /*******************************************************************/
 280           Read_RomCord(void)
 281          {
 282   1           unsigned char j;
 283   1           Init_DS18B20();
 284   1        
 285   1           WriteOneChar(0x33);  // 读序列码的操作
 286   1           for (j = 0; j < 8; j++)
 287   1               {
 288   2                RomCode[j] = ReadOneChar() ; 
 289   2               }
 290   1      }
 291          
 292          /*******************************************************************/
 293          /*                                                                 */
 294          /*DS18B20的CRC8校验程序                                            */
 295          /*                                                                 */
 296          /*******************************************************************/
 297          uchar CRC8() 
 298          { 
 299   1         uchar i,x; uchar crcbuff;
 300   1         
 301   1         crc=0;
 302   1         for(x = 0; x <8; x++)
 303   1         {
C51 COMPILER V7.06   READ_DS18B20_LCD1602_C51                                              05/02/2009 22:07:12 PAGE 6   

 304   2          crcbuff=RomCode[x];
 305   2          for(i = 0; i < 8; i++) 
 306   2           { 
 307   3            if(((crc ^ crcbuff)&0x01)==0) 
 308   3            crc >>= 1; 
 309   3             else { 
 310   4                    crc ^= 0x18;   //CRC=X8+X5+X4+1
 311   4                    crc >>= 1; 
 312   4                    crc |= 0x80; 
 313   4                  }         
 314   3            crcbuff >>= 1;       
 315   3               }
 316   2         }
 317   1           return crc;        
 318   1      }
 319          /*******************************************************************/
 320          /*                                                                 */
 321          /* 数据转换与显示                                                  */
 322          /*                                                                 */
 323          /*******************************************************************/
 324          
 325           Disp_RomCode()
 326          {
 327   1         uchar j;
 328   1         uchar H_num=0x40;       //LCD第二行初始位置
 329   1      
 330   1         for(j=0;j<8;j++)
 331   1         {
 332   2          Temp = RomCode[j];
 333   2      
 334   2          display[0]=((Temp&0xf0)>>4);
 335   2          if(display[0]>9)
 336   2           { display[0]=display[0]+0x37;}
 337   2          else{display[0]=display[0]+0x30;}
 338   2      
 339   2          lcd_pos(H_num);             
 340   2          lcd_wdat(display[0]);        //高位数显示 
 341   2      
 342   2          H_num++;
 343   2          display[1]=(Temp&0x0f);
 344   2          if(display[1]>9)
 345   2           {display[1]=display[1]+0x37;}
 346   2          else {display[1]=display[1]+0x30;}
 347   2      
 348   2          lcd_pos(H_num);             
 349   2          lcd_wdat(display[1]);        //低位数显示 
 350   2          H_num++;
 351   2         }
 352   1      }        
 353          
 354          /*******************************************************************/
 355          /*                                                                 */
 356          /* 蜂鸣器响一声                                                    */
 357          /*                                                                 */
 358          /*******************************************************************/
 359          void beep()
 360            {
 361   1          unsigned char y;
 362   1          for (y=0;y<100;y++)
 363   1          {
 364   2            Delay(60);
 365   2            BEEP=!BEEP;                //BEEP取反
C51 COMPILER V7.06   READ_DS18B20_LCD1602_C51                                              05/02/2009 22:07:12 PAGE 7   

 366   2          } 
 367   1          BEEP=1;                      //关闭蜂鸣器
 368   1              Delay(40000);
 369   1        }
 370          
 371          /*******************************************************************/
 372          /*                                                                 */
 373          /* DS18B20 OK 显示菜单                                             */
 374          /*                                                                 */
 375          /*******************************************************************/
 376          void  Ok_Menu ()
 377          { 
 378   1          uchar  m;
 379   1          lcd_init();                //初始化LCD 
 380   1                  
 381   1          lcd_pos(0);                //设置显示位置为第一行的第1个字符
 382   1           m = 0;
 383   1          while(cdis1[m] != '\0')
 384   1           {                         //显示字符
 385   2             lcd_wdat(cdis1[m]);
 386   2             m++;
 387   2           }
 388   1      
 389   1          lcd_pos(0x40);             //设置显示位置为第二行第1个字符
 390   1           m = 0;
 391   1          while(cdis2[m] != '\0')
 392   1           {
 393   2             lcd_wdat(cdis2[m]);      //显示字符
 394   2             m++;
 395   2           }
 396   1      }
 397          
 398          /*******************************************************************/
 399          /*                                                                 */
 400          /* DS18B20 ERROR 显示菜单                                          */
 401          /*                                                                 */
 402          /*******************************************************************/
 403          void  Error_Menu ()
 404          {
 405   1           uchar  m;
 406   1           lcd_init();                //初始化LCD 
 407   1              
 408   1               lcd_pos(0);                //设置显示位置为第一行的第1个字符
 409   1           m = 0;
 410   1           while(cdis3[m] != '\0')
 411   1           {                         //显示字符
 412   2             lcd_wdat(cdis3[m]);
 413   2             m++;
 414   2           }
 415   1      
 416   1           lcd_pos(0x40);             //设置显示位置为第二行第1个字符
 417   1           m = 0;
 418   1           while(cdis4[m] != '\0')
 419   1           {
 420   2             lcd_wdat(cdis4[m]);      //显示字符
 421   2             m++;
 422   2           }
 423   1      }
 424          
 425          /*******************************************************************/
 426          /*                                                                 */
 427          /* 主函数                                                          */
C51 COMPILER V7.06   READ_DS18B20_LCD1602_C51                                              05/02/2009 22:07:12 PAGE 8   

 428          /*                                                                 */
 429          /*******************************************************************/
 430          void main()
 431           {
 432   1           P0=0;
 433   1              P2&=0x1F;
 434   1      
 435   1         while(1)
 436   1        {
 437   2           Ok_Menu ();
 438   2           Read_RomCord();    //读取64位序列码
 439   2           CRC8();            //CRC效验
 440   2           if(crc==0)         //CRC效验正确
 441   2               {
 442   3                Disp_RomCode();       //显示64位序列码
 443   3                beep();
 444   3           }
 445   2           while(!presence)
 446   2               {
 447   3                Init_DS18B20();
 448   3                delay1(1000);
 449   3               }
 450   2      
 451   2           Error_Menu ();
 452   2              do
 453   2               {  
 454   3                 Init_DS18B20();
 455   3                 beep();
 456   3           }
 457   2              while(presence);
 458   2        }
 459   1      }
 460          
 461          /*******************************************************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    655    ----
   CONSTANT SIZE    =     68    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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