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

📄 main.c

📁 基于ucosSAEj1939的汽车组合仪表,硬件是MC9S12H128
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************************
*                                                                                       
*                      北京航空航大学 706教研室                         
*                   All rights reserved.       2005                                                 
*                                                                                       
*======================================================================================
*                                                                                       
*       文件名:         main.c                                                        
*       大纲:           主程序                  
*       文件标识:                                                                       
*       摘 要:                                                                                                                                                              
*                                                                                      
*======================================================================================
*                                                                                      
*       描述:           汽车仪表主程序                                                                                      
*                                                                                      
*       控制器:         Freescale MC9s12H256                                         
*                                                                                      
*       编译器:         Metrowerks CodeWarrior IDE v5.2.1149                            
*                                                                                      
*======================================================================================
*                                                                                      
*       当前版本:   3.1.0                                                                   
*       编程人员:   孙进,曹磊                                                                 
*       完成日期:   2006年3月                                                                                                                                                                                                   
*                                                                                       
*======================================================================================                                                                          
*
*       更新历史记录:                                                                   
*                                                                                      
***************************************************************************************/

#include <hidef.h>      /* common defines and macros */
#include <MC9S12H256.h>     /* derivative information */
#include "..\Ucos\includes.h"
#include "..\protocol stack\J1939_includes.h"
#include "..\driver\printp.h"
#include "..\driver\Motor.h"
#include "..\driver\Motor_includes.h"
#include "..\driver\lcd.h"
#include "..\driver\eeprom.h"
#include "user.h"							 

//任务栈大小定义
#define START_STK_SIZE            200
#define TASK_J1939_STK_SIZE       200
#define TASK_EngSpeed_STK_SIZE    200
#define TASK_VehSpeed_STK_SIZE    200
#define TASK_WatTemp_STK_SIZE     200
#define TASK_OilPres_STK_SIZE     200
#define TASK_VehDistance_STK_SIZE 200
#if MUTIPLE_PACKAGE_TRANSPORT
#define TASK_FaultCode_STK_SIZE   200
#endif
#define TASK_Instruc_STK_SIZE     200

//演示系统用
#define TASK_GeneralSignal_STK_SIZE        200
#define TASK_EmergSignal_STK_SIZE          200

#define START_PRIO  4
#define J1939_PRIO  5
#define EMERG_SIGNAL_PRIO  6
#define ENGSPEED_PRIO  7
#define VEHSPEED_PRIO  8
#define WATTEMP_PRIO  10
#define OILPRES_PRIO  11
#if MUTIPLE_PACKAGE_TRANSPORT
#define FAULTCODE_PRIO   12
#endif
#define INSTRUC_PRIO  13
#define VEHDISTANCE_PRIO  14
#define GENERAL_SIGNAL_PRIO  16

//水温表和油压表分为9档显示
#define STEP0 0
#define STEP1 20
#define STEP2 40
#define STEP3 60
#define STEP4 80
#define STEP5 100
#define STEP6 120
#define STEP7 140
#define STEP8 160
#define STEP9 180

/*******************************************/
	//全局变量定义
/******************************************/
OS_STK StartTaskStk[START_STK_SIZE];                   //起始任务
OS_STK TaskJ1939Stk[TASK_J1939_STK_SIZE];              //协议栈任务
OS_STK TaskEngSpeedStk[TASK_EngSpeed_STK_SIZE];			   //转速显示任务
OS_STK TaskVehSpeedStk[TASK_VehSpeed_STK_SIZE];			   //车速显示任务
OS_STK TaskWatTempStk[TASK_WatTemp_STK_SIZE];          //水温显示任务
OS_STK TaskOilPresStk[TASK_OilPres_STK_SIZE];			     //油压显示任务
OS_STK TaskVehDistanceStk[TASK_VehDistance_STK_SIZE];  //里程显示任务
OS_STK TaskInstrucStk[TASK_Instruc_STK_SIZE];          //串口指令任务
#if MUTIPLE_PACKAGE_TRANSPORT
OS_STK TaskFaultCodeStk[TASK_FaultCode_STK_SIZE];	     //故障码显示任务
#endif

void *EngSpeed_ptr;										                 //转速指针
void *VehSpeed_ptr;                                    //车速指针                                   
void *WatTemp_ptr;										                 //水温指针 
void *OilPres_ptr;                                     //油压指针
void *VehDistance_ptr;                                 //里程指针
#if MUTIPLE_PACKAGE_TRANSPORT
void *FaultCode_ptr;									                 //故障码指针
#endif
void *Instruc_ptr;									                   //串口指令指针

OS_EVENT *EngSpeed_MBox;                               //转速消息邮箱
OS_EVENT *VehSpeed_MBox;                               //车速消息邮箱
OS_EVENT *WatTemp_MBox; 							                 //水温消息邮箱
OS_EVENT *OilPres_MBox;                                //油压消息邮箱
OS_EVENT *VehDistance_MBox;                            //里程消息邮箱
OS_EVENT *Instruc_MBox;                                //串口指令邮箱
OS_EVENT *Printp_Sem;                                  //串口调用信号量
#if MUTIPLE_PACKAGE_TRANSPORT
OS_EVENT *FaultCode_MBox;                              //故障码消息邮箱
#endif

unsigned char Instruction;														 //数据请求
J1939_TX_MESSAGE_T J1939msg;													 //协议栈发送数据
extern FAULT_CODE_T FaultCode;		                     //故障码
extern VEH_DISTANCE_T VehDistance;                     //里程
INT8U err;																						 //错误

//演示系统用

OS_STK TaskGeneralSignalStk[TASK_GeneralSignal_STK_SIZE];			           //指示灯显示任务
OS_STK TaskEmergSignalStk[TASK_EmergSignal_STK_SIZE];
void *GeneralSignal_ptr;																			 //指示灯消息指针
void *EmergSignal_ptr;
OS_EVENT *GeneralSignal_MBox;                                      //指示灯消息邮箱
OS_EVENT *EmergSignal_MBox;
OS_EVENT *EmergFlg_Sem;

/*******************************************/
	//函数声明
/******************************************/
void IO_Init(void);
void RTIInit(void);
void Init_mcu(void);
void StartTask(void* pdata);
void TaskJ1939(void* pdata);
void TaskEngSpeed(void* pdata);
void TaskVehSpeed(void* pdata);
void TaskWatTemp(void* pdata);
void TaskOilPres(void* pdata);
#if MUTIPLE_PACKAGE_TRANSPORT
void TaskFaultCode(void* pdata);
#endif
void TaskInstruc(void* pdata);
void TaskVehDistance(void* pdata);
void SCIReceive_ISR(void);

//演示系统用
void TaskGeneralSignal(void* pdata);
void TaskEmergSignal(void* pdata);

/****************************************************************************************
@函数名称           : void main(void)           
@参数               : None 
@返回值             : None
@描述               : 主程序
@作者               : 孙进,曹磊
@最后编辑时间       : 2006-03-31
@版本               : V3.1.0
*****************************************************************************************/
void main(void) 
{
    
  	OSInit();	
    
    OSTaskCreate(StartTask, (void*)0, (void*)&StartTaskStk[START_STK_SIZE-1], START_PRIO);
    
    //信号量创建	
  	Printp_Sem = OSSemCreate(1);
  	EmergFlg_Sem = OSSemCreate(0);
  	
  	//邮箱创建
  	EngSpeed_MBox = OSMboxCreate(EngSpeed_ptr);
  	VehSpeed_MBox = OSMboxCreate(VehSpeed_ptr);
  	WatTemp_MBox = OSMboxCreate(WatTemp_ptr);
  	OilPres_MBox = OSMboxCreate(OilPres_ptr);
  	VehDistance_MBox = OSMboxCreate(VehDistance_ptr);
    #if MUTIPLE_PACKAGE_TRANSPORT 
  	FaultCode_MBox = OSMboxCreate(FaultCode_ptr);  	 
  	#endif
  	Instruc_MBox = OSMboxCreate(Instruc_ptr); 	
  	//演示系统用
  	GeneralSignal_MBox = OSMboxCreate(GeneralSignal_ptr);
  	EmergSignal_MBox = OSMboxCreate(EmergSignal_ptr);
   	
   	
    OSStart();	
}

