|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2009-8-11 09:03:22
|
显示全部楼层
哦,谢谢你了,我选的外部时钟是1MHz的,产生的是固定频率1HZ的正弦波,所以频率寄存器0的低字节写0X410C,高字节写0X4000,具体程序如下:
//包含所需头文件
#include <iom16.h>
#define uchar unsigned char
#define uint unsigned int
//宏定义
#define FSYNC_L PORTB_Bit4=0 //置AD9833_FSYNC为低电平,使能AD9833 SPI通讯
#define FSYNC_H PORTB_Bit4=1 //置AD9833_FSYNC为为高电平,关断AD9833 SPI通讯
#define SCL_L PORTB_Bit7=0 //SPI总线时钟线
#define SCL_H PORTB_Bit7=1
#define SDA_L PORTB_Bit5=0 //SPI总线数据线
#define SDA_H PORTB_Bit5=1
//函数声明
void port_init(void);
void init_ad9833(void);
void Write_word (uint data);
void put(unsigned long freq_value);
void DelayMs(uint i);
//主函数
void main(void)
{
port_init();
init_ad9833(); //初始化AD9833
Write_word(0x2000); //28位连续,选择频率0,相位0,RESET=0 ,选择正弦波输出
Write_word(0x410c); //写频率0寄存器的低字节LSB(1Hz的正弦波)
Write_word(0x4000); //写频率0寄存器的高字节MSB
Write_word(0xc000); //写相位0寄存器
DelayMs(20);
while(1)
{}
}
//端口初始化
void port_init(void)
{
DDRB = 0xFF;
PORTB = 0xFF;
}
//初始化AD9833
void init_ad9833(void)
{
Write_word(0x2100); //28位连续,选择频率0,相位0,RESET=1
Write_word(0x4000); //写频率0寄存器的低字节LSB
Write_word(0x4000); //写频率0寄存器的高字节MSB
Write_word(0xc000); //写相位0寄存器
}
//写16位数据到AD9833,软件SPI方式
void Write_word (uint data)
{
uchar i;
SCL_H;
FSYNC_H;
DelayMs(1);
FSYNC_L;
for(i=0;i<16;i++)
{
if(data&0x8000)
{
SDA_H;
}
else
{
SDA_L;
}
SCL_L;
DelayMs(2);
SCL_H;
DelayMs(2);
data=data<<1;
}
DelayMs(1);
FSYNC_H;
DelayMs(5);
SCL_L;
}
//延时子程序
void DelayMs(uint i)
{
uint j;
for(;i!=0;i--)
{
for(j=20;j!=0;j--)
{;}
}
} |
|