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

📄 oscillograph_v2.c

📁 基于LPC2200实验箱的数字示波器源代码
💻 C
字号:
/****************************************************************************************
* 文 件 名:main.c
* 功    能:通过图形函数接口,演示矩形波的傅立叶逼近过程
* 说    明:将JP3短接。
****************************************************************************************/
#include	"config.h"
#include	"stdlib.h"
#include	"math.h"
#define PI 3.1415
#define	TaskStkLengh	512

#define  K	0.03	
OS_STK TaskStk0 [TaskStkLengh];
OS_STK TaskStk1 [TaskStkLengh];
/********采样的变量定义**********/
uint32 ADC_DATA1[200]={0};
uint32 ADC_DATA[200]={200,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};          //存放转换结果
uint32 ADC_DATA_AVG=3000;               //存放平均值
uint32 COU=0;               		//下标
volatile uint32 count=0;
volatile uint32 maxwell=0;   //采样显示数组的下标
uint32 ADC_DATA_AV[100]={0};				//存储采样显示数据的数组
/***********************************/

OS_EVENT	*Mybox;		//定义消息邮箱


/**********************************
void Line_MySIN(void)
{	
	uint32 x,y;
	for(x=0;x<320;x++)
	   	{
	   		y=(100-95*sin(x*PI/120));
			//y=10;
			GUI_Point(x,y,RED);
		}
}
**********************************/

/**********************************/
void Line_MySIN(void)
{	
	uint32 x,y;
	for(x=0;x<200;x++)
	   	{
	   		y=(100-95*ADC_DATA[x]/3300);
			//y=10;
			GUI_Point(x,y,RED);
		}
}
/**********************************/


/****************************************************************************
* 功    能:初始化背景和坐标系
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  Coordinate(void)
{
    GUI_FillSCR(BLUE);                 // 填充白色背景
    GUI_HLine(  0, 0, 319, YELLOW);    // 绘画x坐标轴
    GUI_HLine(  0, 20, 319, YELLOW);
    GUI_HLine(  0, 40, 319, YELLOW);
    GUI_HLine(  0, 60, 319, YELLOW);
    GUI_HLine(  0, 80, 319, YELLOW);
    GUI_HLine(  0, 100, 319, YELLOW);
    GUI_HLine(  0, 120, 319, YELLOW);
    GUI_HLine(  0, 140, 319, YELLOW);
    GUI_HLine(  0, 160, 319, YELLOW);
    GUI_HLine(  0, 180, 319, YELLOW);
    GUI_HLine(  0, 200, 319, YELLOW);
    GUI_HLine(  0, 220, 319, YELLOW);
    GUI_HLine(  0, 240, 319, YELLOW);
    
    GUI_RLine(0,   0, 240, YELLOW);    // 绘画y坐标轴
    GUI_RLine(20,   0, 240, YELLOW);
    GUI_RLine(40,   0, 240, YELLOW);
    GUI_RLine(60,   0, 240, YELLOW);
    GUI_RLine(80,   0, 240, YELLOW);
    GUI_RLine(100,   0, 240, YELLOW);
    GUI_RLine(120,   0, 240, YELLOW);
    GUI_RLine(140,   0, 240, YELLOW);
    GUI_RLine(160,   0, 240, YELLOW);
    GUI_RLine(180,   0, 240, YELLOW);
    GUI_RLine(200,   0, 240, YELLOW);
    GUI_RLine(220,   0, 240, YELLOW);
    GUI_RLine(240,   0, 240, YELLOW);
    GUI_RLine(260,   0, 240, YELLOW);
    GUI_RLine(280,   0, 240, YELLOW);
    GUI_RLine(300,   0, 240, YELLOW);
    GUI_RLine(320,   0, 240, YELLOW);
}

/****************************************************************************/
/******************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;            //匹配的时候 产生中断并且复位
 T1MR0=Fpclk/5000;      //定时时间为200us
 T1TCR=0x01;            //启动定时器
 
}
/*******************************************************************************/

/*************中断服务程序***********************************/
void Timer1_Exception(void)
{
    static uint32 Temp;
    //void *Temp1=(&Temp);
    OS_ENTER_CRITICAL();
    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; 
 
    /**********************************/
    OS_EXIT_CRITICAL();
    ADC_DATA1[count]=Temp;	
    OSMboxPost(Mybox,(void  *)&Temp);
}
 /*************计算平均值程序***********************************/
void AVG_CAL(uint32 *Data)
{
 uint32 i;
 uint32 Begin=0;        //循环的初始值
 uint32 AVG[4]={0};     //存放计算平均值的中间结果
 for(i=0;i<4;i++)
    {
     Begin=i*50;
     for(COU=Begin;COU<(Begin+50);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/200;
}
/***********************显示平均值*********************************/
void AVG_Display(void)
{
	AVG_CAL(ADC_DATA);  			//计算平均值
    ZLG7290ShowChar(3,ADC_DATA_AVG/1000);		
    ZLG7290ShowChar(2,(ADC_DATA_AVG%1000)/100);
    ZLG7290ShowChar(1,(ADC_DATA_AVG%100)/10);
    ZLG7290ShowChar(0,ADC_DATA_AVG%10);
}    
/**************************************************************************/                            
                            
                            
/*********************************************************************************************************
**                            Task1 任务1
                    			中速采样任务
**********************************************************/
void Task1(void *pdata)
{
 INT8U err=0;
 uint32 i,x,y;
 uint32 L=0;
 count=0;
 
 pdata=pdata;
 x=0;
 Mybox=OSMboxCreate((void*)0);      //创建一个信邮箱
 ADC_Init();                //ADC初始化
 //IRQ_init();                //IRQ初始化
T1_Init();                 //初始化T1
 
while(1) 
 {
    
   for(count=0;count<200;count++)		//从邮箱中读取采样的数据
       {
    	ADC_DATA[count]=*(uint32*)(OSMboxPend(Mybox,0,&err));	
        if((count+1)%2==0)
        	ADC_DATA_AV[maxwell]=(ADC_DATA[count-1]+ADC_DATA[count])/2;
        	
        if(maxwell>99)
        	maxwell=0;
        else	
        	maxwell++;
       }	
    
    //VICIntEnClr=1<<5;               //禁止T1的中断
    //ZLG7290ShowChar(7,0x0F);        //采样完成显示“F”
   
    /*******显示曲线******************/
    while(x<318)
      { 
       for(i=0;i<100;i++)
	     {
	     	
	     		GUI_RLine(x+1,   0, 200, BLUE);
	     		GUI_RLine(x+2,   0, 200, BLUE);
	     		GUI_RLine(x+3,   0, 200, BLUE);
	     		
	     	  while(L<200)
	     		{
	     			GUI_Point(x+1,	L,	YELLOW	);
	     			GUI_Point(x+2,	L,	YELLOW	);
	     			GUI_Point(x+3,	L,	YELLOW	);
	     			L=L+20;
	     		}
	     		L=0;
	     if(((x+1)%20)==0)
	     	{
	     		GUI_RLine(x+1,   0, 200,YELLOW);
	     	}
	     if(((x+2)%20)==0)
	     	{
	     		GUI_RLine(x+2,   0, 200, YELLOW);
	     	}
	     if(((x+3)%20)==0)
	     	{
	     		GUI_RLine(x+3,   0, 200,YELLOW);
	     	}
	     	
	     		
	     	y=100-ADC_DATA_AV[i]*K;	//K为电压与格子数的转换系数
	     	
	     	GUI_Point(x,y,RED);
		    x=x+1;   
		 }
	   }
	   x=0;	 
	/*********************************/	 
    
    OSTimeDly(100);
   
 }
 
}
 /***************************************************************************************/
/***************************************************************************
* 功    能:
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  Task0(void *pdata)
{   
   	
   	 
	
	pdata =pdata;
	TargetInit();
	
	GUI_FillSCR(WHITE);                 // 填充白色背景
	GUI_Initialize();			        // 初始化LCM  
	Coordinate();
	BAR_FillSCR(10,120,20,140,DGREEN);
	OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 2);//中速采样任务
    while(1)
    {
      
     //AVG_Display();				//显示采样的结果
     OSTimeDly(1000);
     //Line_My();						
     
    
     //OSTaskResume(2); 
    
    }
    
}
/****************************************************************************
* 功    能:创建任务
* 入口参数:无
* 出口参数:无
****************************************************************************/
int main(void)
{
	OSInit();
	OSTaskCreate(Task0,(void *)0,&TaskStk0[TaskStkLengh-1],4);
	OSStart();
	return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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