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

📄 aaa.lst

📁 用51单片机编译成的频率计的源程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
 297          
 298          
 299          
 300          
 301          /**********延时子程序*************/
 302          void mdelay(uchar j)
C51 COMPILER V7.50   AAA                                                                   09/12/2005 06:33:21 PAGE 6   

 303          {uint i;
 304   1      for(;j>0;j--)
 305   1        { for(i=0;i<200;i++)
 306   2        {;}
 307   2          }
 308   1      }
 309          
 310          /**********判忙子程序*************/
 311           void lcdbusytest()
 312          {
 313   1        PSD33_reg.DATAOUT_A = 0xff;
 314   1       // lcdport=0xff;
 315   1        RS=0;
 316   1        RW=1;
 317   1        E=1;
 318   1        PSD33_reg.DIRECTION_A =0;                       //PB为输入模式
 319   1        do{temp=PSD33_reg.DATAIN_A;} while(busy);
 320   1      //do{temp=lcdport;}while(busy);
 321   1        E=0;
 322   1        PSD33_reg.DIRECTION_A =0xff; 
 323   1      }
 324          
 325          
 326          /*********写命令******************/
 327           void writelcdcom(uchar com)
 328          {
 329   1        lcdbusytest();
 330   1        RS=0;
 331   1        RW=0;
 332   1        E=1; 
 333   1        PSD33_reg.DATAOUT_A = com;
 334   1        //lcdport=com;
 335   1        E=0;
 336   1      }
 337          
 338          /**********写数据****************/
 339          void writelcddat(uchar dat)
 340          {
 341   1        lcdbusytest();
 342   1        RS=1;
 343   1        RW=0;
 344   1        E=1;
 345   1        PSD33_reg.DATAOUT_A = dat;
 346   1        //lcdport=dat;
 347   1        E=0;
 348   1      }
 349          
 350          /***********LCD清屏****************/
 351          void clrlcd()
 352          {writelcdcom(0x01);}
 353          
 354          /***********LCD初始化**************/
 355           void init_lcd()
 356          { mdelay(15);
 357   1        RS=0;
 358   1        RW=0;
 359   1        E=1;
 360   1        PSD33_reg.DATAOUT_A = 0x38;
 361   1       // lcdport=0x38;
 362   1        E=0;
 363   1        mdelay(5);
 364   1        RS=0;
C51 COMPILER V7.50   AAA                                                                   09/12/2005 06:33:21 PAGE 7   

 365   1        RW=0;
 366   1        E=1;
 367   1        PSD33_reg.DATAOUT_A = 0x38;
 368   1        //lcdport=0x38;
 369   1        E=0;
 370   1        mdelay(5);
 371   1        RS=0;
 372   1        RW=0;
 373   1        E=1;
 374   1        PSD33_reg.DATAOUT_A = 0x38;
 375   1       // lcdport=0x38;
 376   1        E=0;
 377   1        writelcdcom(0x38);
 378   1        writelcdcom(0x08);
 379   1        clrlcd();
 380   1        writelcdcom(0x06);
 381   1        writelcdcom(0x0c);
 382   1      }
 383          
 384          /*********写一个字符****************/
 385          void printchar(uchar xpos,uchar ypos,uchar str)
 386          {uchar m=0;
 387   1      switch (ypos)
 388   1      { case 0:  xpos|=0x80;break;
 389   2        case 1: xpos|=0xc0;break;
 390   2        default: break;
 391   2        }
 392   1      writelcdcom(xpos);
 393   1      writelcddat(str);
 394   1      }
 395          
 396          /*********写字符串函数*************/
 397          void printstr(uchar xpos,uchar ypos,uchar *str)
 398          { 
 399   1       //uchar n;
 400   1       uchar m=0;
 401   1       switch (ypos)
 402   1       { case 0: xpos|=0x80;break;            //写入显示地址要求D7恒为高电平
 403   2         case 1: xpos|=0xc0;break;
 404   2         default: break;
 405   2        }
 406   1       writelcdcom(xpos);                //此处的Xpos已转换为LCM的显示寄存器实际地址
 407   1       for(i=0;i<strlen(str);i++)
 408   1         {
 409   2           writelcddat(str[m++]);
 410   2         }
 411   1      
 412   1      }
 413          
 414          
 415          /*****************************************************************************
 416          *                         ADC_EnableAll()
 417          *功能:ADC使能,设置P1口通道为ADC输入,选择ADC时钟频率
 418          *参数:无
 419          ******************************************************************************/
 420          void ADC_EnableAll(void) 
 421          {
 422   1          ACON = 0;                           // 关闭ADC
 423   1      
 424   1      
 425   1          ADCPS =(0x08 + 1);                  //使能ADC时钟,设置时钟频率
 426   1          _nop_();
C51 COMPILER V7.50   AAA                                                                   09/12/2005 06:33:21 PAGE 8   

 427   1          _nop_();
 428   1              P1SFS0 |= 0x07;
 429   1              P1SFS1 |= 0x07;                      // 选择P1口相应位为ADC输入
 430   1      
 431   1          
 432   1          ACON = 0x20;
 433   1                              // 使能ADC;Enable ADC
 434   1      
 435   1          // NOTE: USER CODE MUST WAIT AT LEAST 20 MS before calling ADC_Read (Using the ADC)
 436   1      }
 437          
 438          
 439          
 440          /******************************************************************************
 441          *                       ADC_Init(channel)
 442          *功能描述:ADC初始化,选择模拟通道输入,初始化时钟,关闭ADC中断
 443          *参    数:channel - uchar 选择ADC通道
 444          *注    意:当ADC通道改变得时候,此子程序一定要被调用
 445          *****************************************************************************/
 446          void ADC_Init (unsigned char channel) 
 447          {
 448   1          unsigned char temp;
 449   1          ACON = 0;                           
 450   1      
 451   1          temp = (0x01) << channel;           // 选择通道
 452   1          P1SFS0 |= temp;         
 453   1          P1SFS1 |= temp;                     // 设置P1口相应位为ADC输入
 454   1      
 455   1          ADCPS =(0x08 + 1);  // 使能ADC时钟,设置时钟频率
 456   1          _nop_();
 457   1          ACON = 0x20;                        // 允许ADC转换
 458   1      
 459   1      
 460   1          // NOTE: USER CODE MUST WAIT AT LEAST 20 MS before calling ADC_Read (Using the ADC)
 461   1      }
 462          
 463          /******************************************************************************
 464          *                      uint  ADC_Read(channel)
 465          *功能描述:读A/D转换后的数据
 466          *参    数:channel,初始化程序中选择的通道
 467          *返 回 值:ADC转换结果,12位
 468          *注    意:该子程序调用前,ADC_Init()必须先被调用
 469          *******************************************************************************/
 470          unsigned int ADC_Read( unsigned char channel )
 471          {
 472   1          unsigned int  temp_ADC_result;  
 473   1          ACON &= 0xE0;                        //清除输入通路  ~(00101110B) = (11010001B)
 474   1      
 475   1          ACON |= (channel<<2);                 //选择通路
 476   1          _nop_ ();
 477   1          _nop_ ();   
 478   1      
 479   1          ACON |= 0x02;                           //开始ADC转换
 480   1          _nop_ ();                               //延时一个机器周期: ADST: 1->0
 481   1      
 482   1          while( (ACON & 0x01) != 1 );            //等待转换结束
 483   1      
 484   1            // Note: For increased ADC accuracy, the while loop above should be
 485   1            //       replaced with code that puts the MCU into Idle mode via PCON
 486   1            //       and makes use of the ADC interrupt to exit the Idle mode.
 487   1            //       The user would need to enable the ADC int and define the ADC ISR.
 488   1      
C51 COMPILER V7.50   AAA                                                                   09/12/2005 06:33:21 PAGE 9   

 489   1          temp_ADC_result = (ADAT1<<8)+ADAT0;     //Calculate ADC conversion result
 490   1      
 491   1          return (temp_ADC_result);
 492   1      }
 493          
 494          
 495          /*******************************************************************************
 496          *    int sin_angle(long angle )
 497          *功能描述:角度换算函数,使角度值控制在180以内
 498          *
 499          ********************************************************************************/
 500          
 501          int sin_angle(long angle )
 502          {
 503   1              int Mod_data;
 504   1      
 505   1              Mod_data = (int)angle/180;
 506   1              switch (Mod_data )
 507   1              {
 508   2              case 0:
 509   2                       M_angle = sin_table[angle];
 510   2                   break;
 511   2              case 1:
 512   2                       M_angle = -sin_table[angle - 180];
 513   2                       break;
 514   2          case 2:
 515   2                   M_angle = sin_table[angle - 360];
 516   2                       break;
 517   2              case 3:
 518   2                       M_angle = -sin_table[angle - 540];
 519   2                   break;
 520   2              }
 521   1      
 522   1              return(M_angle);
 523   1      }
 524          
 525          /*******************************************************************************
 526          *             void first(void )
 527          *第一个采样点计算函数,在K=0时计算
 528          *******************************************************************************/
 529          void first(void )               
 530          {
 531   1      
 532   1              U_angle = K*180/N;                      //U相在K=0时计算
 533   1              V_angle = U_angle + 120;
 534   1              W_angle = U_angle + 240;
 535   1      
 536   1      
 537   1              U_Toff = ((Half_Ts * (0xffff - M*(sin_angle(U_angle))))>>16);
 538   1              V_Toff = ((Half_Ts * (0xffff - M*(sin_angle(V_angle))))>>16);
 539   1              W_Toff = ((Half_Ts * (0xffff - M*(sin_angle(W_angle))))>>16);
 540   1      
 541   1      
 542   1      
 543   1              P_flag = 0;
 544   1      
 545   1      }
 546          
 547          /*------------------------------------------------------------------------------
 548          timer0_isr()
 549          
 550          This function is an interrupt service routine for TIMER 0.  It should never
C51 COMPILER V7.50   AAA                                                                   09/12/2005 06:33:21 PAGE 10  

 551          be called by a C or assembly function.  It will be executed automatically
 552          when TIMER 0 overflows.
 553          
 554          This ISR stops timer0, adjusts the counter so that another interrupt occurs in
 555          10ms, and then restarts the timer.
 556          ------------------------------------------------------------------------------*/
 557          
 558          //定时器0中断服务程序
 559          //定时器0用于产生采样周期的定时中断,采样周期Ts =1/2载波周期 = 278 时钟周期
 560          static void timer0_isr (void) interrupt TF0_VECTOR using 1
 561          {
 562   1        TR0 = 0;                                              /* stop timer 0 */
 563   1        TL0 = (timer0_value & 0x00FF);
 564   1        TH0 = (timer0_value >> 8);
 565   1        TR0 = 1;                                              /* start timer 0 */
 566   1        
 567   1      
 568   1      ////////////////////////////////////////////
 569   1      ////将上一次定时器中断计算的延时值送入TCM0,TCM1,TCM2的比较寄存器
 570   1      //
 571   1      //
 572   1      ////取当前PCA0的计数值
 573   1              PCA0 = PCACL0 + (PCACH0  << 8 );
 574   1      //
 575   1      ////实际延时时间应加上PCA0的当前计数值
 576   1      //
 577   1              U_Toff += PCA0;
 578   1              V_Toff += PCA0;
 579   1              W_Toff += PCA0;
 580   1              U_Ton += PCA0;
 581   1              V_Ton += PCA0;
 582   1              W_Ton += PCA0;
 583   1      //
 584   1      //
 585   1      ////偶数顶点采样使用Toff,奇数底点采样使用Ton
 586   1              if ( P_flag==0)
 587   1              {
 588   2                      CAPCOML0 = (U_Toff & 0x00FF);
 589   2                      CAPCOMH0 = (U_Toff >> 8);
 590   2                      
 591   2                      CAPCOML1 = (V_Toff & 0x00FF);
 592   2                      CAPCOMH1 = (V_Toff >> 8);
 593   2      
 594   2                      CAPCOML2 = (W_Toff & 0x00FF);
 595   2                      CAPCOMH2 = (W_Toff >> 8);
 596   2              }
 597   1              else 
 598   1              {
 599   2                      CAPCOML0 = (U_Ton & 0x00FF);
 600   2                      CAPCOMH0 = (U_Ton >> 8);

⌨️ 快捷键说明

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