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

📄 main.lst

📁 从零开始学51单片机源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
 284   2        {
 285   3              recnum = 0; //全部清空 
 286   3              // 开中断返回主程序,等待接收下一个数据 
 287   3        }
 288   2      loop1:  //结束处理流程 
 289   2        enable(); //开中断返回
 290   2      }
 291   1      
 292   1              //如果是发送中断 
 293   1              if (TI)
 294   1              {
 295   2                      TI = 0; //清除发送中断
 296   2              }
 297   1      
 298   1      }
 299          
 300          //ADC initialize
 301          // Conversion time: 48uS
 302          void adc_init(void)
 303          {
C51 COMPILER V8.08   MAIN                                                                  04/06/2012 21:53:17 PAGE 6   

 304   1              P1ASF = 0x00; //P1.0用作AD转换 
 305   1              //转换结果清零 
 306   1              ADC_RES = 0;
 307   1              ADC_RESL = 0;
 308   1      
 309   1              //ADC_POWER=1,SPEED1=0,SPEED0=0,
 310   1              //ADC_FLAG=0,ADC_START=0,CHS2/CHS1/CHS0=000
 311   1              //11.0592MHz,540个时钟周期转换一次,速度约125KHz,时间约 48us
 312   1              ADC_CONTR = 0X80;
 313   1              //等待4周期       
 314   1              _nop_();        
 315   1              _nop_();
 316   1              _nop_();
 317   1              _nop_();
 318   1              //ADRJ = 0,ADC_RES寄存器保存10位A/D转换结果的高8位,ADC_RESL保存结果的低2位 
 319   1              AUXR1 &= 0xfb; 
 320   1      }
 321          
 322          //AD转换中断
 323          void  ADC_interrupt() interrupt 5
 324          {
 325   1              ADC_CONTR &= 0Xef;      //ADC_FLAG清零 
 326   1              //计算电压值 
 327   1              ad_result10 = ADC_RES;
 328   1              ad_result10 = ( ad_result10 << 2 ) | ADC_RESL;
 329   1      
 330   1              f_adconverting = 0;
 331   1      }
 332          
 333          
 334          //call this routine to initialize all peripherals
 335          void init_devices(void)
 336          {
 337   1       char i=0;
 338   1       //stop errant interrupts until set up
 339   1       _nop_();
 340   1       _nop_();
 341   1       _nop_();
 342   1       _nop_();
 343   1       _nop_();
 344   1       EA = 0; //disable all interrupts
 345   1       port_init();
 346   1       watchdog_init();  //设置且启动看门狗 
 347   1       timer0_init();
 348   1       timer1_init();
 349   1       uart0_init();
 350   1       adc_init();
 351   1      
 352   1       PCON &= 0xfd; //关闭power down模式,PD位置0
 353   1      
 354   1       //all peripherals are now initialized
 355   1       //按键清零 
 356   1       ty=0;
 357   1       qq=0;
 358   1       fd=0;
 359   1       key0=0;
 360   1       key1=0;
 361   1       //时间、计数清零 
 362   1       time=0;
 363   1       time_m=0;
 364   1       time_f=0;  
 365   1       cnt=0; 
C51 COMPILER V8.08   MAIN                                                                  04/06/2012 21:53:17 PAGE 7   

 366   1      
 367   1       //状态清零 
 368   1       f_start=0;
 369   1       f_sleep=0;
 370   1       f_volt=0;
 371   1       f_adconverting = 0;
 372   1       
 373   1       readset();//读取本机地址 
 374   1       me=addr;
 375   1       WDR();   //喂狗 
 376   1       
 377   1       //刚上电,AD不准,多检查一次 
 378   1       checkpower(); //检查电源 
 379   1       WDR();
 380   1       checkpower();
 381   1       WDR();
 382   1       
 383   1       if (vin<1.75)  //如果需要充电 
 384   1       {
 385   2          //灯全关 
 386   2              d_vote = 1;
 387   2              P3 |= 0xe0; 
 388   2              for (i=0;i<5;i++)
 389   2              {       //闪烁5次d_vote
 390   3                      d_vote=0;        //亮d_vote
 391   3                      msdelay(500);
 392   3                      WDR();
 393   3                      d_vote=1;       //灭d_vote
 394   3                      msdelay(500);
 395   3                      WDR(); //喂狗 
 396   3              }
 397   2       }
 398   1      }
 399          
 400          
 401          void main(void)
 402          {
 403   1       int i;
 404   1      
 405   1       init_devices();
 406   1       //insert your functional code here...
 407   1       EA = 1;  //开总中断 
 408   1      
 409   1      while(1)
 410   1      {
 411   2              //关INT0 INT1中断 
 412   2         IE &= 0xfa;  //111 1010
 413   2         WDR();
 414   2         if (recnum>5) //任意时刻接收计数器大于5,清零 
 415   2         {
 416   3                recnum=0;
 417   3         }
 418   2         
 419   2         if (f_sleep==1)       //休眠标 
 420   2         {
 421   3                 msdelay(10);
 422   3                     f_start=0;
 423   3                         f_sleep=0;
 424   3                         sleep(); //休眠power down
 425   3         }
 426   2      
 427   2         if (f_volt==1)  //低电提示 
C51 COMPILER V8.08   MAIN                                                                  04/06/2012 21:53:17 PAGE 8   

 428   2         {
 429   3                f_volt=0;
 430   3                //灯全关 
 431   3                d_vote = 1;
 432   3                P3 |= 0xe0;
 433   3                for (i=0;i<5;i++)
 434   3                {
 435   4                              //闪烁5次d_vote
 436   4                              d_vote=0;        //亮d_vote
 437   4                              msdelay(500);
 438   4                              WDR();
 439   4                              d_vote=1;  //灭d_vote
 440   4                              msdelay(500);
 441   4                              WDR();  //喂狗 
 442   4                 }
 443   3         }
 444   2      
 445   2              //---------------------------------------------------
 446   2                       if (s1==0)      //按键S1 P3.4  同意 
 447   2                       {
 448   3                          ty++;
 449   3                              time_f=0;
 450   3                              msdelay(10); 
 451   3                              if ((s1==0) && (ty==1))
 452   3                              {
 453   4                              offled(1);      //点亮D1,关闭D2、D3    
 454   4                                      time=0;
 455   4                                      if (f_start==1) //如果是投票状态 
 456   4                                      {               
 457   5                                              key0=1; 
 458   5                                      }
 459   4                              key1++;                                          //按键次数加1
 460   4                              if(key1>3)
 461   4                                      {
 462   5                                              key1=0;                  //按三次
 463   5                                      } 
 464   4                              }
 465   3                       }
 466   2                       else
 467   2                       {
 468   3                         ty=0;
 469   3                       }
 470   2                       //----------------------------------------------------
 471   2                       if ((s2==0)&(s1=1))//s2按下,s1未按,key0=3
 472   2                       {
 473   3                         qq++;
 474   3                         time_f=0;
 475   3                         msdelay(10); 
 476   3                         if ((s2==0)&(s1=1) & (qq==1))
 477   3                         {
 478   4                           offled(2);//点亮D2,关闭D1、D3
 479   4                               time=0;
 480   4                           if (f_start==1)  key0=3;
 481   4                           if ((key1>2)&(key1<5))
 482   4                           {
 483   5                     key1++; //同意按三次后弃权按过2次
 484   5                           }
 485   4                           else key1=0;
 486   4                         }
 487   3                       }
 488   2                       else
 489   2                       {
C51 COMPILER V8.08   MAIN                                                                  04/06/2012 21:53:17 PAGE 9   

 490   3                         qq=0;
 491   3                       }
 492   2                      //-------------------------------------------------------- 
 493   2                       if (s3==0)                     //s3按下,key0=2
 494   2                       {
 495   3                          fd++;
 496   3                              time_f=0;
 497   3                              msdelay(10);
 498   3                              if ((s3==0) && (fd==1))
 499   3                          {
 500   4                                offled(3); //点亮D3,关闭D2、D1
 501   4                                if (f_start==1)  key0=2;
 502   4                                time=0;
 503   4                                d3=1;  //关d3
 504   4                                if ((key1>4)&(key1<8))
 505   4                                {
 506   5                                  key1++;  //之后反对按3下
 507   5                                }
 508   4                                else key1=0;
 509   4                              }
 510   3                              if(key1==8) //按第3下反对 一整套进入工厂模式动作做完 
 511   3                              {
 512   4                                      REN=1; //允许串口接收 
 513   4                                      key1=0;
 514   4                                      //offled(1);
 515   4                                      key0=12; //key0=12,编地址状态
 516   4                              }  
 517   3                        }
 518   2                        else
 519   2                        {
 520   3                               fd=0;
 521   3                        }
 522   2                      //-------------------------------------------------
 523   2                      if(key0==12) //工厂模式
 524   2                      {
 525   3                               //从下往上循环亮灯 
 526   3                               //灯全关 
 527   3                               d_vote = 1;
 528   3                               P3 |= 0xe0;
 529   3                           d3=0;        //开d3
 530   3                               msdelay(500);
 531   3                               WDR();
 532   3                               d3=1;  //关d3
 533   3                               d2=0;
 534   3                               msdelay(500);
 535   3                               WDR();  //喂狗 
 536   3                               d2=1;
 537   3                               d1=0;
 538   3                               msdelay(500);
 539   3                               WDR();
 540   3                               d1=1;
 541   3                               d_vote=0;
 542   3                               msdelay(500);
 543   3                               WDR();  //喂狗
 544   3                               d_vote=1;
 545   3                               
 546   3                               time_m++;
 547   3                      }
 548   2                      if ((key0==12) && (time_m>5))  //循环超过5次 
 549   2                      {
 550   3                          key0=0;
 551   3                              time_m=0;
C51 COMPILER V8.08   MAIN                                                                  04/06/2012 21:53:17 PAGE 10  

 552   3                              //灯全关 
 553   3                              d_vote = 1;
 554   3                              P3 |= 0xe0;
 555   3                      }       
 556   2              }
 557   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   3686    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     39      25
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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