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

📄 xinhao.c

📁 计算实用教程adadad9851实用教程
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg52.h>
#include <math.h>
#include <stdio.h>
#include <absacc.h>

#define KEY      XBYTE[0x8000]
#define DATAPORT XBYTE[0xb000]  //点阵数据口地址
#define COMPORT  XBYTE[0xb200]  //点阵命令口地址
#define FRE1_A XBYTE [0x9000]   //频率控制字一正弦波,调幅载波,FSK载波f1,ASK,PSK载波
#define FRE1_B XBYTE [0x9001]
#define FRE1_C XBYTE [0x9002]
#define FRE1_D XBYTE [0x9003]
#define FRE2_A XBYTE [0x9005]    //频率控制字二 FSK载波f2
#define FRE2_B XBYTE [0x9006]
#define FRE2_C XBYTE [0x9007]
#define FRE2_D XBYTE [0x9008]
#define MODE  XBYTE  [0x9004]     //功能切换控制:1.AM 与 Sin  2.FM  3.ASK 4.FSK 5.PSK
#define DDS_D0 XBYTE [0xc000]     //AM调制波控制字
#define DDS_D1 XBYTE [0xc001]
#define DDS_D2 XBYTE [0xc002]
#define DDS_D3 XBYTE [0xc003]
#define DA0832 XBYTE [0xd000]     //AM调制波幅度控制端口

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long int

#define NUM 18
/**************************************/
/***************公用子程序声明***********************/
void Init_Int(void);             //中断初始化
void Delay(uint Time);           //延时子程序
void L_delay(uchar T);           //长时间延时程序
void Datas_dis(ulong Datas,uchar P_str,uchar P_end,uchar P_pon);//数字送显程序
void Chars_dis(uchar *s);             //一整行英文字符显示送显程序
void Chars_dis_s(uchar str,uchar end,uchar *s);   //更改一行中的几个字符
void Out_data(uchar dat);             //向点阵数据口发数据
void Check(void);                     //检查点阵读写状态
void Out_com(uchar com);              //写一个命令
void Out_data_com(uchar dat1,uchar com1);//写一个数据和一个命令
void Out_data2_com(uchar dat1,uchar dat2,uchar com1);//写两个数据和一个命令
void Init_Dian(uchar l);              //点阵初始化 8:8*8字符, 6:6*8字符
void Clear_Dian(uchar a);             //字符和图形显示清屏
void Dis_line(uchar Line_num);        //点阵显示一行字符
/**************功能子程序声明************/
void DDS(ulong F);                       //DAC0800 DDS程序
void AD9851_DDS(ulong frequence);        //AD9851 单频或AM模式
void AD9851_FSK(ulong f1,ulong f2);
/*
void AD9851_FSK(ulong f1,ulong f2,ulong fsk);//fsk
void AD600_WR(uint kp);               //AD600增益控制电压输出设置程序
void OFFSET_WR(uchar kk);             //调制深度设置程序
void AMPL_WR(uint la);                //DAC0800 幅度控制程序 */

void Manu0_Dis(void);                 //0层菜单显示程序
void Freq_Dis(ulong ff);              //频率显示程序
void Ampl_Dis(uint aa);               //幅度显示程序
void Manu1_Dis(void);                 //1层菜单显示程序
void Manu2_Dis(void);                 //2层菜单显示程序
void Manu3_Dis(void);                 //3层菜单显示程序
void Manu4_Dis(void);                 //4层菜单显示程序
void Manu5_Dis(void);                 //5层菜单显示程序
void Manu6_Dis(void);                 //6层菜单显示程序
void Input_Dis(void);                 //输入缓冲显示

/***********************************************************/
ulong FREQ1=0;
ulong FREQ2=0;
ulong FSK=0;
uchar DEEP=0;
uint  AMP1=0;
uint  AMP2=0;
ulong Input_Temp=0;
uchar Point=0;
uchar Step=0;
uint C_V=0;

sbit ET_SIX=P1^7;                      //点阵字符大小选择,1:8*8  0:6*8
sbit XSK_AM=P1^4;                     // 数字调制或调幅
sbit MD_SIN=P1^2;               //正弦或调制 ,0:正弦,1:调制信号
sbit FIVE_TEN=P1^3;                   //10K/5K最大角频偏选择  1:5K   ,0:10K
sbit PSK_ASK=P1^1;                    //PSK/ASK选择  1:ASK  0:PSK

uchar ten_five=0;                       //最大频偏标志位
uint amp;
/********************************/
/*   程序状态转换               */
/*  0:根菜单显示状态            */
/*  1:正弦输出静态模式          */
/*         11:频率设定          */
/*         12:幅度设定          */
/*                              */
/*  2:AM输出静态模式            */
/*         21:载波频率设定      */
/*         22:调制深度设定      */
/*                              */
/*  3:FSK输出静态模式           */
/*         31:载波频率设定      */
/*         32:幅度设定          */
/*         33:跳变频率设定      */
/*         34:FSK跳变频率设定   */
/*  4:FM输出静态模式            */
/*         41:中心频率设定      */
/*         42:幅度设定          */
/*         43:频偏选择          */
/*  5:PSK输出静态模式           */
/*  6:ASK输出静态模式           */
/********************************/

/****************特殊存储区*****************/
/*****************************/
uchar Disp_Buff[21];                 //显示缓冲区
/*****************************/

/*****************************/
/**********中   断   设   定***********************/
/**********************************************************************/
void Init_Int(void)
{
   EX0=1;   //开外部中断0
   IT0=1;   //边沿触发
   EX1=1;   //开外部中断1
   IT1=1;   //边沿触发
   EA=1;    //开全局中断
}

/**********************************************************************/
/****************数据显示程序******************/
/*Datas:The data to be displayed;P_str:Starting display position;
  P_end:Ending display position; P_pon:Point display position;
  以上所述显示位置均为LCD上的绝对位置。
  P_end比P_pon小1,则无小数点,按整数方式显示,以此方式显示时不能显示到显示屏的最右边一位;
  所有的整型都化成ulong后送显,小数以整数表示以减少代码量   */
void Datas_dis(ulong Datas,uchar P_str,uchar P_end,uchar P_pon)
{
  ulong d_t;

  for(d_t=1;P_end>=P_str;P_end--)
    {
      if(P_end==P_pon)
        {
          Disp_Buff[P_end]='.';
        }
      else
        {
          Disp_Buff[P_end]=(Datas/d_t>0)?0x30+((Datas/d_t)%10):((P_end<P_pon-1)?0x20:0x30);
          d_t=d_t*10;
        }
    }
}
/***************字符显示程序*******************/
/*整体刷以便显示缓冲区,在Data_dis();之前使用,将要显示数字的位用空格填充,
  用其他符号填充也可。
  入口为字符串首地址                                                    */
void Chars_dis(uchar *s)
{
  uchar w;
  for(w=0;w<21;w++)
    Disp_Buff[w]=s[w];
}
/************************************************************************/
/****************更改一行中的几个字符子程序***********/
void Chars_dis_s(uchar str,uchar end,uchar *s)
/*S为要替换的字符,uchar str 为起始地址,uchar end 为结束地址*/
{
  uchar w;
  for(w=0;str<=end;str++,w++)
      Disp_Buff[str]=s[w];
}
/******************软件延时子程序***************************************/
/***********************************************************************/
void Delay(uint Time)
{
   while(Time--);    //软件短时间延迟
}
/***********************************************************************/
void L_delay(uchar T)
{
  uchar o;
  for(o=0;o<T;o++)  //软件长时间延时
    Delay(40000);
}
/******************************************************************/
/*****************************************/
/*       点 阵 相 关 程 序               */
/*****************************************/
/*****************************************************************************/
/************检查读写状态*******************/
void Check(void)
{
  uchar sta_1;
  do
  {
    sta_1=COMPORT;
    sta_1=sta_1&0x03;
  }
  while(sta_1!=0x03);
}
/************向数据口发数据*****************/
void Out_data(uchar dat)
{
  Check();
  DATAPORT=dat;
}
/***********写一个命令**********************/
void Out_com(uchar com)
{
  Check();
  COMPORT=com;
}
/*************写一个参数及命令**************/
void Out_data_com(uchar dat1,uchar com1)
{
  Out_data(dat1);
  Out_com(com1);
}
/************写两个参数及命令***************/
void Out_data2_com(uchar dat1,uchar dat2,uchar com1)
{
  Out_data(dat1);
  Out_data(dat2);
  Out_com(com1);
}
/**************点阵初始化程序*******************/
void Init_Dian(uchar l)
{
  if(l==6)                        //8*6型字符
    {
      Out_data2_com(0x00,0x00,0x40);
      Out_data2_com(0x15,0x00,0x41);
      Out_data2_com(0x00,0x04,0x42);
      Out_data2_com(0x15,0x00,0x43);
      //Out_com(0xa7);
    }
  Out_com(0x80);                   //逻辑或合成
  Out_com(0x9c);
}
/*************清RAM区*********************/
void Clear_Dian(uchar a)        //0:清除文本区;1:清除图形区
{
  uint l,i;
  if(a==0)
   {
     Out_data2_com(0x00,0x00,0x24);
     i=169;
   }
  if(a==1)
   {
     Out_data2_com(0x00,0x04,0x24);
     i=1400;
   }
  Out_com(0xb0);
  for(l=i;l>0;l--)
   {
     Out_data(0x00);
   }
  Out_com(0xb2);
}
/******************************************************/
/******************************************************/
/**************** 显示一行英文字符*******************/
void Dis_line(uchar Line_num)     //显示内容为Disp_Buff内所存内容
{
  uchar l;
  Out_data2_com(Line_num*21,0x00,0x24);
  Out_com(0xb0);
  for(l=0;l<21;l++)
   {
     Out_data(Disp_Buff[l]-0x20);
   }
  Out_com(0xb2);
}
/****************************************************************************/




