📄 dds1.c
字号:
#include<reg52.h>
#include<INTRINS.H>
#include<ABSACC.h>
//------宏定义-------------
#define Uchar unsigned char
#define Uint unsigned int
#define Lcd1602WdataPort 0x8101
#define Lcd1602CmdPort 0x8100
#define Lcd1602StatusPort 0x8102
#define Busy 0x80
//-----位定义------
sbit R = P3^7;
sbit W = P3^6;
sbit MReset = P1^0;//DDS控制
sbit IO_Reset = P1^1;
sbit SDIO = P1^2;
sbit Updata_Clock = P1^3;
sbit SCLK = P3^0;
sbit CS = P3^1;
sbit DataDA = P1^4;//D/A控制
sbit ClkDA = P1^5;
sbit LOAD = P1^6;
sbit LDAC = P1^7;
sbit P3_5=P3^5;
//---------变量定义---------------------------------
Uint code key[5]={0xf8f0,0xf8e8,0xf8d8,0xf8b8,0xf878};
Uchar m=0,k1=1,k=0,keyvalue=0;
Uchar f,reset=1;
int count=0;
float f1=1;
Uchar code a1[]={0x6e,0x47,0x3d,0x33,0x14,0x10,0x0d,0x0f,0x0a,0x00};//调制度程控电压
Uchar freqstr[]={0,0,0,0};
float freq=0;
//Uchar count1=0;
Uchar code str[]=" . MHz ";
Uchar code str1[]=" . KHz ";
Uchar code str8[]=" . Hz ";
Uchar code c[]={'0','1','2','3','4','5','6','7','8','9'};
//-----------------函数声明----------------
void keyscan(void);
void LcdReset( void );
void LcdWriteCommand( Uchar CMD,Uchar AttribC );
void LcdWriteData( Uchar dataW );
void ShowChar(Uchar pos,Uchar c);
void ShowString(Uchar line,char *pr);
void Writecommand(Uchar a);
void Writedata(Uchar code *p,Uchar m);
void DDSINITIAL(void);
void shuru(void);
void inc(void);//频率增
void dec(void);//频率减
void inc1(void);//频率增
void dec1(void);//频率减
void WriteDa(Uchar Dat,Uchar CH);
void writedataFTW(long int data1);
void Display(Uchar s);
void nop(void);
void Delay400Ms(void);
void Delay5Ms(void);
main()
{
Uchar i=0,n=0x00;
Uchar n1=0x10,count1=0;
Uchar code str11[]=" Change Ma ";
Uchar code str12[]=" ";
Uchar code str2[]="Please input num ";
Uchar code str3[]=" freq inc ";
Uchar code str4[]=" freq dec ";
Uchar code str5[]=" AM ";
Uchar code str6[]=" PSK ";
Uchar code str7[]=" ASK ";
IE=0x84;
Delay400Ms();
LcdReset();
ShowString(0,str2);
for( ; ; )
{ reset=1;
while(1) //设定频率
{ keyscan();
freqstr[count1++]=k;
if(k=='R'){k=0;break;}
if(k=='M'||k=='K'||k=='H'){ShowChar(n1++,k);break;}
ShowChar(n1++,c[k]);
Delay400Ms();
EA=1;
}
shuru();
while(reset)
{ EA=1;
keyscan();
switch(k)
{ case 1:{ShowString(1,str3);inc();}break;//频率增
case 2:{ShowString(1,str4);dec();}break;//频率减
case 3:{ShowString(1,str5);}break;//AM
case 4:{ShowString(1,str6);
P3_5=0;
}
break;//PSK;
case 5:{WriteDa(a1[m++],0);if(m==1)ShowString(1,str12);ShowChar(0x10,c[i++]);if(m>10){m=0;i=0;}
ShowString(0,str11);}break;//程控调节调制度
case 6:{ShowString(1,str7);P3_5=1;}break;//ASK
case 'L':{ShowString(1,str3);inc1();}break;
case 'T':{ShowString(1,str4);dec1();}break;
case 'R':{LcdReset();ShowString(0,str2);
freq=0;freqstr[0]=0;freqstr[1]=0;freqstr[2]=0;freqstr[3]=0;
count1=0;reset=0;n1=0x10;m=0;i=0;}break;//复位
}
EA=1;
}
}
}
//-------键盘扫描----------
void keyscan(void)
{ f=1;
XBYTE[0xf800]=0;
while(f);
switch(keyvalue)
{ case 0x70:k=1;break;
case 0xb0:k=2;break;
case 0xd0:k=3;break;
case 0xe0:k=4;break;
case 0x71:k=5;break;
case 0xb1:k=6;break;
case 0xd1:k=7;break;
case 0xe1:k=8;break;
case 0x72:k=9;break;
case 0xb2:k=0;break;
case 0xd2:k='M';break;
case 0xe2:k='K';break;
case 0x73:k='R';break;
case 0xb3:k='H';break;
case 0xe3:k='L';break;//右移
case 0xd3:k='T';break;//左移
}
}
//---------外部中断1用于读键值------
Int1_process() interrupt 2 using 0
{ Uchar i;
Uchar w=0;
keyvalue=0;
Delay400Ms();
for(i=0;i<5;i++)
{
w=XBYTE[key[i]]&0x0f;
if(w!=0x0f)
{
keyvalue=(w<<4)|i;
f=0;
EA=0;
break;
}
else f=0;
}
XBYTE[0xf800]=0;
}
//--------DDS初始化-----------
void DDSINITIAL(void)
{
Uchar code data1[]={0x10,0x4f,0x00,0x20};
Uchar code data3[]={0xf5,0x00};//1.5V
Uchar code data4[]={0xff};
CS=0;
MReset=0;
nop();
MReset=1;
nop();
MReset=0;
IO_Reset=0;
nop();
IO_Reset=1;
nop();
IO_Reset=0;
nop();
Updata_Clock=0;
IO_Reset=0;
nop();
IO_Reset=1;
nop();
IO_Reset=0;
nop();
Writecommand(0x07);//向控制寄存器写数据
Writedata(data1,4);
IO_Reset=0;
nop();
IO_Reset=1;
nop();
IO_Reset=0;
Writecommand(0x0a);
Writedata(data4,1);
IO_Reset=0;
nop();
IO_Reset=1;
nop();
IO_Reset=0;
Writecommand(0x08);
Writedata(data3,2);
IO_Reset=0;
nop();
IO_Reset=1;
nop();
IO_Reset=0;
Writecommand(0x09);
Writedata(data3,2);
IO_Reset=0;
nop();
IO_Reset=1;
nop();
IO_Reset=0;
_nop_();
}
//-------DDS写命令--------
void Writecommand(Uchar a)
{ Uchar i;
SCLK=0;
for(i=0;i<8;i++)
{ a<<=1;
SDIO=CY;
nop();
SCLK=1;
nop();
SCLK=0;
}
}
//--------DDS写数据------------------
void Writedata(Uchar code *p,Uchar m)
{ Uchar i,j,b;
SCLK=0;
for(i=0;i<m;i++)
{ b=*(p+i);
for(j=0;j<8;j++)
{b<<=1;
SDIO=CY;
nop();
SCLK=1;
nop();
SCLK=0;
}
}
}
//-----------DDS频率-------------
void writedataFTW(long int data1)
{ Uchar j;
//data1=~data1;
SCLK=0;
for(j=0;j<32;j++)
{data1<<=1;
SDIO=CY;
nop();
SCLK=1;
nop();
SCLK=0;
}
for(j=0;j<16;j++)
{ SDIO=0;
nop();
SCLK=1;
nop();
SCLK=0;
}
}
//------延时10us----------
void nop(void)
{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}
//------显示设定频率---------
void shuru(void)
{ Uchar i,j,i1;
long int freq1;
for(i=0;i<4;i++)
{ if(freqstr[i]=='K'){j=0;i1=i;break;}
else if(freqstr[i]=='M'){j=1;i1=i;break;}
else if(freqstr[i]=='H'){j=2;i1=i;break;}
}
switch(i1)
{ case 3:freq=freqstr[0]*100+freqstr[1]*10+freqstr[2];break;
case 2:freq=freqstr[0]*10+freqstr[1];break;
case 1:freq=freqstr[0];break;
}
switch(j)
{ case 0:freq1=(long int)(freq*14316.558);break;
case 1:freq1=(long int)(freq*14316557.653);break;
case 2:freq1=(long int)(freq*14.317);break;
}
DDSINITIAL();
Writecommand(0x02);
writedataFTW(freq1);
Updata_Clock=1;
nop();
Updata_Clock=0;//DDS更新时钟刷新;
Display(j);
}
//-------频率增-------------
void inc(void)
{ Uchar i,j,i1;
long int freq1;
for(i=0;i<4;i++)
{ if(freqstr[i]=='K'){j=0;i1=i;break;}
else if(freqstr[i]=='M'){j=1;i1=i;break;}
else if(freqstr[i]=='H'){j=2;i1=i;break;}
}
switch(j)
{ case 0:{ freq=freq+0.1;
if(freq>=1000){freqstr[i1]='M';j=1;freq=1;}
}break;
case 1:freq=freq+0.0001;break;
case 2:{ freq=freq+100;if(freq>=1000){freq=1;freqstr[i1]='K';j=0;}
}break;
}
switch(j)
{ case 0:freq1=(long int)(freq*14316.6);break;
case 1:freq1=(long int)(freq*14316557.6);break;
case 2:freq1=(long int)(freq*14.317);break;
}
DDSINITIAL();
Writecommand(0x02);
writedataFTW(freq1);
Updata_Clock=1;
nop();
Updata_Clock=0;//DDS更新时钟刷新;
Display(j);
}
void inc1(void)
{ Uchar i,j,i1;
long int freq1;
for(i=0;i<4;i++)
{ if(freqstr[i]=='K'){j=0;i1=i;break;}
else if(freqstr[i]=='M'){j=1;i1=i;break;}
else if(freqstr[i]=='H'){j=2;i1=i;break;}
}
switch(j)
{ case 0:{ freq=freq+0.1;
if(freq>=1000){freqstr[i1]='M';j=1;freq=1;}
}break;
case 1:freq=freq+1.0;break;
case 2:{ freq=freq+100;if(freq>=1000){freq=1;freqstr[i1]='K';j=0;}
}break;
}
switch(j)
{ case 0:freq1=(long int)(freq*14316.6);break;
case 1:freq1=(long int)(freq*14316557.6);break;
case 2:freq1=(long int)(freq*14.317);break;
}
DDSINITIAL();
Writecommand(0x02);
writedataFTW(freq1);
Updata_Clock=1;
nop();
Updata_Clock=0;//DDS更新时钟刷新;
Display(j);
}
//---------频率减---------
void dec(void)
{ Uchar i,j,i1;
Uchar code str9[]=" error ";
Uchar code str10[]=" ";
long int freq1;
for(i=0;i<4;i++)
{ if(freqstr[i]=='K'){j=0;i1=i;break;}
else if(freqstr[i]=='M'){j=1;i1=i;break;}
else if(freqstr[i]=='H'){j=2;i1=i;break;}
}
switch(j)
{ case 0:freq=freq-0.1;break;
case 1:{ freq=freq-0.0001;}break;
case 2:{ freq=freq-100;
if(freq<0){ShowString(0,str9);ShowString(1,str10);j=3;}
}break;
}
switch(j)
{ case 0:freq1=(long int)(freq*14316.6);break;
case 1:freq1=(long int)(freq*14316557.6);break;
case 2:freq1=(long int)(freq*14.317);break;
case 3:freq1=0;break;
}
DDSINITIAL();
Writecommand(0x02);
writedataFTW(freq1);
Updata_Clock=1;
nop();
Updata_Clock=0;//DDS更新时钟刷新;
Display(j);
}
void dec1(void)
{ Uchar i,j,i1;
Uchar code str9[]=" error ";
Uchar code str10[]=" ";
long int freq1;
for(i=0;i<4;i++)
{ if(freqstr[i]=='K'){j=0;i1=i;break;}
else if(freqstr[i]=='M'){j=1;i1=i;break;}
else if(freqstr[i]=='H'){j=2;i1=i;break;}
}
switch(j)
{ case 0:freq=freq-1;break;
case 1:{ freq=freq-0.1;}break;
case 2:{ freq=freq-100;
if(freq<0){ShowString(0,str9);ShowString(1,str10);j=3;}
}break;
}
switch(j)
{ case 0:freq1=(long int)(freq*14316.6);break;
case 1:freq1=(long int)(freq*14316557.6);break;
case 2:freq1=(long int)(freq*14.317);break;
case 3:freq1=0;break;
}
DDSINITIAL();
Writecommand(0x02);
writedataFTW(freq1);
Updata_Clock=1;
nop();
Updata_Clock=0;//DDS更新时钟刷新;
Display(j);
}
//--------LCD显示---------
void Display(Uchar s)
{
long int i;
Uchar j,n;
if(s==0){ShowString(0,str1);n=0x04;i=(long int)(freq*10+0.5);if(i<10)ShowChar(0x02,'0');}
else if(s==1){ShowString(0,str);n=0x07;i=(long int)(freq*10000+0.5);
if(i<10000)ShowChar(0x02,'0');}
else if(s==2){ShowString(0,str8);n=0x04;i=(long int)(freq*10+0.5);}
while(i)
{ if(s==3){s=0;break;}
j=i%10;
i=i/10;
ShowChar(n--,c[j]);
if(n==0x03)n=0x02;
Delay400Ms();
}
}
//-------------写D/A--------------
void WriteDa(Uchar Dat,Uchar CH)
{
Uchar i;
LDAC = 0;
ClkDA = 0;
i=Dat;
for(i=0;i<11;i++)
{
ClkDA = 1;
if(i<3)
{
CH<<=1;
DataDA = CY;
}
else
{ Dat <<=1;
DataDA = CY;
}
_nop_();
ClkDA = 0;
}
_nop_();
LOAD = 0;
_nop_();
LOAD = 1;
_nop_();
ClkDA = 1;
_nop_();
ClkDA = 0;
}
//-------100Ms延时-----
void Delay400Ms(void)
{ Uchar i=5;
Uint j;
while(i--)
{
//j=7269; //400Ms
j=1817; //100Ms
while(j--);
}
}
//------5Ms延时---------
void Delay5Ms(void)
{
Uint i = 5552;
while(i--);
}
//-------LCD初始化------
void LcdReset( void ) {
LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
Delay5Ms();
LcdWriteCommand( 0x38, 0); // 共三次
Delay5Ms();
LcdWriteCommand( 0x38, 0);
Delay5Ms();
LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号 参数--"1")
LcdWriteCommand( 0x08, 1); // 显示关闭
LcdWriteCommand( 0x01, 1); // 显示清屏
LcdWriteCommand( 0x06, 1); // 显示光标移动设置
LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
}
//----------LCD写命令----------------------------
void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
W = 1;R = 1;
if (AttribC)
{
P0=0xff;
while( XBYTE[Lcd1602StatusPort] & Busy ); // 检测忙信号?
}
XBYTE[Lcd1602CmdPort] = CMD;
}
//---------LCD写数据---------------
void LcdWriteData( Uchar dataW ) {
W = 1;R = 1;
while( XBYTE[Lcd1602StatusPort] & Busy ); // 检测忙信号
XBYTE[Lcd1602WdataPort] = dataW;
}
//---------显示字符串----------------
void ShowString(Uchar line,char *ptr)
{ Uchar l,i;
l=line<<4;
for(i=0;i<16;i++)
ShowChar(l++,*(ptr+i));
}
//---------显示字符-----------------
void ShowChar(Uchar pos,Uchar c)
{ Uchar p;
if(pos>=0x10)
p=pos+0xb0;
else
p=pos+0x80;
LcdWriteCommand(p,1);
LcdWriteData(c);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -