51单片机控制AD9833,如何输出固定周期的波形,比如十个周期
给点意见,如何修改,可以输出固定周期的波形
#include <reg52.h>
#include <intrins.h>
sbit f_sync = P1^0;
sbit s_clk = P1^1;
sbit s_data = P1^2;
#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 int Config_Data[8];
//频率
unsigned long int code freq[5]={75000,100000,200000,300000,400000};
//函数声明
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 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);
}
}
}
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)
*
* signal_type:0(正弦波),1(三角波),2(方波)
*
* 默认配置: 0相移,方波不分频
*******************************************************************/
void waveGenerate(unsigned long int frequency,unsigned char signal_type)
{
unsigned char k;
unsigned long int freq_temp;
if(frequency>MCLK)
frequency=MCLK;
switch(signal_type)
{
case 0://正弦波
Config_Data[0]=0x2108;//控制寄存器配置值,复位片内其它寄存器
Config_Data[7]=0x2008;//控制寄存器配置值,不复位片内其它寄存器
break;
case 1://三角波
Config_Data[0]=0x210A;
Config_Data[7]=0x200A;
break;
case 2://方波,不分频
Config_Data[0]=0x2128;
Config_Data[7]=0x2028;
break;
default://正弦波
Config_Data[0]=0x2108;
Config_Data[7]=0x2008;
break;
}
//freq_temp=frequency*(2^28/MCLK),MCLK=6Mhz时,2^28/MCLK约等于44.739242666666669
freq_temp=frequency*44.739242666666669;
Config_Data[1]=freq_temp&0x3fff;
Config_Data[3]=Config_Data[1];
Config_Data[2]=(freq_temp&0x0fffc000)>>14;
Config_Data[4]=Config_Data[2];
Config_Data[1]=Config_Data[1]|0x4000;//FREQ0 14 LSBs
Config_Data[2]=Config_Data[2]|0x4000;//FREQ0 14 MSBs
Config_Data[3]=Config_Data[3]|0x8000;//FREQ1 14 LSBs
Config_Data[4]=Config_Data[4]|0x8000;//FREQ1 14 MSBs
Config_Data[5]=0xC000;//PHASE0
Config_Data[6]=0xE000;//PHASE1
for(k=0;k<8;k++)
{
writeDDS2Byte(Config_Data[k]);
}
}
void writeDDS2Byte(unsigned int config)
{
unsigned char i;
DDS_SCLK_DOWN;
_nop_();
DDS_FSYNC_UP;
_nop_();
DDS_SCLK_UP;
delay2us(1);
DDS_FSYNC_DOWN;
_nop_();
for (i=0; i<16; i++)
{
if (config & 0x8000)
DDS_SDATA_UP;
else
DDS_SDATA_DOWN;
delay2us(1);
DDS_SCLK_DOWN;
delay2us(1);
DDS_SCLK_UP;
config <<= 1;
}
DDS_FSYNC_UP;
_nop_();
DDS_SCLK_DOWN;
delay2us(100);
}
static void delay2us(unsigned char i)
{
while (--i);
}