📄 正弦波可出来(外部更新可用).c
字号:
#include <C8051F410.h>
#include<math.h>
//注意
unsigned char ADDR; //// 所有函数均使用ADDR和DATA
unsigned char DATA[6]; //// 函数不带参数传输
#define N 4 //倍频数
#define CLK 50 //外部时钟
sbit IO_RES=P2^6; //A2 //高电平激活,在下一个指令周期开始应该将此置为低电平(17)
sbit SDIO=P2^1; //A0(第19脚)
sbit IO_UD=P2^2; //(第20脚)
sbit SCLK=P2^3; //(第21脚);//数据上升沿被装入
sbit _CS=P2^4; //(第22脚)//低电平激活
//sbit OSK=P1^5;
sbit RESET=P2^5; //(71)
//sbit FSK_BPSK=P1^7;
//*********************************
void oscill();
void delayms(unsigned char ms);
void DDS_w_d();
void initial_AD9852();
void DDS_w_f(unsigned long i);
void DDS_w_f1(unsigned long i);
void DDS_w_f2(unsigned long i);
int fc;
bdata unsigned char temp;
sbit temp0=temp^0;
sbit temp1=temp^1;
sbit temp2=temp^2;
sbit temp3=temp^3;
sbit temp4=temp^4;
sbit temp5=temp^5;
sbit temp6=temp^6;
sbit temp7=temp^7;
//*********************88
void main(){
fc=N*CLK;//单位是MHZ
oscill();
P2MDOUT = 0xff;
initial_AD9852() ;
ADDR=2;
DATA[5]=0x09;
DATA[4]=0x99;
DATA[3]=0x99;
DATA[2]=0x99;
DATA[1]=0x99;
DATA[0]=0x99;
DDS_w_d();
while(1);
}
//*********************888
void delayms(unsigned char ms)
{while(ms--);}
//****************************
void DDS_w_d() //根据已有的地址ADDR和DATA 写数据到AD9852
{ char num,i;
if((ADDR==0)||(ADDR==1)||(ADDR==8)||(ADDR==9)||(ADDR==0x0b))
num=2;
else if(ADDR==0x0a)
num=1;
else if(ADDR==6)
num=3;
else if(ADDR==5||ADDR==7)
num=4;
else num=6;
_CS=0;
IO_RES=0;
SCLK=1;
// IO_UD=0;
IO_RES=1;
delayms(10);
IO_RES=0;
delayms(50);
IO_RES=0;
//I/O输入,数据即可在上升沿输入近来
temp=ADDR;
for(i=7;i>=0;i--)
{
SCLK=0;
delayms(10);
SDIO=temp7;
SCLK=1;
delayms(10);
temp<<=1;
}
for(;num>0;num--)
{
temp=DATA[num-1];
for(i=7;i>=0;i--)
{
SCLK=0;delayms(10);
SDIO=temp7;
SCLK=1;
delayms(10);
temp<<=1;
}
}
IO_UD=1;
IO_UD=0;
_CS=1;
}
//***********************8888
void initial_AD9852() //初始化AD9852
{
DATA[3]=0x04;
DATA[2]=0x44;
DATA[1]=0x00;
DATA[0]=0x00;
ADDR=7;///////////////////////////
RESET=1;
delayms(50);
RESET=0;
DDS_w_d();
delayms(50);
}
//*******************************888
void DDS_w_f(unsigned long i) //写频率到ADDR//ADDR=2或3
{
/*//FTW = (Desired Output Frequency × 2N)/SYSCLK
unsigned long j1,j2;
double k;
int k;
k=i*281474976/fc;
j1=k/167777216;
j2=k%167777216;
DATA[0]=j2;
j2>>=8;
DATA[1]=j2;
j2>>=8;
DATA[2]=j2;
DATA[3]=j1;
j1>>=8;
DATA[4]=j1;
j1>>=8;
DATA[5]=j1;
delayms(1);*/
//FTW = (Desired Output Frequency × 2N)/SYSCLK
/*////////////// double k;
unsigned long j;
//2^48/1M=281474976.710656
k=(2147483648/N*4/CLK);
k=k*512/15625;
k=k*i;
j=k/65536;
k=(k/65536-j)*65536;
DATA[2]=j;
j>>=8;
DATA[3]=j;
j>>=8;
DATA[4]=j;
j>>=8;
DATA[5]=j;
j=k;
DATA[0]=j;
j>>=8;
DATA[1]=j;
DDS_w_d(); *///(原来)
DATA[5]=0x01;
DATA[4]=0x99;
DATA[3]=0x99;
DATA[2]=0x99;
DATA[1]=0x99;
DATA[0]=0x99;
DDS_w_d();
}
//***************************88888888
void DDS_w_f1(unsigned long i) //写频率1
{
ADDR=2;
DDS_w_f(i);
}
//*************************************
void DDS_w_f2(unsigned long i) //写频率2
{
ADDR=3;
DDS_w_f(i);
}
//****************************88
//*******************************410初始化程序
void oscill(){ CLKSEL = 0x00;//选择内部振荡方式
//CLKSEL = 0x01;//选择外部振荡方式
OSCICN = 0x87;
PCA0MD &= ~0x40;//关开门狗
XBR1 = 0x40;
}
//***************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -