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

📄 ds18b20-lcd1602-c51.lst

📁 基于51的DS18B20_1Wire温度控制等C,ASM源程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 255          {
 256   1        unsigned char i = 0;
 257   1        for (i = 8; i > 0; i--)
 258   1        {
 259   2          DQ = 0;
 260   2          DQ = dat&0x01;
 261   2          Delay(5);
 262   2      
 263   2          DQ = 1;
 264   2          dat>>=1;
 265   2        }
 266   1      }
 267          
 268          /*******************************************************************/
 269          /*                                                                 */
 270          /* 温度报警值写入DS18B20                                           */
 271          /*                                                                 */
 272          /*******************************************************************/
 273          Write_Temperature_alarm(void)
 274          {
 275   1          Init_DS18B20();
 276   1        
 277   1          WriteOneChar(0xCC);           //跳过读序号列号的操作 
 278   1          WriteOneChar(0x4e);           //将设定的温度报警值写入 DS18B20
 279   1              WriteOneChar(temp_alarm[0]);  //写TH
 280   1              WriteOneChar(temp_alarm[1]);  //写TL
 281   1          WriteOneChar(0x7f);           //12位精确度
 282   1       
 283   1              Init_DS18B20();
 284   1          WriteOneChar(0xCC);           //跳过读序号列号的操作 
 285   1          WriteOneChar(0x48);           //把暂存器里的温度报警值拷贝到EEROM
 286   1      }
 287          
 288          /*******************************************************************/
 289          /*                                                                 */
 290          /* 读取64位序列码                                                  */
 291          /*                                                                 */
 292          /*******************************************************************/
 293           Read_RomCord(void)
 294          {
 295   1         unsigned char j;
 296   1         Init_DS18B20();
 297   1        
 298   1         WriteOneChar(0x33);          // 读序列码的操作
 299   1         for (j = 0; j < 8; j++)
 300   1         {
 301   2           RomCode[j] = ReadOneChar() ; 
 302   2         }
 303   1      }
C51 COMPILER V8.05a   DS18B20_LCD1602_C51                                                  11/20/2006 21:44:00 PAGE 6   

 304          
 305          /*******************************************************************/
 306          /*                                                                 */
 307          /*DS18B20的CRC8校验程序                                            */
 308          /*                                                                 */
 309          /*******************************************************************/
 310          uchar CRC8() 
 311          { 
 312   1         uchar i,x; uchar crcbuff;
 313   1         
 314   1         crc=0;
 315   1         for(x = 0; x <8; x++)
 316   1         {
 317   2          crcbuff=RomCode[x];
 318   2          for(i = 0; i < 8; i++) 
 319   2           { 
 320   3            if(((crc ^ crcbuff)&0x01)==0) 
 321   3            crc >>= 1; 
 322   3             else { 
 323   4                    crc ^= 0x18;   //CRC=X8+X5+X4+1
 324   4                    crc >>= 1; 
 325   4                    crc |= 0x80; 
 326   4                  }         
 327   3            crcbuff >>= 1;       
 328   3               }
 329   2         }
 330   1           return crc;        
 331   1      }
 332          /*******************************************************************/
 333          /*                                                                 */
 334          /* 数据转换与显示                                                  */
 335          /*                                                                 */
 336          /*******************************************************************/
 337          
 338           Disp_RomCode(uchar H_num)
 339          {
 340   1         uchar j;
 341   1         
 342   1         if(H_num==1)
 343   1         lcd_pos(0x00); 
 344   1         if(H_num==2)
 345   1         lcd_pos(0x40);
 346   1           
 347   1         for(j=0;j<8;j++)
 348   1         {
 349   2          Temp = RomCode[j];
 350   2      
 351   2          display[0]=((Temp&0xf0)>>4);
 352   2          if(display[0]>9)
 353   2           { display[0]=display[0]+0x37;}
 354   2          else{display[0]=display[0]+0x30;}          
 355   2          lcd_wdat(display[0]);        //高位数显示 
 356   2      
 357   2          display[1]=(Temp&0x0f);
 358   2          if(display[1]>9)
 359   2           {display[1]=display[1]+0x37;}
 360   2          else {display[1]=display[1]+0x30;}           
 361   2          lcd_wdat(display[1]);        //低位数显示 
 362   2         }
 363   1      }        
 364          
 365          /*******************************************************************/
