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

📄 suoxianghuan.c

📁 常用的锁相环技术
💻 C
字号:
    #include <AT89x52.h>
    #include <intrins.h>
    #include <stdio.H>
    sbit CLK=P1^0;
    sbit DATA=P1^1;
    sbit LE=P1^2;    
    xdata unsigned int R; //基隹分频计数器    
    unsigned char SW,A; //A吞咽计数器值  SW为预选分频值
    unsigned int N;  //程序计数器
    xdata float LowestF=98.6,HighF=118.6,NormalF=40.0,SpaceF=0.2;
    xdata unsigned  int LowestCount; //可编程分频计数器计数值
    xdata unsigned char Counter;//最大信道数
    unsigned int Midx;
    unsigned char Midy;
    
    unsigned int PrepareNormalCount(unsigned int x, bit flag)//组装14位的基准频率计数值14-16 x--R flag=1 P=32
    {                                                        // flag=0 P=64  
        unsigned int y;
        y=0;
        if(flag==1)  //P=32
             y=0x8001;
        else        //P=64
             y=0x0001;
        x=x<<1; 
        x=x&0x7ffE;
        y=y|x;
        return y;        
    }
   
    void LEHigh_Out(void)
    {
        LE=1;
        _nop_(); 
        _nop_(); 
        _nop_();
        LE=0;
    }
    void SendDara8Bit(unsigned char x) //送一个8位数据到PLL
    {
        unsigned char i;
        bit flag=0;
        CLK=0;
        DATA=0;
        LE=0;
        for(i=0;i<8;i++)
        {
            if((x&0x80)==0)
                flag=0;
            else
                   flag=1;
            DATA=flag;
            _nop_(); 
            _nop_(); 
            _nop_(); 
            CLK=1;
            _nop_(); 
            _nop_(); 
            _nop_(); 
            CLK=0;
            x=x<<1;
         }
    }
    void SendDara3Bit(unsigned char x) //送一个8位数据到PLL
    {
        unsigned char i;
        bit flag=0;
        CLK=0;
        DATA=0;
        LE=0;
        for(i=0;i<3;i++)
        {
            if((x&0x80)==0)
                flag=0;
            else
                   flag=1;
            DATA=flag;
            _nop_(); 
            _nop_(); 
            _nop_(); 
            CLK=1;
            _nop_(); 
            _nop_(); 
            _nop_(); 
            CLK=0;
            x=x<<1;
         }
    }
    /******************************************************************************/
    //函数名称:    Serial_init
    //功    能:    串口初始化
    //输入参数:    无
    //输出参数: 无
    /******************************************************************************/
    void Serial_init( void )
    {
        if( (SCON&0xf0) != 0x50 ) SCON = 0x52;
        PCON = 0x80;
        TMOD = ( TMOD&0x0f ) | 0x20;

        TH1 = -96;     //19200
        TR1 = 1;
        ES = 1;
    }

    void Gain_AandN(bit flag)//flag=0 P=64 flag=1  P=32
    {
        unsigned  int p,Mid;    
        
        if(flag==0)
             p=64;
        else
            p=32;
        
        LowestCount=(unsigned int)(LowestF/SpaceF);    
        N=LowestCount/p;        
        Mid=LowestCount-(N*p);
         A=(unsigned char)Mid;
        if(Mid>N)  //此种情况为P选得过大赞成VCO不能输出要求的最低频率 如果要排出这种情况 要将P改为另一个较小值            
        {       //如已是较小的值则表明系统在频率设计时有一些问题
            N=N+1;
            A=0;
        }
    }
    void ScanF_out(bit flag)
    {
        unsigned int p,Mid;


        if(flag==0)
             p=64;
        else
            p=32;
        
        Mid=(unsigned int)A; 
        if(Mid<N) 
             A=A+1;
        else
            {
                LowestCount=N*p+A;    
                N=LowestCount/p;
                Mid=LowestCount-(N*p);
                 A=(unsigned int)Mid;
                if(Mid>=N)  //中间会有不连续的频率            
                {      
                    N=N+1;
                    A=0;
                }
            }
    }
    main()
    { 
        xdata unsigned int x,y;
          xdata float z;
          unsigned char SendMid;
      
          Serial_init( );
          
        Counter=(char)((HighF-LowestF)/SpaceF);
          Counter=Counter+1;
          
        SW=64;      

        R=(unsigned int)(NormalF/SpaceF); //基准频率计数 R的值
        x=PrepareNormalCount(R, 0);  //组合16位基准寄存器的值
          y=x>>8;

          SendMid=(unsigned char)y; //送出R

          SendDara8Bit(SendMid);
          SendMid=(unsigned char)x;
          SendDara8Bit(SendMid);
          LEHigh_Out();

          Gain_AandN(0); //计算出初始的N A并送到芯片
          Midx=N;
          Midy=A;
        printf("N:%d  A:%bd  \n",Midx,Midy);
          
        Midy=Midy<<1; //组合19位寄存器值
        Midy=Midy&0xfe;
        Midx=Midx<<5;

          x=Midx>>8;
          SendMid=(unsigned char)x;
          SendDara8Bit(SendMid);
          SendMid=(unsigned char)Midx;
          SendDara3Bit(SendMid);
          SendDara8Bit(Midy);
          LEHigh_Out();     

          y=(unsigned int)SW;
         y=y*N;
          z=(float)y*SpaceF;      
      
          while((z<HighF)&&(N<Counter))//扫描N A
          {
            ScanF_out(0);
            y=(unsigned int)SW;
            y=y*N;
              z=(float)y*SpaceF;

            Midx=N;
            Midy=A;
            printf("N:%d  A:%bd  ",Midx,Midy);

            Midy=Midy<<1; //组合19位寄存器值
            Midy=Midy&0xfe;
            Midx=Midx<<5;
            
            x=Midx>>8;
            SendMid=(unsigned char)x;
                    SendDara8Bit(SendMid);
            SendMid=(unsigned char)Midx;
            SendDara3Bit(SendMid);
            SendDara8Bit(Midy);
            LEHigh_Out();    
      }
         
    }

⌨️ 快捷键说明

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