原创 LMX233x程序

2008-12-11 22:49 3118 6 6 分类: MCU/ 嵌入式

这是以前写的LMX2330锁相环的程序


主程序:


//接收机软件,2330锁相环
//作者    :姬瑞江
//版权    :四川西江电子(西江工作室)
//日期    :2005年10月7日
#include <MEGA8.H>
#include <stdio.h>  
#include <delay.h>
#include "eeprom.c"
#include "lmx233x.h"
#include "lmx2330a.c"    
//PTcomb1:寄存器标志和发送定位;PTdata:发送号编号寄存器;PTcommand:发送转换位寄存器;PTfsjs:低发送数据次数计数,高记忆数据发送计数
//PTcomb1:0x80开始发送数据标志;0x40数据首发标志; m
unsigned char  PTcomb1,PTcommand,PTfsjs;
unsigned int PTdata;
//TIMER0 initialize - prescale:64
// desired value: 2.5KHz
// actual value:  2.520KHz (0.8%)
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
//unsigned char lli;
TCNT0 = 0xC2; //reload counter value
if((PTcomb1&0x80)==0x80)
   {
    
  
   }
}


//TIMER1 initialize - prescale:64
// WGM: 0) Normal, TOP="0xFFFF"
// desired value: 100Hz
// actual value: 100.032Hz (0.0%)
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
 //TIMER1 has overflowed
 TCNT1H = 0xF9; //reload counter high value
 TCNT1L = 0xE6; //reload counter low value
// Place your code here


}


 void port_init(void)
    {


     PORTB="0x00";
     DDRB="0x3F"; 
     PORTC="0x00";
     DDRC="0x0F";
     PORTD="0x00";
     DDRD="0x00";


    }


void timer0_init(void)
{
 TCCR0 = 0x00; //stop
 TCNT0 = 0xC2; //set count
 TCCR0 = 0x03; //start timer
}


void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xF9; //setup
 TCNT1L = 0xE6;
 OCR1AH = 0x06;
 OCR1AL = 0x1A;
 OCR1BH = 0x06;
 OCR1BL = 0x1A;
 ICR1H  = 0x06;
 ICR1L  = 0x1A;
 TCCR1A = 0x00;
 TCCR1B = 0x03; //start Timer
}


void init_devices(void)
{
 //stop errant interrupts until set up
 #asm
  cli
 
 #endasm //disable all interrupts  
 PTcomb1=0;
 PTcommand=0;
 PTfsjs=0;
 PTdata=0;
 port_init();
 timer0_init();
 timer1_init();
 LMX_int();


 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x05; //timer interrupt sources
 #asm
 sei
 #endasm; //re-enable interrupts
 //all peripherals are now initialized
}


void main(void)

unsigned char  tempcom;
         init_devices();
        
      tempcom="0";
    lmx2330_RN(714,tempcom);        //发送IF-R分频。    
   
    tempcom="1";                         //并叠RF-R Cp码  
    lmx2330_RN(714,tempcom);        //发送RF-R分频。          
 
    tempcom="2";                       //并叠IF-N Cp码
    lmx2330_RN(10495,tempcom);     //发送IF-N分频。  10495
     
    tempcom="3";                       //并叠RF-N Cp码
    lmx2330_RN(10496,tempcom);     //发送RF-N分频。   10496   
         
    for(;;)
    {
   #asm("NOP");
    
    }


}


LMX233x驱动


//程序环境:CVAVR V1.24.6
//作者    :姬瑞江
//版权    :四川西江电子(西江工作室)
//日期    :2005年10月7日
//#include <iom8v.h>
//#include <macros.h>
//lmx2330_writeRn(unsigned long rfdata,unsigned long ifdata,unsigned char command,unsigned char fenping);
//LMX系列端口初始化
void LMX_int(void)
  {
    LMX_DDR|=LMX_EN+LMX_CLK+LMX_DAT;  //在同一个端口设置NE,CLK,DAT
    LMX_PORT|=LMX_EN;                 //初始化输出端口状态
   }
//一个单时钟  
void LMX_clk(void)
    {  delay_us(1);
      LMX_PORT|=LMX_CLK;       //CLK=1
      delay_us(2); 
      LMX_PORT&=~LMX_CLK;      //CLK=0
      delay_us(1);
    }
