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

📄 oscillograph_v6.c

📁 基于LPC2200实验箱的数字示波器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		GUI_LoadPic((200+16*i),221,*(p7+i),16,16);
	for(i=0;i<2;i++)					//显示"HZ"
		GUI_LoadPic((8*i+280),221,*(p10+i),8,16);
	
	for(i=0;i<2;i++)					//显示"倍率"
		GUI_LoadPic(16*i,221,*(p8+i),16,16);	
						
	GUI_SetColor(RED,DGREEN);
	GUI_LoadPic(50,221,X,8,16);//显示"X"
	GUI_LoadPic(64,221,*(p9+Bei_Lv),8,16);		//显示"数字"	
  /****************************************************************************/
  
  /*****************************画控制区*******************************************/
  		GUI_SetColor(BLACK,WHITE);

  	GUI_RectangleFill(4,164,56,196,WHITE);
	for(i=0;i<2;i++)					//显示"停止"
		GUI_LoadPic(8+16*i,168,*(p11+i),16,16);
  
    GUI_SetColor(WHITE,BLACK);
  	GUI_RectangleFill(4,124,56,156,WHITE);
  	for(i=0;i<2;i++)					//显示"开始"
		GUI_LoadPic(8+16*i,128,*(p12+i),16,16);
  
  	GUI_SetColor(BLACK,WHITE);
  	GUI_RectangleFill(4,84,56,116,WHITE);
  	for(i=0;i<2;i++)					//显示"清屏"
		GUI_LoadPic(8+16*i,88,*(p13+i),16,16);
  
  	GUI_RectangleFill(4,44,56,76,WHITE);
  	for(i=0;i<2;i++)					//显示"设置"
		GUI_LoadPic(8+16*i,48,*(p14+i),16,16);
 	
 	GUI_SetColor(OLIVE,PURPLE);	
	for(i=0;i<5;i++)					//显示"Tiger"
		GUI_LoadPic(10+8*i,10,*(p15+i),8,16);
}

/******************ADC初始化********************************************/
void ADC_Init(void) 
{
 PINSEL1=PINSEL1&(~(3<<22))|(1<<22);        //设置P0.27为AIN0
 ADCR=  (1<<0)      			|
        ((Fpclk/1000000-1)<<8)	|
        (0<<16) 				|
        (0<<17) 				|
        (1<<21) 				|
        (0<<22) 				|
        (1<<24) 				|
        (0<<27);
}
/*******************************************************************************/

/*****************T1初始化******************************************************/
void T1_Init(void)
{
 T1IR=0xFFFFFFFF;               //清楚定时器的全部中断标志
 T1TC=0x00;             //初始化T1
 T1PR=0x00;             //不分频
 T1MCR=0x03;            //匹配的时候 产生中断并且复位
 
 T1CCR=T1CCR|(1<<7)|(1<<8);	//设置P0.17 为CAP1.2 ,下降沿有效,产生中断
 
 T1MR0=Fpclk/5000;      //定时时间为200us
 T1TCR=0x01;            //启动定时器
 
}
/*******************************************************************************/

/*************中断服务程序***********************************/
void Timer1_Exception(void)
{
    static uint32 Temp;
    //void *Temp1=(&Temp);
    OS_ENTER_CRITICAL();
if(T1IR&0x01!=0)
  {
    T1IR=0x01;      //清除中断标志
    VICVectAddr=0;  //通知中断控制器中断结束
    /*******************采样程序*******/
 	Temp=ADDR;
 	ADCR=(ADCR&0xFFFFFF00)|0x01|(1<<24);       //切换通道,并且进行转换
 	while((ADDR&0x80000000)==0);
 		ADCR=ADCR|(1<<24);
 	while((ADDR&0x80000000)==0);
 		Temp=ADDR;
 	Temp=(Temp>>6)&0x3FF;
 	Temp=3300*Temp;
 	Temp=Temp>>10; 
 	OV++;								//计时的周期个数
    /**********************************/
    ADC_DATA[count]=Temp;	
    OSMboxPost(Mybox,(void  *)&Temp);
  }
 if(T1IR&(1<<6)!=0)
 	{
 		T1IR=0x01;      //清除中断标志
    	VICVectAddr=0;  //通知中断控制器中断结束
 		if(CAP>10)
 			CAP=0;
 		else
 			CAP++;
 		
 		CAP_Value0=CAP_Value;
 		CAP_Value=T1CR2;			//读取T1CR2中的TC的值
 		
 		if(CAP_Value>CAP_Value0)
 			Time_CAP[CAP]=(CAP_Value-CAP_Value0)*OV;	//计算捕获的间隔时间
 		else
 			Time_CAP[CAP]=(CAP_Value0-CAP_Value)*OV;	//计算捕获的间隔时间
 		
 		OV=0;		//清除计时的周期个数
 	}
	    OS_EXIT_CRITICAL();

}
 /*************计算采样平均值程序***********************************/
void AVG_CAL(uint32 *Data)
{
 uint32 i;
 uint32 Begin=0;        //循环的初始值
 uint32 AVG[4]={0};     //存放计算平均值的中间结果
 for(i=0;i<4;i++)
    {
     Begin=i*65;
     for(COU=Begin;COU<(Begin+65);COU++)
        AVG[i]=ADC_DATA[COU]+AVG[i];
    }
 ADC_DATA_AVG=AVG[0]+AVG[1]+AVG[2]+AVG[3];
 ADC_DATA_AVG=ADC_DATA_AVG/260;
}

/*************计算捕获平均值程序***********************************/
void CAP_AVG_CAL(void)
{
 uint32 i;
 uint32 CAP_AVG=0;     //存放计算平均值的中间结果
 for(i=0;i<10;i++)
    {
        CAP_AVG=Time_CAP[i]+CAP_AVG;
    }
 CAP_AVG=CAP_AVG/10;
 CAP_AVG=(CAP_AVG*1000)/Fpclk;			//计算周期(ms)
}
/***********************显示 捕获平均值  液晶屏幕 *********************************/
void CAP_AVG_Display(void)
{
	uint32 i;
	uint8 num[4]={0};
	CAP_AVG_CAL();  			//计算平均值
    num[0]=CAP_AVG/1000;		
    num[1]=(CAP_AVG%1000)/100;
    num[2]=(CAP_AVG%100)/10;
    num[3]=CAP_AVG%10;
    GUI_SetColor(WHITE,DGREEN);
	
	for(i=0;i<4;i++)					//显示"平均值的数据"
		GUI_LoadPic((8*i+50),201,*(p2+num[i]),8,16);
}    
/**************************************************************************/  
/************计算 最大值和最小值*************************************/
void	Max_Min(void)
{
	uint32 i;
	Max_ADC=ADC_DATA[0];
	Min_ADC=ADC_DATA[0];
	for(i=1;i<260;i++)
		{
			if(ADC_DATA[i]<Min_ADC)
				Min_ADC=ADC_DATA[i];
			if(ADC_DATA[i]>Max_ADC)
				Max_ADC=ADC_DATA[i];
		}
}

/***********************显示  最大值  最小值 *********************************/
void Max_Min_Display(void)
{
	uint32 i;
	uint8 num[4]={0};
	Max_Min();  			//计算平均值
    
    num[0]=Min_ADC/1000;		
    num[1]=(Min_ADC%1000)/100;
    num[2]=(Min_ADC%100)/10;
    num[3]=Min_ADC%10;
    
	GUI_SetColor(WHITE,DGREEN);
	for(i=0;i<4;i++)					//显示"最小值的数据"
		GUI_LoadPic((8*i+147),221,*(p2+num[i]),8,16);
	//************************************************************/
	num[0]=Max_ADC/1000;		
    num[1]=(Max_ADC%1000)/100;
    num[2]=(Max_ADC%100)/10;
    num[3]=Max_ADC%10;
    
	GUI_SetColor(WHITE,DGREEN);
	for(i=0;i<4;i++)					//显示"最小值的数据"
		GUI_LoadPic((8*i+147),201,*(p2+num[i]),8,16);
}    
/**************************************************************************/                            

