📄 ad9850.#2
字号:
#include <c8051f120.h>
#include <intrins.h>
#include<ABSACC.H>
//-----------------------定义管脚--------------------------------------------------------
#define data_OUT P0
#define keypad P3
sbit FQ_UD = P2^5; //AD9850信号更新申请
sbit W_CLK = P2^6; //写控制字时钟
sbit SETRST= P2^7;
sbit led = P1^6;
unsigned char key;
unsigned char CON_word[5];
const ksp[4]={0XF7,0XFB,0XFD,0XFE};//扫描码
const keycode[]={0X7D,0XE7,0XEB,0XED,0XD7,0XDB,0XDD,0XB7,0XBB,0XBD,
0XEE,0XDE,0XBE,0X7E,0X77,0X7B};//参考键值
//-----------------------------------------------------------------------------
// P3.3 P3.2 P3.1 P3.0
// | | | |
//P3.4---1---2---3---A(+)----
// | | | |
//P3.5---4---5---6---B(-)----
// | | | |
//P3.6---7---8---9---C(Enter)--
// | | | |
//P3.7---E---F---0---D(Clr)---
//---------------------------------------------------------------------------
void Oscillator_Init()
{
int i = 0;
SFRPAGE = CONFIG_PAGE;
OSCXCN = 0x77;
for (i = 0; i < 3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0);
CLKSEL = 0x01;
}
void Port_IO_Init()
{
SFRPAGE = CONFIG_PAGE;
P0MDOUT = 0xFF;
P1MDOUT = 0xFF;
P3MDOUT = 0x0F;
P2MDOUT = 0xFF;
XBR2 = 0x40;
}
void Init_Device(void)
{
Port_IO_Init();
Oscillator_Init();
}
//--------------------------------------------------------------------------------------------------
// 函数名称: delay
// 入口参数: N
// 函数功能:延时子程序,实现(16*N+24)us的延时
// 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动
//--------------------------------------------------------------------------------------------------
void delay(unsigned int N)
{
int i;
for(i=N;i>0;i--);
}
void jisuan(unsigned long frequence);
void WRITE_AD9850(void);
unsigned char keypad_scan();
unsigned long keypad_data();
//--------------------------------------------------------------------------------------------------
// 函数名称:main
// 用户主函数
// 函数功能:主函数
//--------------------------------------------------------------------------------------------------
void main()
{
long freq;
// disable watchdog timer
WDTCN = 0xde;
WDTCN = 0xad;
Init_Device();
led=0;
jisuan(10000000);
WRITE_AD9850();
FQ_UD=0;
delay(150);
while(1){
if(keypad_scan()==0x0e)
{
led=~led;
freq=keypad_data();
jisuan(freq);
WRITE_AD9850();
FQ_UD=0;
delay(150);
}
}
}
// -----------------计算频率------------------------//
void jisuan(unsigned long frequence)
{
long freq;
freq=85.89934592*frequence; //使用50M晶振,frequence就是所要输出的频率
CON_word[1]=(freq&(0xff000000))>>24; //用与控制频率的高8位
CON_word[2]=(freq&(0x00ff0000))>>16; //用与控制频率的中8位
CON_word[3]=(freq&(0x0000ff00))>>8; //用与控制频率的中8位
CON_word[4]=freq&(0x000000ff); //用与控制频率的低8位
}
//--------------------------------------------------------------------------------------------------
// 函数名称: WRITE_AD9850
// 函数功能: 将控制字写入AD9850
//--------------------------------------------------------------------------------------------------
void WRITE_AD9850(void)
{
unsigned char i;
W_CLK=0;
FQ_UD=0;
delay(0);
SETRST=1;
delay(0);
SETRST=0;
CON_word[0]=CON_word[0]&0xfc; //置工作方式选择位为00
for(i=0;i<5;i++)
{
W_CLK=0;
data_OUT=CON_word[i]; //送控制字
delay(0);
W_CLK=1; //上升延
delay(0);
W_CLK=0;
}
// delay(0);
FQ_UD=1; //上升延要求AD9850改变输出
}
//------------------键盘扫描------------------------//
//-----------------------------------------------------------------------------
// P3.3 P3.2 P3.1 P3.0
// | | | |
//P3.4---1---2---3---A(+)----
// | | | |
//P3.5---4---5---6---B(-)----
// | | | |
//P3.6---7---8---9---C(Enter)--
// | | | |
//P3.7---E---F---0---D(Clr)---
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
unsigned char keypad_scan()
{
unsigned char i,j;
P3=0Xf0;
while(P3!=0XF0);//检查键盘是否有键按下
do
{
for(i=0;i<=3;i++)
{
P3=ksp[i];
if(P3!=ksp[i])//检查第i行是否有键按下
{
delay(100);
key=P3; //读键值
if(key!=ksp[i])//确认有键按下
{
for(j=0;j<16;j++)
{
if(key==keycode[j])
return (j);
}
return (0x10);
}
}
}
}
while(1);
}
unsigned long keypad_data()
{
unsigned char temp1;
unsigned long temp=0;
while(keypad_scan()!=0X0C)
{
temp1=keypad_scan();
if(temp1>=0&&temp1<=9)
{
led=~led;
temp=temp*10+temp1;
}
}
led=~led;
return(temp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -