|
这段代码是参照论坛上某XD的,网上也有类似的51程序,晶振用的是16M的,MCU是tiny13使用内部8M RC
int main(void)
{
PORTB=(1<<AD9833_CE)|(1<<AD9833_SDATA)|(1<<AD9833_SCLK);
DDRB =(1<<AD9833_CE)|(1<<AD9833_SDATA)|(1<<AD9833_SCLK);
delay_nms(2000);
Write_word(0x2100); //28位连续,选择频率0,相位0,RESET=1
Write_word(0x4000); //写频率0寄存器的低字节LSB
Write_word(0x4000); //写频率0寄存器的高字节MSB
Write_word(0x2900); //28位连续,选择频率0,相位0,RESET=1
Write_word(0x8000); //写频率0寄存器的低字节LSB
Write_word(0x8000); //写频率0寄存器的高字节MSB
//Write_word(0xD000);
//Write_word(0xF000);
Write_word(0xC000); //写频率0寄存器的低字节LSB
Write_word(0xF000); //写频率0寄存器的高字节MSB
Write_word(0x2000); //28位连续,选择频率0,相位0,RESET=0
output(50);
while(1);
}
/*-----------------------------------------------------------------------
delay_nus :长延时函数(GCC内部延时函数的延时过短)
输入参数: t :延时时间 us
-----------------------------------------------------------------------*/
void delay_nus(unsigned int t)
{
while (t--)
_delay_us(1);
}
/*-----------------------------------------------------------------------
delay_nms :长延时函数(GCC内部延时函数的延时过短)
输入参数: t :延时时间 ms
-----------------------------------------------------------------------*/
void delay_nms(unsigned int t)
{
while (t--)
_delay_ms(1);
}
//-----------------------------------------------------------------------
//Write_word : 写16位数据到SPI接口,软件SPI方式
//
//输入参数: data: 数据(16位)
//-----------------------------------------------------------------------
void Write_word(unsigned int data)
{
unsigned char i;
SCL_H;
SDA_H;
FSYNC_H;
delay_nus(5);
FSYNC_L;
delay_nus(2);
for(i=0;i<16;i++)
{
if(data&0x8000) SDA_H;
else SDA_L;
SCL_L;
delay_nus(2);
SCL_H;
delay_nus(2);
data=data<<1;
}
delay_nus(1);
FSYNC_H;
delay_nus(1);
SCL_L;
delay_nus(10);
}
//------------------------------------------------------------------
//output :AD9833输出指定频率的正弦波
//
//输入参数:freq_value 类型:unsigned long
//输出参数:无
//------------------------------------------------------------------
void output(unsigned long freq_value)
{
unsigned long dds;
unsigned int dds_l,dds_h;
dds= freq_value *16.777216; //268435456/ FMCLK
dds=dds<<2;
dds_l=dds; //低字节
dds_h=dds>>16; //高字节
dds_l=dds_l>>2;
dds_l=dds_l & 0x7FFF;
dds_l=dds_l | 0x4000;
dds_h=dds_h & 0x7FFF;
dds_h=dds_h | 0x4000;
Write_word(0x2000); //28位连续,选择频率0,相位0,RESET=0
//Write_word(0x4000 | 0x49B); //200k sine wave
//Write_word(0x4000 | 0x83);
Write_word(dds_l);
Write_word(dds_h);
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|