4179|6

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

各位大虾阿。有谁用过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;
}

最新回复

怎么 看三个引脚的时许图呢,求解释啊  详情 回复 发表于 2011-8-20 10:05
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
程序太长了啊

9850很容易用的,有问题该再看看它的DATASHEET
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
慢慢来,别急
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
慢慢来,别急
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

5
 
我今年毕业设计用的是9851,用数字示波器看到的波形很完美,程序控制形成了扫频模式,现在已经做到了10M,现在正在继续增加新的功能,  
我建议你先编一个比较简单的程序,再测试三个引脚口出来的时序图是否满足芯片的串行模式时序图   如果满足 你再接入芯片即可看到波形   如果看不到波形 用万能表一个一个引脚仔细检查  查完即可看到标准的正弦波波形     
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
学习 学习
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

7
 
怎么 看三个引脚的时许图呢,求解释啊
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表