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

📄 main.c

📁 基于HMS7202的波形发生器源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//#include "reg7202.h"
 #include <string.h>
 #include "hms7202lib.h"
 #include "ddscommand.h"
 #include "math.h"
 #include "kb.h"

    unsigned int Frequency=1000;//用来存放从键盘输入的频率值,Hz
    unsigned int oldFrequency;
    unsigned int ModemFreq=50;//用来存放从键盘输入的调制频率,Hz
    unsigned int oldModemFreq;
    unsigned int DeviaFreq=50;//用来存放从键盘输入的调制频偏,Hz
    unsigned int oldDeviaFreq;
    unsigned int Ampl=1000;//用来存放从键盘输入的幅度值,mVpp
    unsigned int oldAmpl;
    char fre1_data[6] = {0xC2,0x8E,0xEC,0x37,0x00,0x00};
      //用来存放经换算后得到的频率数据,共用
    char fre2_data[6] = {0xE6,0x25,0xEC,0xC8,0x7E,0x03};
      //用来存放有帧数据的经换算后得到的频率数据,共用
    short fre23_data[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
      //用来存放频率2和频率3
    char amp_data[6] = {0xA3,0x08,0x59,0x07,0x01,0x00};
      //用来存放经换算后得到的幅度数据,共用
    char ratio_data[6] ={0x75,0x08,0,0,0,0};//用来存放方波占空比
  //  char oldamp_data[6] = {0,0,0,0,0,0};  
    unsigned char KeyValue;//用来存放当前按键的键值
    unsigned char Ratio_data =50;//用来存放从键盘输入的占空比
    unsigned char oldRatio_data;
    char *pcmd;//用来指向当前发送的数据
    FRAME_HEAD_t * pCurrentWave;//用来指向当前波形
    FRAME_HEAD_t * pCurrentArb;//用来指向当前任意波
    FRAME_HEAD_t * pCurrentFrameHD;//用来指向当前发送的帧头
    


 void Main()
 {
    unsigned char moddepth;//AM调制深度
    int i,modnum,amsource;
    unsigned int SampFreq;//用来存放AM/FM的采样频率
    system_init();


    /**************************************/
    /* LCD display power_on screem*/
    /****************************************/
  /*  char *pcmd = (char *)&SinCMD;
    FrameHead_Send(pcmd);
    
    pcmd = (char *)&AmpCMD;
    FrameHead_Send(pcmd);//发送默认波形*/

   // Get_Freq(Frequency,fre1_data);
   // Get_Freq(Frequency*2*RAMP_SDSIZE,fre2_data);
   // Get_Amp(Frequency,Ampl,amp_data);

    while(1)
    {
        KeyValue = Get_Key();
        switch(KeyValue)
        {
        case 30://表示按了正弦波按钮
        	ser_printf("正弦波\n");
        	pCurrentWave = &SinCMD;
        	
        	strncpy(SinCMD.m_WFrequency,fre1_data,6);
        	FrameHead_Send(pCurrentWave);//发送波形ID和频率数据
    
    		strncpy(AmpCMD.m_WFrequency,amp_data,6);
    		pCurrentFrameHD = &AmpCMD;
    		FrameHead_Send(pCurrentFrameHD);//发送幅度数据
    		break;
    		
        case 34://表示按了方波按钮
            ser_printf("方波\n");
            pCurrentWave = &SquaCMD;
            
        	strncpy(SquaCMD.m_WFrequency,fre1_data,6);
        	pCurrentFrameHD = &SquaCMD;
        	FrameHead_Send(pCurrentFrameHD);//发送波形ID和频率数据
    
    		strncpy(AmpCMD.m_WFrequency,amp_data,6);
    		pCurrentFrameHD = &AmpCMD;
			FrameHead_Send(pCurrentFrameHD);//发送幅度数据
			
			strncpy(RatioCMD.m_WFrequency,ratio_data,6);
    		pCurrentFrameHD = &RatioCMD;
			FrameHead_Send(pCurrentFrameHD);//发送占空比
    		break;
    		
    	case 38://表示按了三角波按钮
    		ser_printf("三角波\n");
    		pCurrentWave = &TriaCMD.head;
    		
    		strncpy(TriaCMD.head.m_WFrequency,fre2_data,6);
    		pCurrentFrameHD = &TriaCMD.head;
    		FrameHead_Send(pCurrentFrameHD);//发送波形ID和频率数据
    		
    		pcmd = (char *)TriaCMD.Tria;
    		FrameData_Send(pcmd,HW_SDSIZE*2);//发送波形数据
    		break;
    		
    	case 39://表示按了锯齿波按钮
    		ser_printf("锯齿波\n");
    		pCurrentWave = &RampCMD.head;
    		
    		strncpy(RampCMD.head.m_WFrequency,fre2_data,6);
    		pCurrentFrameHD = &RampCMD.head;
    		FrameHead_Send(pCurrentFrameHD);////发送波形ID和频率数据
    		
    		pcmd = (char *)RampCMD.Ramp;
    		FrameData_Send(pcmd,HW_SDSIZE*2);//发送波形数据
    		break;
    	case 40://表示按了噪声按钮
    		ser_printf("噪声\n");
    		pCurrentWave = &NoiseCMD;
    		
    		pCurrentFrameHD = &NoiseCMD;
    		FrameHead_Send(pCurrentWave);//发送波形类型和频率数据(频率数据不变)
    		
    		strncpy(AmpCMD.m_WFrequency,amp_data,6);
    		pCurrentFrameHD = &AmpCMD;
			FrameHead_Send(pCurrentFrameHD);//发送幅度数据
			break ;
    	case 25://表示按了频率按钮
    		ser_printf("设置频率:");
    		oldFrequency = Frequency;
    		Frequency = readfreq();
    		if(Frequency==0)
    		{
    			Frequency = oldFrequency;
    			ser_printf("\n取消频率设置\n");
    		}
    		else
    		{
    			ser_printf("%10d\n",Frequency);
    		}
    		
    		freq_convert(Frequency,fre1_data);
    		freq_convert(Frequency*HW_SDSIZE*2,fre2_data);
    		amp_convert(Frequency,Ampl,amp_data);
    		
    
    		break;
		
		case 26://表示按了幅度按钮
			ser_printf("设置幅度:");
		    oldAmpl = Ampl;
			Ampl = readamp();
			if(Ampl==0)
			{
				Ampl = oldAmpl;
				ser_printf("\n取消幅度设置\n");
			}
			else
				ser_printf("%10d\n",Ampl);
		//	strncpy(oldamp_data,amp_data,6);//在幅度数据变换之前保存旧的幅度数据
			amp_convert(Frequency,Ampl,amp_data);
		
			
			break;
		case 24://按了输出键 
		//还有问题:没考虑调制、扫频、突发部分。
			if(pCurrentWave->m_WWaveType==0x1a)//噪声不更新频率数据
			{
				FrameHead_Send(pCurrentWave);//发送波形ID和频率数据
				
				strncpy(AmpCMD.m_WFrequency,amp_data,6);
    			pCurrentFrameHD = &AmpCMD;
    			FrameHead_Send(pCurrentFrameHD);//发送幅度数据
			}	
    		else if(pCurrentWave->m_WWaveType!=0x1a && pCurrentWave->m_WDataLen==0)//无波形数据
    		{
    			strncpy(pCurrentWave->m_WFrequency,fre1_data,6);
    			FrameHead_Send(pCurrentWave);//发送波形ID和频率数据
    			
    			strncpy(AmpCMD.m_WFrequency,amp_data,6);
    			pCurrentFrameHD = &AmpCMD;
    			FrameHead_Send(pCurrentFrameHD);//发送幅度数据
    			if(pCurrentWave->m_WWaveType==0x1)//若当前波形为方波,还要发送占空比
    			{
    				pCurrentFrameHD = &RatioCMD;
    				FrameHead_Send(pCurrentFrameHD);
    			}
    		}
    		
    		else //有波形数据
    		{
    			strncpy(pCurrentWave->m_WFrequency,fre2_data,6);
    			FrameHead_Send(pCurrentWave);//发送波形ID和频率数据
    			
    			switch(pCurrentWave->m_WWaveType)//根据波形ID发送不同的波形数据
    			{
    			case 2: // ramp
    				pcmd = (char *)RampCMD.Ramp;
    				FrameData_Send(pcmd,HW_SDSIZE*2);
    				break;
    				
    			case 3: // tria
    				pcmd = (char *)TriaCMD.Tria;
    				FrameData_Send(pcmd,HW_SDSIZE*2);
    				break;
    				
    			case 4://UExp
    				pcmd = (char *)UExpCMD.UExp;
    				FrameData_Send(pcmd,HW_SDSIZE*2);
    				break;
    			case 5://DExp
    				pcmd = (char *)DExpCMD.DExp;
    				FrameData_Send(pcmd,HW_SDSIZE*2);
    				break;
    			case 6://Cardgm
    				pcmd = (char *)CardgmCMD.Cardgm;
    				FrameData_Send(pcmd,HW_SDSIZE*2);
    				break;
    			case 7://Sinc
    				pcmd = (char *)SincCMD.Sinc;
    				FrameData_Send(pcmd,HW_SDSIZE*2);
    				break;
    			case 9://Arb
    				pcmd = (char *)ArbCMD.Arb;
    				FrameData_Send(pcmd,ArbCMD.head.m_WDataLen*2);
    				break;	
    			default :
    				break;
    			}//switch end
    			
    			strncpy(AmpCMD.m_WFrequency,amp_data,6);
    			pCurrentFrameHD = &AmpCMD;
    			FrameHead_Send(pCurrentFrameHD);//发送幅度数据
    		}
    		
		
    	case 28://表示按了占空比设置按钮
    		ser_printf("设置占空比:");
    		oldRatio_data = Ratio_data;
    		Ratio_data = readratio();
    		if(Ratio_data == 0)
    		{
    			Ratio_data = oldRatio_data;
    			ser_printf("取消占空比设置");
    		}
    		ratio_convert(Ratio_data,ratio_data);
    		strncpy(RatioCMD.m_WFrequency,ratio_data,6);
    		break;
    		
    	case 20://表示按了mod按钮
    		modnum = 0;
    		while(1)
    		{
    			KeyValue = Get_Key();
    			if(KeyValue == 25)//表示更改调制模式
    			{
    				modnum = (modnum+1)%3;
    				continue;
    			}
    			else if(KeyValue>25 && KeyValue<30)
    			{
    				break;
    			}
    		}
    		
    		//判断使用哪种调制方法
    		switch(modnum)
    		{
    		case 0://AM
    			pCurrentWave = &AmCMD.head;

⌨️ 快捷键说明

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