/***********************显示平均值   液晶屏幕 *********************************/
void AVG_Display(void)
{
	uint32 i;
	uint8 num[4]={0};
	AVG_CAL(ADC_DATA);  			//计算平均值
    num[0]=ADC_DATA_AVG/1000;		
    num[1]=(ADC_DATA_AVG%1000)/100;
    num[2]=(ADC_DATA_AVG%100)/10;
    num[3]=ADC_DATA_AVG%10;
    GUI_SetColor(WHITE,DGREEN);
	
	for(i=0;i<4;i++)					//显示"平均值的数据"
		GUI_LoadPic((8*i+50),201,*(p2+num[i]),8,16);
}    
/**************************************************************************/   
 /*************************************产生PWM**************************************/
 void Cap_Display()
 {
 
 }                
/*********************************************************************************************************
**                            Task2 任务2
                    			显示曲线任务
************************************************************************/
void Task2(void *pdata)
{
	uint32 i,x,y,xx,yy;
 	uint32 L=0;
	pdata=pdata;
 while(1)
   {
	if(Stop==1) 
   		{
   			OSTaskSuspend(4);				//按下停止按钮的时候,挂起采样任务;
   			Stop=0;
   		}
	/*******显示曲线******************/
    OS_ENTER_CRITICAL();
    x=60;
    xx=60;
    yy=100;
    while(x<320)
      {
       for(i=0;i<260;i++)
	     {
	     	
	     		GUI_RLine(x+1,   0, 200, BLUE);
	     		while(L<200)
	     		{
	     			GUI_Point(x+1,	L,	YELLOW	);
	     			
	     			L=L+20;
	     		}
	     		L=0;
	     if(((x+1)%20)==0)
	     	{
	     		GUI_RLine(x+1,   0, 200,YELLOW);
	     	}
	     
	     	y=100-ADC_DATA[i]*K;	//K为电压与格子数的转换系数
	     	
	     	//GUI_Point(x,y,BLACK);
	     	x=x+1;
	     	GUI_Line(xx,yy, x,y,BLACK);
	     	xx=x;
	     	yy=y;
		    
		       
		 }
	   }
	   //x=0;
	   
	   OS_EXIT_CRITICAL();	 
	/*********************************/	
	
	OSTimeDly(OS_TICKS_PER_SEC/2);
 }
}                            
/*********************************************************************************************************
**                            Task1 任务1
                    			中速采样任务
**********************************************************/
void Task1(void *pdata)
{
  
 INT8U err=0;
 count=0;
pdata=pdata;
 
 Mybox=OSMboxCreate((void*)0);      //创建一个信邮箱
 ADC_Init();                //ADC初始化
 T1_Init();                 //初始化T1
 
while(1) 
 {
   if(Stop==1) 
   		{
   			OSTaskSuspend(3);				//按下停止按钮的时候,挂起采样任务;
   			Stop=0;
   		}
   		
   for(count=0;count<260;count++)		//从邮箱中读取采样的数据
       {
    	ADC_DATA[count]=*(uint32*)(OSMboxPend(Mybox,0,&err));	
       }	
   
    AVG_Display();				//显示采样的平均值
    Max_Min_Display();			//显示采样的最大值以及最小值
    Cap_Display();				//显示捕获的 频率 周期
    OSTimeDly(OS_TICKS_PER_SEC/2);
   
 }
 
}
 /***************************************************************************************/
