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

📄 ds18b20-lcd1602-c51.lst

📁 基于51的DS18B20_1Wire温度控制等C,ASM源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 225   2          dat >>= 1;
 226   2          DQ = 1; // 给脉冲信号
 227   2      
 228   2          if(DQ)
 229   2           dat |= 0x80;
 230   2          Delay(4);
 231   2        }
 232   1      
 233   1          return (dat);
 234   1      }
 235          
 236          /*******************************************************************/
 237          /*                                                                 */
 238          /* 写一个字节                                                      */
 239          /*                                                                 */
 240          /*******************************************************************/
 241           WriteOneChar(unsigned char dat)
C51 COMPILER V8.02   DS18B20_LCD1602_C51                                                   08/21/2006 15:48:03 PAGE 5   

 242          {
 243   1        unsigned char i = 0;
 244   1        for (i = 8; i > 0; i--)
 245   1        {
 246   2          DQ = 0;
 247   2          DQ = dat&0x01;
 248   2          Delay(5);
 249   2      
 250   2          DQ = 1;
 251   2          dat>>=1;
 252   2        }
 253   1      }
 254          
 255          /*******************************************************************/
 256          /*                                                                 */
 257          /* 读取温度                                                        */
 258          /*                                                                 */
 259          /*******************************************************************/
 260           Read_Temperature(unsigned char x)
 261          {
 262   1           unsigned char i;
 263   1           Init_DS18B20();
 264   1        
 265   1           WriteOneChar(0xCC);  // 跳过读序号列号的操作
 266   1           WriteOneChar(0x44);  // 启动温度转换
 267   1      
 268   1           Init_DS18B20();
 269   1      //   WriteOneChar(0xCC);  //跳过读序号列号的操作
 270   1           WriteOneChar(0x55);  //匹配ROM命令
 271   1           for(i=0;i<8;i++)
 272   1           {
 273   2             WriteOneChar(RomCode[x][i]);
 274   2           }  
 275   1           WriteOneChar(0xBE);  //读取温度寄存器
 276   1      
 277   1           temp_data[0] = ReadOneChar();   //温度低8位
 278   1           temp_data[1] = ReadOneChar();   //温度高8位 
 279   1      }
 280          
 281          /*******************************************************************/
 282          /*                                                                 */
 283          /* 数据转换与温度显示                                              */
 284          /*                                                                 */
 285          /*******************************************************************/
 286           Disp_Temperature(uchar x)
 287          {
 288   1        display[4]=temp_data[0]&0x0f;
 289   1        display[0]=ditab[display[4]]+0x30;     //查表得小数位的值
 290   1        
 291   1        display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
 292   1        display[3]=display[4]/100+0x30;
 293   1        display[1]=display[4]%100;
 294   1        display[2]=display[1]/10+0x30;
 295   1        display[1]=display[1]%10+0x30;
 296   1      
 297   1          if(display[3]==0x30)        //高位为0,不显示
 298   1         { 
 299   2           display[3]=0x20;              
 300   2           if(display[2]==0x30)      //次高位为0,不显示
 301   2           display[2]=0x20;
 302   2         }
 303   1          if(x==1)
C51 COMPILER V8.02   DS18B20_LCD1602_C51                                                   08/21/2006 15:48:03 PAGE 6   

 304   1          {
 305   2           lcd_pos(0x48);               //在LCD第二行显示
 306   2           lcd_wdat(display[3]);        //百位数显示 
 307   2           lcd_pos(0x49);             
 308   2           lcd_wdat(display[2]);        //十位数显示 
 309   2               lcd_pos(0x4a);             
 310   2           lcd_wdat(display[1]);        //个位数显示 
 311   2               lcd_pos(0x4c);             
 312   2           lcd_wdat(display[0]);        //小数位数显示
 313   2          }
 314   1         else
 315   1           {
 316   2           lcd_pos(0x08);               //在LCD第一行显示
 317   2           lcd_wdat(display[3]);        //百位数显示 
 318   2           lcd_pos(0x09);             
 319   2           lcd_wdat(display[2]);        //十位数显示 
 320   2               lcd_pos(0x0a);             
 321   2           lcd_wdat(display[1]);        //个位数显示 
 322   2               lcd_pos(0x0c);             
 323   2           lcd_wdat(display[0]);        //小数位数显示
 324   2          }
 325   1      
 326   1      }        
 327          
 328          /*******************************************************************/
 329          /*                                                                 */
 330          /* 蜂鸣器响一声                                                    */
 331          /*                                                                 */
 332          /*******************************************************************/
 333          void beep()
 334            {
 335   1          unsigned char y;
 336   1          for (y=0;y<100;y++)
 337   1          {
 338   2            Delay(60);
 339   2            BEEP=!BEEP;                //BEEP取反
 340   2          } 
 341   1          BEEP=1;                      //关闭蜂鸣器
 342   1              Delay(40000);
 343   1        }
 344          
 345          /*******************************************************************/
 346          /*                                                                 */
 347          /* DS18B20 OK 显示菜单                                             */
 348          /*                                                                 */
 349          /*******************************************************************/
 350          void  Ok_Menu ()
 351          { 
 352   1          uchar  m;
 353   1          lcd_init();                //初始化LCD 
 354   1                  
 355   1          lcd_pos(0);                //设置显示位置为第一行的第1个字符
 356   1           m = 0;
 357   1          while(cdis1[m] != '\0')
 358   1           {                         //显示字符
 359   2             lcd_wdat(cdis1[m]);
 360   2             m++;
 361   2           }
 362   1           
 363   1           writetab();               //自定义字符写入CGRAM
 364   1           delay1(5);
 365   1           lcd_pos(0x0d);
C51 COMPILER V8.02   DS18B20_LCD1602_C51                                                   08/21/2006 15:48:03 PAGE 7   

 366   1           lcd_wdat(0x00);          //显示自定义字符
 367   1      
 368   1          lcd_pos(0x40);             //设置显示位置为第二行第1个字符
 369   1           m = 0;
 370   1          while(cdis2[m] != '\0')
 371   1           {
 372   2             lcd_wdat(cdis2[m]);      //显示字符
 373   2             m++;
 374   2           }
 375   1      
 376   1      //   writetab();             //自定义字符写入CGRAM
 377   1      //   delay1(5);
 378   1           lcd_pos(0x4d);
 379   1           lcd_wdat(0x00);          //显示自定义字符
 380   1      }
 381          
 382          /*******************************************************************/
 383          /*                                                                 */
 384          /* DS18B20 ERROR 显示菜单                                          */
 385          /*                                                                 */
 386          /*******************************************************************/
 387          void  Error_Menu ()
 388          {
 389   1           uchar  m;
 390   1           lcd_init();                //初始化LCD 
 391   1              
 392   1               lcd_pos(0);                //设置显示位置为第一行的第1个字符
 393   1           m = 0;
 394   1           while(cdis3[m] != '\0')
 395   1           {                         //显示字符
 396   2             lcd_wdat(cdis3[m]);
 397   2             m++;
 398   2           }
 399   1      
 400   1           lcd_pos(0x40);             //设置显示位置为第二行第1个字符
 401   1           m = 0;
 402   1           while(cdis4[m] != '\0')
 403   1           {
 404   2             lcd_wdat(cdis4[m]);      //显示字符
 405   2             m++;
 406   2           }
 407   1      }
 408          
 409          /*******************************************************************/
 410          /*                                                                 */
 411          /* 主函数                                                          */
 412          /*                                                                 */
 413          /*******************************************************************/
 414          void main()
 415           {
 416   1           Ok_Menu ();
 417   1      
 418   1              do
 419   1               {
 420   2            Read_Temperature(0);
 421   2                Disp_Temperature(0);
 422   2            delay1(30);
 423   2                Read_Temperature(1);
 424   2                Disp_Temperature(1);
 425   2            delay1(30);
 426   2           }
 427   1          while(!presence) ;
C51 COMPILER V8.02   DS18B20_LCD1602_C51                                                   08/21/2006 15:48:03 PAGE 8   

 428   1      
 429   1           Error_Menu ();
 430   1      
 431   1              do
 432   1               {  
 433   2                 Init_DS18B20();
 434   2                 beep();
 435   2           }
 436   1              while(presence);
 437   1      }
 438          
 439          /*******************************************************************/


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