|
问题描述:按照卖家提供的51单片机程序基础上,把程序移植到自己的51单片机上,写数据方式也是根据AD9851模块的工作时序图来写的,但是问题来了:现在不论是我怎样修改频率,出来的波形都不是标准正弦波,而且频率在示波器上一直显示50hz不变,四个通道都是一样(如附图1)昨天晚上我想了一下,怀疑是数据没有写进去,但是本人还不会看数据有没有写进去(只会简单使用debug,但是用debug好像也没啥用,编译环境用的keil5)。求助问题:1、请问各位大神知道为什么会出现这种情况?除了是数据没写进去之外,还有其他可能问题吗?(模块硬件应该没问题)
2、请问怎么看我的数据有没有写进去?
现将代码贴至如下:
# include <reg51.h>
# include <stdio.h>
# include <intrins.h>
sbit ad9850_w_clk =P1^4;
sbit ad9850_fq_up =P1^3;
sbit ad9850_rest =P1^2;
//***************************************************//
// ad9850复位(并口模式) //
//---------------------------------------------------//
void ad9850_reset()
{
ad9850_w_clk=0;
ad9850_fq_up=0;
//rest信号
ad9850_rest=0;
ad9850_rest=1;
ad9850_rest=0;
}
//***************************************************//
// 向ad9850中写命令与数据(并口) //
//---------------------------------------------------//
void ad9850_wr_parrel(unsigned char w0,double frequence)
{
unsigned char w;
long int y;
double x;
//计算频率的HEX值
x=4294967295/156.25;//适合125M晶振
//如果时钟频率不为125MHZ,修改该处的频率值,单位MHz !!!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//写w0数据
w=w0;
P0=w; //w0
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w1数据
w=(y>>24);
P0=w; //w1
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w2数据
w=(y>>16);
P0=w; //w2
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w3数据
w=(y>>8);
P0=w; //w3
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w4数据
w=(y>>=0);
P0=w; //w4
ad9850_w_clk=1;
ad9850_w_clk=0;
//移入始能
ad9850_fq_up=1;
ad9850_fq_up=0;
}
//***************************************************//
// 测试程序1000Hz //
//---------------------------------------------------//
void main()
{
//---------------------------------------------------//
//并行写5000Hz程序
ad9850_reset();
ad9850_wr_parrel(0x00,15000000);
//---------------------------------------------------//
}
|
|