STC8单片机驱动DDS信号发生器AD9850扫频

STC8单片机驱动DDS信号发生器AD9850扫频

本程序为2019年电子设计竞赛D题扫频部分改编,拿来备战一下2021年电赛,练一下手。使用STC8H8K64U/STC8G2K64单片机驱动DDS芯片AD9850做的一个扫频程序。
AD9850输出100Hz-1MHz的正弦波和方波,可修改适当频率。IIC OLED显示当前频率。
实际上包括按键在内都没使用超过15个引脚,代码才5.7K左右,可以使用STC8G1K08/H1K08来做底板。
使用立创EDA画单片机底板,DDS是某宝的。原理图如下所示:
在这里插入图片描述 下面为DDS驱动程序:

#ifndef __AD985X_H
#define __AD985X_H
//QQ:2401553359,  QQ群:560864628
#include "STC8H.h"//STC8的头文件
#include <intrins.h>


#define AD9850 //驱动AD9850时使用此宏定义
//#define AD9851 //驱动AD9851时使用此宏定义

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

sbit AD985x_DAT=P1^4;//引脚定义
sbit AD985x_RST=P1^5;
sbit AD985x_FQ =P1^6;
sbit AD985x_CLK=P1^7;

extern ulong Fre_Max;

void AD985x_Reset_Sreial(void);
void AD985x_Write_Serial(unsigned char w0,double frequence);


#endif

DDS驱动函数:

#include "ad985x.h"

#ifdef AD9850
ulong Fre_Max = 30000000;//最大频率
#else
#define AD9851
ulong Fre_Max = 50000000;
#endif
//***************************************************//
//              ad9850复位(串行模式)                 //
//---------------------------------------------------//
void AD985x_Reset_Sreial(void)
{
  AD985x_CLK = 0;
  AD985x_FQ = 0;
  //rest信号
  AD985x_RST = 0;
  AD985x_RST = 1;
  AD985x_RST = 0;
  //w_clk信号
  AD985x_CLK = 0;
  AD985x_CLK = 1;
  AD985x_CLK = 0;
  //fq_up信号
  AD985x_FQ = 0;
  AD985x_FQ = 1;
  AD985x_FQ = 0;
}


//向ad9850中写命令与数据(串行)
//w0:驱动AD9850时写0,关闭倍频,驱动AD9851时写1,开启倍频
void AD985x_Write_Serial(unsigned char w0, double frequence)
{
  unsigned char i, w;
  long int y;
  double x;
#ifdef AD9850
  x = 4294967295u / 125; //适合125M晶振
#else
#define AD9851
  x = 4294967295u / 180; //适合180M晶振
#endif

  frequence = frequence / 1000000;
  frequence = frequence * x;
  y = frequence;
  //写w4数据
  w = (y >>= 0);
  for(i = 0; i < 8; i++)
  {
    AD985x_DAT = (w >> i) & 0x01;
    AD985x_CLK = 1;
    AD985x_CLK = 0;
  }
  //写w3数据
  w = (y >> 8);
  for(i = 0; i < 8; i++)
  {
    AD985x_DAT = (w >> i) & 0x01;
    AD985x_CLK = 1;
    AD985x_CLK = 0;
  }
  //写w2数据
  w = (y >> 16);
  for(i = 0; i < 8; i++)
  {
    AD985x_DAT = (w >> i) & 0x01;
    AD985x_CLK = 1;
    AD985x_CLK = 0;
  }
  //写w1数据
  w = (y >> 24);
  for(i = 0; i < 8; i++)
  {
    AD985x_DAT = (w >> i) & 0x01;
    AD985x_CLK = 1;
    AD985x_CLK = 0;
  }
  //写w0数据
  w = w0;
  for(i = 0; i < 8; i++)
  {
    AD985x_DAT = (w >> i) & 0x01;
    AD985x_CLK = 1;
    AD985x_CLK = 0;
  }
  //移入始能
  AD985x_FQ = 1;
  AD985x_FQ = 0;
}

AD9850扫频程序主要写一下频率控制字,加一个for循环就行了。

