⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dds.c

📁 此为DDS9851信号发生器完整源程序,功能开发十分齐全~
💻 C
字号:
//--------------------------------头文件
#include<reg52.h>
#include <stdlib.h>
//----------------------------------自定义
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
#define send_fpga P0
#define key_port P1
#define control P2
sbit cp=P2^0;
sbit ad=P2^1;
sbit db7=P2^2;
sbit en=P3^5;
sbit rw=P3^6;
sbit rs=P3^7;
bit fre_mode=0;  //1在频率模式下
bit ran_mode=0;  //1在幅度模式下
bit mut_mode=0;  //1在调相模式下
bit no_data=0;   //0表示没有输入数据
uchar keycode;    //键值
uchar scancode;
uchar wave_one_data=0; //第一路波形控制,0表Sine
uchar wave_two_data=0; //第二路波形控制,0表Sine
uchar road_mode=1;  //1表第一路
uchar  line[8];   //连接字字符
uchar p=0;        //连字符指针
//----------------------
void da_clr(void)
{   uchar i;
  for (i=0;i<8;i++)
  {line[i]=0;}
  }
//----------------------------------串行输入并行输出数据
void da_out(uchar num)
{
 uchar i;
 for(i=8;i>0;i--)
 {
  CY=0;
  num<<=1;
  ad=CY;
  cp=0;
  cp=1;
 }
}
//--------------------------------------忙信号延时
void busy_delay(void)
{   uchar i = 20;
    while(i--);
}
//-----------------------------写指令
void write_inst(uchar x)
{
 da_out(x);
 busy_delay();
 rs=0;
 rw=0;
 en=1;
 en=0;
}
//-----------------------------写数据
void write_data(void)
{
 da_out(ACC);
 busy_delay();
 rs=1;
 rw=0;
 en=1;
 en=0;
}
//--------------------------------清屏
void cls(void)
{
 write_inst(0x01);
}
//---------------------------------重新定义显示方式
void initial(void)
{
 write_inst(0x38);             //用8位传输数据,显示用5*7
 write_inst(0x0e);             //显示器显示,光标显示并闪烁
 write_inst(0x06);                //每次输入,光标向右移动一格
}
//---------------------------------------查表输入菜单数据
void lcd_show( uchar *see )
{
  while(*see)
  {
	ACC=*see++;
   write_data();
  }
}
//---------------------------------------显示菜单
void t_first(void)
{cls();
 write_inst(0x80); lcd_show("       The      ");
 write_inst(0xc0); lcd_show("   first road   ");
}
//-------------------------------------
void t_second(void)
{cls();
 write_inst(0x80); lcd_show("       The      ");
 write_inst(0xc0); lcd_show("  second road   ");
}
//-------------------------------------------
void sine_wave(void)
{cls();
 write_inst(0x80); lcd_show(" choose the way ");
 write_inst(0xc0); lcd_show("   Sine wave    ");
}
//-------------------------------------
void square_wave(void)
{cls();
 write_inst(0x80); lcd_show(" choose the way ");
 write_inst(0xc0); lcd_show("  Square wave   ");
}
//-----------------------------------------
void triangle_wave(void)
{cls();
 write_inst(0x80); lcd_show(" choose the way ");
 write_inst(0xc0); lcd_show(" Triangle wave  ");
}
//-----------------------------------
void teeth_wave(void)
{cls();
 write_inst(0x80); lcd_show(" choose the way ");
 write_inst(0xc0); lcd_show("   Teeth wave   ");
}
//-----------------------------------
void fre_port(void)
{cls();
 write_inst(0x80); lcd_show("importation data");
 write_inst(0xc0); lcd_show(" Fre:       (Hz)"); write_inst(0xc5);
}
//------------------------------------------
void ran_port(void)
{cls();
 write_inst(0x80); lcd_show("importation data");
 write_inst(0xc0); lcd_show("   Ran:   (v)   "); write_inst(0xc7);
}
//-----------------------------------------
void mut_port(void)
{cls();
 write_inst(0x80); lcd_show("importation data");
 write_inst(0xc0); lcd_show("Mut:      (Ran) "); write_inst(0xc4);
}
//---------------------------------------------
void is_right(void)
{cls();
 write_inst(0x80); lcd_show(" The operation  ");
 write_inst(0xc0); lcd_show("    is right    ");
}
//----------------------------------------------------------
void of_scope(void)
{cls();
 write_inst(0x80); lcd_show("     Sorry      ");
 write_inst(0xc0); lcd_show("beyond of scope ");
}
//--------------------------------------------------
void none_data(void)
{cls();
 write_inst(0x80); lcd_show("  Please input  ");
 write_inst(0xc0); lcd_show(" first the data ");
}
//-------------------------------------------送第一路频率数据
void send_one_fre(ulong x)
{
 ulong *y; uchar *a; uchar *b; uchar *c; uchar *d;
 y=0x40; a=0x40; b=0x41; c=0x42; d=0x43; *y=x;
  control=control|0xf0;  //无操作
  send_fpga=*d;   //先送低字节
  control=control&0x07;  //送低字节控制数据
  control=control|0xf0;
  send_fpga=*c;
  control=control&0x87;
  control=control|0xf0;
  send_fpga=*b;
  control=control&0x47;
  control=control|0xf0;
  send_fpga=*a;
  control=control&0xc7;
  control=control|0xf0;
  control=control&0x27;  //完成频率发确认信号
}
//-------------------------------------------送第二路频率数据
void send_two_fre(ulong x)
{
 ulong *y; uchar *a; uchar *b; uchar *c; uchar *d;
 y=0x40; a=0x40; b=0x41; c=0x42; d=0x43; *y=x;
  control=control|0xf8;  //无操作
  send_fpga=*d;   //先送低字节
  control=control&0x0f;  //送低字节控制数据
  control=control|0xf8;
  send_fpga=*c;
  control=control&0x8f;
  control=control|0xf8;
  send_fpga=*b;
  control=control&0x4f;
  control=control|0xf8;
  send_fpga=*a;
  control=control&0xcf;
  control=control|0xf8;
  control=control&0x2f;  //完成频率发确认信号
}
//------------------------------------------送第一路幅度数据
void send_one_ran(uchar x)
{
 control=control|0xf8;
 send_fpga=x;
 control=control&0x67;  //送控制字
 control=control|0xf0;
}
//---------------------------------------送第二路幅度数据
void send_two_ran(uchar x)
{
 control=control|0xf8;
 send_fpga=x;
 control=control&0x6f;  //送控制字
 control=control|0xf8;
}
//------------------------------------------送第一路波形
void send_one_wave(uchar x)
{
 control=control|0xf8;
 send_fpga=x;
 control=control&0xa7;  //送控制字
 control=control|0xf8;
}
//------------------------------------------送第二路波形
void send_two_wave(uchar x)
{
 control=control|0xf8;
 send_fpga=x;
 control=control&0xaf;  //送控制字
 control=control|0xf8;
}
//----------------------------------------送相位数据
void send_mut(uint x)
{
 uint *y; uchar *a; uchar*b;
 y=0x40;a=0x40;b=0x41; *y=x;
 control=control|0xf8;
 send_fpga=*b;
 control=control&0xe7;
 control=control|0xf8;
 send_fpga=*a;
 control=control&0x17;
 control=control|0xf8;
 control=control&0x97;
}
//------------------------------------------输出完数据后全部清零
void clrs(void)
{ulong *z;
 z=0x40;
 *z=0x00;
}
//---------------------------------------------------------各按键功能
void zero(void)
{
 if(fre_mode==1)
   {if(p<=6) {line[p++]='0'; lcd_show("0");no_data=1;}else{write_inst(0x0c);}}
 else if(ran_mode==1)
   {if(p<=2) {line[p++]='0'; lcd_show("0");no_data=1;}else{write_inst(0x0c);}}
 else if(mut_mode==1)
   {if(p<=5) {line[p++]='0'; lcd_show("0");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void one(void)
{
 if(fre_mode==1)
   {if(p<=6) {line[p++]='1'; lcd_show("1");no_data=1;}else{write_inst(0x0c);}}
 else if(ran_mode==1)
   {if(p<=2) {line[p++]='1'; lcd_show("1");no_data=1;}else{write_inst(0x0c);}}
 else if(mut_mode==1)
   {if(p<=5) {line[p++]='1'; lcd_show("1");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void two(void)
{
 if(fre_mode==1)
   {if(p<=6) {line[p++]='2'; lcd_show("2");no_data=1;}else{write_inst(0x0c);}}
 else if(ran_mode==1)
   {if(p<=2) {line[p++]='2'; lcd_show("2");no_data=1;}else{write_inst(0x0c);}}
 else if(mut_mode==1)
   {if(p<=5) {line[p++]='2'; lcd_show("2");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void three(void)
{
 if(fre_mode==1)
   {if(p<=6) {line[p++]='3'; lcd_show("3");no_data=1;}else{write_inst(0x0c);}}
 else if(ran_mode==1)
   {if(p<=2) {line[p++]='3'; lcd_show("3");no_data=1;}else{write_inst(0x0c);}}
 else if(mut_mode==1)
   {if(p<=5) {line[p++]='3'; lcd_show("3");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void four(void)
{
 if(fre_mode==1)
   {if(p<=6) {line[p++]='4'; lcd_show("4");no_data=1;}else{write_inst(0x0c);}}
 else if(ran_mode==1)
   {if(p<=2) {line[p++]='4'; lcd_show("4");no_data=1;}else{write_inst(0x0c);}}
 else if(mut_mode==1)
   {if(p<=5) {line[p++]='4'; lcd_show("4");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void five(void)
{
 if(fre_mode==1)
    {if(p<=6) {line[p++]='5'; lcd_show("5");no_data=1;}else{write_inst(0x0c);}}
 else if(ran_mode==1)
    {if(p<=2) {line[p++]='5'; lcd_show("5");no_data=1;}else{write_inst(0x0c);}}
 else if(mut_mode==1)
    {if(p<=5) {line[p++]='5'; lcd_show("5");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void six(void)
{
 if(fre_mode==1)
    {if(p<=6) {line[p++]='6'; lcd_show("6");no_data=1;}else{write_inst(0x0c);}}
 else if(ran_mode==1)
    {if(p<=2) {line[p++]='6'; lcd_show("6");no_data=1;}else{write_inst(0x0c);}}
 else if(mut_mode==1)
    {if(p<=5) {line[p++]='6'; lcd_show("6");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void seven(void)
{
 if(fre_mode==1)
    {if(p<=6) {line[p++]='7'; lcd_show("7");no_data=1;}else{write_inst(0x0c);}}
 else if(ran_mode==1)
    {if(p<=2) {line[p++]='7'; lcd_show("7");no_data=1;}else{write_inst(0x0c);}}
 else if(mut_mode==1)
    {if(p<=5) {line[p++]='7'; lcd_show("7");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void eight(void)
{
 if(fre_mode==1)
    {if(p<=6) {line[p++]='8'; lcd_show("8");no_data=1;}else{write_inst(0x0c);}}
 else if(ran_mode==1)
    {if(p<=2) {line[p++]='8'; lcd_show("8");no_data=1;}else{write_inst(0x0c);}}
 else if(mut_mode==1)
    {if(p<=5) {line[p++]='8'; lcd_show("8");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void nine(void)
{
 if(fre_mode==1)
    {if(p<=6) {line[p++]='9'; lcd_show("9");no_data=1;}else{write_inst(0x0c);}}
 else if (ran_mode==1)
    {if(p<=2) {line[p++]='9'; lcd_show("9");no_data=1;}else{write_inst(0x0c);}}
 else if (mut_mode==1)
    {if(p<=5) {line[p++]='9'; lcd_show("9");no_data=1;}else{write_inst(0x0c);}}
}
//---------------------------------------------
void point_road(void)
{
 if((ran_mode==1)||(mut_mode==1))
 {
  line[p++]='.';
  lcd_show(".");
 }
 else
 {fre_mode=0;ran_mode=0;mut_mode=0;
  road_mode++;
  if(road_mode==3){road_mode=1;}
  switch(road_mode)
  {case 1:{t_first();}break;
   case 2:{t_second();}break;}
 }
}
//-------------------------------------------------选择波形
void ch_wave(void)
{
 fre_mode=0;ran_mode=0;mut_mode=0;
 if(road_mode==1)
 {
  wave_one_data++;
  if(wave_one_data==4) {wave_one_data=0;}
  switch(wave_one_data)
  {case 0:{send_one_wave(0x00);sine_wave();}break;
   case 1:{send_one_wave(0x01);square_wave();}break;
   case 2:{send_one_wave(0x02);triangle_wave();}break;
   case 3:{send_one_wave(0x03);teeth_wave();}break;}
 }
 else if(road_mode==2)
 {
  wave_two_data++;
  if(wave_two_data==4) {wave_two_data=0;}
  switch(wave_two_data)
  {case 0:{send_two_wave(0x00);sine_wave();}break;
   case 1:{send_two_wave(0x01);square_wave();}break;
   case 2:{send_two_wave(0x02);triangle_wave();}break;
   case 3:{send_two_wave(0x03);teeth_wave();}break;}
 }
}
//------------------------
void ch_fre(void)
{
 fre_mode=1;ran_mode=0;mut_mode=0; fre_port(); p=0;no_data=0;clrs();da_clr();
}
//-----------------------------
void ch_ran(void)
{
 ran_mode=1;fre_mode=0;mut_mode=0; ran_port(); p=0;no_data=0;
}
//---------------------------------------
void ch_mut(void)
{
 mut_mode=1;fre_mode=0;ran_mode=0; mut_port(); p=0;no_data=0;clrs(); da_clr();
}
//-------------------------------
void enter(void)
{
 ulong y=0;
 uint z;
 uchar t;
 float x;
 float n;
  y=0;
 if(no_data==0){none_data();}else{
 switch(road_mode)
 {case 1:{if(fre_mode==1)
            {y=atol(line)/0.003725;
             if(y>268456644){of_scope();}else{is_right();send_one_fre(y);}}
          else if(ran_mode==1)
            {x=atof(line);t=x*50;
              if(t>250){of_scope();}else{is_right(); send_one_ran(t);}}
          else if(mut_mode==1)
            {n=atof(line);z=n/0.09;
             if(z>4000){of_scope();}else{is_right();send_mut(z);}}
          } break;
  case 2:{if(fre_mode==1)
            {y=atol(line)/0.003725;
             if(y>268456644){of_scope();}else{is_right(); send_two_fre(y);}}
          else if(ran_mode==1)
            {x=atof(line);t=x*50;
              if(t>250){of_scope();}else{is_right(); send_two_ran(t);}}
          }break;
 }
                                }
 p=0;fre_mode=0;ran_mode=0;mut_mode=0; clrs();da_clr();
}

//----------------------------------各按键功能
void key_pass(void)
{
 switch(keycode)
 {
  case 0xe7:{zero();}break;   case 0xeb:{one();}break;         case 0xed:{two();}break;
  case 0xee:{three();}break;  case 0xd7:{four();}break;        case 0xdb:{five();}break;
  case 0xdd:{six();}break;    case 0xde:{seven();}break;       case 0xb7:{eight();}break;
  case 0xbb:{nine();}break;   case 0xbd:{point_road();}break;  case 0xbe:{ch_wave();}break;
  case 0x77:{ch_fre();}break; case 0x7b:{ch_ran();}break;      case 0x7d:{ch_mut();}break;
  case 0x7e:{enter();}break;  default:{}
 }
}
//---------------------------------按键延时
void key_delay (void)
{
 uint i;
 for(i=3000;i>0;i--){}
}
//----------------------------------计算键值
void  key()
{scancode=0xef;
 while(1)
  {key_port=scancode;key_delay();
   keycode=key_port;
   if((keycode&0x0f)!=0x0f){key_pass();}
   scancode=((scancode<<=1)|0x0f);
   if(key_port==0xff)break;}
}
//--------------------------------------------上电初始化
void begin(void)
{
 initial();               //重新定义显示方式
 t_first();               //显示The firat road
 send_one_fre(0x000418a8);    //1KHZ
 send_two_fre(0x000418a8);
 send_one_ran(0x64);      //2V
 send_two_ran(0x64);
 send_one_wave(0x00);     //正弦波
 send_two_wave(0x00);
 send_mut(0x0000);          //零相移
}
//-----------------------------------------------主程序
main()
{
 en=0;
 key_delay ();
 key_delay ();
 key_delay ();
 key_delay ();
 begin();
 while(1)
 {
  key();
 }
}







⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -