//Fout=调制频率控制字*SYSCLK/2的32次方 (SYSCLK=50M) 50M=2faf080 2的32次方=100 000 000 1K=3e8 对应的调制频率控制字=14f8b
//
#include《reg52.h》
#define uchar unsigned char //这里用“uchar”代替“unsigned char”,“uchar”用来定义无符号字符型数。
#define uint unsigned int //“uint”用来定义无符号整型数。
sbit w_clk1= P1^0; //AD9850_1的将8bit的频率控制字加载进入数据锁存器 上升沿有效
sbit fq_ud1=P1^1; //AD9850_1将40bit的控制字加载进入相位累加器 上升沿有效
sbit Rset1= P1^2; //AD9850_1的复位 上升沿有效
sbit w_clk2 =P1^4 ; //AD9850_2的将8bit的频率控制字加载进入数据锁存器 上升沿有效
sbit fq_ud2 =P1^5; //AD9850_2的40bit的控制字加载进入相位累加器 上升沿有效
sbit Rset2 =P1^6; //AD9850_1的复位 上升沿有效
sbit DDSLE_1 =P1^7; //AD9850的数据锁存器控制端 上升沿有效
uchar code AD9850[61]={0,0x01,0x4f,0x8d,0x02,0x9f,0x16,0x03,0xee,0xa1,0x05,0x3e,0x2c,0x06,0x8d,0xb7,
0x07,0xdd,0x42,0x09,0x2c,0xcd,0x0a,0x7c,0x58,0x0b,0xcb,0xe3,0x0d,0x1b,0x6e,
0x0e,0x6a,0xf9,0x0f,0xba,0x84,0x11,0x0a,0x0f,0x12,0x59,0x9a,0x13,0xa9,0x25,
0x14,0xf8,0xb0,0x16,0x48,0x3b,0x17,0x97,0xc6,0x18,0xe7,0x51,0x1a,0x36,0xdc};
uint AD9850_kz=0; //AD9850_1的8bit的频率控制字
uint AD9850_sc=0; //AD9850_1的8bit的频率数据
uint AD9850_sccs=0; //AD9850_1的8bit的频率数据传输的次数
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del。这是通过软件延时,有一定误差。
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
uint i,j;
for(i=0; i《del; i++)
for(j=0; j《1827; j++) //这个是通过软件仿真得出的数
;
}
/********************************************************************
* 名称 : Main()
* 功能 : 实现灯的闪烁
* 输入 : 无
* 输出 : 无
***********************************************************************/
void AD9850_Rset(void) //AD9850复位
{
Rset1= 0; //AD9850_1的复位 上升沿有效
Rset1= 1;
Rset1= 0;
Rset2= 0; //AD9850_2的复位 上升沿有效
Rset2= 1;
Rset2= 0;
}
void AD98501_kzz(void) //将8bit的频率控制字加载到AD9850_1
{
w_clk1= 0; //将8bit的频率控制字加载进入AD9850_1的数据锁存器 上升沿有效
DDSLE_1=1;
P1=0;
w_clk1= 1;
DDSLE_1=0;
}
void AD98501_scpl(uint AD9850_sc) //AD9850_1的将32bit的频率数据加载
{
uint s=0; //临时变量
w_clk1= 0; //将16bit的0的频率数据加载进入AD9850_1的数据锁存器 上升沿有效
DDSLE_1=1;
P1=0;
w_clk1= 1;
w_clk1= 0;
w_clk1= 1;
w_clk1=0;
DDSLE_1=0;
for(AD9850_sccs=0;AD9850_sccs《3;AD9850_sccs++)
{
s=AD9850_sccs+ AD9850_sc*3;
w_clk1= 0; //将8bit的频率数据加载进入AD9850_1的数据锁存器 上升沿有效
DDSLE_1=1;
P1=AD9850[s];
w_clk1= 1;
DDSLE_1=0;
}
fq_ud1=0;
fq_ud1=1;
AD9850_sc=0;
}
void AD98502_kzz(void) //将8bit的频率控制字加载到AD9850_2
{
// w_clk2= 0; //将8bit的频率控制字加载进入AD9850_2的数据锁存器 上升沿有效
DDSLE_1=1;
// NOP();
// NOP();
P1=0;
// w_clk2=1;
DDSLE_1=0;
}
void AD98502_scpl(uint AD9850_sc) //将 32bit的频率数据加载到AD9850_2
{
uint s=0; //临时变量
w_clk2= 0; //将16bit的0的频率数据加载进入AD9850_2的数据锁存器 上升沿有效
DDSLE_1=1;
P1=0;
w_clk2= 1;
w_clk2= 0;
w_clk2= 1;
w_clk2=0;
DDSLE_1=0;
for(AD9850_sccs=0;AD9850_sccs《3;AD9850_sccs++)
{
s=AD9850_sccs+ AD9850_sc*3;
w_clk2= 0; //AD9850_1的将8bit的频率数据加载进入数据锁存器 上升沿有效
DDSLE_1=1;
P1=s;
w_clk2= 1;
DDSLE_1=0;
}
fq_ud2=0;
fq_ud2=1;
AD9850_sc=0;
}
void Main(void)
{
uint pl=0;
uint x=0;
P0=0;
P1=0;
AD9850_Rset(); //复位AD9850
AD98501_kzz(); //制AD9850控制字
AD98502_kzz();
while(1) //重复输出1-20KHz的波形
{
for(pl=0;pl《20;pl++)
{
AD98501_scpl(x);
AD98502_scpl(x);
Delay(500);
}
}
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !