【01】设计大致思路
一开始是使用按键进行频率输出数值的增加或者减少,后改进成使用EC11调节输出数值,使数值的输出更加顺滑流畅。
【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文章来源:https://www.toymoban.com/news/detail-752866.html
#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模板网!