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

📄 main.c

📁 此程序实现任意波形发生器的菜单选择操作及向FPGA发送控制命令
💻 C
📖 第 1 页 / 共 2 页
字号:
//产生波形
	
	CS_DAC=c_mag;//输出D/A幅值
	for(i=0;i<bits;i++)
	{
		temp=x_sin*sin[i]+x_rec*rec[i]+x_tri*tri[i];//线型叠加波形
		temp/=x_total;//新波形归一化
		*(D_RAM+i)=temp;//输出波形表到FPGA双口RAM
		 temp_jun[i]=temp;//存储波形。
	}

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


	//存储波形
    Sector_erase(save_mag);

    Byte_program(save_mag,c_mag);//存储幅度


	Byte_program(save_freq,freqH);//存储频率高位
	Byte_program((save_freq+1),freqL);//存储频率低位

	Byte_program(save_count,cycleH);//存储频率高位
	Byte_program(save_count+1,cycleL);//存储频率低位


	save(temp_jun);
}


//波形存储函数
void save(uchar *reg_temp)
{ 
   uint i;
   uint addr=save_sector;
   Sector_erase(addr);
   for(i=0;i<512;i++)
     {
	   Byte_program(addr,reg_temp[i]);
       _nop_();
	   addr++;
	 }
   
}


//读已存波
void read_bo(void)
{
   uint i;
   uint addr;
   uchar temp;
	uchar freqH=0,freqL=1;//频率控制字高低8位
	uchar cycleH,cycleL;
	uchar *D_RAM=&CS_7132;//双口RAM头地址
	uchar *A_FPGA=&CS_FPGA;//频率控制字首地址

   addr=save_sector;
   
   for(i=0;i<512;i++)
     {
	    temp=Byte_read(addr);
		_nop_();
		temp_jun[i]=temp;
		addr++;
	 }

	 freqH=Byte_read(save_freq);
	 freqL=Byte_read(save_freq+1);

     _nop_();
	 mag=Byte_read(save_mag);
     _nop_();

	 cycleH=Byte_read(save_count);
	 cycleL=Byte_read(save_count+1);
	 _nop_();
    
    //显示已存波
     CS_DAC=mag;             //输出D/A幅值

     *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=temp_jun[i];
		*(D_RAM+i)=temp;//输出波形表到FPGA双口RAM
	}

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



//按ok键响应函数
void action(uchar bo_type)
{
   if(bo_type==3)
     create_combin(mag,freq,a,b,c);
   else 
      create_base(mag,freq,bo_type);
      
}

///////////////////////////////////////////////////////////////////////////////

//读取键盘数据,返回当前被按下的键号
uchar keyin(void)
{
 	uchar i;
 	COM=0x40;
	i=DAT;
	i=i&0x7f; //取键盘数据低7位
 	return(i);
}


////////////////////////////////////////////////////////////////////////////////主函数
void main(void)
{
 
 	uchar i,j,k;
    
	
	//////////////////////////////////////////////////////////////////////////////
	//初始化单片机
	AUXR = 0x02;/*STC单片机关内部RAM和开ALE*/
 	for(i=0;i<5;i++)
 	{
		for(j=0;j<100;j++)
  		{
			for(k=0;k<100;k++);
		}
	}

	//////////////////////////////////////////////////////////////////////////////
	//初始化8279
 	COM=0xd1;//1101 0001b 清除所有显示
 	do{ACC=COM;}
	while(clflag==1);   //清除起来比较慢,所以一条指令执行的时间不足以完成所有清除,故需等待
 	COM=0x01;COM=0x02;  
 	IE=0x81;TCON=0x01;
 	//////////////////////////////////////////////////////////////////////////////
    for(i=0;i<8;i++)
	{
		COM=0X80+i;
		DAT=seg[0];
	}
    //大循环
 	while(1)
 	{  
		while(int_flag==0)  /*等待中断*/
	     {
		   ;//后台程序
		 }
		
		int_flag=0;
		if(ok==1) {ok=0;EA=0;action(state0);EA=1;}
		//if(ok==1) {ok=0;action(state0);}

        //根据键值调用键盘响应函数
		switch(state0)
		{
			case 0:switch(state1)
                        {
                           case 0:switch(state2)
                                  {
                                    case 0:freq++;display();delay();break;
                                    case 1:freq--;display();delay();break;
                                    case 2:freq+=100;display();delay();break;
									case 3:freq-=100;display();delay();break;
									case 4:break;
                                  }break;
						  
                           case 1:switch(state2)
                                  {
                                    case 0:mag+=5;display();delay();break;
                                    case 1:mag-=5;display();delay();break;
									case 2:break;
                                  }break;
                           case 2:break;
						 }
			       break;
		   case 1:switch(state1)
                        {
                           case 0:switch(state2)
                                  {
                                    case 0:freq++;display();delay();break;
                                    case 1:freq--;display();delay();break;
									case 2:freq+=100;display();delay();break;
									case 3:freq-=100;display();delay();break;
									case 4:break;
                                  }break;
                           case 1:switch(state2)
                                  {
                                    case 0:mag+=5;display();delay();break;
                                    case 1:mag-=5;display();delay();break;
									case 2:break;
									case 3:break;
									case 4:break;
                                  }break;
						 }
				   break;
			case 2:switch(state1)
                        {
                           case 0:switch(state2)
                                  {
                                    case 0:freq++;display();delay();break;
                                    case 1:freq--;display();delay();break;
									case 2:freq+=100;display();delay();break;
									case 3:freq-=100;display();delay();break;
									case 4:break;
                                  }break;
                           case 1:switch(state2)
                                  {
                                    case 0:mag+=5;display();delay();break;
                                    case 1:mag-=5;display();delay();break;
									case 2:break;
									case 3:break;
									case 4:break;
                                  }break;
						 }
				    break;
			 case 3:switch(state1)
                        {
                           case 0:switch(state2)
                                  {
                                    case 0:freq++;display();delay();break;
                                    case 1:freq--;display();delay();break;
									case 2:freq+=100;display();delay();break;
									case 3:freq-=100;display();delay();break;
									case 4:break;
                                  }break;
                           case 1:switch(state2)
                                  {
                                    case 0:mag+=5;display();delay();break;
                                    case 1:mag-=5;display();delay();break;
									case 2:break;
									case 3:break;
									case 4:break;
                                  }break;
						 }
				    break;
            case 4:{EA=0;read_bo();EA=1;} 
	 		default:break;
		}
	 state2=4;
 	}
}


