MC145162锁相环程序.doc_第1页
MC145162锁相环程序.doc_第2页
MC145162锁相环程序.doc_第3页
MC145162锁相环程序.doc_第4页
MC145162锁相环程序.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MC145162锁相环键控收发频率控制程序/Main.c*#include#include#include#includelcd1602.c#includemc145162.c #includekey.cuchar freq4=0,0,0,0;uchar code disp = 0, 1, 2, 3,4, 5, 6, 7, 8, 9 ,.;float f;uint Tx;void clear(void)uint i;for(i=0;i0011 - 0001 1001 0000 - 01 - 00 0000 0000 000/ 0 AUX TxSelect RxSelect - 12bit=400 - s1 s2 - 14bit=0/Crystal=4M AUX-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,Set the Freq!);/LCD_Write_String(13,1,MHz);if(T)LCD_Write_String(0,0,Set the Freq! T);/发射指示elseLCD_Write_String(0,0,Set the Freq! R);/接收指示LCD_Write_String(13,1,MHz);set_pot(0x43);while (1) switch(KeyPro()case 0xff: ; break;case 0:if(w4)& !flag)LCD_Write_Data(1);freqw=1;w+; break;case 1:if(w4)& !flag)LCD_Write_Data(2);freqw=2;w+; break;case 2:if(w4)& !flag)LCD_Write_Data(3);freqw=3;w+; break;case 3:if(!flag) set_pot(0x40);/清除已输入,for(i=0;i13;i+)/MHz不要清除,所以不是i16LCD_Write_Data( );set_pot(0x43);w=0;q=0;clear(); break;case 4:if(w4)& !flag)LCD_Write_Data(4);freqw=4;w+; break;case 5: if(w4)& !flag)LCD_Write_Data(5);freqw=5;w+; break;case 6:if(w4)& !flag)LCD_Write_Data(6);freqw=6;w+; break;case 7: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 /上一位不是小数点freqw-1=0;w-; break;case 8: if(w4)& !flag)LCD_Write_Data(7);freqw=7;w+; break;case 9: if(w4)& !flag)LCD_Write_Data(8);freqw=8;w+; break;case 10: if(w4)& !flag)LCD_Write_Data(9);freqw=9;w+; break;case 11:if(!load)LCD_Init(); if(T)LCD_Write_String(0,0,Set the Freq! T);elseLCD_Write_String(0,0,Set the Freq! R);LCD_Write_String(13,1,MHz);set_pot(0x43);w=0;d=0;q=0;flag=0;P1=0xff;clear(); break;case 12: if(d=0) & (load=0)LCD_Write_Data(.);q=w;/记录小数点位置d=1;/按了小数点的标志 break;case 13: if(w4)& !flag)LCD_Write_Data(0);freqw=0;w+; break;case 14:if(!flag)T=T;/选择发射还是接收 break;case 15: /LCD_Init(); /确定键set_pot(0x00);/第1行的第1列for(i=0;i16;i+)LCD_Write_Data(title_2i);/Loading.if(i5)DelayMs(80-10*i);elseDelayMs(200-10*i);set_pot(0x40);/*for(i=0;i150) LCD_Write_String(0,0,Error Freq150M!);LCD_Write_String(3,1,Set again!);f=0;Tx=0;P1=0xff;else if(f50M!);LCD_Write_String(3,1,Set again!);f=0;Tx=0;P1=0xff;elseTx=f*10;/f*MHz*1000kHz/100kHzMC145162_Reset(0x92,0x300A8000,Tx,Tx);if(T)LCD_Write_String(1,0, Transmit. );elseLCD_Write_String(1,0, Receive. );/*for(i=0;i4;i+) /test/ LCD_Write_Char(i,1,dispfreqi);LCD_Write_Char(5,1,q);if(d=1)LCD_Write_Char(6,1,dispq);LCD_Write_Char(8,1,w);LCD_Write_Char(9,1,dispw);LCD_Write_Char(11,1,d);LCD_Write_Char(12,1,dispd);DelayMs(800);*/ /test/P1=f; /指示,测试用,可不用d=0;q=0;load=0; /config.h*#ifndef _config_h_#define _config_h_#include#include#define uint unsigned int#define uchar unsigned char#define ulong unsigned long int#define DataPort P0#define KeyPort P3 sbit CLK=P20; sbit ADin=P21; sbit Din=P22; sbit ENB=P23;sbit RS = P24; /定义液晶端口 sbit RW = P25;sbit EN = P26;extern void DelayUs2x(uchar t);extern void DelayMs(uchar t);extern uchar KeyScan(void);extern uchar KeyPro(void);extern bit LCD_Check_Busy(void);extern void LCD_Write_Cmd(uchar com);extern void LCD_Write_Data(uchar Data);extern void LCD_Clear(void);extern void LCD_Write_String(uchar x,uchar y,uchar *s);extern void LCD_Write_Char(uchar x,uchar y,uchar Data);extern void set_pot(uchar pot);extern void LCD_Init(void);extern void delay(uint time);extern uchar key_scan();#endif/mc145162.c*/* MC145162 可编程的双PLL(锁相环)频率合成器最高频率可达到60 MHz 和 85 MHz 。适合配合MC3361,MC3362,MC2833等调频发射接收模块的使用适用于全球范围内的CT-1制式的无绳电话。同样适用于需要60 MHz以下的频率其它产品。MC145162-1是MC145162的高频版本,工作频率高达85 MHz。通过MCU的串行接口,非常方便地操作可编程的接收、发射、参考、辅助参考计数器。正因为这样,所以它可使用于任何CT-1制式的无绳电话。本IC的发射环和接收环各有一个独立的相位检测器。一个共用的参考晶体,驱动两个独立的参考频率计数器,为发射环和接收环提供了独立的参考频率。如果有需要的话,辅助参考计数器可以让我们为发射环和接收环选择一个额外的参考频率。 */ #include#includebit T=1; /默认发射模式 /*/ void delay(uint time) uint t; for (t=0; ttime; t+) void Write_Ctrl_val(uint Ctrl_val)/输入数据为控制字int i; ulong shift1; if(T)Ctrl_val=Ctrl_val|0x02; /关接收elseCtrl_val=Ctrl_val|0x04; /关发射 ENB=0; CLK=0; ADin=0; Din=0; ENB=1; shift1=0x80; /1000 0000 /在编程控制寄存器/参考频率时,MSB为1,输入控制字。MSB为0,输入参考频率. for(i = 0;i 1; Din=0; CLK=0; ENB=0;void Write_Refreq_val(ulong Refreq_val)/ 输入数据是参考频率int i; ulong shift2; /ENB=0; CLK=0; shift2=0x80000000; /1000 0000 0000 0000 - 0000 0000 0000 0000 ENB=1; /参考频率,其实是在配置对晶振的分频R且鉴相器如何选择之 for(i = 0;i 1; Din=0; CLK=0;ENB=0; /void Write_Counter_Reg(uint Tx_Count,uint Rx_Count)/发射计数器与接收计数器被选中int i; ulong shift3;/ CLK=0; ENB=0; /串行数据传输的时候,ENB脚置低使能 shift3 = 0x8000; /1000 0000 0000 0000 for(i = 0;i 1; ADin=0; Din=0; CLK=0; ENB=1; /当编程Tx/Rx通道计数器,ENB脚必须动作, ENB=0; /以便在上次时钟的上升沿之后提供下降沿来锁存移位数据。 / void Write_PLL(uint TX,uint RX) uint TX_temp,RX_temp; TX_temp=TX/4; /预分频 RX_temp=RX/4; Write_Counter_Reg(TX_temp,RX_temp); void MC145162_Reset(uint Ctrl_val,ulong Refreq_val,uint Tx_Count,uint Rx_Count) /Ctrl_val : 1-0-TestBit-AuxDataSelect-REFout/3/4-TxPDEnable-RxPDEnable-TxPDEnable /Refreq_val :发射寄存器与接收寄存器,共32位Write_Ctrl_val(Ctrl_val);Write_Refreq_val(Refreq_val);/Write_Counter_Reg(Tx_Count,Rx_Count);Write_PLL(Tx_Count,Rx_Count);/ MCU的编程方法有两种格式,由ENB输入引脚所控制。/ 在串行数据传输的时候,/ 假如使能信号为高,控制寄存器/参考频率编程被选中。/ 假如ENB为低时,发射计数器与接收计数器的被选中编程。/ 在发射计数器与接收计数器编程期间,ADin 和 Din脚都能输入数据到发射与接收计数器。/*/Delay.h*#ifndef _delay_h_#define _delay_h_#define uint unsigned int#define uchar unsigned char#define ulong unsigned long int/*-uS延时函数,含有输入参数 uchar t,无返回值uchar 是定义无符号字符变量,其值的范围是0255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS -*/void DelayUs2x(uchar t) while(-t);/*-mS延时函数,含有输入参数 uchar t,无返回值uchar 是定义无符号字符变量,其值的范围是0255 这里使用晶振12M,精确延时请使用汇编-*/void DelayMs(uchar t)while(t-)/大致延时1mSDelayUs2x(245);DelayUs2x(245);#endif/lcd1602.c*/*-名称:LCD1602内容:通过矩阵键盘输入,依次显示0-F16中字符引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK-*/#include#include#includeuchar code title_1=Input the Freq!; uchar code title_2= Loading. ;uchar code title_3= Working. ;uchar code numtable=0,1,2,3,4,5,6,7,8,9,., ,!,D,E,F;/转换成液晶显示的字符/*-判忙函数-*/bit LCD_Check_Busy(void) DataPort= 0xFF; RS=0; RW=1; EN=0; _nop_(); EN=1;return (bit)(DataPort & 0x80);/*-写入命令函数-*/void LCD_Write_Cmd(uchar com) while(LCD_Check_Busy(); /忙则等待RS=0; RW=0; EN=1; DataPort= com; _nop_(); EN=0;/*-写入数据函数-*/void LCD_Write_Data(uchar Data) while(LCD_Check_Busy(); /忙则等待RS=1; RW=0; EN=1; DataPort= Data; _nop_();EN=0;/*-写入字符串函数-*/void LCD_Write_String(uchar x,uchar y,uchar *s) if (y = 0) LCD_Write_Cmd(0x80 + x); else LCD_Write_Cmd(0xc0 + x); while (*s) LCD_Write_Data( *s); s +; /*-写入字符函数-void LCD_Write_Char(uchar x,uchar y,uchar Data) if (y = 0) LCD_Write_Cmd(0x80 + x); else LCD_Write_Cmd(0xc0 + x); LCD_Write_Data( Data); */*-设置位置函数-*/void set_pot(uchar pot) LCD_Write_Cmd(0x80+pot);/pot=0x00第一行首位,每个字符占0x02/pot=0x40第二行首位/*-初始化函数-*/void LCD_Init(void) RW=0;EN=0;LCD_Write_Cmd(0x38); LCD_Write_Cmd(0x0c); LCD_Write_Cmd(0x06); LCD_Write_Cmd(0x01); /清屏/key.c*#include#include /*-按键扫描函数,返回扫描键值-*/uchar KeyScan(void) /键盘扫描函数,使用行列反转扫描法uchar cord_h,cord_l;/行列值中间变量KeyPort=0x0f; /行线输出全为0cord_h=KeyPort&0x0f; /读入列线值if(cord_h!=0x0f) /先检测有无按键按下DelayMs(2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论