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