|
各位大虾阿。有谁用过DDS芯片阿。现在我在用DDS制作频率发生源的时候遇到问题谁能帮我解决一下呢?
[复制链接]
我连接出来的电路在示波器上看不到任何信号。。。但是用示波器测试单片机针数据是传递过去的。。。。我用的单片机是AT89S52,DDS芯片时AD9850,谁能帮我看下阿。。
下面是程序:(我这里用的是40M的晶振)
#include
#include
#include
#include
#include
#define AD_send P0
#define LCD_Data P1
//定义LCD引脚
void Delay5Ms(void);
void LCDInit(void); //LCD初始化
void DisplayOneChar(unsigned char DData);
void charadds(unsigned long int a) ;
void WriteDataLCD(unsigned char WDLCD);
void WriteCommandLCD(unsigned char WCLCD);
void AD9850(float freq,long d4);
void _1hzjia(void);
void _1hzjian(void);
void _10hzjia(void);
void _10hzjian(void);
sbit btn1=P2^0;
sbit btn2=P2^2;
sbit btn3=P2^1;
sbit btn4=P2^3;
sbit sdata=P2^4;
sbit sclk=P3^6;
sbit load=P3^7;
sbit LCD_RS=P2^5; //命令数据切换
sbit LCD_RW=P2^6; //读操作
sbit LCD_E=P2^7; //LCD 使能
unsigned long int pw=0;
unsigned long int pl=10000000;
bit xs=1;
void main(void)
{
EA=1;
EX0=1;
IT0=1;
load=0;
sclk=0;
// AD_send=0xFF;
{btn1=1;btn2=1;btn3=1;btn4=1;}
LCDInit();
AD9850(pl,0x00);
while(1){
//AD9850(2863311530,0x00);
//AD_send=0X00;
if(xs==1){
WriteCommandLCD(0x01);
charadds(pl);
xs=0;
}
//AD_send=0XFF;
_1hzjia();
_1hzjian();
_10hzjia();
_10hzjian();
};
}
void _1hzjia(void){
if(btn1==0){
Delay5Ms();
pl=2000;
//pl+=100;
btn1=1;
xs=1;
}
}
void _1hzjian(void){
if(btn2==0){
Delay5Ms();
pl=1000000;
//pl-=100;
btn2=1;
xs=1;
}
}
void _10hzjia(void){
if(btn3==0){
Delay5Ms();
AD9850(pl,0x30);
btn3=1;
xs=1;
}
}
void _10hzjian(void){
if(btn4==0){
Delay5Ms();
btn4=1;
xs=1;
}
}
void LCDInit(void) //LCM初始化
{
LCD_Data = 0x00;
WriteCommandLCD(0x38);
Delay5Ms();
WriteCommandLCD(0x38); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCD(0x08); //关闭显示
WriteCommandLCD(0x06); // 显示光标移动设置
WriteCommandLCD(0x01); //显示清屏
WriteCommandLCD(0x0C); // 显示开及光标设置
}
void WriteCommandLCD(unsigned char WCLCD)
{
Delay5Ms();
LCD_Data = WCLCD;
LCD_RS = 0;
LCD_RW = 0;
// LCM_E 必须是由 高 到 低 的电平变化!!!
LCD_E = 1; //-----!!!问题一直出在这里!!!
Delay5Ms();
LCD_E = 0;
}
//读状态
void WriteDataLCD(unsigned char WDLCD)
{
Delay5Ms();
LCD_Data = WDLCD;
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 1; //-----!!!问题一直出在这里!!!
Delay5Ms();
LCD_E = 0;
}
void Delay5Ms(void)
{
unsigned int TempCyc = 200;
while(TempCyc--);
}
void charadds(unsigned long int a)
{
unsigned long c,p=0;
c=a/1000000000;
if(c!=0)
{
WriteDataLCD(c+0x30);
p=1;
}
c=(a%1000000000)/100000000;
if(c!=0 || p==1)
{
WriteDataLCD(c+0x30);
p=1;
}
c=(a%100000000)/10000000;
if(c!=0 || p==1)
{
WriteDataLCD(c+0x30);
p=1;
}
c=(a%10000000)/1000000;
if(c!=0 || p==1)
{
WriteDataLCD(c+0x30);
p=1;
}
c=(a%1000000)/100000;
if(c!=0 || p==1)
{
WriteDataLCD(c+0x30);
p=1;
}
c=(a%100000)/10000;
if(c!=0 || p==1)
{
WriteDataLCD(c+0x30);
p=1;
}
c=(a%10000)/1000;
if(c!=0 || p==1)
{
WriteDataLCD(c+0x30);
p=1;
}
c=(a%1000)/100;
if(c!=0 || p==1)
{
WriteDataLCD(c+0x30);
p=1;
}
c=(a%100)/10;
if(c!=0 || p==1)
{
WriteDataLCD(c+0x30);
}
c=a%10+0x30;
WriteDataLCD(c);
}
/*************** AD9850驱动程序 ************/
void AD9850(float freq,long d4)
{
float fw;
char i,j,temp;
char d[5];
fw=freq*107.3741824;
d[4]=0x00;//(unsigned long)(d4/11.25)*8;
d[0]=(unsigned long)fw;
d[1]=(unsigned long)fw>>8;
d[2]=(unsigned long)fw>>16;
d[3]=(unsigned long)fw>>24;
//时序 调整
load=0;
sclk=0;
sclk=1;
sclk=0;
load=1;
load=0;
for(i=0;i<5;i++)
{
temp=d;
for(j=0;j<8;j++)
{
//AD_send=temp;
if(temp&1) sdata=1;//AD_send|=0x04;
else sdata=0;//AD_send&=0xfb;
sclk=0;
sclk=1;
temp=temp>>1;
}
}
sclk=0;
load=1;
load=0;
//AD_send=0xff;
//sdata=0;
}
|
|