//多个单时钟  
void LMX_nclk(char nk)
    { unsigned char nclk;
      for(nclk=0;nclk<nk;nclk++)
      LMX_clk();
    }
//写2Bit指令
void lmx2326_write_cn(unsigned char command)
   {
      if(command==0)
      {
      LMX_PORT&=~LMX_DAT;
      LMX_clk();                         //dat=0
          LMX_clk();                    //dat=0 
      }
    if(command==1)
        {
       LMX_PORT&=~LMX_DAT;
        LMX_clk();                               //dat=0
        LMX_PORT|= LMX_DAT;                  //DAT=1;  
        LMX_clk();
       }
    if(command==2)
        {
         LMX_PORT|= LMX_DAT;                  //DAT=1;  
         LMX_clk();
         LMX_PORT&=~LMX_DAT;                     //dat=0
         LMX_clk(); 
       }
      if(command==3)
        {
        LMX_PORT|=LMX_DAT;                  //DAT=1;  
        LMX_clk();
        LMX_clk();                          //dat=1
       } 
    
   }



/* void lmx2330_writeRn(unsigned int rfdata,unsigned int ifdata,unsigned char command)
RFdata为射频输出频率或OSC振荡频率,IFdata中频或R步进频率,Command为控制命令
N预分频:IF预分频设定16,RF预分频设定64;
Command命令的0-2Bit为步进频率选择开关:0=10KHz;1=20KHz;2=50KHz;3=100KHz;4=150KHz;5=200KHz;6=250KHz;7=自定义
步进频率从ifdata入口/10输入。
3-4Bit为本振源频率选择:0=8MHz,1=10MHz,2=12MHz,3=自定义.默认8MHz,叠加0x08=10MH,叠加0x10=12MHz,叠加0x18=自定义
本振频率从rfdata入口/10输入。
5bit为正谱倒谱:0=正谱;1=倒谱;  高本振倒谱,低本振正谱。
6-7bit为IF/RF识别Cp码,0xc0=RF-N; 0x80=IF-N; 0x40=RF-R; 0=IF-R。
注意rfdata+ifdata不可大于65535,其中参数是以1KHz的倍数设定的,LD状态已固定为双路锁定点亮*/


void lmx2330_RN(unsigned int rfdata,unsigned char command)
     {
      unsigned char temirfn,forl;
      unsigned int datbit,temosc;
       temosc="rfdata"; 
     //写使能 
      LMX_PORT&=~(LMX_CLK+LMX_DAT+LMX_EN);              //CLK,DAT=0
        //写R分频数据
      if(((command&0x03)==0)||((command&0x03)==1))            //IF-R/RF-R
    {
      datbit="0x4000";
     
             
                
      lmx2326_write_cn(1);              //写IF-R的21,20bit为01
      lmx2326_write_cn(1);              //写IF-R的19,18bit为01        
      LMX_PORT|= LMX_DAT;               //DAT写1.
      LMX_clk();                        //发送1时钟,写17bit为01        
      for(forl=0;forl<15;forl++)
         {
         if((datbit&temosc)!=0)              
                LMX_PORT|=LMX_DAT;                       //数据Bit为非0,DAT输出为1
             else 
                LMX_PORT&=~LMX_DAT;                      //数据Bit为0,DAT输出为0
       LMX_clk();                          //发送1时钟,写17bit同18bit
       datbit="datbit">>1;                              //比较数据右移1位。
          
          }
     if((command&0x03)==0x00)
        lmx2326_write_cn(0);              //写IF-R的C1,C2.IF-R为00,高位在前写成00.
     else
        lmx2326_write_cn(2);              //写RF-R的C1,C2.IF-R为01,高位在前写成10.
       }
 //写N分频数据   
   if(((command&0x03)==2)||((command&0x03)==3))            //IF-N/RF-N
      {
     
       if((command&0x03)==2)
          {
          datbit="0x4000";           //IF-N赋值
          temirfn="15";
          }
       else
          {
          datbit="0x8000";          //RF-N赋值
          temirfn="16";
          }
       lmx2326_write_cn(1);              //写N的21,20bit为01
       if((command&0x03)==2)                  //写IF-N
          {
          for(forl=0;forl<temirfn;forl++)
         {
         
              if((temosc&datbit)==0)
                 LMX_PORT&=~LMX_DAT;          //数据Bit为0,DAT输出为0
          else
             LMX_PORT|=LMX_DAT;           //数据Bit为非0,DAT输出为1
          LMX_clk();                        //发送1时钟,写17bit同18bit
          datbit="datbit">>1;               //比较数据右移1位。
          if(forl==10)
            {
            LMX_PORT&=~LMX_DAT;            //第14-16Bit无效,发送3个0 
            LMX_nclk(3);                  
            }
             }
          }  
       else                           //写RF-N
          {
                LMX_PORT&=~LMX_DAT;            //第3Bit发送0 
            LMX_clk();         
           for(forl=0;forl<temirfn;forl++)
         {
        
              if((temosc&datbit)==0)
                 LMX_PORT&=~LMX_DAT;          //数据Bit为0,DAT输出为0
          else
             LMX_PORT|=LMX_DAT;           //数据Bit为非0,DAT输出为1
          LMX_clk();                        //发送1时钟,
          datbit="datbit">>1;               //比较数据右移1位。
         
           if(forl==9)
            {
            LMX_PORT&=~LMX_DAT;            //第14Bit无效,发送0 
            LMX_clk();                  
            }
             }
         
          }
        if((command&0x03)==2)
        lmx2326_write_cn(1);              //写IF-N的C1,C2.IF-N为10,高位在前写成01.
     else
        lmx2326_write_cn(3);              //写RF-N的C1,C2.RF-N为11,高位在前写成11.
     
      }
       LMX_PORT|=LMX_EN;                //EN,CLK,DAT=1; 
       LMX_PORT&=~(LMX_CLK+LMX_DAT);    //CLK,DAT=0;
       delay_us(80);
 
 }
 
