基于STC89C52RC芯片 高频DDS信号发生器AD9851信号源方波正弦波系统设计

这篇具有很好参考价值的文章主要介绍了基于STC89C52RC芯片 高频DDS信号发生器AD9851信号源方波正弦波系统设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【01】设计大致思路

一开始是使用按键进行频率输出数值的增加或者减少,后改进成使用EC11调节输出数值,使数值的输出更加顺滑流畅。

高频dds芯片,单片机,嵌入式硬件,硬件工程,信号处理

【02】参考资料

链接:https://pan.baidu.com/s/1gz9DuRynFkpIcYw1fGyf6A?pwd=1111  提取码:1111

【03】部分代码

AD9851.c

#include <AD9851.h>

//*******************************************************************/
//功能:AD9851复位
//形参:无
//返回:无
//详解:AD9851复位(并口模式)
//*******************************************************************/
void ad9851_reset()
{
	ad9851_w_clk=0;
	ad9851_fq_up=0;
	//rest信号
	ad9851_rest=0;
	ad9851_rest=1;
	ad9851_rest=0;
}

//*******************************************************************/
//功能:AD9851复位
//形参:无
//返回:无
//详解:AD9851复位(串口模式)
//*******************************************************************/
void ad9851_reset_serial()
{
	ad9851_w_clk=0;
	ad9851_fq_up=0;
	//rest信号
	ad9851_rest=0;
	ad9851_rest=1;
	ad9851_rest=0;
	//w_clk信号
	ad9851_w_clk=0;
	ad9851_w_clk=1;
	ad9851_w_clk=0;
	//fq_up信号
	ad9851_fq_up=0;
	ad9851_fq_up=1;
	ad9851_fq_up=0;
}

//*******************************************************************/
//功能:向AD9851中写命令与数据
//形参:转移数据变量-->>	w0;频率变量-->>	frequence
//返回:无
//详解:向AD9851中写命令与数据(并口)
//*******************************************************************/
void ad9851_wr_parrel(unsigned char w0,double frequence)
{
	unsigned char w;
	long int y;
	double x;
	//计算频率的HEX值
	x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频)
	//如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!!
	frequence=frequence/1000000;
	frequence=frequence*x;
	y=frequence;
	//写w0数据
	w=w0;   
	P1=w;      //w0
	ad9851_w_clk=1;
	ad9851_w_clk=0;
	//写w1数据
	w=(y>>24);
	P1=w;      //w1
	ad9851_w_clk=1;
	ad9851_w_clk=0;
	//写w2数据
	w=(y>>16);
	P1=w;      //w2
	ad9851_w_clk=1;
	ad9851_w_clk=0;
	//写w3数据
	w=(y>>8);
	P1=w;      //w3
	ad9851_w_clk=1;
	ad9851_w_clk=0;
	//写w4数据
	w=(y>>=0);
	P1=w;      //w4
	ad9851_w_clk=1;
	ad9851_w_clk=0;
	//移入始能
	ad9851_fq_up=1;
	ad9851_fq_up=0;
}

//*******************************************************************/
//功能:向AD9851中写命令与数据
//形参:转移数据变量-->>	w0;频率变量-->>	frequence
//返回:无
//详解:向AD9851中写命令与数据(串口)
//*******************************************************************/
void ad9851_wr_serial(unsigned char w0,double frequence)
{
	unsigned char i,w;
	long int y;
	double x;
	//计算频率的HEX值
	x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频)
	//如果时钟频率不为180MHZ,修改该处的频率值,单位MHz  !!!
	frequence=frequence/1000000;
	frequence=frequence*x;
	y=frequence;
	//写w4数据
	w=(y>>=0);
	for(i=0;i<8;i++)
	{
	ad9851_bit_data=(w>>i)&0x01;
	ad9851_w_clk=1;
	ad9851_w_clk=0;
	}
	//写w3数据
	w=(y>>8);
	for(i=0;i<8;i++)
	{
	ad9851_bit_data=(w>>i)&0x01;
	ad9851_w_clk=1;
	ad9851_w_clk=0;
	}
	//写w2数据
	w=(y>>16);
	for(i=0;i<8;i++)
	{
	ad9851_bit_data=(w>>i)&0x01;
	ad9851_w_clk=1;
	ad9851_w_clk=0;
	}
	//写w1数据
	w=(y>>24);
	for(i=0;i<8;i++)
	{
	ad9851_bit_data=(w>>i)&0x01;
	ad9851_w_clk=1;
	ad9851_w_clk=0;
	}
	//写w0数据
	w=w0;   
	for(i=0;i<8;i++)
	{
	ad9851_bit_data=(w>>i)&0x01;
	ad9851_w_clk=1;
	ad9851_w_clk=0;
	}
	//移入始能
	ad9851_fq_up=1;
	ad9851_fq_up=0;
}

AD9851.h

#ifndef __AD9851_H_
#define __AD9851_H_
//----------------AD9851 头文件----------------//
#include <stc8.h>
# include <intrins.h>

//----------------AD9851 IO口定义----------------//
sbit ad9851_w_clk    =P2^2;  																		//P2.2口接AD9851的w_clk脚/PIN7
sbit ad9851_fq_up    =P2^4;																			//P2.1口接AD9851的fq_up脚/PIN8
sbit ad9851_rest     =P2^3;  																		//P2.0口接AD9851的rest脚/PIN12
sbit ad9851_bit_data =P2^2;  																		//P1.7口接AD9851的D7脚/PIN25
//P1为8位数据口

//----------------函数快速调用(复制粘贴)列表----------------//
/*******************************************************************
void ad9851_reset(void);																				//ad9851复位(并口模式)
void ad9851_reset_serial(void);																	//ad9851复位(串口模式)
void ad9851_wr_parrel(unsigned char w0,double frequence);				//向AD9851中写命令与数据(并口)
void ad9851_wr_serial(unsigned char w0,double frequence);				//向AD9851中写命令与数据(串口)
******************************************************************/

//----------------函数声明列表----------------//
//
//*******************************************************************/
//功能:AD9851复位
//形参:无
//返回:无
//详解:AD9851复位(并口模式)
//*******************************************************************/
void ad9851_reset();

//*******************************************************************/
//功能:AD9851复位
//形参:无
//返回:无
//详解:AD9851复位(串口模式)
//*******************************************************************/
void ad9851_reset_serial();

//*******************************************************************/
//功能:向AD9851中写命令与数据
//形参:转移数据变量-->>	w0;频率变量-->>	frequence
//返回:无
//详解:向AD9851中写命令与数据(并口)
//*******************************************************************/
void ad9851_wr_parrel(unsigned char w0,double frequence);

//*******************************************************************/
//功能:向AD9851中写命令与数据
//形参:转移数据变量-->>	w0;频率变量-->>	frequence
//返回:无
//详解:向AD9851中写命令与数据(串口)
//*******************************************************************/
void ad9851_wr_serial(unsigned char w0,double frequence);

#endif

LCD12864.c

#include <LCD12864.h>

//*******************************************************************/
//功能:延时函数
//形参:无
//返回:无
//详解:LCD12864写数据、写命令与检测忙状态时提供延时
//*******************************************************************/
void delayNOP()
{
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}

//*******************************************************************/
//功能:延时函数
//形参:毫秒级延时-->>	ms
//返回:无
//详解:LCD12864初始化与显示字符、图形时提供延时
//*******************************************************************/
void delayms(unsigned int ms)
{
  unsigned char y;
  while (ms--)
  {
    for (y = 0; y < 114; y++)
      ;
  }
}

//*******************************************************************/
//功能:检查LCD忙状态
//形参:无
//返回:无
//详解:lcd_busy为1时,忙,等待;lcd-busy为0时,闲,可写指令与数据。
//*******************************************************************/
bit lcd_busy()
{
  bit result;
  LCD_RS = 0;
  LCD_RW = 1;
  LCD_EN = 1;
  delayNOP();
  result = (bit)(P0 &0x80);
  LCD_EN = 0;
  return (result);
}

//*******************************************************************/
//功能:LCD12864写命令
//形参:写入的命令-->>	cmd
//返回:无
//详解:向LCD12864写命令
//*******************************************************************/
void lcd_wcmd(unsigned char cmd)
{
  while (lcd_busy())
    ;
  LCD_RS = 0;
  LCD_RW = 0;
  LCD_EN = 1;
  P0 = cmd;
  delayNOP();
  LCD_EN = 0;
}

//*******************************************************************/
//功能:LCD12864写数据
//形参:写入的数据-->>	dat
//返回:无
//详解:向LCD12864写数据
//*******************************************************************/
void lcd_wdat(unsigned char dat)
{
  while (lcd_busy())
    ;
  LCD_RS = 1;
  LCD_RW = 0;
  LCD_EN = 1;
  P0 = dat;
  delayNOP();
  LCD_EN = 0;
}

//*******************************************************************/
//功能:初始化LCD12864
//形参:无
//返回:无
//详解:LCD12864初始化
//*******************************************************************/
void lcd_init()
{
  LCD_PSB = 1; //并口方式

  LCD_RST = 0; //液晶复位
  delayms(5);
  LCD_RST = 1;
  delayms(5);

  lcd_wcmd(0x34); //扩充指令操作
  delayms(5);
  lcd_wcmd(0x30); //基本指令操作
  delayms(5);
  lcd_wcmd(0x0C); //显示开,关光标
  delayms(5);
  lcd_wcmd(0x06); //光标的移动方向
  delayms(5);
  lcd_wcmd(0x01); //清除LCD的显示内容
  delayms(5);
}

