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

📄 wdbj.lst

📁 一个可控温度报警装置的源码,用DS18B20采集温度,用4个按键设置温度的上下限并存在EEPROM中,按键可实现单击和长按,且时间精确,也是一个不错的键盘程序.4个数码管显示温度,4个数码管用来设定.
💻 LST
📖 第 1 页 / 共 2 页
字号:
 263   1              yingda();
 264   1              stop();
 265   1              EA=1;
 266   1              DelayM(5);
 267   1      }
 268          
 269          uchar read_add(uchar dizhi)
 270          {       
 271   1              uchar date;
 272   1              start();
 273   1              write_byte(0xa0);
 274   1              yingda();
 275   1              write_byte(dizhi);
 276   1              yingda();
 277   1              start();
 278   1              write_byte(0xa1);
 279   1              yingda();
 280   1              date=read_byte();
 281   1              stop();
 282   1              DelayM(5);
 283   1              return date;
 284   1      }
 285          /*************************************************
 286          **************************************************
 287          下面是数码管所用的函数,包括闪烁和动态扫描
 288          **************************************************
 289          *************************************************/
 290          //LED闪烁子函数
 291          void flash()
 292          {
 293   1              if(shans&&blink)
 294   1              {
 295   2                      if(ledtime--==0)
 296   2                      {
 297   3                              if(!shanz) ledtime=mietime;
 298   3                              else    ledtime=liangtime;
 299   3                              shanz=~shanz;
 300   3                      }
 301   2              }
 302   1              else shanz=0;
 303   1      }
