/**********************************************************
//10.6.8//
AD9850并行驱动:
***********************************************************/
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/****************51并行驱动接口****************/
#define dat P1 //数据口
#define set P2 //控制口
sbit fq_ud =P2^5; //上升沿将输入寄存器中40位控制字送入DDS内核
sbit rst =P2^6; //高电平复位
sbit clk =P2^7; //上升沿锁存控制字入40位输入寄存器
sbit flag1=P2^0; //设置跳频图案
sbit flag2=P2^1;
sbit flag3=P2^2;
sbit spd1=P2^3; //设置跳速
sbit spd2=P2^4;
uint Z,Y,g_count=0; // 定义全局变量
uchar S,Q,phase_word=0x00,d[15][5]; //相位控制字,使用低5位
//uchar power_down=0x00; //低功耗模式
//uchar work_way=0x00;
//uchar ww[5]={0x00,0x02,0x8F,0x5C,0x29};
ulong freq;
/****************短延时**************************/
void delay_us(uint i)
{
while(i--);
}
/***************AD9850初始化********************/
//在此之前请确认D0,D1和D2的电平状态,并行工作方式000,串行工作方式需注意,为110,但需外接上下拉电阻;
void init_dds(void)
{
rst=1; //高电平复位
delay_us(10000); //延时10mS
rst=0;
delay_us(10000); //延时10mS
}
/***************往,AD9850写数据**********************/
void write_dds(uint g_count)
{
uchar i;
//ww[4]=dds&0xFF; //频率字最低字节
//ww[3]=(dds>>8)&0xFF;
//ww[2]=(dds>>16)&0xFF;
//ww[1]=dds>>24; //频率字最高字节
//ww[0]=phase_word; //控制字
//fq_ud=0; //FQ_UD置低
//clk=0;
//CLK置低
for(i=0;i<5;i++) //送入5个字节的控制字
{
dat=d[g_count][i];
delay_us(1);
clk=1;
delay_us(1);
clk=0;
delay_us(1);
}
fq_ud=1; //使能信号
delay_us(2);
fq_ud=0;
}
/*************跳频图案******************/
void dds_flag(int i,int k)
{
int x,w;
uchar idata a[3][5]={0x00,0x00,0x00,0x1E,0x32, //180
0X00,0x00,0x00,0x03,0x5A, //20
0x00,0x00,0x00,0x10,0xC6}; //100
uchar idata b[7][5]={0x00,0x11,0xEB,0x85,0x1E, //7M
0x00,0x07,0xAE,0x14,0x7A, //3M
0x00,0x0C,0xCC,0xCC,0xCC, //5M
0x00,0x05,0x1E,0xB8,0x51, //2M
0x00,0x02,0x8F,0x5C,0x28, //1M
0x00,0x0A,0x3D,0x70,0xA3, //4M
0x00,0x0F,0x5C,0x28,0xF5}; //6M
uchar idata c[15][5]={0x00,0x00,0x0E,0xBE,0xDF, //22.5K
0x00,0x00,0x06,0xE1,0x9B, //10.5K
0x00,0x00,0x02,0xF2,0xF9, //4.5K
0x00,0x00,0x00,0xFB,0xA8, //1.5K
0x00,0x00,0x07,0xDD,0x44, //12K
0x00,0x00,0x03,0xEE,0xA2, //6K
0x00,0x00,0x01,0xF7,0x51, //3K
0x00,0x00,0x08,0xD8,0xEC, //13.5K
0x00,0x00,0x0B,0xCB,0xE6, //18K
0x00,0x00,0x05,0xE5,0xF3, //9K
0x00,0x00,0x0A,0xD0,0x3D, //16.5K
0x00,0x00,0x04,0xEA,0x4A, //7.5K
0x00,0x00,0x09,0xD4,0x95, //15K
0x00,0x00,0x0C,0xC7,0x8E, //19.5K
0x00,0x00,0x0D,0xC3,0x37}; //21K
uchar xdata e[3][5]={0x00,0x00,0x00,0xA7,0xC5, //1000
0x00,0x00,0x00,0x21,0x8D, //200
0x00,0x00,0x00,0x64,0xA9}; //600
uchar xdata f[3][5]={0x00,0x00,0x09,0xD4,0x95, //15K
0x00,0x00,0x01,0xF7,0x51, //3K
0x00,0x00,0x05,0xE5,0xF3}; //9K
if(k==1) {for(x=0;x<i;x++)
{
for(w=0;w<5;w++)
{
d[x][w]=a[x][w];
}
}
}
if(k==2) {for(x=0;x<i;x++)
{
for(w=0;w<5;w++)
{
d[x][w]=b[x][w];
}
}
}
if(k==3) {for(x=0;x<i;x++)
{
for(w=0;w<5;w++)
{
d[x][w]=c[x][w];
}
}
}
if(k==4) {for(x=0;x<i;x++)
{
for(w=0;w<5;w++)
{
d[x][w]=e[x][w];
}
}
}
if(k==5) {for(x=0;x<i;x++)
{
for(w=0;w<5;w++)
{
d[x][w]=f[x][w];
}
}
}
}
/*默认输出波形*/
void normal_start(void)
{
uchar ww[5]={0x00,0x02,0x8F,0x5C,0x29};
int i;
fq_ud=0; //FQ_UD置低
clk=0; //CLK置低
for(i=0;i<5;i++) //送入5个字节的控制字
{
dat=ww[i];
delay_us(2);
clk=1;
delay_us(2);
clk=0;
delay_us(2);
}
fq_ud=1; //使能信号
delay_us(3);
fq_ud=0;
}
/*T1溢出中断处理函数*/
void timer1_int()interrupt 3 using 2
{ /*时钟振荡频率为12MHZ*/
TH1=S;
TL1=Q;
write_dds(g_count);
//Z=Z+1;
g_count++;
//if(g_count==Y) g_count=0;
}
void main()
{
uint i,j,k;
uchar m,n ;
//ulong dds;
init_dds();
/*定时,中断初始化*/
TMOD=0x10;
TH1=0x3C;
TL1=0xB0;
TR1=1;
ET1=1;
EA=1;
while(1)
{
if((!flag1)&&(!flag2)&&(!flag3))
{
normal_start();
while((!flag1)&&(!flag2)&&(!flag3));
}
delay_us(50);
m=set&0x07;
n=set&0x18;
switch(m)
{
case (0x01):Y=i=3;k=1;break;
//case (0x03):Y=i=3;k=1;goto normal;
//case (0x05):Y=i=3;k=1;goto normal;
case (0x02):Y=i=7;k=2;break;
//case (0x06):Y=i=7;k=2;goto normal;
case (0x03):Y=i=3;k=4;break;
case (0x04):Y=i=15;k=3;break;
case (0x07):Y=i=3;k=5;break;
default:normal_start();while(1);
}
dds_flag(i,k);
switch(n)
{
case(0x08):S=0x3C;Q=0xB0;break;
case(0x10):S=0xEC;Q=0x78;break;
case(0x18):S=0xFD;Q=0x66;break;
default:normal_start();while(1);
}
//if(spd1==1) {S=0x3C;Q=0xB0;} //每秒20跳
//else if(spd2==1) {S=0xFD;Q=0x66;}
//else if((!spd1)&&(!spd2)){S=0xD8;Q=0xF0;} //默认跳速每秒100跳
while(1)
{ for(j=0;j<i;j++)
{
//x=j+1;//Z=j;
while((j+1-g_count)!=0);
if(g_count==Y) g_count=0;
}
}
}
}