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

📄 main.c

📁 包括使用ucos任务的一些操作实现了lpc2142上的一些基本功能:按键、流水灯
💻 C
字号:
/*************************************************************************************
** Copyright (c) XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
** http:XXXXXXXXXXXXXXX

**文件名称:MAIN.C
**功能说明:LPC2142的大部分功能实验主函数,包括按键、中断,beep、流水灯、定时器、RTC、AD/DA、
			UART、LCD。
**使用说明:

** 当前版本: 1.0
** 作    者:  xxx
** 完成日期:  2007年xx月xx号

*************************************************************************************/
/************************************************************************************
引脚分布
P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7
TX0	 RX0			CS1		  K4   K3

P0.8 P0.9 P0.10 P0.11 P0.12 P0.13 P0.14 P0.15
TX1	 RX1  RW 	SCL	  SDA	 K1	  VRST	K2

P0.16 P0.17 P0.18 P0.19 P0.20 P0.21 P0.22 P0.23
BEEP  SCK1	MISO  MOSI	SSEL  RS_COM RW	   VB
P0.24 P0.25 P0.26 P0.27 P0.28 P0.29 P0.30 P0.31
	  AOUT	D+	   D-	A_IN1 A_IN2	 CS2   ULED

LED引脚
L1---------L8
P1.16----P1.23
***********************************************************************************/
#include "config.h"
#include "stdlib.h"
#include "common.h"

#define	TaskStkLengh	64				//Define the Task0 stack length 定义用户任务0的堆栈长度
 								   	
OS_STK	TaskStk [TaskStkLengh];			//Define the Task0 stack 定义用户任务0的堆栈
OS_STK	TaskStk1 [TaskStkLengh];		//Define the Task1 stack 定义用户任务1的堆栈
OS_STK	TaskStk2 [TaskStkLengh];		//Define the Task1 stack 定义用户任务2的堆栈
OS_STK	TaskStk3 [TaskStkLengh];		//Define the Task1 stack 定义用户任务3的堆栈
OS_STK	TaskStk4 [TaskStkLengh];		//Define the Task1 stack 定义用户任务4的堆栈
OS_STK	TaskStk5 [TaskStkLengh];		//Define the Task1 stack 定义用户任务5的堆栈
OS_STK	TaskStk6 [TaskStkLengh];		//Define the Task1 stack 定义用户任务6的堆栈

OS_EVENT	*UartDataSem;				//定义信号量
OS_EVENT	*UartDataBox;				//定义邮箱
OS_EVENT	*UartDataQuee;				//定义消息队列

void 	Task0(void *pdata);			//Task0 任务0
void 	Task1(void *pdata);			//Task1 任务1
void 	Task2(void *pdata);			//Task1 任务2
void 	Task3(void *pdata);			//Task1 任务3
void 	Task4(void *pdata);			//Task1 任务4
void 	Task5(void *pdata);			//Task1 任务5
void 	Task6(void *pdata);			//Task1 任务6


RTCTIME	NowTime;				   //定义当前时间


int main (void)
{  	void *MessageStorage[10] ;	  //定义用于创建消息队列的数组指针
   	


	OSInit ();		
	
	//UartDataSem=OSSemCreate(0);						//创建信号量
	//UartDataBox=OSMboxCreate(0); 						//创建邮箱
	UartDataQuee=OSQCreate(MessageStorage,10); 			//创建消息队列
	
																									
	OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2);	//创建任务0
			
	OSStart ();
	return 0;															
}
/*********************************************************************************************************
**                            Task0 任务0
**						初始化目标板并创建其他任务
********************************************************************************************************/

void Task0	(void *pdata)
{
	pdata = pdata;
	TargetInit (); 						//初始化目标板


	//创建其它任务
	OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 3);
	OSTaskCreate (Task2,(void *)0, &TaskStk2[TaskStkLengh - 1], 4);
	OSTaskCreate (Task3,(void *)0, &TaskStk3[TaskStkLengh - 1], 5);
	OSTaskCreate (Task4,(void *)0, &TaskStk4[TaskStkLengh - 1], 6);
	OSTaskCreate (Task5,(void *)0, &TaskStk5[TaskStkLengh - 1], 8);
	OSTaskCreate (Task6,(void *)0, &TaskStk6[TaskStkLengh - 1], 7);
	while (1)
	{
		
		OSTimeDly(10);

	}
}
/*********************************************************************************************************
**                            Task1 任务1
						按键1激活输出周期100ms的流水灯
********************************************************************************************************/