C51 COMPILER V7.50   WDBJ                                                                  03/08/2008 22:56:25 PAGE 6   

 304          
 305          void display(uchar pos) //按位显示函数POS表示第几位数码管
 306          {
 307   1              bit sflag;
 308   1              duX=1;                          //关显示
 309   1              P0=0x00;
 310   1              duX=0;
 311   1      
 312   1              duX=1;                          
 313   1              sflag=(blink>>pos)&0x01;
 314   1              if(!sflag||(sflag&!shanz))
 315   1              {
 316   2                      if(pos==2||pos==6)      P0=duma[buffer[pos]]|0x80;
 317   2                      else    P0=duma[buffer[pos]];
 318   2              }
 319   1              else P0=0x00;
 320   1              duX=0;          
 321   1      
 322   1              weX=1;
 323   1              P0=wema[pos];           //送位码
 324   1              weX=0;  
 325   1      }
 326          
 327          void key()
 328          {
 329   1              static uchar keycnt;                                            //按键年龄计数器
 330   1              static bit keyesc;                                                      //按键释放置位标志
 331   1              funcnt=0x00;
 332   1              funval=0x00;
 333   1              if(keydone)                                                                     //上次按键任务已完成
 334   1              {
 335   2                      if(K1==0&&K2&&K3&&K4)   {funcnt++;funval=0x01;}
 336   2                      else if(K2==0&&K1&&K3&&K4) {funcnt++;funval=0x02;}
 337   2                      else if(K3==0&&K2&&K1&&K4) {funcnt++;funval=0x03;}
 338   2                      else if(K4==0&&K2&&K1&&K3) {funcnt++;funval=0x04;}
 339   2              }
 340   1              if(!funcnt)//无键按下或上档键个数多于一个
 341   1              {       
 342   2                      shans=1;
 343   2                      keypre=0x00;
 344   2                      keyesc=0x00;task=0x00;keycnt=0x00;
 345   2              }
 346   1              else    if(!keyesc)                                                     //键已释放
 347   1              {
 348   2                      if(funcnt>1) keyesc=1;
 349   2                      else if(funval!=keypre)                                 //如果本次键值和上次不同
 350   2                      {
 351   3                              keypre=funval;                                          //用本次键值替换上次值
 352   3                              keycnt=0x00;
 353   3                      }
 354   2                      else 
 355   2                      {       
 356   3                              keycnt++;
 357   3                              switch(task)
 358   3                              {
 359   4                              case 0:
 360   4                                      if(keycnt==N)
 361   4                                      {
 362   5                                              shans=1;
 363   5                                              keyprocess=1;
 364   5                                              if(K1==0||K4==0) keyesc=1;
 365   5                                              else
C51 COMPILER V7.50   WDBJ                                                                  03/08/2008 22:56:25 PAGE 7   

 366   5                                              {                       
 367   6                                                      task++;
 368   6                                                      keycnt=0;
 369   6                                              }                       
 370   5                                      }
 371   4                                      break;
 372   4                              case 1:
 373   4                                      if(keycnt==MaxRate)
 374   4                                      {
 375   5                                              shans=0;
 376   5                                              keyprocess=1;
 377   5                                              keycnt=0;
 378   5                                              task++;
 379   5                                      }
 380   4                                      break;
 381   4                              case 2:
 382   4                                      if(keycnt==MinRate)
 383   4                                      {
 384   5                                              shans=0;
 385   5                                              keyprocess=1;
 386   5                                              keycnt=0;
 387   5                                      }
 388   4                                      break;
 389   4                              }
 390   3                      }
 391   2              }
 392   1      }
 393          //功能键处理
 394          void key1()
 395          {
 396   1              if(!keymark)
 397   1              {
 398   2                      pb=&buffer[0];
 399   2                      blink=0x01;
 400   2                      keymark=1;
 401   2                      shans=1;
 402   2              }
 403   1              else
 404   1              {
 405   2                      pb++;
 406   2                      blink<<=1;
 407   2                      if(pb>=&buffer[4])
 408   2                      {
 409   3                              pb=&buffer[0];
 410   3                              blink=0x01;
 411   3                      }
 412   2              }
 413   1      }
 414          //*************************************//
 415          void key2()
 416          {       
 417   1              if(keymark)
 418   1              {
 419   2                      *pb+=1;
 420   2                      if(*pb>=0x0a)
 421   2                              *pb=0x00;
 422   2              }
 423   1      }
 424          
 425          //*************************************//
 426          void key3()
 427          {
C51 COMPILER V7.50   WDBJ                                                                  03/08/2008 22:56:25 PAGE 8   

 428   1      
 429   1              if(keymark)
 430   1              {
 431   2                      if(*pb<=0)      *pb=9;
 432   2                      else            *pb-=1;
 433   2              }       
 434   1      }
 435          void key4()
 436          {
 437   1      
 438   1              if(keymark)
 439   1              {
 440   2                      blink=0x00;
 441   2                      keymark=0;
 442   2                      write_add(9,buffer[1]);
 443   2                      write_add(10,buffer[2]);
 444   2                      write_add(11,buffer[3]);
 445   2              }       
 446   1      }
 447          
 448          void keyXZ()
 449          {
 450   1              if(keyprocess)
 451   1              {       
 452   2                      keydone=0;
 453   2                      keyprocess=0;
 454   2                      switch(keypre)
 455   2                      {
 456   3                              case 0x01:key1();break;
 457   3                              case 0x02:key2();break;
 458   3                              case 0x03:key3();break;
 459   3                              case 0x04:key4();break;
 460   3                      }
 461   2                      keydone=1;
 462   2              }
 463   1      }
 464          //*************************************//
 465          /*********************************************
 466                  功能:定时器0中断服务程序
 467          *********************************************/
 468          void timer0() interrupt 1
 469          {
 470   1              TH0=V_TH0;
 471   1              TL0=V_TL0;
 472   1                      flash();
 473   1                      key();
 474   1      
 475   1      }
 476          void main()
 477          {
 478   1              uint num=0;
 479   1              uchar a,b,c;
 480   1              uchar   n;
 481   1      
 482   1              TMOD=V_TMOD;TH0=V_TH0;TL0=V_TL0;
 483   1              TR0=1;ET0=1;EA=1;
 484   1              sdate=0x00;
 485   1              keyprocess=0;keydone=1;
 486   1              ledtime=liangtime;
 487   1              shanz=0;
 488   1              keymark=0;
 489   1      
C51 COMPILER V7.50   WDBJ                                                                  03/08/2008 22:56:25 PAGE 9   

 490   1              buffer[1]=read_add(9);
 491   1              buffer[2]=read_add(10);
 492   1              buffer[3]=read_add(11);
 493   1              while(1)
 494   1              {
 495   2                      num1=buffer[1]*100+buffer[2]*10+buffer[3];
 496   2                      num=DS18b20_readTemp();                                         //读温度并送显
 497   2                      a=num/100;
 498   2                      b=(num%100)/10;
 499   2                      c=(num%100)%10;
 500   2                      buffer[5]=a;
 501   2                      buffer[6]=b;
 502   2                      buffer[7]=c;
 503   2                      for(n=0;n<5;n++)
 504   2                      {
 505   3                              for(sdate=0;sdate<=7;sdate++)
 506   3                              {
 507   4                                      display(sdate);
 508   4                                      DelayM(3);
 509   4                              }
 510   3                              keyXZ();
 511   3                      }
 512   2                      if(num1>num) {led4=0,led8=1;}
 513   2                      else    {led4=1,led8=0;}
 514   2              }
 515   1      }
 516          
 517          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1224    ----
   CONSTANT SIZE    =     24    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     23       8
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      6       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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