for(freq=100;freq<=1000000u;freq=freq+10000)
	{//从100Hz到1MHz扫频
	 AD985x_Write_Serial(0x00,freq);
     delay_ms(10);//延时,可以不用,加快扫频速度
		if(freq>1000000u)//大于1MHz
		freq=1000000u;//固定输出1MHz
		OLED_ShowNum(44, 6, freq, 8, 0);	//显示
	}
 
 //下面是主函数
 /*
*实验名称及内容   : DDS设定固定频率及扫频波形,外部中断切换功能OLED显示

*实验平台及编程人员   : STC8学习板 QQ:2401553359,QQ群:560864628

*开发软件   :Keil uVision5、VScode

* 芯    片    :  STC8H8K64U、STC8G2K64S4、STC8A8K64S4A12等
                 单片机引脚及容量足够可以使用STC8全系列芯片
* 时    钟	  :内部时钟11.0592MHz

*时    间   :2021.04.26:按键设定频率输出
              2021.04.28:添加扫频功能,修复部分Bug
说     明   :按键设定频率值OLED显示,所有IO口都设置成准双向口
		  为了提高按键的抗干扰性,建议加3.3K-10K上拉电阻		
*/
#include "STC8H.h"//头文件
#include "oled.h"
#include "delay.h"
#include "key.h"
#include "timer.h"
#include "ad985x.h"

void main(void)//主函数
{
	P0M0=0X00;P0M1=0X00;//准双向口
	P1M0=0X00;P1M1=0X00;//准双向口
	P3M0=0X00;P3M1=0X00;//准双向口
  Timer1_Init();//定时器1初始化
  OLED_Init();//OLED初始化
  OLED_Clear();//OLED清屏
	OLED_ShowCH(0, 0, "2021电子设计竞赛");//显示字符,先取模后才能使用
  OLED_ShowCH(16, 2, "AD9850:DDS");
	OLED_ShowCH(32, 4, "取模后随便写中文");
  OLED_ShowCH(4, 6, "频率:        Hz");
  OLED_ShowNum(44, 6, freq, 8, 0);   //显示当前频率,显示宽度要足够
  AD985x_Reset_Sreial();//AD985x复位
	//根据宏定义选择写入函数
#ifdef AD9850//条件编译
	//AD9850不开启倍频
  AD985x_Write_Serial(0, freq);
#else
#define AD9851
	//AD9851开启倍频
  AD985x_Write_Serial(1, freq);
#endif
	EX0 = 1;	  //使能INT0中断允许位
	IT0 = 1;		//选择INT0为下降沿触发方式
	EA = 1;	    //开启总中断
  while(1)    //循环运行
  {
		display();//循环运行
	}
}

效果:
在这里插入图片描述
在这里插入图片描述
视频链接:https://www.bilibili.com/video/BV1gA411G7yk
源码链接:https://pan.baidu.com/s/1K_ZYtcyu0oq8Ft4u-qsdqA
提取码:rd9t

  • 11
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
AD9850是一款DDS芯片,用于产生可调率的正弦波和方波信号。它通过数字控制的方式,根据输入的率和相位信息,生成相应的输出信号。其原理如下: 1. 首先,需要将AD9850芯片进行初始化和复位操作,确保其处于初始状态。 2. 然后,通过控制引脚和时钟信号,将需要描的率信息输入到AD9850芯片中。 3. AD9850芯片内部有一个相位累加器和一个数字控制振荡器(DDS核心),通过控制振荡器的率和相位,可以实现输出信号率和相位的调节。 4. 在过程中,通过改变控制振荡器的率和相位,可以实现输出信号率的连续变化。 5. AD9850芯片的输出信号可以通过外部滤波电路进行滤波和放大,以得到所需的信号。 总结来说,AD9850芯片通过数字控制的方式,根据输入的率和相位信息,生成相应的输出信号,从而实现功能。 #### 引用[.reference_title] - *1* [电赛准备DDS & AD9910模块数据手册、使用方法详解](https://blog.csdn.net/Fraay/article/details/108687441)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STC8单片机驱动DDS信号发生器AD9850](https://blog.csdn.net/qq_44406425/article/details/123802257)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [AD9854的工作原理和应用电路图](https://blog.csdn.net/FPGAerClub/article/details/80474001)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值