📄 pll.c
字号:
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include <reg52.h>
#include <absacc.h>
#include "mylib.h"
#include "intrins.h"
#define input0 in0.in0
#define input1 in1.in1
#define fm 0
#define am 1
#define up 1
#define down 0
sbit din=P1^5;
sbit clk=P1^6;
sbit dou=P3^7;
sbit cen=P1^4;
extern bit band;
union
{
ulong all;
struct
{
uchar addr :8; //8位输入输出模式选择地址
uint frq :16; //16位电台频率数值
uchar cankao :4; //4位参考频率选择
uchar xs :1; //晶振选择 0:4.5m 1:7.2mhz
uchar cte :1; //中频计数控制 1:START 0:REST
uchar inp :2; //输入频率范围选择
}in0;
}in0;
union
{
ulong da;
struct
{
uchar addr :8; //8位输入输出模式选择地址
uchar bnc :1; //空输出B01-B04四个输出口,可以控制外围的电路,常用来做波段切换。
uchar stmo :1; //立体单声道强制转换 设置为1可以选择单声道输出
uchar ifen :1; //中频缓冲输出使能 设置为0选择中频输出同时净音
uchar band :1; //波段选择 设置为0选择调频
uchar io :2; //两个可以定义的端口,可以做输入也可做输出。再此程序中IO1空,IO2为立体声检测脚
uchar ioc :2; //设置IO口的工作模式,为0时设置为输入模式,反之。
uchar dz :2; //锁相环死区控制,不是很重要。
uchar ul :2; //锁相环控制电压输出驱动模式设01时为直接输出模式(一般采用此种模式)
uchar doc :3; //设置输出数据端DO脚的辅助功能设置010时将指示中频测量的完成状况
uchar dnc :1; //空数据位,不用。
uchar test :3; //测试模式一般全部设置为0
uchar ifs :1; //中频计数器控制,一般设置为1,主要设置中频场强(1:40毫伏0:70毫伏)
uchar dlc :1; //电荷泵输出,正常状态为0,设置为1时拉低电位。
uchar tbc :1; //设置为1时使B01口输出8HZ的基准脉冲,此时B01口将不能作为通用输出口。
uchar gt :2; //中频测量时间设置最大64MS最小4MS当GT=00时,前两中等待时间3-4MS后两中等待时间为7-8MS,中频信号必须在等待时间结束之前输入!!
}in1;
}in1;
void iniband()
{
input0.addr=0x14; //输入模式1的地址
input0.xs =0x00; //选择0为4.5MHZ晶体
input0.cte =0x00; //锁相环内部使能位设置0复位设置为1开始计数。
input1.addr=0x94; //输入模式2的地址
input1.bnc =0x00; //B04本设计未用
input1.stmo=0x00; //默认为立体声输出
input1.ifen=0x01; //中频输出缓冲暂时关闭
input1.io =0x00; //没有用到,但是可以做为立体声单声道信号检测
input1.ioc =0x00; //将上两个脚全部设置为输出
input1.dz =0x00; //此设置效果不是很明显可以设置捕捉范围
input1.ul =0x01; //将锁相环的误差电压直接输出可以设置捕捉灵敏度
input1.doc =0x00; //将DOUT脚的辅助功能设置为中频计数状态检测
input1.dnc =0x00; //空的数据位
input1.test=0x00; //全部设置为0设置为正常状态
input1.ifs =0x00; //中频输入信号强度控制设置此状态,最大限度的减少误台
input1.dlc =0x00; //设置电荷泵正常输出
input1.tbc =0x00; //设置为1时B01将输出8HZ的基准信号但是BO1本收音电路设置为FM/AM转换,应设置为零
input1.gt =0x01; //将中频测量时间设置为4MS设置太高自动搜索整个频段将会很长
}
void iniband1(bit band)//设置调频调幅的不同部分
{
if(band==fm)
{
input0.cankao=0x0c; //FM步进频率50KHZ
input0.inp=0x01; //输入频率范围10-160MHZ
input1.band=fm;
}
else
{
input0.cankao=0x05; //AM步进频率10KHZ
input0.inp=0x00; //输入频率范围0.5-10MHZ
input1.band=am;
}
}
ulong stepserch(bit direction,uint freq)//单步搜索形参:步进方向,和基频率
{
uchar c;
uint a; //根据
c=(input1.band)?0x10:0x01; //根据波段选择步进数据AM每次加0X10 FM每次加0X01,具体原因参照数据手册上他们加载频率时的不同点。
a=direction?(swdata(freq)+c):(swdata(freq)-c);//根据步进方向决定是加还是减。由于频率数据是反向加载的,如频率计算出是:0101 而加载时却是1010 一定注意!!!!!!!!!!!!!!!!
input0.frq=swdata(a); //再将已经加减后的频率数据反向存储
input0.cte=0;
wrdata(in0.all); //复位锁相环IC72131内部的中频记数控制位
input0.cte=1;
wrdata(in0.all); //打开锁相环IC72131内部的中频记数控制位 ,单应该注意的是即使打开记数功能位内部电路不会立刻记数,而是延时一段时间(3-7MS,内部自动延时)
input1.ifen=0;
wrdata(in1.da); //在上一语句的3-7MS延时之内应打开外部的中频缓冲,开始记数!
delay50(); //一般中频记数时间在64MS之内,本程序选择32MS,所以延时50MS已经足够了
delay50();
input1.ifen=1;
wrdata(in1.da); //记数结束后关闭中频缓冲,并取消静音状态!
return(rddata()); //读出中频记数的值,看是否为AM-450KHZ FM-10。7MHZ,如果是说明已经准确搜到台。
}
uint swdata(uint x) //将2个字节的数值反向。
{
uint b;
uchar a;
for(a=0;a<16;a++)
{
b=(x&0x0001)?((b<<1)+1):(b<<1);
x=x>>1;
}
return(b);
}
wrdata(ulong dat) //写四个字节的功能和数据给72131,72131有3个象这样的数据,并且每次4个字节一个数据,分别对应数据手册上的IN0,IN1,和DOUT,控制段!
{ //IN0数据段主要发送频率数据和参考频率,其他请参考数据手册!
uchar count;
cen=0;
for(count=0;count<32;count++)
{
_nop_();
_nop_();
_nop_();
clk=1;
if(dat&0x80000000)
din=1;
else
din=0;
dat=dat<<1;
clk=0;
_nop_();
_nop_();
_nop_();
clk=1;
if(count==7)
cen=1;
_nop_();
_nop_();
_nop_();
}
cen=0; //可以参考发送时序图
}
ulong rddata(void)//读出中频记数值和收音的各个状态:如是否锁定,单声道立体声等!!
{
uchar count;
ulong ifcount;
uchar addr=0x54;
cen=0;
for(count=0;count<32;count++)
{
if(count<8)
{
_nop_();
_nop_();
_nop_();
clk=1;
if(addr&0x80)
din=1;
else
din=0;
addr=addr<<1;
clk=0;
_nop_();
_nop_();
_nop_();
clk=1;
if(count==7)
cen=1;
_nop_();
_nop_();
_nop_();
}
else
{
_nop_();
_nop_();
_nop_();
clk=1;
_nop_();
_nop_();
_nop_();
clk=0;
_nop_();
_nop_();
_nop_();
clk=1;
dou=1;
ifcount=(dou)?((ifcount<<1)+1):(ifcount<<1);
}
}
cen=0;
return(ifcount&0x000fffff);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -