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

📄 main.c

📁 基于LPC2200实验箱的中速采样源代码
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"

#define	TaskStkLengh	512		//Define the Task0 stack length 定义用户任务0的堆栈长度
OS_STK	TaskStk0 [TaskStkLengh];		//Define the Task0 stack 定义用户任务0的堆栈
OS_STK	TaskStk1 [TaskStkLengh];
OS_EVENT * Mybox=NULL;

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;

/******************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;			//启动定时器
 
}
/*******************************************************************************/
/*****************IRQ 初始化******************************************************/
void IRQ_init(void)
{
 VICIntEnable=(1<<5);		//使能定时器1
}
/*************中断服务程序***********************************/
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);		//向邮箱之中发送消息
	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;
}
/*********************************************************************************************************
**                            Task1 任务1
								高速采样任务
**********************************************************/
void Task1(void *pdata)
{
 INT8U err=0;
 //uint32 * DATA_P=NULL;
 pdata=pdata;
 count=0;
 Mybox=OSMboxCreate((void*)0);		//创建一个信邮箱
 ADC_Init();				//ADC初始化
 IRQ_init();				//IRQ初始化
 T1_Init();					//初始化T1
 
 for(count=0;count<200;count++)
  	{
//  		ADC_DATA[count]=(uint32)(uint32*)(OSMboxPend(Mybox,0,&err));      //邮箱返回的是一个指针 	
  	ADC_DATA[count]=*(uint32*)(OSMboxPend(Mybox,0,&err));	
	//OSTimeDlyHMSM(0,0,0,4);
  	}	
 	
 	VICIntEnClr=1<<5;				//禁止T1的中断
 	ZLG7290ShowChar(7,0x0F);		//采样完成显示“F”
 	OSMboxDel(Mybox,OS_DEL_ALWAYS,&err);		//删除邮箱
 	OSTaskDel(OS_PRIO_SELF);				//删除任务
 }
/*********************************************************************************************************
**                            Task0 任务0
								键盘任务
********************************************************************************************************/

		void Task0	(void *pdata)
{
	uint32 KEY=0;
	uint32 KEY0=0;
	uint32 i=0;
	pdata = pdata;
	TargetInit ();
	
 while (1)
	{
		OSTimeDly(10);
        KEY0=ZLG7290GetKey();
        OSTimeDly(6);
        KEY=ZLG7290GetKey();
        if((KEY==0)||(KEY>16)||(KEY!=KEY0))
        	{
        		OSTimeDly(4);
        		continue;
        	}
        switch(KEY)	
        	{
        		case 11:									//创建采样任务
        				{
        					OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 2);//高速采样任务
        					break;
        				}
        		case 12:									//显示采样平均值
        				{
        					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);
   							break;
   						}
   				case 13:									//显示全部数据
   						{
   							if(COU>199)
   								COU=0;
   							else
   								COU++;
   							ZLG7290ShowChar(7,ADC_DATA[COU]/1000);		
        					ZLG7290ShowChar(6,(ADC_DATA[COU]%1000)/100);
   							ZLG7290ShowChar(5,(ADC_DATA[COU]%100)/10);
   							ZLG7290ShowChar(4,ADC_DATA[COU]%10);
   							break;
   						}
   				case 14:									//清屏
   						{
   							for(i=0;i<8;i++)
   							ZLG7290ShowChar(i,0x1F);
   							break;
   						}
   				default:
   							break;
   			}
	}
}

/*********************************************************************************************************
**                            Main Function
********************************************************************************************************/

       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 + -