//*******************************************************************/
//功能:LCD12864显示地址输入
//形参:X轴写地址-->>	X;Y轴写地址-->>	Y
//返回:无
//详解:写地址,用于LCD12864显示位置的控制
//*******************************************************************/
void lcd_pos(unsigned char X, unsigned char Y)
{
  unsigned char pos;

  if (X == 1)
  {
    X = 0x80;	// 第一行的地址是80H
  }
  else if (X == 2)
  {
    X = 0x90;	//第二行的地址是90H
  }
  else if (X == 3)
  {
    X = 0x88;	//第三行的地址是88H
  }
  else if (X == 4)
  {
    X = 0x98;	//第三行的地址是98H
  }
  pos = X + Y; //确定显示地址
	
  lcd_wcmd(pos); //写显示地址
}

//*******************************************************************/
//功能:LCD12864标志
//形参:无
//返回:无
//详解:标志函数
//*******************************************************************/
void lcdflag()
{
  lcd_wcmd(0x08); //关闭显示
  delayms(1000);
  lcd_wcmd(0x0c); //开启显示
  delayms(1000);
  lcd_wcmd(0x08);
  delayms(1000);
  lcd_wcmd(0x0c);
  delayms(1000);
  lcd_wcmd(0x08);
  delayms(1000);
  lcd_wcmd(0x0c);
  delayms(1000);
  lcd_wcmd(0x01); //清屏
  delayms(5);
}

//*******************************************************************/
//功能:LCD12864图形显示
//形参:图片数据存储-->>	*bmp
//返回:无
//详解:向LCD12864写入图片数据,显示图形
//*******************************************************************/
void photodisplay(unsigned char *bmp)
{
  unsigned char i, j;

  lcd_wcmd(0x34); //写数据时,关闭图形显示

  for (i = 0; i < 32; i++)
  //32行(上半屏)
  {
    lcd_wcmd(0x80 + i); //先写入Y坐标值
    lcd_wcmd(0x80); //写入X坐标值
    for (j = 0; j < 16; j++)
    //16*8列
      lcd_wdat(*bmp++);
    delayms(1);
  }

  for (i = 0; i < 32; i++)
  //32行(下半屏)
  {
    lcd_wcmd(0x80 + i); //先写入Y坐标值
    lcd_wcmd(0x88); //写入X坐标值
    for (j = 0; j < 16; j++)
    //16*8列
      lcd_wdat(*bmp++);
    delayms(1);
  }
  lcd_wcmd(0x36); //写完数据,开图形显示
}

//*******************************************************************/
//功能:LCD12864指令操作
//形参:无
//返回:无
//详解:扩充指令与基本指令操作、清屏
//*******************************************************************/
void clr_screen()
{
  lcd_wcmd(0x34); //扩充指令操作
  delayms(5);
  lcd_wcmd(0x30); //基本指令操作
  delayms(5);
  lcd_wcmd(0x01); //清屏
  delayms(5);
}

//*******************************************************************/
//功能:LCD12864字符串显示
//形参:字符串存储-->>	str[]
//返回:无
//详解:向LCD12864写入字符串数据,显示字符串
//*******************************************************************/
void wr_string(unsigned char str[])
{
  unsigned char num = 0;

  while (str[num])
  {
    lcd_wdat(str[num++]); //写数据
    delayms(10); //延时形成逐字显示效果
  }
}

LCD12864.h

#ifndef __LCD12864_H_
#define __LCD12864_H_
//----------------LCD12864 头文件----------------//
#include <stc8.h>
#include <intrins.h>																			//延时函数_nop_()头文件

//----------------LCD12864 IO口定义----------------//
#define LCD_data  P0       																//数据口
sbit LCD_RS = P3 ^ 5; 																		//寄存器选择输入
sbit LCD_RW = P3 ^ 6; 																		//液晶读/写控制
sbit LCD_EN = P3 ^ 4; 																		//液晶使能控制
sbit LCD_PSB = P3 ^ 7; 																		//串/并方式控制
sbit LCD_RST = P3 ^ 0; 																		//液晶复位端口

//char code reserve[3]_at_ 0x3b; 													//保留0x3b开始的3个字节

//----------------函数快速调用(复制粘贴)列表----------------//
/*******************************************************************
void delayNOP();																					//LCD12864写数据、写命令与检测忙状态时提供延时
void delayms(unsigned int ms);														//LCD12864初始化与显示字符、图形时提供延时
bit lcd_busy();																						//lcd_busy为1时,忙,等待;lcd-busy为0时,闲,可写指令与数据。
void lcd_wcmd(unsigned char cmd);													//向LCD12864写命令
void lcd_wdat(unsigned char dat);													//向LCD12864写数据
void lcd_init();																					//LCD12864初始化
void lcd_pos(unsigned char X, unsigned char Y);						//写地址,用于LCD12864显示位置的控制
void lcdflag();																						//标志函数
void photodisplay(unsigned char *bmp);										//向LCD12864写入图片数据,显示图形
void clr_screen();																				//扩充指令与基本指令操作、清屏
void wr_string(unsigned char str[]);											//向LCD12864写入字符串数据,显示字符串
******************************************************************/


//----------------函数声明列表----------------//
//
//*******************************************************************/
//功能:延时函数
//形参:无
//返回:无
//详解:LCD12864写数据、写命令与检测忙状态时提供延时
//*******************************************************************/
void delayNOP();