H文件



//定义MCU与LCD的接口
#define LMX_DDR       DDRB
#define LMX_EN_DDR    DDRB
#define LMX_CLK_DDR   DDRB
#define LMX_DAT_DDR   DDRB
#define LMX_PORT   PORTB
#define LMX_EN_PORT   PORTB
#define LMX_CLK_PORT  PORTB
#define LMX_DAT_PORT  PORTB



#define PT2262_DDR    DDRC
#define PT2262_POPT    DDRC
#define PT2262I       0X01
#define PT2262O       0X02
//#define LMX_CE_PORT  PORTD


//#define LMX_CE         0x20   //portc5       out
#define LMX_EN         0x01   //portB0         out
#define LMX_CLK        0x02   //portc1         out
#define LMX_DAT        0x04   //portd2         out


#define en_bit     0
#define clk_bit    1
#define dat_bit    2


/*--------------------------------------------------------------------------------------------------
Public function prototypes
--------------------------------------------------------------------------------------------------*/
//void delay_nus              (unsigned int n);
//void delay_nms              (unsigned int n);
//void delay_1us              (void);
//void delay_1ms              (void)
//LMX系列单片机端口初始化
void LMX_int                (void);


/*
void LMX2326_wite_rn(unsigned int data,unsigned char rncommand,unsigned char ldcommand)
data为发送数据
command高半字节为21-20Bit发送数据命令,低半字节为R/N/F控制命令
*/ 
//void LMX2326_write_rnf        (unsigned int data,unsigned char command);


/* void lmx2330_writeRn(unsigned int rfdata,unsigned int ifdata,unsigned char command)
RFdata为射频输出频率或OSC振荡频率,IFdata中频或R步进频率,Command为控制命令
N预分频:IF预分频设定16,RF预分频设定64;
Command命令的0-2Bit为步进频率选择开关:0=10KHz;1=20KHz;2=50KHz;3=100KHz;4=150KHz;5=200KHz;6=250KHz;7=自定义
步进频率从ifdata入口输入。
3-4Bit为本振源频率选择:0=8MHz,1=10MHz,2=12MHz,3=自定义.默认8MHz,叠加0x08=10MH,叠加0x10=12MHz,叠加0x18=自定义
本振频率从rfdata入口输入。
5bit为正谱倒谱:0=正谱;1=倒谱; 
6-7bit为IF/RF识别Cp码,0xc0=RF-N; 0x80=IF-N; 0x40=RF-R; 0=IF-R。
注意rfdata+ifdata不可大于65535,其中参数是以10KHz的倍数设定的,LD状态已固定为双路锁定点亮*/
void lmx2330_RN             (unsigned int rfdata,unsigned char command); 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条