📄 main.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 + -