//*******************************************************************/
//功能:延时函数
//形参:毫秒级延时-->>	ms
//返回:无
//详解:LCD12864初始化与显示字符、图形时提供延时
//*******************************************************************/
void delayms(unsigned int ms);

//*******************************************************************/
//功能:检查LCD忙状态
//形参:无
//返回:无
//详解:lcd_busy为1时,忙,等待;lcd-busy为0时,闲,可写指令与数据。
//*******************************************************************/
bit lcd_busy();

//*******************************************************************/
//功能:LCD12864写命令
//形参:写入的命令-->>	cmd
//返回:无
//详解:向LCD12864写命令
//*******************************************************************/
void lcd_wcmd(unsigned char cmd);

//*******************************************************************/
//功能:LCD12864写数据
//形参:写入的数据-->>	dat
//返回:无
//详解:向LCD12864写数据
//*******************************************************************/
void lcd_wdat(unsigned char dat);

//*******************************************************************/
//功能:初始化LCD12864
//形参:无
//返回:无
//详解:LCD12864初始化
//*******************************************************************/
void lcd_init();

//*******************************************************************/
//功能:LCD12864显示地址输入
//形参:X轴写地址-->>	X;Y轴写地址-->>	Y
//返回:无
//详解:写地址,用于LCD12864显示位置的控制
//*******************************************************************/
void lcd_pos(unsigned char X, unsigned char Y);

//*******************************************************************/
//功能:LCD12864标志
//形参:无
//返回:无
//详解:标志函数
//*******************************************************************/
void lcdflag();

//*******************************************************************/
//功能:LCD12864图形显示
//形参:图片数据存储-->>	*bmp
//返回:无
//详解:向LCD12864写入图片数据,显示图形
//*******************************************************************/
void photodisplay(unsigned char *bmp);

//*******************************************************************/
//功能:LCD12864指令操作
//形参:无
//返回:无
//详解:扩充指令与基本指令操作、清屏
//*******************************************************************/
void clr_screen();

//*******************************************************************/
//功能:LCD12864字符串显示
//形参:字符串存储-->>	str[]
//返回:无
//详解:向LCD12864写入字符串数据,显示字符串
//*******************************************************************/
void wr_string(unsigned char str[]);

#endif

EC11.c

#include "EC11.h"

// -----------------------------------(03)------------------------------------- 
// --------------本头文件添加到的组别 
/** @addtogroup BSP  本文件添加到板级支持包(board support package) 组别
  * @{
  */

// -----------------------------------(04)------------------------------------- 
// --------------添加驱动模块 
/** @defgroup EC11 
  * @brief EC11 driver modules
  * @{
  */

// ----------------------------------(04-01)----------------------------------- 
// --------------添加私有类型定义   
/** @defgroup EC11 _Private_TypesDefinitions
  * @{
  */
  
  
  
// ----------------------------------(04-01)----------------------------------- 
//                                                    04-01的结尾-------------- 
/**
  * @}
  */

//                                              04-01的结尾标识符--------------

// ----------------------------------(04-02)----------------------------------- 
// --------------添加私有定义   
/** @defgroup EC11 _Private_Defines
  * @{
  */
//#define RCC_OFFSET                (RCC_BASE - PERIPH_BASE)  
   
  
// ----------------------------------(04-02)----------------------------------- 
//                                                    04-02的结尾-------------- 
/**
  * @}
  */

//                                              04-02的结尾标识符--------------

// ----------------------------------(04-03)----------------------------------- 
// --------------添加私有宏  
/** @defgroup EC11 _Private_Macros
  * @{
  */
 
// ----------------------------------(04-03)----------------------------------- 
//                                                    04-03的结尾-------------- 
/**
  * @}
  */
//                                              04-03的结尾标识符--------------

// ----------------------------------(04-04)----------------------------------- 
// --------------添加私有变量  
/** @defgroup EC11 _Private_Variables
  * @{
  */
	bit FLAG_EC11Rota;				    //	旋转编码器旋转状态标志位1:旋转   0:停止;
	bit FLAG_EC11Key;				      //	旋转编码器旋转轻触开关处于微调和粗调模式状态标志位0:粗调    1:微调
	bit FLAG_EC11Directional;		  //	旋转编码器旋转方向状态标志位		0:逆时针转动    1:顺时针转动
	unsigned char EC11Key_CountAdd;	//	旋转编码器旋转轻触开关顺时针旋转次数
  unsigned char EC11Key_CountSub;	//	旋转编码器旋转轻触开关逆时针旋转次数
// ----------------------------------(04-04)----------------------------------- 
//                                                    04-04的结尾-------------- 
/**
  * @}
  */
//                                              04-04的结尾标识符--------------

// ----------------------------------(04-05)----------------------------------- 
// --------------添加私有函数属性   
/** @defgroup EC11 _Private_FunctionPrototypes
  * @{
  */
   void EC11_Init(void);		//INT0中断初始化函数
  
// ----------------------------------(04-05)----------------------------------- 
//                                                    04-05的结尾-------------- 
/**
  * @}
  */
//                                              04-05的结尾标识符--------------

// ----------------------------------(04-06)----------------------------------- 
// --------------添加私有函数 
 
/** @defgroup EC11 _Private_Functions
  * @{
  */
/**	   EC11控制端口初始化函数
  * @brief  (1) 
  *         (2)
  *         (3)           
  * @note   None
  * @param  None
  * @retval None
  */
void EC11_Init()		//@11.0592MHz
{
    //端口输出模式初始化 :	STC89C52	
  //                      -P3.3  EXINT1---EC11旋转编码器A脚 在INT1外部中断初始化中定义了
	//              				-P3.6:EXINT1---EC11旋转编码器B脚
	//              				-P3.7:EXINT1---EC11旋转编码器轻触按键KEY脚	
  FLAG_EC11Key=0;
  EC11Key_CountAdd=0;
  EC11Key_CountSub=0;
  IT1 = 1;                        //set INT1 int type (1:Falling 0:Low level)
  EX1 = 1;                        //enable INT1 interrupt
  EA = 1;                         //open global interrupt switch
 	
	
}

void ExInt1() interrupt 2           //(location at 0013H)
{
  FLAG_EC11Key=1;
  EX1 = 0 ; 
  if(EC11_B)
  {
    EC11Key_CountAdd++;
    FLAG_EC11Directional=1;
  }
  else
  {
    EC11Key_CountSub++;
    FLAG_EC11Directional=0;
  }
    
}
// ----------------------------------(04-06)----------------------------------- 
//                                                    04-06的结尾-------------- 
/**
  * @}
  */

//                                              04-06的结尾标识符--------------

  
  
// -----------------------------------(04)------------------------------------- 
//                                                       04的结尾-------------- 
/**
  * @}
  */ 
//                                                 04的结尾标识符--------------



// -----------------------------------(03)-------------------------------------
//                                                        3的结尾-------------- 
/**
  * @}
  */ 
//                                                  3的结尾标识符-------------- 

// -----------------------------------(01)-------------------------------------

EC11.h

#ifndef __EC11_H
#define __EC11_H

// -----------------------------------(03)------------------------------------- 
// --------------C++ C语言兼容说明 用于将C++代码以标准C形式输出(即以C的形式被调用),
// 这是因为C++虽然常被认为是C的超集,但是C++的编译器还是与C的编译器不同的。C中调用
// C++中的代码这样定义会是安全的。 
#ifdef __cplusplus
 extern "C" {
#endif

// -----------------------------------(04)------------------------------------- 
// --------------包含的头文件 
/* Includes ------------------------------------------------------------------*/
  #include "stc8.h"
   
// -----------------------------------(05)------------------------------------- 
// --------------本头文件添加到的组别 
/** @addtogroup BSP  本文件添加到开发文件的组别
  * @{
  */


// ----------------------------------(06-01)------------------------------------ 
// --------------添加任意若干个外部使用到的常量 数据类型 
//structures、Configuration_section_for_CMSIS、Exported_types、Peripheral_registers_structures
//Library_configuration_section、Peripheral_memory_map、Peripheral_declaration、Exported_constants
//Peripheral_Registers_Bits_Definition、Exported_macro 
/** @defgroup PORT_memory_map 
  * @{
  */     
/** 
  * @brief   EC11 Port_Defines
  */    
	sbit EC11_A=P3^3;
	sbit EC11_B=P3^6;
	sbit EC11_Key=P3^7;
		
/** 
  * @brief   EC11  Public_Defines
  */							  
  	
	/** 
  * @brief   EC11  Public_Variables
  */  		
	extern bit FLAG_EC11Rota;				//	旋转编码器旋转状态标志位1:旋转   0:停止;
	extern bit FLAG_EC11Key;				//	旋转编码器旋转轻触开关处于微调和粗调模式状态标志位0:微调    1:粗调  
	extern bit FLAG_EC11Directional;		//	旋转编码器旋转方向状态标志位		0:逆时针转动    1:顺时针转动
	extern unsigned char EC11Key_CountAdd;	//	旋转编码器旋转轻触开关顺时针旋转次数
  extern unsigned char EC11Key_CountSub;	//	旋转编码器旋转轻触开关逆时针旋转次数
// ----------------------------------(06-01)------------------------------------
//                                                     06-01的结尾-------------- 
/**
  * @}
  */ 
//                                                06-01的结尾标识符-------------- 




// -----------------------------------(07)------------------------------------- 
// --------------添加外部调用本头文件的宏定义 
/** @defgroup EC11 _Exported_Macros
  * @{
  */
   	#define Fine_Adj 10          //系统频率   
	#define Roughly_Adj 100          //系统频率
	//typedef unsigned char BYTE;	
	//typedef unsigned int WORD;
/**
  * @}
  */
// -----------------------------------(07)------------------------------------- 
//                                                  7的结尾标识符-------------- 


// -----------------------------------(08)------------------------------------- 
// --------------添加外部调用本头文件的函数 
/** @defgroup EC11 _Exported_Functions
  * @{
  */                   
		void EC11_Init(void);		//INT0中断初始化函数

	
/**
  * @}
  */
// -----------------------------------(08)------------------------------------- 
//                                                  8的结尾标识符--------------                                                        

// -----------------------------------(05)-------------------------------------
//                                                        5的结尾-------------- 
/**
  * @}
  */ 
//                                                  5的结尾标识符-------------- 
  
// -----------------------------------(03)------------------------------------- 
//                                                        3的结尾--------------
#ifdef __cplusplus
}
#endif
/**
  * @}
  */
