标题:
STC8F2K16S2单片机AD9833波形发生器程序 输出3种波形频率相位
[打印本页]
作者:
chensq
时间:
2019-8-7 11:04
标题:
STC8F2K16S2单片机AD9833波形发生器程序 输出3种波形频率相位
这是我编写的基于国产51单片机芯片STC8F2K16S2的AD9833波形发生器驱动程序,可以输出不同频率以及相位的波形,可以输出正弦波,三角波以及方波,其中附带AD9833的中文数据手册,不易获得,请珍惜。
单片机源程序如下:
#include <reg52.h>
#include <intrins.h>
sbit f_sync = P3^5;
sbit s_clk = P3^2;
sbit s_data = P3^3;
#define DDS_SCLK_UP s_clk=1
#define DDS_SCLK_DOWN s_clk=0
#define DDS_SDATA_UP s_data=1
#define DDS_SDATA_DOWN s_data=0
#define DDS_FSYNC_UP f_sync=1
#define DDS_FSYNC_DOWN f_sync=0
//#define BITB 0x0800
//AD9833输入时钟值
unsigned long int MCLK=6000000;
unsigned char p=3.141592653589793;
//寄存器配置数组
unsigned int Config_Data[8];
//频率
unsigned long int code freq[5]={7500,10000,20000,30000,40000};
//函数声明
static void delay2us(unsigned char i);
static void changeFreq(unsigned char key);
static unsigned char getKeyValue();
void writeDDS2Byte(unsigned int config);
void waveGenerate(unsigned long int frequency,unsigned int phase,unsigned char signal_type);
void main(void)
{
// unsigned char key_temp,key;
// //用单片机P1口高5bit来选择频率
// key=getKeyValue();
// changeFreq(key);
// while(1)
// {
// key_temp=getKeyValue();
// if(key!=key_temp)
// {
// key = key_temp;
// changeFreq(key);
// }
// }
waveGenerate(freq[4],2*p,0);
}
//static unsigned char getKeyValue()
//{
// unsigned char cnt;
// unsigned char key_first,key_second;
// key_first = P1&0xF8;
// for(cnt=0; cnt<100; --cnt );
// key_second = P1&0xF8;
// if( key_first == key_second )
// return key_second;
// else
// return 255;
//}
//static void changeFreq(unsigned char key)
//{
// switch(key)
// {
// case 0xF0://s5
// waveGenerate(freq[4],0);
// P2 = 0x00;
// break;
// case 0xE8://s4
// waveGenerate(freq[3],0);
// P2 = 0x01;
// break;
// case 0xD8://s3
// waveGenerate(freq[2],0);
// P2 = 0x02;
// break;
// case 0xB8://s2 X3
// waveGenerate(freq[1],0);
// P2 = 0x03;
// break;
// case 0x78://s1 X4
// waveGenerate(freq[0],0);
// P2 = 0x04;
// break;
// default:
// waveGenerate(freq[0],0);
// P2 = 0x04;
// break;
// }
//}
/*******************************************************************
* 功能:波形发生器
*
* 入口参数: frequency: 期望得到的信号频率 (frequency<MCLK)
*
* phase:期望得到的相位
*
* signal_type:0正弦波1(三角波),2(方波)
*
* 默认配置: 0相移,方波不分频
*******************************************************************/
void waveGenerate(unsigned long int frequency,unsigned int phase,unsigned char signal_type)
{
unsigned char k;
unsigned long int freq_temp;
unsigned int phase_temp;
if(frequency>MCLK)
frequency=MCLK;
switch(signal_type)
{
case 0://正弦波
Config_Data[0]=0x2108;//控制寄存器配置值,复位片内其他寄存器,AD9833上电时,期间应复位,要使AD9833复位应将reset位置1,即bit8置1,要通过Vout引脚提供正弦波输出,应将mode(D1)bit清0并将OPBITEN(D5)bit清0,当DIV2=1时即bit3=1,DAC的MSB被直接送至Vout引脚
Config_Data[7]=0x2008;//控制寄存器配置值,不复位片内其他寄存器,要使AD9833退出复位,应将该位清零,即bit8位清零,要通过Vout引脚提供正弦波输出,应将mode(D1)bit清0并将OPBITEN(D5)bit清0,当DIV2=1时即bit3=1,DAC的MSB被直接送至Vout引脚
break;
case 1://三角波
Config_Data[0]=0x210A;//控制寄存器配置值,复位片内其他寄存器,AD9833上电时,期间应复位,要使AD9833复位应将reset位置1,即bit8置1,要通过Vout引脚提供三角波输出,应将mode(D1)1,DIV2=1时即bit3=1,DAC的MSB被直接送至Vout引脚
Config_Data[7]=0x200A;//控制寄存器配置值,不复位片内其他寄存器,要使AD9833退出复位,应将该位清零,即bit8位清零,要通过Vout引脚提供三角波输出,应将mode(D1)置1,DIV2=1时即bit3=1,DAC的MSB被直接送至Vout引脚
break;
case 2://方波,不分频
Config_Data[0]=0x2128;//控制寄存器配置值,复位片内其他寄存器,AD9833上电时,期间应复位,要使AD9833复位应将reset位置1,即bit8置1,当OPBITEN(D5)置1,mode(D1)清0,DIV2=1时即bit3=1,Vout输出DAC数据MSB
Config_Data[7]=0x2028;//控制寄存器配置值,不复位片内其他寄存器,要使AD9833退出复位,应将该位清零,即bit8位清零,当OPBITEN(D5)置1,mode(D1)清0,DIV2=1时即bit3=1,Vout输出DAC数据MSB
break;
default://正弦波
Config_Data[0]=0x2108;
Config_Data[7]=0x2008;
break;
}
//freq_temp=frequency*(2^28/MCLK),MCLK=6Mhz?,2^28/MCLK约等于44.739242666666669
//phase_temp=phase*(4096/2p),p=3.141592653589793
freq_temp=frequency*44.739242666666669; //载入所选频率寄存器的值,此信号会经过如下相位偏移处理,2?/4096*PHASEREG,PHASEREG是所选相位输出频率和参考时钟频率之间的关系,必须考虑所选输出频率和参考时钟频率之间的关系,以免产生不良的输出异常
phase_temp=phase*651.898646904403295309;
Config_Data[1]=freq_temp&0x3fff;//先将bit15,bit14位清0,控制字写入
Config_Data[3]=Config_Data[1];//先将bit15,bit14位清0,控制字写入
Config_Data[2]=(freq_temp&0x0fffc000)>>14;//先将bit15,bit14位清0,控制字写入
Config_Data[4]=Config_Data[2];//先将bit15,bit14位清0,控制字写入
Config_Data[5]=phase_temp&0x1fff;
Config_Data[5]=Config_Data[6];
Config_Data[1]=Config_Data[1]|0x4000;//(频率寄存器)FREQ0 14 LSBs,bit15=0,bit14=1,FREQ0寄存器写入
Config_Data[2]=Config_Data[2]|0x4000;//(频率寄存器)FREQ0 14 MSBs,bit15=0,bit14=1,FREQ0寄存器写入
Config_Data[3]=Config_Data[3]|0x8000;//(频率寄存器)FREQ1 14 LSBs,bit15=1,bit14=0,FREQ1寄存器写入
Config_Data[4]=Config_Data[4]|0x8000;//(频率寄存器)FREQ1 14 MSBs,bit15=1,bit14=0,FREQ1寄存器写入
// Config_Data[5]=0xC000;//(相位寄存器)PHASE0
// Config_Data[6]=0xE000;//(相位寄存器)PHASE1
Config_Data[5]=Config_Data[5]|0xC000;//(相位寄存器)PHASE0,bit15=1,bit14=1,bit13=0,PHASE0寄存器写入
Config_Data[6]=Config_Data[6]|0xE000;//(相位寄存器)PHASE1,bit15=1,bit14=1,bit13=1,PHASE1寄存器写入
for(k=0;k<8;k++)
{
writeDDS2Byte(Config_Data[k]);
}
}
/***********************************************************************************************
*
* 软件模拟SPI
*
* 向AD9833写入数据或控制信息时,FSYNC应处于低电平并保持低电平,直到数据的16个位均已写入AD9833为止,FSYNC信号以帧方式传输要载入AD9833的16位信息
*
* 向AD9833发送数据时,FSYNC被拉低,单片机以8位字节传输数据,因此每个周期中只有8个SCLK下降沿,要向AD9833中载入剩余的8个位,FSYNC应在第一批8个位传输完成后保持低电平,同时启动第二次写操作来传输数
* 据的第二个字节,第二次写操作结束后FSYNC被拉高,SCLK应在两次写操作之间处于高电平空闲状态
*
************************************************************************************************/
void writeDDS2Byte(unsigned int config)
{
unsigned char i;
DDS_SCLK_DOWN;//拉低SCLK
_nop_();//延时
DDS_FSYNC_UP;//拉高FSYNC
_nop_();//延时
DDS_SCLK_UP;//拉高SCLK
delay2us(1);//延时1us
DDS_FSYNC_DOWN;//发送数据时,FSYNC拉低
_nop_();
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
(5.44 KB, 下载次数: 37)
下载附件
2019-8-7 21:24 上传
所有资料51hei提供下载:
超声波驱动.7z
(10.66 MB, 下载次数: 150)
2019-8-7 21:28 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
51hei团团
时间:
2019-8-7 21:29
好资料,51黑有你更精彩!!!
作者:
51hei团团
时间:
2019-8-7 21:31
好资料,51黑有你更精彩!!!
作者:
zhiren
时间:
2019-8-7 21:51
好资料,51黑有你更精彩!!!
作者:
Ljp989A
时间:
2019-10-10 14:38
好资料,谢谢楼主!
作者:
qq1182560902
时间:
2019-10-13 23:35
写的不错,加油
作者:
爹爹
时间:
2020-6-16 07:11
楼主问您一下,AD9833的GND和VCC应该和单片机的什么引脚连在一起
作者:
陈初学
时间:
2020-6-25 13:06
好资料,谢谢楼主
作者:
陈新雅
时间:
2021-4-1 13:56
想问下楼主AD转换器和stc8f2k16s2单片机怎么连接驱动的,还有驱动程序是你写的这个嘛
作者:
enochenoch
时间:
2025-5-16 19:25
太好了,正需要啊
作者:
长风007
时间:
2025-6-25 09:47
及时雨,正在研究这一块。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1