📄 pll.c
字号:
#include<reg52.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit LE4113=P1^7;
sbit DI4113=P1^6; /*改为实际硬件i/o口*/
sbit CK4113=P1^5;
void set_LO(uint freq);
void set_uart(void);
void receive(void);
void command_process(void);
void delay_ms(uint); /*毫秒延时程序*/
void delay_us(uchar time);
main()
{
DI4113=CK4113=LE4113=0;
set_LO(3240); /*改为PLL输出频率*/
while(1)
{;
}
}
/************************************************************************/
void set_LO(uint x)
{
uint temp;
uint B,R;
uchar A, i;
x=x/2; /* x=x/鉴相频率 */
CK4113 = 0 ;
/* Initialization Latch input */
for(i=0;i<24;i++)
{
switch(i)
{
case 0:
DI4113 = 0 ; /*DB23 Prescaler Value P2P1 == 0 0 */
break;
case 1:
DI4113 = 0 ; /*DB22 Prescaler Value P2P1 == 0 0 */
break; /*P=8/9 前置分频比设定 */
case 2:
DI4113 = 0 ; /*DB21 PD2=0,1*/
break;
case 3:
DI4113 = 1 ; /*DB20 CP16~CP11, current setting*/
break;
case 4:
DI4113 = 1 ; /*DB19 ``````*/
break;
case 5:
DI4113 = 0 ; /*DB18 ```````*/
break;
case 6:
DI4113 = 1 ; /*DB17 ``````` */
break;
case 7:
DI4113 = 1 ; /*DB16 `````````*/
break;
case 8:
DI4113 = 1 ; /*DB15 ````` */
break;
case 9:
DI4113 = 1 ; /*DB14 Tc4~Tc1,timeout=35(PFD cycles) */
break;
case 10:
DI4113 = 0 ; /*DB13 ``````` */
break;
case 11:
DI4113 = 0 ; /*DB12 ````````` */
break;
case 12:
DI4113 = 0 ; /*DB11 ```````` */
break;
case 13:
DI4113 = 0 ; /*DB10 F5F4=0 0 Fastlock disabled */
break;
case 14:
DI4113 = 0 ; /*DB9 ```````````` */
break;
case 15:
DI4113 = 0 ; /*DB8 F3=0,CP=Normal */
break;
case 16:
DI4113 = 1 ; /*DB7 F2=1,PD Polarity=Positive */
break;
case 17:
DI4113 = 0 ; /*DB6 M3~M1,Muxout output=Digital lock detect */
break;
case 18:
DI4113 = 0 ; /*DB5 `````` */
break;
case 19:
DI4113 = 1 ; /*DB4 ``````` */
break;
case 20:
DI4113 = 0 ; /*DB3 PD1=0,Normal operation */
break;
case 21:
DI4113 = 0; /*DB2 F1=0; Normal */
break;
case 22:
DI4113 = 1 ; /*DB1 C2C1=11 Initialization Latch register */
break;
case 23:
DI4113 = 1 ; /*DB0 ```````` */
break;
default:break;
}
delay_us(5);
CK4113 = 1 ;
delay_us(5);
CK4113 = 0 ;
}
LE4113=1;
delay_ms(15);
LE4113 = 0;
delay_us(5);
/*R Counter Input */
for(i=0;i<8;i++)
{
switch(i)
{
case 0:
DI4113 = 0 ; /*DB23 Any Value */
break;
case 1:
DI4113 = 0; /*DB22 DLY,SYNC=0 0 Normal Operation */
break;
case 2:
DI4113 = 0 ; /*DB21 ``````````` */
break;
case 3:
DI4113 = 0 ; /*DB20 LDP=0,Lock detector precision */
break;
case 4:
DI4113 = 0 ; /*DB19 T2T1=0 0 Normal Operation */
break;
case 5:
DI4113 = 0 ; /*DB18 ``````` */
break;
case 6:
DI4113 = 0 ; /*DB17 ABP2,ABP1=0 0,Antibacklash Pulsewidth=3.0ns */
break;
case 7:
DI4113 = 0 ; /*DB16 ````````` */
break;
default: break;
}
delay_us(5);
CK4113 = 1 ;
delay_us(5);
CK4113 = 0 ;
}
/*divider ratio(R COUNTER),R15..R1. R = 13. fosc/R = 10MHz/5 = 2MHz */
R=5;
for(i=0; i<14; i++)
{
temp = R & (0x0001 << (13-i)) ;
if (temp)
DI4113 = 1 ;
else
DI4113 = 0 ;
delay_us(5);
CK4113 = 1 ;
delay_us(5);
CK4113 = 0 ;
}
/*control bits ,c2c1 == B00 --> R counter */
DI4113 = 0 ; delay_us(5); /*C2 */
CK4113 = 1 ; delay_us(5); CK4113 = 0 ;
DI4113 = 0 ; delay_us(5);/*C1 */
CK4113 = 1 ; delay_us(5); CK4113 = 0 ;
LE4113=1; delay_ms(15); LE4113 = 0; delay_us(5);
/* N counter input*/
DI4113 = 0 ;
delay_us(5); /*DB23 Any Value;*/
CK4113 = 1 ;
delay_us(5);
CK4113 = 0 ;
DI4113 = 0 ;
delay_us(5); /*DB22 Any Value; */
CK4113 = 1 ;
delay_us(5);
CK4113 = 0 ;
DI4113 = 0 ;
delay_us(5); /*DB21 G1=0,CP Current seting 1 is Permanently Used; */ CK4113 = 1 ;
delay_us(5);
CK4113 = 0 ;
/*divider ratio(N COUNTER) input B18..B1 */
/*******************************************************************/
B=x/8; /*B=x/前置分频比*/
for(i=0; i<13; i++)
{ //B
temp = B & (0x0001 << (12-i)) ;
if (temp)
DI4113 = 1 ;
else
DI4113 = 0 ;
delay_us(5);
CK4113 = 1; delay_us(5); CK4113 = 0 ;
}
/* input A6..A1 */
/*******************************************************************/
A=x%8; /*A=x%前置分频比*/
for(i=0; i<6; i++)
{ //A
temp = A & (0x01 << (5-i)) ;
if (temp)
DI4113 = 1 ;
else
DI4113 = 0 ;
delay_us(5);
CK4113 = 1; delay_us(5); CK4113 = 0 ;
}
/*control bits ,c2c1 == B01 --> N counter*/
DI4113 = 0 ; delay_us(5); /*C2 */
CK4113 = 1 ; delay_us(5); CK4113 = 0 ;
DI4113 = 1 ; delay_us(5); /*C1*/
CK4113 = 1 ; delay_us(5); CK4113 = 0 ;
LE4113=1; delay_ms(15); LE4113 = 0; delay_us(5);
}
/*延时毫秒程序*/
void delay_ms(uint time)
{
uint i;
while(time--)
for(i=0;i<114;i++);
}
/*微秒延时函数*/
void delay_us(uchar time)
{
while(time--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -