STC89C52RC芯片 高频DDS信号发生器AD9851信号源方波正弦波系统设计
【01】设计大致思路
一开始是使用按键进行频率输出数值的增加或者减少,后改进成使用EC11调节输出数值,使数值的输出更加顺滑流畅。
【02】参考资料
链接:https://pan.百度.com/s/1gz9DuRynFkpIcYw1fGyf6A?pwd=1111
提取码:1111
【03】部分代码
AD9851.c
-
-
-
//*******************************************************************/
-
//功能: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
-
-
-
//----------------AD9851 头文件----------------//
-
-
-
-
//----------------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);
-
-
LCD12864.c
-
-
-
//*******************************************************************/
-
//功能:延时函数
-
//形参:无
-
//返回:无
-
//详解: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
-
-
-
//----------------LCD12864 头文件----------------//
-
-
-
-
//----------------LCD12864 IO口定义----------------//
-
-
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[]);
-
-
EC11.c
-
-
-
// -----------------------------------(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
-
-
-
-
// -----------------------------------(03)-------------------------------------
-
// --------------C C语言兼容说明 用于将C 代码以标准C形式输出(即以C的形式被调用),
-
// 这是因为C 虽然常被认为是C的超集,但是C 的编译器还是与C的编译器不同的。C中调用
-
// C 中的代码这样定义会是安全的。
-
-
extern "C" {
-
-
-
// -----------------------------------(04)-------------------------------------
-
// --------------包含的头文件
-
/* Includes ------------------------------------------------------------------*/
-
-
-
// -----------------------------------(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
-
* @{
-
*/
-
-
-
//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的结尾--------------
-
-
}
-
-
/**
-
* @}
-
*/
-
// 3的结尾标识符--------------
-
// -----------------------------------(02)-------------------------------------
-
// 2的结尾--------------
-
main.c
-
-
-
-
-
-
//#include "EncoderEC11.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]);
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhibhafi
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
excel打印预览压线压字怎么办
PHP中文网 06-22