void Task1	(void *pdata)
{  INT8U j=0;

	pdata = pdata;

	
	while (1)
	{	
	 OSTaskSuspend(3);						//挂起本任务,由按键1激活

		
	IO1PIN=~((1<<16)<<j);					//输出流水灯
	j++;
	if(j==8) j=0;
 	OSTimeDlyHMSM(0,0,0,100);
	}
 }
		
/*********************************************************************************************************
**                            Task2 任务2
						 按键2激活输出周期流水灯,周期由AIN2控制
********************************************************************************************************/

void Task2	(void *pdata)
{  
	INT8U i=0;
	INT16U	AdData1;
	INT16U	AdData2; 

	pdata = pdata;	
	while(1)
	{	
		OSTaskSuspend(4);								 //挂起本任务,由按键1激活
//		AD_Start(1);						
//		AdData1=Get_ADData();
		AD_Start(2);						
		AdData2=Get_ADData();							//采集AIN2的数据
		if((AdData2<100)||(AdData2>1000))
	  	AdData2=900;

		IO1PIN=~((1<<16)<<i);							//输出流水灯
		i++;
		if(i==8) i=0;
		OSTimeDlyHMSM(0,0,0,AdData2);		  
	}
}
/*********************************************************************************************************
**                            Task3 任务3
				按键3激活采集温度(AIN1)电压(AIN2)数据 并通过消息队列发送给TASK6
********************************************************************************************************/

void Task3	(void *pdata)
{  	INT8U err;
	INT16U	AdData1;
	INT16U	AdData2; 

	INT8U 	NowThermal;
	INT16U	NowVolt;
	INT16U	DataSend[9];
	
	pdata = pdata;	
	while(1)
	{	
		OSTaskSuspend(5);
		AD_Start(1);						
		AdData1=Get_ADData();
		AD_Start(2);						
		AdData2=Get_ADData();
		//NowThermal=AdData1*100/1024;				//实际的采样值
		NowThermal=60;								//软件模拟用假设值
		//NowVolt=AdData1*3300/1024;
		NowVolt=700;
		NowTime=Get_RTCTime();						//获取当前时间
		DataSend[0]= NowThermal;
		DataSend[1]= NowVolt;
		DataSend[2]= NowTime.year;
		DataSend[3]= NowTime.mon;
		DataSend[4]= NowTime.dom;
		DataSend[5]= NowTime.dow;
		DataSend[6]= NowTime.hour;
		DataSend[7]= NowTime.min;
		DataSend[8]= NowTime.sec;

		//可以采用下面三种方法进行与TASK6的通讯

		//err=OSSemPost(UartDataSem);						//发送信号量
		//err=OSMboxPost(UartDataBox,(void *)&NowThermal);	//发送邮箱
		
		err=OSQPost(UartDataQuee,(void *)DataSend);	 		//发送消息队列
		
		//OSTaskResume(4)	;
		
		OSTimeDlyHMSM(0,0,0,100);
			
		}
}
		 
/*********************************************************************************************************
**                            Task4
				按键4使系统进入掉电模式,按外部中断1恢复正常模式
********************************************************************************************************/

void Task4	(void *pdata)
{  
	pdata = pdata;	
	while(1)
	{	
		OSTaskSuspend(6);
		Power_Con();
		PllVpb_Ini();

		OSTimeDlyHMSM(0,0,0,100);
	}


}
	

  


/*********************************************************************************************************
**                            Task2 任务2
								获取按键
********************************************************************************************************/

void Task5	(void *pdata)
{  	INT8U 	KeyNum;
	INT8U  LastKey;
	pdata = pdata;

	while (1)
	{
	 	
	KeyNum=Scan_Key();								//获取当前按键,只有按下的时候是键值,弹起来后键值为0

	/******************************************************************
	对键值的处理:没有建按下的时候键值按前一个键值处理,键4除外
	********************************************************************/
	if((LastKey!=NO_KEY)&&(KeyNum!=NO_KEY)) LastKey=KeyNum;
	else if(KeyNum	!=NO_KEY)
	LastKey=KeyNum;
	if (KeyNum== NO_KEY)
	  {
							
	  	if (LastKey== KEY1)
			KeyNum=KEY1;
		if (LastKey== KEY2)
			KeyNum=KEY2;
		if (LastKey== KEY3)
			KeyNum=KEY3;
		if (LastKey== KEY4)
			KeyNum=NO_KEY;
	
	   }

   
	/**********************恢复各任务***********************************************/

	 switch(KeyNum)
	   {case KEY1: OSTaskResume(3); break;
	    case KEY2: OSTaskResume(4); break;
		case KEY3: OSTaskResume(5); break;
		case KEY4: OSTaskResume(6); break;
		}
	OSTimeDlyHMSM(0,0,0,10);
	}
}  

/*********************************************************************************************************
**                            Task6 
				串口发送某1时刻的温度,电压,由任务3触发
********************************************************************************************************/

void Task6	(void *pdata)
{  	INT16U *msg;
	INT8U err;
	INT8U NowThermal;
	INT16U	NowVolt;
	pdata = pdata;	
	while(1)
	{
		//OSTaskSuspend(4);
		//OSSemPend(UartDataSem,0,&err);			//	获取信号量(不能传送值,需要将NowThermal定义成外部全局变量
		//msg=OSMboxPend(UartDataBox,0,&err);		//  获取邮箱(每次只能传送一个值)
		msg=OSQPend(UartDataQuee,0,&err);			//	获取消息队列(一次传送所有数据)

		NowThermal=msg[0];
		NowVolt=msg[1];
		NowTime.year=msg[2];
		NowTime.mon=msg[3];
		NowTime.dom=msg[4];
		NowTime.dow=msg[5];
		NowTime.hour=msg[6];
		NowTime.min=msg[7];
		NowTime.sec=msg[8];
		Uart1_SendString("thermal:");
		Uart1_SendByte(NumToChar(NowThermal/100));
		Uart1_SendByte(NumToChar((NowThermal%100)/10));
		Uart1_SendByte(NumToChar(NowThermal%10));
	    Uart1_SendByte('\n');

		Uart1_SendString("Voltage:");
		Uart1_SendByte(NumToChar(NowVolt/1000));
		Uart1_SendByte(NumToChar((NowVolt%1000)/100));
		Uart1_SendByte(NumToChar((NowVolt%100)/10));
		Uart1_SendByte(NumToChar(NowVolt%10));
	    Uart1_SendByte('\n');

		Uart1_SendString("year:");
		Uart1_SendByte(NumToChar(NowTime.year/1000));
		Uart1_SendByte(NumToChar((NowTime.year%1000)/100));
		Uart1_SendByte(NumToChar((NowTime.year%100)/10));
		Uart1_SendByte(NumToChar(NowTime.year%10));
	    Uart1_SendByte('\n');

		Uart1_SendString("month:");
		Uart1_SendByte(NumToChar(NowTime.mon/10));
		Uart1_SendByte(NumToChar(NowTime.mon%10));
	    Uart1_SendByte('\n');

		Uart1_SendString("date:");
		Uart1_SendByte(NumToChar(NowTime.dom/10));
		Uart1_SendByte(NumToChar(NowTime.dom%10));
	    Uart1_SendByte('\n');

		Uart1_SendString("weekday:");
		Uart1_SendByte(NumToChar(NowTime.dow));
	    Uart1_SendByte('\n');

		Uart1_SendString("hour:");
		Uart1_SendByte(NumToChar(NowTime.hour/10));
		Uart1_SendByte(NumToChar(NowTime.hour%10));
	    Uart1_SendByte('\n');

		Uart1_SendString("minute:");
		Uart1_SendByte(NumToChar(NowTime.min/10));
		Uart1_SendByte(NumToChar(NowTime.min%10));
	    Uart1_SendByte('\n');

		Uart1_SendString("second:");
		Uart1_SendByte(NumToChar(NowTime.sec/10));
		Uart1_SendByte(NumToChar(NowTime.sec%10));
	    Uart1_SendByte('\n');
		Uart1_SendByte('\n');

	//	OSTimeDlyHMSM(0,0,0,1000);
	}
}
	 
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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