程序是使用淘宝上的,应该没有问题的,IO口什么的也修改了。
main.c文件:
#include "STC15F2K60S2.H"
#include "ad9833.h"
void DelayMs( unsigned int ms)
{
unsigned int i,j;
for (i = 0; i < ms; i++)
for(j=0;j<1074;j++);
}
void main()
{
AD9833_WaveSeting(20000.0,0,SIN_WAVE,0 );//2KHz, 频率寄存器0,正弦波输出 ,初相位0
while(1)
{
}
}
AD9833.C文件代码:
#include "ad9833.h"
#include "STC15F2K60S2.H"
sbit FSYNC = P3^3;
sbit CLK = P3^1;
sbit DAT = P3^0;
#define FSYNC_0() FSYNC =0
#define FSYNC_1() FSYNC =1
#define SCK_0() CLK = 0
#define SCK_1() CLK = 1
#define DAT_0() DAT = 0
#define DAT_1() DAT = 1
#define CS_0() CS = 0
#define CS_1() CS = 1
static void AD9833_Delay(void)
{
unsigned int i;
for (i = 0; i < 1; i++);
}
//向SPI总线发送16个bit数据
void AD9833_Write(unsigned int TxData)
{
unsigned char i;
SCK_1();
//AD9833_Delay();
FSYNC_1();
//AD9833_Delay();
FSYNC_0();
AD9833_Delay();
for(i = 0; i < 16; i++)
{
if(TxData&0x8000)
DAT_1();
else
DAT_0();
AD9833_Delay();
SCK_0();
AD9833_Delay();
SCK_1();
TxData <<= 1;
}
FSYNC_1();
}
void AD9833_WaveSeting(double Freq,unsigned int Freq_SFR,unsigned int WaveMode,unsigned int Phase )
{
int frequence_LSB,frequence_MSB,Phs_data;
double frequence_mid,frequence_DATA;
long int frequence_hex;
/*********************************计算频率的16进制值***********************************/
frequence_mid=268435456/25;//适合25M晶振 2^28/fmclk AD9833模拟输出为f=fmclk/2^28 *FREQREG
//如果时钟频率不为25MHZ,修改该处的频率值,单位MHz ,AD9833最大支持25MHz
frequence_DATA=Freq;
frequence_DATA=frequence_DATA/1000000;
frequence_DATA=frequence_DATA*frequence_mid; //FREQREG = f * 2^28/fmclk
frequence_hex=frequence_DATA; //这个frequence_hex的值是32位的一个很大的数字,需要拆分成两个14位进行处理;
frequence_LSB=frequence_hex; //frequence_hex低16位送给frequence_LSB
frequence_LSB=frequence_LSB&0x3fff; //去除最高两位,16位数换去掉高位后变成了14位
frequence_MSB=frequence_hex>>14; //frequence_hex高16位送给frequence_HSB
frequence_MSB=frequence_MSB&0x3fff; //去除最高两位,16位数换去掉高位后变成了14位
Phs_data=Phase|0xC000; //相位值
AD9833_Write(0x0100); //复位AD9833,即RESET位为1
AD9833_Write(0x2100); //选择数据一次写入,B28位和RESET位为1
if(Freq_SFR==0) //把数据设置到设置频率寄存器0
{
frequence_LSB=frequence_LSB|0x4000;
frequence_MSB=frequence_MSB|0x4000;
//使用频率寄存器0输出波形
AD9833_Write(frequence_LSB); //L14,选择频率寄存器0的低14位数据输入
AD9833_Write(frequence_MSB); //H14 频率寄存器的高14位数据输入
AD9833_Write(Phs_data); //设置相位
//AD9833_Write(0x2000); /**设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出波形**/
}
if(Freq_SFR==1) //把数据设置到设置频率寄存器1
{
frequence_LSB=frequence_LSB|0x8000;
frequence_MSB=frequence_MSB|0x8000;
//使用频率寄存器1输出波形
AD9833_Write(frequence_LSB); //L14,选择频率寄存器1的低14位输入
AD9833_Write(frequence_MSB); //H14 频率寄存器1为
AD9833_Write(Phs_data); //设置相位
//AD9833_Write(0x2800); /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状态, 频率寄存器1输出波形**/
}
if(WaveMode==TRI_WAVE) //输出三角波波形
AD9833_Write(0x2002);
if(WaveMode==SQU_WAVE) //输出方波波形
AD9833_Write(0x2028); //AD9833_Write(0x2028);
if(WaveMode==SIN_WAVE) //输出正弦波形
AD9833_Write(0x2000);
}
|