//                                                  3的结尾标识符--------------
// -----------------------------------(02)-------------------------------------
//                                                        2的结尾-------------- 
#endif /* __EC11_h*/

main.c文章来源地址https://www.toymoban.com/news/detail-752866.html

#include <LCD12864.h>
#include <AD9851.h>
#include <Timer.h>
#include <stdio.h>
#include <Uart.h>
//#include "EncoderEC11.h"
#include "EC11.h"
#include "MCP41010.h"
#include "Chart.h"

//按键位定义
sbit s2=P3^0;
sbit s3=P3^1;
sbit s4=P3^2;
sbit s5=P3^3;
char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节

/*函数定义区*/
void Frequency_Check(void);//频率控制函数
void Frequency_Display(void);//频率显示函数
void Increase_Reduction_Display(void);//步进频率控制函数
void Increase_Reduction_Check(void);//步进频率显示函数
void Wave_Change(void);//波形切换函数
void Wave_Form_Display(void);//波形显示函数
void EC11_Check(void);//EC11检测兼动作函数
void EC11_Display(void);//EC11动作显示函数

/*显示内容定义区*/
unsigned char code DIS1[] ={"频率:"};
unsigned char code DIS2[] ={"步进:"};
unsigned char code DIS3[] ={"波形:"};
unsigned char code DIS4[] ={"Sine"};
unsigned char code DIS5[] ={"Square"};
unsigned char code DIS_NUM[] ={"0123456789"};//定义频率显示的数组

/*全局变量区*/
unsigned char num;
unsigned char Form=1;
unsigned char u;					   //定义全局变量
unsigned int a;
unsigned int b;
unsigned int h=0;
unsigned long int m;
unsigned char Display_Flag=0;
unsigned char tmp;

/*步进频率变量定义区*/
int Increase = 100;
int Reduction = 100;

/*DDS变量定义区*/
extern long Freq = 100;//初始频率设置
extern unsigned char Freq_Mode = 0x01;//0x00 关闭六倍频模式;0x01 开启六倍频模式

//*******************************************************************/
//功能:延时函数
//形参:无
//返回:无
//详解:提供延时
//*******************************************************************/
void delay(unsigned int z)
{
	unsigned int x,y;
	for(x = z; x > 0; x--)
		for(y = 114; y > 0 ; y--);
}

/*******************************************************************************
* 函 数 名         : main
* 函数功能		     : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main()
{
  delayms(100); //上电,等待稳定
  lcd_init(); //初始化LCD
	UartInit();		//115200bps@24.000MHz
	Timer0Init();		//1毫秒@24.000MHz
	

  while (1)
  {
		//频率控制
		Frequency_Check();
		
		//步进频率控制
//		Increase_Reduction_Check();
		
		//波形控制
//		Wave_Change();
		
		//LCD12864显示
//		Frequency_Display();
//		Increase_Reduction_Display();
//		Wave_Form_Display();
		EC11_Display();
			
		
		//AD9851频率输出
//		ad9851_reset_serial();
// 		ad9851_wr_serial(Freq_Mode,Freq);
		
		if(FLAG_EC11Key)
    {
      FLAG_EC11Key=0;
      if(EC11Key_CountAdd>EC11Key_CountSub)
      {
        tmp=EC11Key_CountAdd-EC11Key_CountSub;
      }
      else
      {
        tmp=EC11Key_CountSub-EC11Key_CountAdd;
      }
      if(FLAG_EC11Directional)
      {
        tmp=EC11Key_CountAdd+1;
        if(tmp>9) tmp=9;
        EC11Key_CountAdd=tmp;
        tmp=tmp+0x30;
      }
      else
      {
        if(EC11Key_CountAdd>1)tmp=EC11Key_CountAdd-1;
        else tmp=0;
        EC11Key_CountAdd=tmp;
        tmp=tmp+0x30;
      }
      lcd_wcmd(0x8a);
      wr_string(tmp);
      EX1 = 1; 
    }
	}
}

//*******************************************************************/
//功能:频率控制函数
//形参:无
//返回:无
//详解:控制频率的增大减小
//*******************************************************************/
void Frequency_Check()
{
	if(h==0)
	{
		if(s2==0)
		{	 
			EA=0;
			delay(5);
			if(s2==0)
			{
				while(!s2);
				Freq = Freq + Increase;
				if(Freq>1000000)
				{
					Freq=0;
				}
				Frequency_Display();
				m=65536-(150000/Freq);
				a=m/256;
				b=m%256;
				EA=1;
			}
		}
		if(s3==0)
		{	 
			delay(5);
			if(s3==0)
			{
				EA=0;	
				while(!s3);
				Freq-=Increase;
				if(Freq<0)
				{
					Freq=1000000;
				}
				Frequency_Display();
				m=65536-(150000/Freq);
				a=m/256;
				b=m%256;	
				EA=1;
			}
		}
	}
}

//*******************************************************************/
//功能:步进频率控制函数
//形参:无
//返回:无
//详解:控制AD9851的步进频率
//*******************************************************************/
void Increase_Reduction_Check()
{
	if(s5==0)
	{
		delay(5);
		if(s5==0)
		{
			EA=0;
			while(!s5);
			h++;
			if(h==1)
			{
				Reduction=Increase;
			}
			if(h==2)
			{
				h=0;
				Increase=Reduction;
				Timer0Init();
				Frequency_Display();
				Increase_Reduction_Display();
				EA=1;
			}
		}
	}
	if(h==1)
	{
		if(s2==0)
		{
			EA=0;
			delay(5);
			if(s2==0)
			{
				while(!s2);
				Reduction=Reduction+100;
				if(Reduction>=100000)
				{
					Reduction=0;
				}
				EA=1;
			}
		}
		if(s3==0)
		{
			delay(5);
			if(s3==0)
			{
				EA=0;
				while(!s3);
				Reduction=Reduction-100;
				if(Reduction<0)
				{
					Reduction=500;
				}
				EA=1;
			}
		}
	}
}

//*******************************************************************/
//功能:波形切换函数
//形参:无
//返回:无
//详解:波形的切换
//*******************************************************************/
void Wave_Change(void)
{
	if(h==1)
	{
		if(s4==0)											 //判断波形变换按键是否按下
		{
			delay(5);
			if(s4==0)
			{
				EA=0;
				while(!s4);
				Form++;										 //波形变换
				if(Form>2)								 //最多四种变化
				{
					Form=1;
				}
				clr_screen();
				Wave_Form_Display();
				EA=1;
			}
		}
	}
}

//*******************************************************************/
//功能:频率显示函数
//形参:无
//返回:无
//详解:AD9851频率的显示
//*******************************************************************/
void Frequency_Display()
{
	unsigned char Million,One_Hundred_Thousand,Myriad,Thousand,Hundred,Ten,One;
	Million=Freq/1000000;
	One_Hundred_Thousand=Freq%1000000/100000;
	Myriad=Freq%1000000%100000/10000;
	Thousand=Freq%1000000%100000%10000/1000;
	Hundred=Freq%1000000%100000%10000%1000/100;
	Ten=Freq%1000000%100000%10000%1000%100/10;
	One=Freq%1000000%100000%10000%1000%100%10;
	
	lcd_wcmd(0x83); //设置显示位置为第一行
	lcd_wdat(DIS_NUM[Million]);
	lcd_wdat(DIS_NUM[One_Hundred_Thousand]);
	lcd_wdat(DIS_NUM[Myriad]);
	lcd_wdat(DIS_NUM[Thousand]);
	lcd_wdat(DIS_NUM[Hundred]);
	lcd_wdat(DIS_NUM[Ten]);
	lcd_wdat(DIS_NUM[One]);
	lcd_wdat('H');
	lcd_wdat('z');
	

	lcd_wcmd(0x80);
	wr_string(DIS1);
}

//*******************************************************************/
//功能:步进频率显示函数
//形参:无
//返回:无
//详解:AD9851步进频率的显示
//*******************************************************************/
void Increase_Reduction_Display()
{
	unsigned int Myriad,Thousand,Hundred,Ten,One;
	Myriad=Reduction/10000;
	Thousand=Reduction%10000/1000;
	Hundred=Reduction%10000%1000/100;
	Ten=Reduction%10000%1000%100/10;
	One=Reduction%10000%1000%100%10;
	lcd_wcmd(0x98+11);
	
	lcd_wcmd(0x93);
	lcd_wdat(DIS_NUM[Myriad]);
	lcd_wdat(DIS_NUM[Thousand]);
	lcd_wdat(DIS_NUM[Hundred]);
	lcd_wdat(DIS_NUM[Ten]);
	lcd_wdat(DIS_NUM[One]);
	lcd_wdat('H');
	lcd_wdat('z');
	
	lcd_wcmd(0x90); 
	wr_string(DIS2);	
}

//*******************************************************************/
//功能:波形显示函数
//形参:无
//返回:无
//详解:波形的显示
//*******************************************************************/
void Wave_Form_Display()
{
	if(Form==1)
	{
		lcd_wcmd(0x8b);
		wr_string(DIS4);
	}
	else
	{
		lcd_wcmd(0x8b);
		wr_string(DIS5);
	}
	
	lcd_wcmd(0x88);
	wr_string(DIS3);
}

