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

📄 main.c

📁 此程序实现任意波形发生器的菜单选择操作及向FPGA发送控制命令
💻 C
📖 第 1 页 / 共 2 页
字号:
/*任意波形发生程序*/
/*此程序设定波形频率,幅度,类型并显示*/

//包含头文件
#include<STC89C51RC_RD_PLUS.H>
#include<absacc.h>
#include<intrins.h>
sbit p10=P1^0;
sbit p12=P1^2;

//自定义数据类型
#define uchar unsigned char
#define uint unsigned int

//定义各个端口地址
#define COM XBYTE [0x0001]         //8279的命令状态口
#define DAT XBYTE [0X0000]         //8279的数据口
#define RAM XBYTE [0X8001]         //8279的RAM地址
#define CS_DAC XBYTE [0X0400]      //DAC选通口地址
#define CS_7132 XBYTE [0X0800]    //7C142选通口地址
#define CS_FPGA XBYTE [0X0C00]    //FPGA选通口地址1
//#define CS_FPGA1 XBYTE [0X0C01]     //FPGA选通地址2
#define CS_RAM XBYTE[0X1000]       //双口RAM选通地址
#define CS_TEMP  XBYTE[0X2400]     //无用地址空间

///////////////////////////////////////////////////////////////////////宏定义
// 宏定义以
/* 定义常量 */
#define ERROR   0
#define OK      1

/* 定义Flash 操作等待时间 */
//#define WAIT_TIME  0x00    //mcu clock 40mhz
//#define WAIT_TIME  0x01    //mcu clock 20mhz
#define WAIT_TIME  0x02    //mcu clock 10mhz
//#define WAIT_TIME  0x03    //mcu clock 5mhz

#define bits 512   //波形表格字节数

#define save_sector 0xE200    //定义波形存储空间
#define save_mag  0xE400      //定义幅度存储空间
#define save_freq 0xE401      //freq存储
#define save_count 0xe403     //存储显示周期个数

//////////////////////////////////////////////////////////////////////////////定义各种常量表
//定义各种常量表
         
/*共阴的七段数码管译码0   1     2    3    4    5    6    7    8   9*/
uchar code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//0级键值表 正弦波  方波  三角波 组合波
uchar code tb0[]={0x40,0x48,0x50,0x58,0x19};

//1级键值表
uchar code tb1[]={0x01,0x02,0x03};

 //2级键值表
uchar code tb2[]={0x5a,0x5b,0x1a,0x1b};

