📄 pll.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 + -