这是以前写的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);
文章评论(0条评论)
登录后参与讨论