標(biāo)題:
AD9850 信號發(fā)生代碼
[打印本頁]
作者:
sgm1936
時(shí)間:
2018-3-28 08:25
標(biāo)題:
AD9850 信號發(fā)生代碼
* AD9850.c *
* AD9850的驅(qū)動(dòng)程序C文件 *
* Copyright (c)2009---MJC *
* Free to Copy and Modify. *
* Author:Worrior *
* Date:2009-9-1 *
************************************************************/
#include<intrins.h>
#include "AD9850I.h"
#include "lcd12864.h"
//unsigned char freq[8]; //液晶顯示8種步進(jìn)頻率值
unsigned char freq[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/********************
**函數(shù):AD9850Reset
**功能:AD9850的復(fù)位函數(shù)
**作者:Worrior
**日期:2009-9-1
********************/
void AD9850Reset(void)
{
AD9850WCLK = 1;
AD9850FQUD = 1;
// AD9850ReSet = 0;
// AD9850ReSet = 1;//復(fù)位腳置高電平(10個(gè)AD9850的時(shí)鐘周期)
// _nop_();_nop_();_nop_();_nop_();_nop_();
// _nop_();_nop_();_nop_();_nop_();_nop_();//延時(shí),其實(shí)不用這么長
// AD9850ReSet = 0;//復(fù)位完成,再拉低
}
/*步進(jìn)按鍵函數(shù)*/
void f10Mhz(void) //10Mhz步進(jìn)
{
freq[0]=freq[0]+1;
if(freq[0]>=10)
{
freq[0]=0;
}
display_led();
}
void f1Mhz(void) //1Mhz步進(jìn)
{
freq[1]=freq[1]+1;
if(freq[1]>=10)
{
freq[1]=0;
}
display_led();
}
void f100Khz(void) //100Khz步進(jìn)
{
freq[2]=freq[2]+1;
if(freq[2]>=10)
{
freq[2]=0;
}
display_led();
}
void f10Khz(void) //10Khz步進(jìn)
{
freq[3]=freq[3]+1;
if(freq[3]>=10)
{
freq[3]=0;
}
display_led();
}
void f1Khz(void) //1Khz步進(jìn)
{
freq[4]=freq[4]+1;
if(freq[4]>=10)
{
freq[4]=0;
}
display_led();
}
void f100Hz(void) //100hz步進(jìn)
{
freq[5]=freq[5]+1;
if(freq[5]>=10)
{
freq[5]=0;
}
display_led();
}
void f10Hz(void) //10hz步進(jìn)
{
freq[6]=freq[6]+1;
if(freq[6]>=10)
{
freq[6]=0;
}
display_led();
}
void f1Hz(void) //1hz步進(jìn)
{
freq[7]=freq[7]+1;
if(freq[7]>=10)
{
freq[7]=0;
}
display_led();
}
/***計(jì)算控制字************/
/***入口:頻率數(shù)組指針***出口,控制字值*****/
unsigned long jisuan(unsigned char data *fno)//*fno-0>freq[0...7]
{
unsigned long dds_no ;
dds_no=
(*(fno+7))*FF0+
(*(fno+6))*FF1+
(*(fno+5))*FF2+
(*(fno+4))*FF3+
(*(fno+3))*FF4+
(*(fno+2))*FF5+
(*(fno+1))*FF6+
(*fno)*FF7 ;
return(dds_no);
}
/********************
**函數(shù):AD9850SetFre
**功能:AD9850設(shè)定頻率控制字函數(shù)
**參數(shù):Fre,float型,要設(shè)定的頻率,單位Hz
**作者:Worrior
**日期:2009-9-1
********************/
void AD9850ISetFre()
{
unsigned long FTW = 0;//要寫入的32位頻率控制字(AD9850一次需要寫入40位控制字)
unsigned char part1,part2,part3,part4;
FTW=jisuan(freq);
// if(FTW > 30000000)
// FTW = 30000000;
// FTW = (unsigned long) (Fre * AD9850_125M);//計(jì)算頻率控制字(公式:FTW=(2^32/fosc)*Fre)
/*以下將32位頻率控制字分解*/
part1 = (unsigned char) (FTW>>24);//取32~25位
part2 = (unsigned char) (FTW>>16);//取24~17位
part3 = (unsigned char) (FTW>>8); //取16~9位
part4 = (unsigned char) (FTW); //取8~1位
/*以上將32位頻率控制字分解*/
AD9850FQUD = 1;
AD9850WCLK = 1;
AD9850DATAPORT = 0x00;//寄存器最高的八位只送0x00
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part1;
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part2;
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part3;
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part4;
AD9850WCLK = 0;//AD9850WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850FQUD = 0;//AD9850FQUD上升沿將AD9850緩沖區(qū)的40位數(shù)據(jù)送入DDS Core
}
/********************
**函數(shù):AD9850SetFre
**功能:AD9850設(shè)定頻率控制字函數(shù)
**參數(shù):Fre,float型,要設(shè)定的頻率,單位Hz
**作者:Worrior
**日期:2009-9-1
********************/
void AD9850IISetFre(float Fre)
{
unsigned long FTW = 0;//要寫入的32位頻率控制字(AD9850一次需要寫入40位控制字)
unsigned char part1,part2,part3,part4;
if(Fre > 30000000)
Fre = 30000000;
FTW = (unsigned long) (Fre * 34.3597384);//計(jì)算頻率控制字(公式:FTW=(2^32/fosc)*Fre)
/*以下將32位頻率控制字分解*/
part1 = (unsigned char) (FTW>>24);//取32~25位
part2 = (unsigned char) (FTW>>16);//取24~17位
part3 = (unsigned char) (FTW>>8); //取16~9位
part4 = (unsigned char) (FTW); //取8~1位
/*以上將32位頻率控制字分解*/
AD9850FQUD = 1;
AD9850WCLK = 1;
AD9850DATAPORT = 0x00;//寄存器最高的八位只送0x00
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part1;
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part2;
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part3;
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part4;
AD9850WCLK = 0;//AD9850WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850FQUD = 0;//AD9850FQUD上升沿將AD9850緩沖區(qū)的40位數(shù)據(jù)送入DDS Core
}
[color=rgb(51, 102, 153) !important]
復(fù)制代碼
主程序:
#include <reg52.h>
#include "AD9850I.h"
#include "hs0038.h"
#include "lcd12864.h"
void main()
{
hs0038_init(); //HS0038初始化,使用了外部中斷0///定時(shí)器1
lcd12864_init();
AD9850Reset();
while(1)
{
Get_Ircode_And_Dis();
switch (ircode[2])
{ /**************模式選擇****************/
case 0x07:xuanzekey();break;
case 0x15:quedingkey();break;
case 0x09:fanhuikey();break;
/*************頻率調(diào)整區(qū)***************/
case 0x0c:if(flag1==1) {f10Mhz();}; break;
case 0x18:if(flag1==1) {f1Mhz(); };break;
case 0x5e:if(flag1==1) {f100Khz();};break;
case 0x08:if(flag1==1) {f10Khz(); };break;
case 0x1c:if(flag1==1) {f1Khz(); } ;break;
case 0x5a:if(flag1==1) {f100Hz();} ;break;
case 0x42:if(flag1==1) {f10Hz(); } ;break;
case 0x52:if(flag1==1) {f1Hz(); } ;break;
/***************頻率確認(rèn)***************/
case 0x4a: if(flag1==1)
{
pce1=0;
pce2=1;
pce3=1;
AD9850ISetFre();
};
break;
/***************AM調(diào)制*********************/
case 0x16: pce1=1; //片選AD9850 I 實(shí)驗(yàn)板U1
pce2=0; //片選AD9850 I 實(shí)驗(yàn)板U2
pce3=1;
AD9850IISetFre(1000.0);break;
case 0x44:if(flag2==1)
{
pce1=1;
pce2=1;
pce3=0;
pwr=0;
AM_mastepdown();
};
break;
case 0x40: if(flag2==1)
{
pce1=1;
pce2=1;
pce3=0;
pwr=0;
AM_mastepup();
};
break;
/***************FM調(diào)制*********************/
case 0x19:AD9850IISetFre(5000.0);break;
default:break;
}
ircode[2]=0; //注意一定要把ircode[2]清零。。。。。
// AD9850SetFre();
}
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1