//*******************************************************************/
//功能:EC11检测兼动作函数
//形参:无
//返回:无
//详解:检测EC11动作并执行相应的行为
//*******************************************************************/
void EC11_Check() interrupt 1
{	
	static int tmp =0;
  Encoder_EC11_Analyze(Encoder_EC11_Scan());
	if(P20 == 0)
	{
		Display_Flag++;
	}   
}

//*******************************************************************/
//功能:EC11动作显示函数
//形参:无
//返回:无
//详解:检测EC11动作并显示相应的代号
//*******************************************************************/
void EC11_Display()
{
	lcd_wcmd(0x90); 
	lcd_wdat(DIS_NUM[dat]);
	lcd_wcmd(0x80);
	lcd_wdat(DIS_NUM[Display_Flag]);
}

到了这里,关于基于STC89C52RC芯片 高频DDS信号发生器AD9851信号源方波正弦波系统设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STC89C52RC的定时器/计数器

    目录 一、STC89C52RC的定时器/计数器 二、定时器/计数器的工作方式如何选择 三、使用Timer0实现1秒定时 四、使用Timer1实现计数器功能 STC89C52RC芯片内置了2个定时器/计数器(Timer0和Timer1),这两个模块可以用于实现定时和计数功能。 这两个定时器/计数器模块的主要特性如下:

    2024年02月07日
    浏览(34)
  • 单片机C51(STC89C52RC)独立按键控制LED亮灭、状态、显示二进制、位移

    目录 1.独立按键控制LED灯亮灭 2.独立按键控制LED灯状态 3.独立按键控制LED灯显示二进制 4.独立按键控制LED灯位移 5.附录 独立按键控制LED灯状态,在独立按键按下时,LED灯点亮,松手后LED灯熄灭。独立按键按下为0,松开为1,在STC89C52RC芯片上,P2为LED灯IO口,P2_0表示第一个LED灯

    2024年02月01日
    浏览(85)
  • STC89C52原理

    STC89C52单片机介绍 STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核 标准功能 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计

    2024年02月08日
    浏览(34)
  • [stc89c52] DS18B20基于单总线协议的温度测量

    1.定义:主机和从机用一根总线进行通信,是一种半双工的通信方式,单线=时钟线+数据线+控制线( +电源线)。理想状况下一条总线上的从器件数量几乎不受数量限制。 2.特点:这是由达拉斯半导体公司推出的一项通信技术。它采用单根信号线,既可传输时钟,又能传输数据

    2024年02月10日
    浏览(41)
  • 89C52RC烧录程序记录

    首先打开STC-ISP烧录软件 把USB转TTL的线连接好,把USB转TTL的跳线帽调到5V的一边,USB转TTL的RXD接51单片机的P3.1TXD端口,USB转TTL的TXD接51单片机的P3.0RXD端口,USB转TTL的GND接51单片机的随意一个GND端口,USB转TTL的5V接51单片机的VCC端口(随意一个),至此连线全部完成。 我的单片机

    2024年02月08日
    浏览(26)
  • 基于STC89C52单片机的温度控制系统设计方案与软硬件实现

    目录 摘要 I Abstract II 第一章 前言 1 1.1 温度控制系统设计发展历史及意义 1.2 温度控制系统的目的 1.3 温度控制系统完成的功能 第二章 总体设计方案 2.1 方案一 2.2 方案二 3.1 DS18B20简介 3.1.1DS18B20封装与引脚 3.1.2 DS18B20的简单性能 3.2 DS18B20的工作原理 3.3 DS18B20的测温原理 3.3.1 测

    2024年02月12日
    浏览(32)
  • 89C52RC普中单片机

    资料下载 普中科技--各型号产品资料下载链接 - STM8单片机 - 普中开源电子分享网 - Powered by Discuz! (prechin.net) 2023-06-28  1.开发板    2.软件 keil,stc-isp。 1.点亮led 89C52RC芯片LED模块是P2口。       2.led1一秒闪烁  3.LED流水灯  4.独立按键控制led亮灭(按下key1亮,松手灭) 5.独立按键

    2024年02月11日
    浏览(39)
  • 什么是STC89C52单片机

    STC89C52是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写10000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构[1],芯片内集成了通用8位中央处理器和ISP Flash存储单元,功

    2024年02月13日
    浏览(31)
  • 【STC89C52】独立键盘和矩阵键盘

    今天我分享的是基于STC89C52的独立键盘与矩阵键盘实验的学习笔记。希望对你有所帮助! 目录 一、原理图分析  二、独立键盘 三、矩阵键盘 键盘在现实生活中很常见,手机的虚拟键盘,电脑的实体键盘。 键盘是由一个个按键构成,按键常态下与两端触点断开,按下时与两端

    2023年04月12日
    浏览(27)
  • STC89C52定时器的简介

    针对于STC89C52RC而言,这个芯片内部包含了三个定时器——T0、T1和T2,他们的中断优先级分别是1、3和5。 怎么还有一个定时器2呢?博主也是今天整理这篇博客的时候,翻阅芯片手册才发现的。如果说,我们经常用的T0和T1叫做通用定时器的话,那么T2我愿称之为高级定时器。今

    2024年02月05日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包