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

📄 main.c

📁 本人是刚刚毕业的学生
💻 C
字号:
#include "config.h"
#include "stdlib.h"
#include "ZIMO.h"
#include "Functions.h"
#include "DispFunction.h"
#define	TaskStkLengh	256		//Define the Task0 stack length 定义用户任务0的堆栈长度
int32 BaseLine0 = 0;
int32 BaseLine1 = 0;
uint32 Center0 = 512;
uint32 Center1 = 512;
uint32 Auto_Flag = 1;
uint32 LastSignalTypeFlag = 100;
uint32 ThisSignalTypeFlag = 100;
uint32 X0 = InterFace_Left_Up_X;
uint32 X1 = InterFace_Right_Low_X;
uint32 Y0 = InterFace_Left_Up_Y;
uint32 Y1 = InterFace_Right_Low_Y;
uint32 DATA0[4];
uint32 DATA1[4];
float Max = 0; 
float Min = 0;
uint32 frequence = 0;
float cycle = 0;
float AutoRangeChange_K0 = 0;
char CHAR[8];
INT8U err;
INT16U ADDATA[PointNumber] = {0};
INT16U ADData0[PointNumber] = {0};
INT16U ADData1[PointNumber] = {0};
OS_EVENT *Freq_Sem;
OS_EVENT *AD_Sem;
OS_EVENT *Disp_Sem;
OS_STK	TaskStk [TaskStkLengh];		//Define the Task0 stack 定义用户任务0的堆栈
OS_STK	TaskWelcomeStk [TaskStkLengh];
OS_STK	TaskStkAD [TaskStkLengh];
OS_STK	TaskStkDISP [TaskStkLengh];
OS_STK  TaskStkFre[TaskStkLengh];
void 	DrawLine(void *pdata);			//DrawLine 绘制示波表的刻度盘任务
void 	Welcome(void *pdata);
void 	TaskAD(void *pdata);
void    Frequence(void *pdata);
void 	TaskDISP(void *pdata);
/******************************************************************************
* 名    称:main()
* 功    能:主程序
* 入口参数:无
* 出口参数:无
* 说    明:无
****************************************************************************/
int main (void)
{OSInit ();	
OSTaskCreate (Welcome,(void *)0, &TaskWelcomeStk[TaskStkLengh - 1], 3);//创建欢迎界面任务,任务优先级为3	
	OSStart ();
	return 0;															
}
/******************************************************************************
* 名    称:Welcome()
* 功    能:绘制示波表的刻度盘
* 入口参数:无
* 出口参数:无
* 说    明:无
****************************************************************************/
void Welcome(void *pdata)
{uint32 j,k,i;
     pdata=pdata;
    AD_Sem=OSSemCreate(0);
    Freq_Sem=OSSemCreate(0); 
Disp_Sem=OSSemCreate(0);
TargetInit ();
	GUI_Initialize();
	GUI_FillSCR(BLUE);
	GUI_SetColor(RED,BLUE);
    for (j = 0; j < 6; j++)
    {GUI_LoadPic(18+j*50,44,*(ProdName0+j),32,32); //显示"简易数字存储",字体32*32 
    } 
       for (j = 0; j < 3; j++)
    {GUI_LoadPic(44+j*92,156,*(ProdName1+j),48,48);//显示"示波器",字体48*48
    }
    for (k = 0; k < 60; k++)
    { for(i=0;i<100;i++) ;
         }
        GUI_FillSCR(BLUE);                                //清屏
        OSTaskCreate (DrawLine,(void *)0, &TaskStk[TaskStkLengh - 1], 5);   OSTaskDel(OS_PRIO_SELF);//删除欢迎界面任务
        OSTimeDly(2);   
}
/**************************************************************************
* 名    称:DrawLine()
* 功    能:绘制示波表的刻度盘
* 入口参数:无
* 出口参数:无
* 说    明:无
****************************************************************************/
void DrawLine(void *pdata)
{   uint32 j;
    pdata = pdata;
  GUI_FillSCR(BLUE);                    //清屏
	ChangeBlockColour(X0,Y0,X1,Y1,BLACK);
		{GUI_DrawTable();
	     GUI_SetColor(RED,BLUE);
	     for (j = 0; j < 5; j++)
        {GUI_LoadPic(X0 + (X1 - X0 - 120) / 6 + j * (24 + (X1 - X0 - 120) / 6), 3, *(word + j), 24, 21); /* 显示"数字示波器",字体24*21 */
        }
        GUI_SetColor(YELLOW,BLUE);
        GUI_OutPutString(21,5,"V");
	    GUI_OutPutString(17,115,"0");
	    GUI_OutPutString(17,91,"1");
		GUI_OutPutString(17,67,"2");
		GUI_OutPutString(17,43,"3");
		GUI_OutPutString(17,19,"4");
		GUI_OutPutString(13,139,"-1");
		GUI_OutPutString(13,163,"-2");
		GUI_OutPutString(13,187,"-3");
		GUI_OutPutString(13,211,"-4");
		for (j = 0; j < 3; j++)
		{GUI_LoadPic(268,52,*(PinLv),16,16);
		}GUI_LoadPic(303,52,*(PinLv+1),16,16);
			    for (j = 0; j < 3; j++)
	    { GUI_LoadPic(268,94,*(ZhouQi),16,16);
		}GUI_LoadPic(303,94,*(ZhouQi+1),16,16);
		for (j = 0; j < 3; j++)
		{ GUI_LoadPic(268+j*17, 136, *(FengZhi+j), 16, 16);
		} for (j = 0; j < 3; j++)
	    {GUI_LoadPic(268+j*17, 178, *(YouXiao+j), 16, 16);
        }
        OSTaskCreate(Frequence, (void *)0, &TaskStkFre[TaskStkLengh - 1], 7);         //创建频率测量任务,任务优先级为8  
        OSTaskCreate(TaskDISP, (void *)0, &TaskStkDISP[TaskStkLengh - 1], 9);         //创建显示任务,任务优先级为9       
        OSTaskCreate (TaskAD, (void *)0, &TaskStkAD[TaskStkLengh - 1], 8);	          //创建AD采样任务,任务优先级7
        OSSemPost(Freq_Sem);
        OSTaskDel(OS_PRIO_SELF);                       //删除示波表的刻度盘任务
	}
}

/*****************************************************************************
* 名    称:Frequence()
* 功    能:频率测量任务
* 入口参数:无
* 出口参数:无
* 说    明:无
****************************************************************************/
void Frequence(void *pdata)
{uint32 Time_Base = 3;          /* 时基设置,单位为微妙 */
 uint32 i,j,data0,data1;
 PINSEL0 = (PINSEL0 & (~(0x03<<20))) | (0x02<<20);//P0.10引脚设置为捕获功能引脚
    T1TC=0;
    T1PR=0;
    while(1)
    {  OSSemPend(Freq_Sem,0,&err);
        OS_ENTER_CRITICAL();
        j=0;
        data0 = 0;
        data1 = 0;
            Timer1CAPIint();
              for (i = 0; i < 2; i++)
       { while (((T1IR&0x10)==0) && (j == 0))
         {
            //if (i == 1)
            j = (Fpclk / (T1TC - data1) < 10);
         }
          data1 = data0;          
          data0 = T1CR0;
          
          T1IR = 0xFFFFFFFF;
       }
       switch (j)
       {
       case 0:
       {
          frequence = Fpclk / (data0 - data1);        /* 计算被测信号频率 */
          cycle = 1000 / (float)frequence;            /* 计算被测信号周期 */
          break;
       }
       case 1:
       {
          frequence = 10;                             /* 计算被测信号频率 */
          cycle = 1000 / (float)frequence;            /* 计算被测信号周期 */
          break;
       }  
       }  
              if (frequence >= 3000)
       {
          Time_Base += cycle * 1000;
       }
       else
       {
          Time_Base = 3;
       }

       Timer1MATInit((uint32)(Fpclk * Time_Base / (float)1000000));
        OS_EXIT_CRITICAL();
 OSSemPost(AD_Sem);  
    }
}
/*****************************************************************************
* 名    称:TaskAD()
* 功    能:AD采样任务
* 入口参数:无
* 出口参数:无
* 说    明:无
****************************************************************************/
void TaskAD (void *pdata)
{   uint32 i = 0;
   pdata = pdata;
		while(1)
    {	OSSemPend(AD_Sem, 0, &err);
        OS_ENTER_CRITICAL();
       ADInit(AD_Clock, 28);             /* 选择AD0.1,采集被测信号样本 */
       if (frequence == 10)
       {
          for (i = 0; i < PointNumber; i++)		    	
	      {  
	        ADCR |= (1 << 24);
            while ((ADDR & 0x80000000) == 0);
            ADData0[i] = (ADDR >> 6) & 0x3FF;		//处理转换值 
            ADDATA[i] = ADData0[i];		            //处理转换值 
          }
       }
       else
       {
          EINTInit();
          while((EXTINT & 0x08) == 0);
          EXTINT = 0x0F;
          T1TCR=0x01;
          for (i = 0; i < PointNumber; i++)		    	
	      {   while ((T1IR & 0x01) == 0);
	          T1IR = 0x01;
	          ADCR |= (1 << 24);
              while ((ADDR & 0x80000000) == 0);
              ADData0[i] = (ADDR >> 6) & 0x3FF;		//处理转换值 
              ADDATA[i] = ADData0[i];		            //处理转换值 
          }
       }
       
        OS_EXIT_CRITICAL();
    }
}
/******************************************************************************
* 名    称:TaskDisp()
* 功    能:把采集到的数据显示在液晶屏上
* 入口参数:无
* 出口参数:无
* 说    明:无
****************************************************************************/
 void TaskDISP (void *pdata)
{    float ffz,yxz;
     float Disp_K0 = 0;
     float Disp_K1 = 0;
     float BiggerOne = 0;
     uint32 i = 0;
     uint32 I = 500;
     pdata = pdata;
     while (1)
     {
         OS_ENTER_CRITICAL();
         ADInit(AD_Clock, 30);                      //测出信号抬高值
	     for (i = 0; i < I; i++)
	     {ADCR |= (1 << 24);
             while ((ADDR & 0x80000000) == 0);
             BaseLine0 += (ADDR >> 6) & 0x3FF;		//处理转换值 
         }
         //BaseLine0 = 0;
         BaseLine0 /= I;
         ADInit(AD_Clock, 27);                      //测出表盘中心值
	     for (i = 0; i < I; i++)
	     { ADCR |= (1 << 24);
             while ((ADDR & 0x80000000) == 0);
             Center0 += (ADDR >> 6) & 0x3FF;		//处理转换值 
         }
         Center0 = ((Center0 * (Y1 - Y0) / I / 1024) + Y0);
         OS_EXIT_CRITICAL();
         GUI_DrawTable();
	      if (frequence > 17500)         //若被测信号的频率大于17.5KHz,则进行插值计算
	     { MaxMinOfArray(ADDATA,PointNumber);
	        SineInsert(ADDATA, 240);                //进行插值运算
	     }
	      MaxMinOfArray(ADData0,PointNumber);
	     BiggerOne = Max - BaseLine0;
	     BiggerOne = (BaseLine0 - Min) <= BiggerOne ? BiggerOne : (BaseLine0 - Min);
	    Disp_K0 = AutoRangeChange(BiggerOne);
	      WaveDisplay(Center0, Center1, Disp_K0, Disp_K1, BaseLine0, BaseLine1); 
	     Center1 = Center0;    	     	       
         BaseLine1 = BaseLine0;
         Disp_K1 = Disp_K0;      
            ffz = FengFengZhi(ADData0,PointNumber);
         yxz = YouXiaoZhi(ADData0,PointNumber,BaseLine0);
      ParameterDisp(frequence, cycle, ffz, yxz);
      SignalTypeMessage();
       OSSemPost(Freq_Sem);
    }
}

⌨️ 快捷键说明

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