📄 xinhao.c
字号:
#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 + -