AD9833程序,信号发生器,正弦波,方波,三角波输出程序

更新时间:2023-06-09 06:41:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

# include <reg51.h>

# include <stdio.h>

# include <intrins.h>

/********************************************/

sbit ad9833_sdata =P1^0;

sbit ad9833_sclk =P1^1;

sbit ad9833_fsync =P1^2;

/*****************定义全局变量*********************/

/*************************************************/

//延时程序

/**************************************************/

void delay(unsigned int m)

{

unsigned int n;

for (n=0;n<=m;n++)

{

}

}

/*****************************************************/

/**向AD9833写16位数据,严格按照这个时序,不能随意修改否则必出错!**/

/*****************************************************/

void write_ad9833_d16(unsigned int x)

{

int i,w;

ad9833_sclk=1;

ad9833_fsync=1;

ad9833_fsync=0;

//写16位数据

w=x;

for(i=0;i<16;i++)

{

ad9833_sdata=w&0x8000;

ad9833_sclk=0;

ad9833_sclk=1;

w=w<<1;

}

ad9833_fsync=1;

ad9833_sclk=0;

}

/**************************************************/

/*************计算AD9833的28位数据值***************/

/*****************************************************/

/**变量frequence就是频率值,单位Hz,比如输入100Hz,则 frequence为100,需要特别注意的是不能超过12MHz;/*****变量frequence_SFR是设置频率寄存器选择0为频率寄存器0,1为频率寄存器1;*******/

/*****变量WAVE_MODE是设置输出波形选择0为三角波,1为方波,2为正弦波;*******/

/*****变量Phase是设置波形相位值*******/

void ad9833_data(double frequence,unsigned int frequence_SFR,unsigned int WAVE_MODE,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晶振

//如果时钟频率不为25MHZ,修改该处的频率值,单位MHz ,AD9833最大支持25MHz

frequence_DATA=frequence;

frequence_DATA=frequence_DATA/1000000;

frequence_DATA=frequence_DATA*frequence_mid;

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;

/*****************************************************************************/

if(frequence_SFR==0) {

frequence_LSB=frequence_LSB|0x4000; //把数据设置到设置频率寄存器0

frequence_MSB=frequence_MSB|0x4000;

//使用频率寄存器0输出波形

/*************************************************/

write_ad9833_d16(0x0100); //复位AD9833,即RESET位为1

write_ad9833_d16(0x2100); //选择数据一次写入,B28位和RESET位为1

write_ad9833_d16(frequence_LSB); //L14,选择频率寄存器0的低14位数据输入

write_ad9833_d16(frequence_MSB); //H14 频率寄存器的高14位数据输入

write_ad9833_d16(Phs_data); //设置相位//write_ad9833_d16(0x2000); /**设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出波形**/

}

/************************************************************************************/

if(frequence_SFR==1) //把数据设置到设置频率寄存器1 {

frequence_LSB=frequence_LSB|0x8000;

frequence_MSB=frequence_MSB|0x8000;

//使用频率寄存器1输出波形

/*************************************************/

write_ad9833_d16(0x0100); //复位AD9833,即RESET位为1

write_ad9833_d16(0x2100); //选择数据一次写入,B28位和RESET位为1

write_ad9833_d16(frequence_LSB); //L14,选择频率寄存器1的低14位输入

write_ad9833_d16(frequence_MSB); //H14 频率寄存器1为

write_ad9833_d16(Phs_data); //设置相位//write_ad9833_d16(0x2800); /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状态,频率寄存器1输出波形**/

}

/****************************************************************************************/

if(WAVE_MODE==0)

{

//频率寄存器输出三角波波形

/***************************************************/

delay(100000);

write_ad9833_d16(0x2002); //设置MODE位为1,输出三角波模式

}

/***************************************************/

if(WAVE_MODE==1)

{

//频率寄存器输出方波波形

/***************************************************/

delay(100000);

write_ad9833_d16(0x2028); //设置OPBITEN位为1,方波输出模式

}

/***************************************************/

if(WAVE_MODE==2)

{

//频率寄存器输出正弦波波形

/***************************************************/

delay(100000);

write_ad9833_d16(0x2000); //设置MODE位为0,输出正弦波模式

}

/***************************************************/

}

/**************************************************/

/*********************主程序***********************/

/**************************************************/

main()

{

P0=0XFF;

P1=0XFF;

P2=0XFF;

P3=0XFF;

ad9833_data(100000,0,2,0 ); //100KHz,频率寄存器0,三角波输出

/*

write_ad9833_d16(0x0100); //复位AD9833,即RESET位为1

write_ad9833_d16(0x2100); //选择数据一次写入,B28位和RESET位为1

write_ad9833_d16(0x69F1); //L14,选择频率寄存器0的低14位输入

write_ad9833_d16(0x4000); //H14 频率寄存器0为(两行组成28位数据表示1KHz)

write_ad9833_d16(0x93E3); //L14选择频率寄存器1的低14位输入

write_ad9833_d16(0x8001); //H14 频率寄存器1为2KHz

write_ad9833_d16(0x2000); //设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出1KHz正弦波形//write_ad9833_d16(0x2002); //设置MODE位为1,输出三角波模式

//write_ad9833_d16(0x2020); //设置OPBITEN位为1,方波输出模式

*/

while(1)

{

delay(100000);

}

}

本文来源:https://www.bwwdw.com/article/eb21.html

Top