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

📄 pll.c

📁 锁相环控制
💻 C
字号:
/*______________________________________________________________
; Project Name: PLL
; Author      : SuMiao
; Date        :	2008,06,12
; Purpose     : PLL(只做锁相环[LMX2536]的功能)
______________________________________________________________*/
 #include  <AT892051.h>
 #include  <intrins.h>
 #include  <stdio.h>
 #include  <stdlib.h>
 #define  uchar unsigned char
 #define  uint unsigned int
 #define  ulong unsigned long
							 				 
 #define  PLLCLOCK 11059.2	 				 
 #define  STEP 	   50     

 #define  frequenceconst1 373500   //443.5M-70M 
 //#define  frequenceconst1 518500   //448.5M+70M  
			
 uchar data pa1;
 uint  data pb1,prr_volue;

 sbit dataout = P1^5;			//锁向环共用数据输入口
 sbit clkout1 = P1^4;			//锁向环1时钟输入口
 sbit enb1 = P1^6;				//锁向环1使能口
 sbit ld1  = P1^3;				//锁向环1锁住使能口
			 








/***************************************************************/
/***************************************************************/
/*******************SUBROUTINE PROGRAM**************************/
/***************************************************************/
/***************************************************************/
/*______________________________________________________________
函数功能: 	delay时间(1MS)
调用方式:   delay1ms(uchar time)
原作者:
时间:
程序修改人:
时间:
______________________________________________________________*/
void  delay1ms(uchar time){ 
      uchar i,j;  
     for(j=0;j<time;j++){         
       for(i=0;i<100;i++){
        _nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();  
        _nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();  
        _nop_();_nop_();_nop_();
        _nop_();_nop_();
        } 
       }
      }

/*______________________________________________________________
函数功能: 	delay时间(1MS)
调用方式:   delay1ms(uchar time)
原作者:
时间:
程序修改人:
时间:
______________________________________________________________*/
void  INITIALIZATION( ){
    enb1=0;      
    dataout=0; clkout1=1;clkout1=0;//cp1--------SET FUNCTION   
    dataout=1; clkout1=1;clkout1=0;//cp0
    dataout=1; clkout1=1;clkout1=0;//F1--Counter Reset
    dataout=0; clkout1=1;clkout1=0;//F2--POWER DOWN
    dataout=1; clkout1=1;clkout1=0;//F3--FoLD0   
    dataout=0; clkout1=1;clkout1=0;//F4--FoLD1
    dataout=0; clkout1=1;clkout1=0;//F5--FoLD2
    dataout=1; clkout1=1;clkout1=0;//F6--Phase Detector Polarity
    dataout=0; clkout1=1;clkout1=0;//F7--Charge Pump TRI-STATE
    dataout=1; clkout1=1;clkout1=0;//F8--FastLock Enable
    dataout=0; clkout1=1;clkout1=0;//F9--FastLock Control
    dataout=0; clkout1=1;clkout1=0;//F10--Timeout Counter Enable
    dataout=0; clkout1=1;clkout1=0;//F11--FastLock Timeout Counter0
    dataout=0; clkout1=1;clkout1=0;//F12--FastLock Timeout Counter1
    dataout=0; clkout1=1;clkout1=0;//F13--FastLock Timeout Counter2
    dataout=0; clkout1=1;clkout1=0;//F14--FastLock Timeout Counter3
    dataout=0; clkout1=1;clkout1=0;//F15--Test Modes0
    dataout=0; clkout1=1;clkout1=0;//F16--Test Modes1
    dataout=0; clkout1=1;clkout1=0;//F17--Test Modes2
    dataout=0; clkout1=1;clkout1=0;//F18--POWER DOWN MODE
    dataout=0; clkout1=1;clkout1=0;//F19--TEST MODE   
    enb1=1;        
    _nop_(); _nop_();  
      }