//INT0的中断服务函数
//INT0由8279在键盘按下时发出
//注意关键字interrupt
void int_int0(void) interrupt 0 using 0
{
  	uchar i;

    //设置标志,告诉主循环中断发生了
  	int_flag=1;
  	//读取键值
    key_value=keyin();
	for(i=0;i<=3;i++)
	  if(key_value==tb0[i]) state0=i;
    for(i=0;i<=2;i++)
	  if(key_value==tb1[i]) state1=i;
	for(i=0;i<=3;i++)
	   if(key_value==tb2[i]) state2=i;
	for(i=0;i<=9;i++)
	   if(key_value==xishu[i]) 
	       { value=i;
	         if(state0==3) {count++;
			                if(count==1) {a=value;COM=0X80;DAT=seg[a];}
					        if(count==2) {b=value;COM=0X81;DAT=seg[b];}
					        if(count==3) {c=value;count=0;COM=0X82;DAT=seg[c];}
					        }
		
				 switch(state0)
                  {
				          case 0:if(state1==2) {count_cycle++;
			                                    if(count_cycle==1) {baiwei=value;COM=0X80;DAT=seg[baiwei];cycle_count=baiwei*100;}
					                            if(count_cycle==2) {shiwei=value;COM=0X81;DAT=seg[shiwei];cycle_count+=shiwei*10;}
					                            if(count_cycle==3) {gewei=value;count_cycle=0;COM=0X82;DAT=seg[gewei];cycle_count+=gewei;}}
 								  break;
                          case 1:if(state1==2) {count_cycle++;
			                                    if(count_cycle==1) {baiwei=value;COM=0X80;DAT=seg[baiwei];cycle_count=baiwei*100;}
					                            if(count_cycle==2) {shiwei=value;COM=0X81;DAT=seg[shiwei];cycle_count+=shiwei*10;}
					                            if(count_cycle==3) {gewei=value;count_cycle=0;COM=0X82;DAT=seg[gewei];cycle_count+=gewei;}}
 								  break;
						  case 2:if(state1==2) {count_cycle++;
			                                    if(count_cycle==1) {baiwei=value;COM=0X80;DAT=seg[baiwei];cycle_count=baiwei*100;}
					                            if(count_cycle==2) {shiwei=value;COM=0X81;DAT=seg[shiwei];cycle_count+=shiwei*10;}
					                            if(count_cycle==3) {gewei=value;count_cycle=0;COM=0X82;DAT=seg[gewei];cycle_count+=gewei;}}
 								  break;
						  case 3:if(state1==2) {count_cycle++;
			                                    if(count_cycle==1) {baiwei=value;COM=0X80;DAT=seg[baiwei];cycle_count=baiwei*100;}
					                            if(count_cycle==2) {shiwei=value;COM=0X81;DAT=seg[shiwei];cycle_count+=shiwei*10;}
					                            if(count_cycle==3) {gewei=value;count_cycle=0;COM=0X82;DAT=seg[gewei];cycle_count+=gewei;}}
 								  break;
				   }
            }
    if(key_value==0x18) ok=1;

}

⌨️ 快捷键说明

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