//波形系数键值表
uchar code xishu[]={0x59,0x41,0x42,0x43,0x49,0x4a,0x4b,0x51,0x52,0x53};
//正弦波形表
uchar code sin[]={127,129,130,132,133,135,136,138,139,141,143,144,146,147,149,150,152,153,155,156,158,159,161,163,164,166,167,168,170,171,173,174,176,177,179,180,182,183,184,186,187,188,190,191,193,194,195,197,198,199,200,202,203,204,205,207,208,209,210,211,213,214,215,216,217,218,219,220,221,223,224,225,226,227,228,228,229,230,231,232,233,234,235,236,236,237,238,239,239,240,241,242,242,243,244,244,245,245,246,247,247,248,248,249,249,249,250,250,251,251,251,252,252,252,253,253,253,253,254,254,254,254,254,254,254,254,254,254,255,254,254,254,254,254,254,254,254,254,254,253,253,253,253,252,252,252,251,251,251,250,250,249,249,249,248,248,247,247,246,245,245,244,244,243,242,242,241,240,239,239,238,237,236,236,235,234,233,232,231,230,229,228,228,227,226,225,224,223,221,220,219,218,217,216,215,214,213,211,210,209,208,207,205,204,203,202,200,199,198,197,195,194,193,191,190,188,187,186,184,183,182,180,179,177,176,174,173,171,170,168,167,166,164,163,161,159,158,156,155,153,152,150,149,147,146,144,143,141,139,138,136,135,133,132,130,129,127,125,124,122,121,119,118,116,115,113,111,110,108,107,105,104,102,101,99,98,96,95,93,91,90,88,87,86,84,83,81,80,78,77,75,74,72,71,70,68,67,66,64,63,61,60,59,57,56,55,54,52,51,50,49,47,46,45,44,43,41,40,39,38,37,36,35,34,33,31,30,29,28,27,26,26,25,24,23,22,21,20,19,18,18,17,16,15,15,14,13,12,12,11,10,10,9,9,8,7,7,6,6,5,5,5,4,4,3,3,3,2,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,8,9,9,10,10,11,12,12,13,14,15,15,16,17,18,18,19,20,21,22,23,24,25,26,26,27,28,29,30,31,33,34,35,36,37,38,39,40,41,43,44,45,46,47,49,50,51,52,54,55,56,57,59,60,61,63,64,66,67,68,70,71,72,74,75,77,78,80,81,83,84,86,87,88,90,91,93,95,96,98,99,101,102,104,105,107,108,110,111,113,115,116,118,119,121,122,124,125};
//方波波形表      
uchar code rec[]={255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//三角波波形表
uchar code tri[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0};
//组合波形表
//uchar code junc[]={1};
//暂定表
//uchar temp_jun[512]={1};
uchar xdata temp_jun[511]={1};


///////////////////////////////////////////////////////////////////////////////////定义全局变量
//定义全局变量

sbit clflag=ACC^7;
bit int_flag=0; /*中断标志位*/
uchar key_value;/*中断返回键值*/
uchar value;    //系数寄存器
//uchar  freq_step=10;  //频率步进
//uchar  mag_step=1;   //幅度步进

uint cycle_count;      //周期个数
uchar baiwei;          //百位
uchar shiwei;          //十位
uchar gewei;           //个位
uchar count_cycle=0;

uint  freq=65500;      //频率寄存器
uchar  mag=100;     //幅度寄存器
//uchar indicate;           //定义频率,幅度flag,indicate=0:freq;indicate=1:mag.


uchar  a;          //正弦波的波形系数
uchar  b;          //方波的波形系数 
uchar  c;          //三角波的波形系数 

uchar  state0=0;    //0级状态
uchar  state1=0;    //1级状态
uchar  state2=0;    //2级状态

bit ok=0;                //ok=1为确认

uchar count=0;          //记顺序按键植

/////////////////////////////////////////////////////////////////////////定义个功能子函数
//定义个功能子函数
void save(uchar *reg_temp);

/* 打开 ISP,IAP 功能 */
void ISP_EN(void)
{
 EA = 0;               //  关中断   
 ISP_CONTR = ISP_CONTR & 0x18;        // 0001,1000 
 ISP_CONTR = ISP_CONTR | WAIT_TIME;
 ISP_CONTR = ISP_CONTR | 0x80;        // 1000,0000 
}



/* 关闭 ISP,IAP 功能 */
void ISP_DI(void)
{
 ISP_CONTR = ISP_CONTR & 0x7f;     // 0111,1111
 ISP_TRIG = 0x00;
 EA   =   1;                    // 开中断 
}



/* 字节读 *//* 程序执行时间15us,指令周期为0.12us */
uchar Byte_read(uint byte_addr)
{
 ISP_ADDRH = (uchar)(byte_addr >> 8);
 ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
 ISP_CMD  = ISP_CMD & 0xf8;         // 1111,1000 
 ISP_CMD  = ISP_CMD | 0x01;          // 0000,0001  字节读数据存储区
 ISP_EN();
 ISP_TRIG = 0x46;
 ISP_TRIG = 0xb9;
 _nop_();
 ISP_DI();
 return (ISP_DATA);
}


/* 扇区擦除 *//* 程序执行时间10ms,指令周期为0.12us */
void Sector_erase(uint Sector_addr)
{     
 uchar addre;
 addre   = (uchar)(Sector_addr >> 8);  // 1111,1110,0000,0000; 取扇区地址
 ISP_ADDRH = addre&0xfe;
 ISP_ADDRL = 0x00;
 
 ISP_CMD = ISP_CMD & 0xf8;       // 1111,1000
 ISP_CMD = ISP_CMD | 0x03;       // 0000,0011  扇区擦除数据存储区
 
 ISP_EN();
 
 ISP_TRIG = 0x46;               // 触发ISP_IAP命令
 ISP_TRIG = 0xb9;              // 触发ISP_IAP命令
  _nop_();
 ISP_DI();
}


/* 字节编程 *//* 程序执行时间64us,指令周期为0.12us */
void Byte_program(uint byte_addr, uchar DataBuf)
{
 ISP_ADDRH = (uchar)(byte_addr >> 8);
 ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
 ISP_CMD  = ISP_CMD & 0xf8;         // 1111,1000 
 ISP_CMD  = ISP_CMD | 0x02;      // 0000,0010  字节编程数据存储区
 ISP_DATA = DataBuf;
 ISP_EN();
 
 ISP_TRIG = 0x46;               // 触发ISP_IAP命令
 ISP_TRIG = 0xb9;               // 触发ISP_IAP命令
 _nop_();
 ISP_DI();
}


/* 字节编程并校验 */
uchar ByteProgramVerify(uint byte_addr, uchar DataBuf)
{
 ISP_ADDRH = (uchar)(byte_addr >> 8);
 ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
 ISP_CMD  = ISP_CMD & 0xf8;          // 1111,1000
 ISP_CMD  = ISP_CMD | 0x02;      // 0000,0010  字节编程数据存储区
 ISP_DATA = DataBuf;
 ISP_EN();
 ISP_TRIG = 0x46;
 ISP_TRIG = 0xb9;
 _nop_();
 ISP_DATA = 0x00;
 ISP_CMD  = ISP_CMD & 0xf8;          // 1111,1000
 ISP_CMD  = ISP_CMD | 0x01;          // 0000,0001
 ISP_TRIG = 0x46;               // 触发ISP_IAP命令
 ISP_TRIG = 0xb9;               // 触发ISP_IAP命令
 _nop_();
 ISP_DI();
 if(ISP_DATA==DataBuf) return OK;
 else return ERROR;
}


//定义延时函数
void delay(void)
{
   uchar i,j;
   for(i=0;i<255;i++)
      for(j=0;j<255;j++);
}



//定义显示函数
void display(void)
{
     uint buff;  
     
          //频率输出      
                 buff=freq;
                  COM=0X80;
                  DAT=seg[buff/10000];
                  COM=0X81;
                  DAT=seg[buff/1000%10];
                  COM=0X82;
                  DAT=seg[buff/100%10];
                  COM=0X83;
                  DAT=seg[buff/10%10];
                  COM=0X84;
                  DAT=seg[buff%10];  
       //幅度输出
                    buff=mag/5;
                   	COM=0X85;
                    DAT=seg[buff/10]+0x80;
                    COM=0X86;
                    DAT=seg[buff%10];
          //波的类型输出
                  COM=0X87;
                  DAT=seg[state0];   
}

//定义波形产生函数
void create_base(uchar b_mag,uint b_freq,uchar b_type)
{
	uchar temp;
	uchar j;
	uchar freqH=0,freqL=1;//频率控制字高低8位
	uchar cycleH,cycleL;
	uchar *D_RAM=&CS_7132;//双口RAM头地址
	uchar *A_FPGA=&CS_FPGA;//频率控制字首地址
	uint i;
	//uint k;
	uchar *table;
	switch(b_type)
	{
		case 0:table=sin;break;//输出正弦波
		case 1:table=rec;break;//输出方波
		case 2:table=tri;break;//输出三角波
		default:break;
	}

	

//产生波形
	//bit W_FPGA;//FPGA 写标志位
	//uchar D_RAM=0x10000;//双口RAM头地址
	//uchar CS_FPGA  //FPGA enable
	
	CS_DAC = b_mag;//输出D/A幅值
	CS_TEMP=0;
	CS_DAC=b_mag;
    //p10=1;
    //p12=0;
    _nop_();
    _nop_();

	*A_FPGA=freqL;
   
	*(A_FPGA+1)=freqH;
	
	*(A_FPGA+2)=0;
    *(A_FPGA+3)=0;
   
	*(A_FPGA+4)=0;
	*(A_FPGA+5)=0;
    

		for(i=0;i<bits;i++)
	{
		temp=0x00;
		*(D_RAM+i)=temp;//输出波形表到FPGA双口RAM
	}

	for(j=0;j<10;j++)
   {
	for(i=0;i<bits;i++)
	{
		temp=table[i];
		_nop_();
		*(D_RAM+i)=temp;//输出波形表到FPGA双口RAM
		_nop_();
	}
    }

	//输送16位频率控制字
	//频率控制字16位,分为高8位freqH;低8位freqL
	freqH=((b_freq&0xff00)>>8);//取出频率控制字高8位
	freqL=(b_freq&0x00ff);//取出频率控制字低8位
	cycleH=((cycle_count&0xff00)>>8);
	cycleL=(cycle_count&0x00ff);
	
    //送出频率控制字和周期个数   
	*A_FPGA=freqL;
   
	*(A_FPGA+1)=freqH;
	
	*(A_FPGA+2)=cycleL;
    *(A_FPGA+3)=cycleH;
   
	*(A_FPGA+4)=0;
	*(A_FPGA+5)=0;
	
}


//组合波产生和存储
void  create_combin(uchar c_mag,uint c_freq,uchar x_sin,uchar x_rec,uchar x_tri)
{
	
    uchar temp;
	uchar freqH=0,freqL=1;//频率控制字高低8位
	uchar cycleH,cycleL;
	uchar *D_RAM=&CS_7132;//双口RAM头地址
	uchar *A_FPGA=&CS_FPGA;//频率控制字首地址
	uint i;
	uchar x_total=x_sin+x_rec+x_tri;//系数之和
	//uchar table[bits];//存储生成的波形到rom

⌨️ 快捷键说明

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