C51 COMPILER V8.05a   DS18B20_LCD1602_C51                                                  11/20/2006 21:44:00 PAGE 7   

 366          /*                                                                 */
 367          /* 读取温度                                                        */
 368          /*                                                                 */
 369          /*******************************************************************/
 370           Read_Temperature(void)
 371          {
 372   1           uchar  i;
 373   1           TR0=0;                     //关中断,防止读数错误
 374   1           Init_DS18B20();
 375   1        
 376   1           WriteOneChar(0xCC);        //跳过读序号列号的操作
 377   1           WriteOneChar(0x44);        //启动温度转换
 378   1      
 379   1           Init_DS18B20();
 380   1      
 381   1           WriteOneChar(0x55);         //匹配ROM命令
 382   1           for(i=0;i<8;i++)
 383   1           WriteOneChar(RomCode[i]);
 384   1      
 385   1           WriteOneChar(0xBE);         //读取温度寄存器
 386   1      
 387   1           temp_data[0] = ReadOneChar();   //温度低8位
 388   1           temp_data[1] = ReadOneChar();   //温度高8位
 389   1           temp_alarm[0] = ReadOneChar();  //温度报警TH
 390   1               temp_alarm[1] = ReadOneChar();  //温度报警TL
 391   1      
 392   1               temp_comp=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
 393   1                                         //取温度整数值
 394   1           TR0=1;        //开中断
 395   1      }
 396          /*******************************************************************/
 397          /*                                                                 */
 398          /* 数据转换与温度显示                                              */
 399          /*                                                                 */
 400          /*******************************************************************/
 401           Disp_Temperature()
 402          {
 403   1         uchar s=0;
 404   1         if(temp_data[1]>127)                  //温度为负值
 405   1         {                                        
 406   2          temp_data[0]=(~temp_data[0])+1;     //取反加一,将补码变成原码
 407   2          if((~temp_data[0])>=0xff)
 408   2          temp_data[1]=(~temp_data[1])+1;
 409   2          else temp_data[1]=~temp_data[1];
 410   2          s=1;
 411   2         }
 412   1              
 413   1         display[4]=temp_data[0]&0x0f;
 414   1         display[0]=(display[4]*10/16)+0x30;
 415   1        
 416   1         display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
 417   1         display[3]=display[4]/100+0x30;
 418   1         display[1]=display[4]%100;
 419   1         display[2]=display[1]/10+0x30;
 420   1         display[1]=display[1]%10+0x30;
 421   1      
 422   1          if(display[3]==0x30)        //高位为0,不显示
 423   1         { 
 424   2           display[3]=0x20;              
 425   2           if(display[2]==0x30)       //次高位为0,不显示
 426   2           display[2]=0x20;
 427   2         }
C51 COMPILER V8.05a   DS18B20_LCD1602_C51                                                  11/20/2006 21:44:00 PAGE 8   

 428   1         if(s)
 429   1         display[3]=0x2d;            //显示负号
 430   1          
 431   1          lcd_pos(0x07);             
 432   1          lcd_wdat(display[3]);      //百位数显示             
 433   1          lcd_wdat(display[2]);      //十位数显示              
 434   1          lcd_wdat(display[1]);      //个位数显示  
 435   1          lcd_wdat('.');            
 436   1          lcd_wdat(display[0]);      //小数位数显示
 437   1              lcd_wdat(0x00);            //显示自定义字符
 438   1          lcd_wdat('C');             //显示C
 439   1      }        
 440          
 441          /*******************************************************************/
 442          /*                                                                 */
 443          /* 蜂鸣器响一声                                                    */
 444          /*                                                                 */
 445          /*******************************************************************/
 446          void beep()
 447          {
 448   1          unsigned char y;
 449   1          for (y=0;y<100;y++)
 450   1          {
 451   2            Delay(70);
 452   2            BEEP=!BEEP;                //BEEP取反
 453   2          } 
 454   1          BEEP=1;                      //关闭蜂鸣器
 455   1              Delay(25000);
 456   1      }
 457          
 458          /*******************************************************************/
 459          /*                                                                 */
 460          /* ROMCORD 显示菜单                                                */
 461          /*                                                                 */
 462          /*******************************************************************/
 463          void  RomCode_Menu ()
 464          { 
 465   1          uchar  m;
 466   1          lcd_init();                //初始化LCD
 467   1       
 468   1          lcd_pos(0);                //设置显示位置为第一行
 469   1          for(m=0;m<16;m++)          //显示字符
 470   1          lcd_wdat(cdis1[m]);
 471   1           
 472   1          Read_RomCord();            //读取64位序列码
 473   1          CRC8();                    //CRC效验
 474   1          if(crc==0)                 //CRC效验正确
 475   1          {
 476   2                Disp_RomCode(2);             //显示64位序列码
 477   2          }
 478   1      }
 479          
 480          /*******************************************************************/
 481          /*                                                                 */
 482          /* DS18B20 ERROR 显示菜单                                          */
 483          /*                                                                 */
 484          /*******************************************************************/
 485          void  Error_Menu ()
 486          {
 487   1           uchar  m;
 488   1           lcd_init();                //初始化LCD 
 489   1              
C51 COMPILER V8.05a   DS18B20_LCD1602_C51                                                  11/20/2006 21:44:00 PAGE 9   

 490   1               lcd_pos(0);                //设置显示位置为第一行的第1个字符
 491   1           for(m=0;m<16;m++) 
 492   1           lcd_wdat(cdis3[m]);        //显示字符
 493   1          
 494   1           lcd_pos(0x40);             //设置显示位置为第二行第1个字符
 495   1           for(m=0;m<16;m++) 
 496   1           lcd_wdat(cdis4[m]);        //显示字符
 497   1      }
 498          
 499          /*******************************************************************/
 500          /*                                                                 */
 501          /* DS18B20 正常显示菜单                                            */
 502          /*                                                                 */
 503          /*******************************************************************/
 504          void  Natural_Menu ()
 505          {
 506   1         uchar  m;
 507   1         lcd_init();                //初始化LCD 
 508   1      
 509   1         lcd_pos(0);                //设置显示位置为第一行的第1个字符
 510   1         for(m=0;m<16;m++) 
 511   1         lcd_wdat(cdis5[m]);        //显示字符
 512   1      
 513   1         lcd_pos(0x40);             //设置显示位置为第二行第1个字符
 514   1         for(m=0;m<16;m++) 
 515   1         lcd_wdat(cdis6[m]);        //显示字符
 516   1      
 517   1         Read_Temperature();

⌨️ 快捷键说明

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