/************************************************/
void Manu0_Dis(void)
{
  Chars_dis(" Signals   Generator ");
  Dis_line(0);
  Chars_dis("    1 ------ Sin     ");
  Dis_line(1);
  Chars_dis("    2 ------ A M     ");
  Dis_line(2);
  Chars_dis("    3 ------ FSK     ");
  Dis_line(3);
  Chars_dis("    4 ------ F M     ");
  Dis_line(4);
  Chars_dis("    5 ------ PSK     ");
  Dis_line(5);
  Chars_dis("    6 ------ ASK     ");
  Dis_line(6);
  Chars_dis(" Select Mode...  [20]");
  Dis_line(7);
}
/**************频率显示子程序***************/
void Freq_Dis(ulong ff)
{
  if(ff<10000)
    {
      Chars_dis_s(18,20,"Hz ");
      Datas_dis(ff,8,17,16);
    }
  else if(ff<10000000)
    {
      Chars_dis_s(18,20,"KHz");
      Datas_dis(ff,8,17,13);
    }
  else
    {
      Chars_dis_s(18,20,"MHz");
      Datas_dis(ff,8,17,10);
    }
}
/********************************************/
/************幅度显示程序************/
void Ampl_Dis(uint aa)
{
  if(aa<1000)
    {
      Chars_dis_s(18,20,"mV ");
      Datas_dis((ulong)(aa),15,17,18);
    }
  else
    {
      Chars_dis_s(18,20,"V  ");
      Datas_dis((ulong)(aa),12,17,14);
    }
}
/**************正弦输出模式菜单显示************/
void Manu1_Dis(void)
{
  Chars_dis("  Sin Output Mode    ");
  Dis_line(0);
  Chars_dis("1.Freq:              ");
  Freq_Dis(FREQ1);
  Dis_line(2);
  Chars_dis("2.Ampl:              ");
  Ampl_Dis(AMP1);
  Dis_line(4);
}
/***********************************************/
void Manu2_Dis(void)
{
  Chars_dis("   AM Output Mode    ");
  Dis_line(0);
  Chars_dis("1.F_C :              ");
  Freq_Dis(FREQ1);
  Dis_line(2);
  Chars_dis("2. Ma :           %  ");
  Datas_dis((ulong)(DEEP),15,17,18);
  Dis_line(4);
}
/**********************************************/
void Manu3_Dis(void)
{
  Chars_dis("   FSK Output Mode   ");
  Dis_line(0);
  Chars_dis("1.F_L :              ");
  Freq_Dis(FREQ1);
  Dis_line(1);
  Chars_dis("2.A_C :              ");
  Ampl_Dis(AMP1);
  Dis_line(2);
  Chars_dis("3.F_H :              ");
  Freq_Dis(FREQ2);
  Dis_line(3);
  Chars_dis("  SEQ :   01010101   ");
 // Freq_Dis(FSK);
  Dis_line(4);

}
/************************************************/
void Manu4_Dis(void)
{
  Chars_dis("   FM Output Mode    ");
  Dis_line(0);
  Chars_dis("1.F_C :              ");
  Freq_Dis(FREQ1);
  Dis_line(2);
  Chars_dis("2.A_C :              ");
  Ampl_Dis(AMP1);
  Dis_line(3);
  if(ten_five)
     Chars_dis("3.Dalt Fmax :  5KHz  ");
  else
     Chars_dis("3.Dalt Fmax : 10KHz  ");
  Dis_line(4);
}
/************************************************/
void Manu5_Dis(void)
{
  Chars_dis("   PSK Output Mode   ");
  Dis_line(0);
  Chars_dis("  F_C :   100KHz     ");
  Dis_line(2);
  Chars_dis("  Rate:   10Kbps    ");
  Dis_line(3);
  Chars_dis("  SEQ :   01010101   ");
  Dis_line(4);
}
/************************************************/
void Manu6_Dis(void)
{
  Chars_dis("   ASK Output Mode   ");
  Dis_line(0);
  Chars_dis("  F_C :   100KHz     ");
  Dis_line(2);
  Chars_dis("  Rate:   10Kbps     ");
  Dis_line(3);
  Chars_dis("  SEQ :   01010101   ");
  Dis_line(4);
}


/********************AM调制波生成***********************/
void DDS(ulong F)
{
  ulong M;
  float fre=10.73621578383221;           //参数为0.1Hz精度的整数,故除10
  //fre=(float)(F);                      //fout=fosc*K/2e32
  //fre=fre*107.3621578383221;             //K=fout*2e32/fosc
  fre=fre*F;
  M=(ulong)(fre);                          //fosc=40.004480MHz
  DDS_D0=(uchar)(M&0x000000ff);
  DDS_D1=(uchar)((M>>8)&0x000000ff);
  DDS_D2=(uchar)((M>>16)&0x000000ff);
  DDS_D3=(uchar)((M>>24)&0x000000ff);
}
/********************************************************/
/*********AD9851**************/
void AD9851_DDS(ulong frequence)
{

⌨️ 快捷键说明

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