/*______________________________________________________________
函数功能: 	锁向环1
函数说明:	outpabr1(pa,pb,prr)
原作者:		
时间:	
程序修改人:
时间:
______________________________________________________________*/
void outpabr1(pa,pb,prr)
      uchar pa;      
      uint pb,prr;
      {
      uchar i,temphigh,templow;						   
    enb1=0;      									   
    dataout=1; clkout1=1;clkout1=0;//R19--LD Precision 
    dataout=0; clkout1=1;clkout1=0;//R18--Test Modes3 
    dataout=0; clkout1=1;clkout1=0;//R17--Test Modes2  
    dataout=0; clkout1=1;clkout1=0;//R16--Test Modes1 
    dataout=0; clkout1=1;clkout1=0;//R15--Test Modes0 
    temphigh=prr/256;		   // 以8位二进制数的形式暂存prr的高8位
    templow=(prr%256);		   // 以8位二进制数的形式暂存prr的低8位
    temphigh<<=2;     		   // 左移2位temphigh 
  for (i=0;i<6;i++){ 
   dataout=(bit)(temphigh&0x80);clkout1=1;clkout1=0;
    temphigh<<=1;
       }     
  for (i=0;i<8;i++){ 
   dataout=(bit)(templow&0x80);clkout1=1;clkout1=0;
    templow<<=1;
       }    
    dataout=0; clkout1=1;clkout1=0;//cp0
    dataout=0; clkout1=1;clkout1=0;//cp1--------SET R 
   enb1=1;        
    _nop_(); _nop_();
	 
   enb1=0;        						   
    dataout=1; clkout1=1;clkout1=0;//N19--GO Bit
    temphigh=pb/256;			  // 以8位二进制数的形式暂存pb的高8位
    templow=(pb%256);			  // 以8位二进制数的形式暂存pb的低8位
    temphigh<<=3;     			  // 左移3位temphigh
  for (i=0;i<5;i++){ 
   dataout=(bit)(temphigh&0x80);clkout1=1;clkout1=0;
    temphigh<<=1;
       }     
  for (i=0;i<8;i++){ 
   dataout=(bit)(templow&0x80);clkout1=1;clkout1=0;
    templow<<=1;
       }				    				 
    pa<<=3;                
   for (i=0;i<5;i++){ 
    dataout=(bit)(pa&0x80);clkout1=1;clkout1=0;
    pa<<=1;
       }
    dataout=0; clkout1=1;clkout1=0;//cp0           
    dataout=1; clkout1=1;clkout1=0;//cp1--------SET N         
    enb1=1;dataout=0;
    _nop_(); _nop_();   
    }

/*___________________________________________________________
函数功能: 		比较频率,确定锁向环输出数值
调用方式:      compfreq(void)
原作者:
时间:
程序修改人:
时间:
______________________________________________________________*/
void compfreq(void){
     ulong frequence;

     frequence=frequenceconst1/STEP;   //N 
     pb1=frequence/32;
	 pa1=(frequence)%32;
	 prr_volue=PLLCLOCK/STEP;		   //R    
                
    }

/*___________________________________________________________
函数功能: 		由锁向环锁住使能口判断是否失锁,而重新要锁定频率
调用方式:      plldect(void)
原作者:
时间:
程序修改人:
时间:
______________________________________________________________*/
void plldect(void){
     ld1=1;
      if(!ld1){
       outpabr1(pa1,pb1,prr_volue);
        }
     }










/***************************************************************/
/***************************************************************/
/************************MAIN PROGRAM***************************/
/***************************************************************/
/***************************************************************/
main(){
	    delay1ms(250);
	    delay1ms(250);
		INITIALIZATION();
	    delay1ms(250);                                 
      	compfreq();  					//比较频率,确定锁向环输出数值
        _nop_();             
        _nop_(); 
        _nop_();   
        outpabr1(pa1,pb1,prr_volue);   	//锁向环1输出
        _nop_();
        _nop_(); 
        _nop_();                         
        //--------------     
   while(1){
        _nop_();
        _nop_();
        _nop_();
     	plldect();						 //判断是否失锁
        _nop_(); 
        _nop_(); 
        _nop_();   
      }
}

⌨️ 快捷键说明

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