/****************************************************************************************
@函数名称           : void IO_init(void)           
@参数               : None 
@返回值             : None
@描述               : 初始化函数,设置 PORTH,PORTJ,PORTL为输出方式;
                      并设置IO口驱动能力为Full drive strength
@作者               : 孙进
@最后编辑时间       : 2006-03-31
@版本               : V3.1.0
*****************************************************************************************/
void IO_Init(void)
{
    DDRH = 0xff;
    RDRH = 0;
  
    DDRJ = 0x0f;
    RDRJ = 0;
  
    DDRL = 0xe0;
    RDRL = 0;
  
    DDRT = 0xc0;
    RDRT = 0;
    
    PTH = 0x0;
    PTJ = 0x0;
    PTL = 0x0;
}

/****************************************************************************************
@函数名称           : void RTIIinit(void)           
@参数               : None 
@返回值             : None
@描述               : RTI初始化函数,设置在16M晶振情况下产生20.48ms定时中断
                      并允许RTI中断
@作者               : 孙进
@最后编辑时间       : 2006-03-31
@版本               : V3.1.0
*****************************************************************************************/
void RTIInit(void) 
{
    RTICTL = 0x69;    //产生,16M晶振的情况下
    CRGINT_RTIE = 1;  //允许RTI中断    
}

/****************************************************************************************
@函数名称           : void Init_mcu(void)           
@参数               : None 
@返回值             : None
@描述               : 硬件及J1939协议栈初始化函数
@作者               : 孙进
@最后编辑时间       : 2006-03-31
@版本               : V3.1.0
*****************************************************************************************/
void Init_mcu(void)
{
    uart_init();				//初始化UART
    IO_Init();					//初始化IO
    InitLcd();					//初始化LCD
    init_motor1();			//初始化motor1
    init_motor2();			//初始化motor2
    init_motor3();			//初始化motor3
    init_motor4(); 			//初始化motor4
    J1939_stk_init();		//初始化协议栈
    init_timer(); 			//初始化用于motor的定时器
    RTIInit();					//初始化RTI
    
    DisplayNone();
          
    DisplayTripDistance(0, 0);
    DisplayTotalDistance(0);
}

/****************************************************************************************
@函数名称           : void StartTask(void* pdata)           
@参数               : void* pdata 
@返回值             : None
@描述               : 起始任务
@作者               : 曹磊
@最后编辑时间       : 2006-08-13
@版本               : V3.1.0
*****************************************************************************************/
void StartTask(void* pdata) 
{
    unsigned char err;
  	pdata = pdata;
  	
  	Init_mcu(); 
  	EnableInterrupts; 	
  	back0_motor();		//回零
  	
  	OSTaskCreate(TaskJ1939, (void*)0, (void*)&TaskJ1939Stk[TASK_J1939_STK_SIZE-1], J1939_PRIO);
  	OSTaskCreate(TaskEngSpeed, (void*)0, (void*)&TaskEngSpeedStk[TASK_EngSpeed_STK_SIZE-1], ENGSPEED_PRIO);	
  	OSTaskCreate(TaskVehSpeed, (void*)0, (void*)&TaskVehSpeedStk[TASK_VehSpeed_STK_SIZE-1], VEHSPEED_PRIO);
  	OSTaskCreate(TaskWatTemp, (void*)0, (void*)&TaskWatTempStk[TASK_WatTemp_STK_SIZE-1], WATTEMP_PRIO);
  	OSTaskCreate(TaskOilPres, (void*)0, (void*)&TaskOilPresStk[TASK_OilPres_STK_SIZE-1], OILPRES_PRIO);
    OSTaskCreate(TaskVehDistance,(void*)0,(void*)&TaskVehDistanceStk[TASK_VehDistance_STK_SIZE-1],VEHDISTANCE_PRIO);  
  	#if MUTIPLE_PACKAGE_TRANSPORT 
    OSTaskCreate(TaskFaultCode,(void*)0,(void*)&TaskFaultCodeStk[TASK_FaultCode_STK_SIZE-1], FAULTCODE_PRIO);
		#endif
    OSTaskCreate(TaskInstruc,(void*)0,(void*)&TaskInstrucStk[TASK_Instruc_STK_SIZE-1],INSTRUC_PRIO);

    OSTaskCreate(TaskGeneralSignal,(void*)0,(void*)&TaskGeneralSignalStk[TASK_GeneralSignal_STK_SIZE-1],GENERAL_SIGNAL_PRIO);
  	OSTaskCreate(TaskEmergSignal,(void*)0,(void*)&TaskEmergSignalStk[TASK_EmergSignal_STK_SIZE-1],EMERG_SIGNAL_PRIO);
  	
  	for(;;) 
  	{
  	    err = OSTaskSuspend(START_PRIO);
  	
  	}
}

/****************************************************************************************
@函数名称           : void TaskJ1939(void* pdata)           
@参数               : void* pdata 
@返回值             : None
@描述               : J1939协议栈任务
@作者               : 孙进
@最后编辑时间       : 2006-03-31
@版本               : V3.1.0
*****************************************************************************************/
void TaskJ1939(void* pdata) 
{
  	pdata = pdata;
  	
  	for(;;) 
  	{
  	    J1939_stk_periodic();
  	    OSTimeDly(1);						 //任务挂起20ms
  	}
}
 
/****************************************************************************************
@函数名称           : void TaskEngSpeed(void* pdata)           
@参数               : void* pdata 
@返回值             : None
@描述               : 发动机速度任务
@作者               : 孙进,曹磊
@最后编辑时间       : 2006-03-31
@版本               : V3.1.0
*****************************************************************************************/
void TaskEngSpeed(void* pdata) 
{
  	unsigned char err;
  	unsigned int *msg;
  	
    unsigned int tacho;
  	unsigned int tachostep;
  	unsigned int step;
  	char result;
      
    pdata = pdata;
      
    for(;;) 
    {	
        msg = (unsigned int*)OSMboxPend(EngSpeed_MBox, 0, &err);
        if(err == OS_NO_ERR) 
        {
    	    	 
            tacho = *msg;
            tacho = tacho >> 8;    //换算为转角
            step = tacho * 69;     //换算为电机步数
            tachostep = (unsigned int)(step); 
            result = motor_move(TACHOMETER,tachostep);          
        } 
        OSTimeDly(10);  				   //任务挂起200ms
    }    
} 

/****************************************************************************************
@函数名称           : void TaskVehSpeed(void* pdata)           
@参数               : void* pdata 
@返回值             : None
@描述               : 车辆速度任务
@作者               : 孙进,曹磊
@最后编辑时间       : 2006-03-31
@版本               : V3.1.0
*****************************************************************************************/
void TaskVehSpeed(void* pdata) 
{
  	unsigned char err;
  	unsigned int *msg;
  	
   	unsigned int speed;
  	unsigned int speedstep;
  	unsigned int step;
  	char result;
    
    pdata = pdata;
      
    for(;;) 
    {		
        msg = (unsigned int*)OSMboxPend(VehSpeed_MBox, 0, &err);
        if(err == OS_NO_ERR) 
        {
    	    	 
            speed = *msg;
            speed = speed >> 8;			//换算为转角
            step = speed * 84;			//换算为电机步数
            speedstep = (unsigned int)(step);   
            result = motor_move(SPEEDOMETER,speedstep);           
        }
        OSTimeDly(10); 					    //任务挂起200ms
    }    
}

/****************************************************************************************
@函数名称           : void TaskWatTemp(void* pdata)           
@参数               : void* pdata 
@返回值             : None
@描述               : 冷却液温度任务
@作者               : 孙进,曹磊
@最后编辑时间       : 2006-03-31
@版本               : V3.1.0
*****************************************************************************************/
void TaskWatTemp(void* pdata) 
{

⌨️ 快捷键说明

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