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

📄 read-ds18b20-lcd1602-c51.lst

📁 基于51的DS18B20_1Wire温度控制等C,ASM源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 237   1      }
 238          
 239          /*******************************************************************/
 240          /*                                                                 */
 241          /* 写一位                                                          */
C51 COMPILER V8.02   READ_DS18B20_LCD1602_C51                                              09/18/2006 17:58:36 PAGE 5   

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

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

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

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


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 + -