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

📄 pll.c

📁 usb接口应用文件供参考 usb接口应用文件供参考
💻 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 + -