MC145162锁相环程序.docx
- 文档编号:7806310
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:22
- 大小:133.71KB
MC145162锁相环程序.docx
《MC145162锁相环程序.docx》由会员分享,可在线阅读,更多相关《MC145162锁相环程序.docx(22页珍藏版)》请在冰豆网上搜索。
MC145162锁相环程序
MC145162锁相环键控收发频率控制程序
//Main.c***************************************************************************************
#include
#include
#include
#include"lcd1602.c"
#include"mc145162.c"
#include"key.c"
ucharfreq[4]={0,0,0,0};
ucharcodedisp[]={'0','1','2','3','4','5','6','7','8','9','.'};
floatf;
uintTx;
voidclear(void)
{
uinti;
for(i=0;i<4;i++)
freq[i]=0;
}
voidmain(void)
{
uchari,w,q;
bitd,load,flag;
w=0;q=0;i=0;
delay(500);
P1=0xff;
MC145162_Reset(0x92,0x300A8000,16,16);//不收只发102.4MHz,100KHz*64*16
//0x31904000==>0011-000110010000-01-0000000000000
//0AUXTxSelectRxSelect-12bit=400-s1s2-14bit=0
//Crystal=4MAUX-s1-s2=0-1-0==>fR2->C(Tx=4M/400=10kHz)、fR1->A(Rx=4M/400/25=400Hz)
LCD_Init();
//LCD_Write_String(0,0,"SettheFreq!
");
//LCD_Write_String(13,1,"MHz");
if(T)
LCD_Write_String(0,0,"SettheFreq!
T");//发射指示
else
LCD_Write_String(0,0,"SettheFreq!
R");//接收指示
LCD_Write_String(13,1,"MHz");
set_pot(0x43);
while
(1)
{
switch(KeyPro())
{
case0xff:
;
break;
case0:
if((w<4)&&!
flag)
{
LCD_Write_Data('1');
freq[w]=1;
w++;
}
break;
case1:
if((w<4)&&!
flag)
{
LCD_Write_Data('2');
freq[w]=2;
w++;
}
break;
case2:
if((w<4)&&!
flag)
{
LCD_Write_Data('3');
freq[w]=3;
w++;
}
break;
case3:
if(!
flag)
{
set_pot(0x40);//清除已输入,
for(i=0;i<13;i++)//MHz不要清除,所以不是i<16
{
LCD_Write_Data('');
}
set_pot(0x43);
w=0;
q=0;
clear();
}
break;
case4:
if((w<4)&&!
flag)
{
LCD_Write_Data('4');
freq[w]=4;
w++;
}
break;
case5:
if((w<4)&&!
flag)
{
LCD_Write_Data('5');
freq[w]=5;
w++;
}
break;
case6:
if((w<4)&&!
flag)
{
LCD_Write_Data('6');
freq[w]=6;
w++;
}
break;
case7:
if(!
load&&!
flag)
{
LCD_Write_Cmd(0x04);LCD_Write_Data('');//退格
LCD_Write_Cmd(0x06);LCD_Write_Data('');
LCD_Write_Cmd(0x04);LCD_Write_Data('');
LCD_Write_Cmd(0x06);
if(w==q)//上一位是小数点,d=1是其标志
d=0;//清除小数点标志
else//上一位不是小数点
{
freq[w-1]=0;
w--;
}
}
break;
case8:
if((w<4)&&!
flag)
{
LCD_Write_Data('7');
freq[w]=7;
w++;
}
break;
case9:
if((w<4)&&!
flag)
{
LCD_Write_Data('8');
freq[w]=8;
w++;
}
break;
case10:
if((w<4)&&!
flag)
{
LCD_Write_Data('9');
freq[w]=9;
w++;
}
break;
case11:
if(!
load)
{
LCD_Init();
if(T)
LCD_Write_String(0,0,"SettheFreq!
T");
else
LCD_Write_String(0,0,"SettheFreq!
R");
LCD_Write_String(13,1,"MHz");
set_pot(0x43);
w=0;
d=0;
q=0;
flag=0;
P1=0xff;
clear();
}
break;
case12:
if((d==0)&&(load==0))
{
LCD_Write_Data('.');
q=w;//记录小数点位置
d=1;//按了小数点的标志
}
break;
case13:
if((w<4)&&!
flag)
{
LCD_Write_Data('0');
freq[w]=0;
w++;
}
break;
case14:
if(!
flag)
T=~T;//选择发射还是接收
break;
case15:
//LCD_Init();//确定键
set_pot(0x00);//第1行的第1列
for(i=0;i<16;i++)
{
LCD_Write_Data(title_2[i]);//Loading...
if(i<5)
DelayMs(80-10*i);
else
DelayMs(200-10*i);
}
set_pot(0x40);
/*for(i=0;i<16;i++)//第二行清空
{
LCD_Write_Data('');
}*/
flag=0;
load=1;
break;
}
//Tx=f/1024;
if(load)
{
flag=1;
if(d==0)//问题:
没按小数点,总是会超出范围!
!
f=(freq[0]*0.1+freq[1]*0.01+freq[2]*0.001+freq[3]*0.0001)*pow(10,w);//(10^(w-4))
if(d==1)
f=(freq[0]*0.1+freq[1]*0.01+freq[2]*0.001+freq[3]*0.0001)*pow(10,q);
//f=(freq[0]*1000+freq[1]*100+freq[2]*10+freq[3])*pow(10,q-4);//(10^(q-4))f是float,但是这里的运算丝毫不涉及小数导致出错
/*
P1=freq[0];
DelayMs(800);
P1=freq[1];
DelayMs(800);
P1=freq[2];
DelayMs(800);
P1=freq[3];
DelayMs(800);
*/
if(f>150)
{
LCD_Write_String(0,0,"ErrorFreq<150M!
");
LCD_Write_String(3,1,"Setagain!
");
f=0;Tx=0;
P1=0xff;
}
elseif(f<50)
{
LCD_Write_String(0,0,"ErrorFreq>50M!
");
LCD_Write_String(3,1,"Setagain!
");
f=0;Tx=0;
P1=0xff;
}
else
{
Tx=f*10;//f*MHz*1000kHz/100kHz
MC145162_Reset(0x92,0x300A8000,Tx,Tx);
if(T)
LCD_Write_String(1,0,"Transmit...");
else
LCD_Write_String(1,0,"Receive...");
/*for(i=0;i<4;i++)//test///////////////////////////////////
{
LCD_Write_Char(i,1,disp[freq[i]]);
LCD_Write_Char(5,1,'q');
if(d==1)
LCD_Write_Char(6,1,disp[q]);
LCD_Write_Char(8,1,'w');
LCD_Write_Char(9,1,disp[w]);
LCD_Write_Char(11,1,'d');
LCD_Write_Char(12,1,disp[d]);
DelayMs(800);
}*///test///////////////////////////////////
P1=f;//指示,测试用,可不用
}
d=0;
q=0;
load=0;
}
}
}
//config.h***************************************************************************************
#ifndef__config_h__
#define__config_h__
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineulongunsignedlongint
#defineDataPortP0
#defineKeyPortP3
sbitCLK=P2^0;
sbitADin=P2^1;
sbitDin=P2^2;
sbitENB=P2^3;
sbitRS=P2^4;//定义液晶端口
sbitRW=P2^5;
sbitEN=P2^6;
externvoidDelayUs2x(uchart);
externvoidDelayMs(uchart);
externucharKeyScan(void);
externucharKeyPro(void);
externbitLCD_Check_Busy(void);
externvoidLCD_Write_Cmd(ucharcom);
externvoidLCD_Write_Data(ucharData);
externvoidLCD_Clear(void);
externvoidLCD_Write_String(ucharx,uchary,uchar*s);
externvoidLCD_Write_Char(ucharx,uchary,ucharData);
externvoidset_pot(ucharpot);
externvoidLCD_Init(void);
externvoiddelay(uinttime);
externucharkey_scan();
#endif
//mc145162.c**********************************************************************************
/*******************************************************
MC145162可编程的双PLL(锁相环)频率合成器
最高频率可达到60MHz和85MHz。
适合配合MC3361,MC3362,MC2833等调频发射接收模块的使用
适用于全球范围内的CT-1制式的无绳电话。
同样适用于需要60MHz以下的频率其它产品。
MC145162-1是MC145162的高频版本,工作频率高达85MHz。
通过MCU的串行接口,非常方便地操作可编程的接收、发射、参考、辅助参考计数器。
正因为这样,所以它可使用于任何CT-1制式的无绳电话。
本IC的发射环和接收环各有一个独立的相位检测器。
一个共用的参考晶体,驱动两个独立的参考频率计数器,为发射环和接收环提供了独立的参考频率。
如果有需要的话,辅助参考计数器可以让我们为发射环和接收环选择一个额外的参考频率。
*******************************************************/
#include
#include
bitT=1;//默认发射模式
/*******************************************************************/
voiddelay(uinttime)
{
uintt;
for(t=0;t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MC145162 锁相环 程序