/***************************************************************************
* 功    能:键盘的输入任务
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  Task0(void *pdata)
{   
	uint32 KEY0,KEY;
	uint32 i;
	pdata =pdata;
	TargetInit();
    while(1)
    {
		OSTimeDly(4);
        KEY0=ZLG7290GetKey();
        OSTimeDly(4);
        KEY=ZLG7290GetKey();
        if((KEY==0)||(KEY>16)||(KEY!=KEY0))
        	{
        		OSTimeDly(4);
        		continue;
        	}
        switch(KEY)
        	{
        		case 11:
        				{
        					if(Guang_Biao<1)
        						Guang_Biao=4;
        					else
        						Guang_Biao--;									//"B"向下移动光标
        					break;
        				}
        		case 16:
        				{
        					OK=1;
        					break;
        				}
        		default:	break;
        	}
        switch(Guang_Biao)	
        	{
        		case 2:	//唤醒采样 显示 任务
        				{
        					GUI_SetColor(BLACK,WHITE);		//白地黑子
  							for(i=0;i<2;i++)					//显示"清屏"
								GUI_LoadPic(8+16*i,88,*(p13+i),16,16);
        					
        					GUI_SetColor(WHITE,BLACK);			//黑地白字
  							for(i=0;i<2;i++)					//显示"开始"
								GUI_LoadPic(8+16*i,128,*(p12+i),16,16);
        					
        					if(OK==1)
        						{
        							OK=0;
        							OSTaskResume(3);		//唤醒采样任务
        							OSTaskResume(4);		//唤醒显示任务
        						}
        					break;
        				}
        		case 1:	//停止								
        				{
        					GUI_SetColor(BLACK,WHITE);			//白地黑字
  							for(i=0;i<2;i++)					//显示"开始"
								GUI_LoadPic(8+16*i,128,*(p12+i),16,16);
        					
        					GUI_SetColor(WHITE,BLACK);				//黑地白字
							for(i=0;i<2;i++)					//显示"停止"
								GUI_LoadPic(8+16*i,168,*(p11+i),16,16);
   						
   		                    if(OK==1)
        						{
        							OK=0;
        							Stop=1;				//停止标志位置1
        						
        						}
        					break;				
   						
   						}
   				case 3:	//清屏								
   						{
   							GUI_SetColor(BLACK,WHITE);			//白地黑字
  							for(i=0;i<2;i++)					//显示"设置"
								GUI_LoadPic(8+16*i,48,*(p14+i),16,16);
							
							GUI_SetColor(WHITE,BLACK);
  							for(i=0;i<2;i++)					//显示"清屏"
								GUI_LoadPic(8+16*i,88,*(p13+i),16,16);
							
							if(OK==1)
        						{
        							OK=0;
        							Stop=1;				//清屏的时候终止 采样以及显示任务
        							Display_Frame();
        							
        							
									Guang_Biao=2;
        						}
        					break;		
   						}
   				case 4:		//设置								
   						{
   							GUI_SetColor(BLACK,WHITE);				//白地黑字
							for(i=0;i<2;i++)					//显示"停止"
								GUI_LoadPic(8+16*i,168,*(p11+i),16,16);
							
							GUI_SetColor(WHITE,BLACK);			//黑地白字
  							for(i=0;i<2;i++)					//显示"设置"
								GUI_LoadPic(8+16*i,48,*(p14+i),16,16);
							
							if(OK==1)
        						{
        							OK=0;
        						}
        					break;	
   						}
   				default:
   							break;
   			}
	
     
    }
    OSTimeDly(OS_TICKS_PER_SEC*4);
    
}
/****************************************************************************
* 功    能:创建任务
* 入口参数:无
* 出口参数:无
****************************************************************************/
int main(void)
{
	OSInit();
	//Create_PWM();											//产生PWM波
	Display_Frame();						//显示界面的构架
	OSTaskCreate(Task0,(void *)0,&TaskStk0[TaskStkLengh-1],8);//按键任务
	OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 3);//中速采样任务
	OSTaskCreate (Task2,(void *)0, &TaskStk2[TaskStkLengh - 1], 4);//显示任务
	OSStart();
	return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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