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

📄 main.c

📁 驾驶员考试电桩考试系统的车载程序
💻 C
字号:
/****************************************************************************
* 文件名:DATARET.C
* 功能:使用串口UART0接收上位机发送的数据,当接收到8个连续数据后,将接收计数值加一后输
*      出LED1--LED8显示,并将数据原封不动地发送回上位机。
* 说明:将跳线器JP8短接。
*      通讯波特率115200,8位数据位,1位停止位,无奇偶校验。
****************************************************************************/
#include "config.h" 
#include "UART0_V1.0.h" 
#include "UART1_V1.0.h" 
#include "LCD_control.h"
#include "ScreenShow.h"
#include "CarInfor.h"

//my data 
uint8  SendBuf[16];						// UART0数据发送缓冲区
uint32 GPIO_input1;
uint32 GPIO_input2;
uint32 GPIO_input3;
uint8 byCarStatus;
uint8 byOldCarStatus;

uint16 u16Message[8];
uint16 u16Name[6];
uint8 u8ExamNo[18];


void delay(int t)
{
	int i=0;
	int n;
 
	for(i=0;i<t;i++)
	{
		for(n=0;n<10;n++){}
	}
}

/****************************************************************************
* 名称:IRQ_Eint2()
* 功能:外部中断EINT2服务函数。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_Eint2(void)
{  uint32  i;
   
   i = IO0SET;						// 读取当前B1控制值
   /* 等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位) */
   while( (EXTINT&0x04)!=0 )		
   {  EXTINT = 0x04;				// 清除EINT1中断标志
   }
   
   VICVectAddr = 0;					// 向量中断结束
}

//================================================================
/****************************************************************************
* 名称:main()
* 功能:初始化串口,并等待接收到串口数据。
* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
****************************************************************************/
int  main(void)
{  
	uint8 i;
	uint32 iGetCarStatusCounter;
	uint8 bSendSelt;
	uint8 byPowerJustOn;
	uint16 u16CarStatusSendOK;
	
	//2008-10-25
	uint8 byReSendCounter;  
	uint8 byMainBoardClose;

	u16Message[0]=0xBFBC;	//考试尚未开始
	u16Message[1]=0xCAD4;
	u16Message[2]=0xC9D0;
	u16Message[3]=0xCEB4;
	u16Message[4]=0xBFAA;
	u16Message[5]=0xCABC;
	u16Message[6]=0xA0A1;
	u16Message[7]=0xA0A1;

	u16Name[0]=0xBCD7;		//霍元甲
	u16Name[1]=0xBCD7;		//霍元甲
	u16Name[2]=0xBCD7;		//霍元甲
	u16Name[3]=0xBCD7;		//霍元甲
	u16Name[4]=0xA0A1;		//霍元甲
	u16Name[5]=0xA0A1;		//霍元甲

	u8ExamNo[0]=0x31;	//1
	u8ExamNo[1]=0x32;	//2
	u8ExamNo[2]=0x33;	//3
	u8ExamNo[3]=0x34;	//4
	u8ExamNo[4]=0x35;	//5
	u8ExamNo[5]=0x36;	//6
	u8ExamNo[6]=0x37;	//7
	u8ExamNo[7]=0x38;	//8
	u8ExamNo[8]=0x39;	//9
	u8ExamNo[9]=0x30;	//0
	u8ExamNo[10]=0x31;	//1
	u8ExamNo[11]=0x32;	//2
	u8ExamNo[12]=0x33;	//3
	u8ExamNo[13]=0x34;	//4
	u8ExamNo[14]=0x35;	//5
	u8ExamNo[15]=0x36;	//6
	u8ExamNo[16]=0x37;	//7
	u8ExamNo[17]=0x38;	//8
	
	PinSet_PINSEL2();
	PinSet_Dir();
	CarInforPinSet();
	SpeakerPinSet();
	Speak(0x00);
	
	for(i=0;i<50;i++)delay(20000);

	init_lcd();						// 初始化LCD接口
	clearhz();						// 清空屏幕

	UART0_Ini(9600,8,1,2);        // 初始化串口模式
	UART1_Ini(9600,8,1,2);        // 初始化串口模式

	for(i=0;i<50;i++)delay(20000);

	ShowTitle(2,0);
	ShowMessage(3,19,u16Message,8);
	ShowName(3,40,u16Name,6);
	ShowExamNo(1,57,u8ExamNo,18);
	
	ShowCarStatus(1,76,0);
	ShowDoorStatus(1,95,0);
	ShowCompony(1,112);

	bSendSelt=TRUE;
	byPowerJustOn=0;
	u16CarStatusSendOK=25500;
	byMainBoardClose=FALSE;
	
//	for(i=0;i<0x10;i++)
//		testLCD_interface();
//		Speak(i);
//		Speak(0);
//		Speak(1);
//		Speak(0x0A);
//		Speak(0x0B);


	while(1)       
	{   
		if(byPowerJustOn==0)
		{
			byPowerJustOn++;
			UART1_ISendBuf(0x01,0x90,SendBuf,0x00);
		}
		//串口接收缓冲器里是否有待处理的数据。
		if(byU1RcvBufOK==0x01)
		{
			if(UART1_CheckRcvData(byU1RcvBuf)==0)
			{
				//解析通信含义。
				if(byU1RcvBuf[4]==0x60)//PC要求切换通道
				{
					SendBuf[0]=0x01;	
					UART1_ISendBuf(0x01,0x50,SendBuf,0x01);
				}
				else if(byU1RcvBuf[4]==0x61)//PC要求刹车
				{
					BrakeControl(byU1RcvBuf[5]);
					SendBuf[0]=byU1RcvBuf[5];
					UART1_ISendBuf(0x01,0x51,SendBuf,0x01);
				}
				else if(byU1RcvBuf[4]==0x62)//PC通知车载考试开始
				{
					Speak(0x0B);
					UART1_ISendBuf(0x01,0x52,SendBuf,0x00);
				}
				
				else if(byU1RcvBuf[4]==0x63)//PC通知车载考试结束
				{
					if(byU1RcvBuf[5]==0x1)
						Speak(0x04);
					else
						Speak(0x03);
					
					SendBuf[0]=byU1RcvBuf[5];
					UART1_ISendBuf(0x01,0x53,SendBuf,0x01);
				}
				else if(byU1RcvBuf[4]==0x64)//PC通知车载考试过程中出现违规,违规内容见附加信息:
				{
				
					Speak(byU1RcvBuf[5]);		//语音在RcvBuf[5]
					BrakeControl(byU1RcvBuf[6]);

					SendBuf[0]=byU1RcvBuf[5];
					SendBuf[1]=byU1RcvBuf[6];
					UART1_ISendBuf(0x01,0x54,SendBuf,0x02);
				}
				else if(byU1RcvBuf[4]==0x65)//PC向车载发送"提示信息"内容
				{
					for(i=0;i<(byU1RcvBuf[3]-7)/2;i++)
						u16Message[i]=byU1RcvBuf[i*2+5]*0x100+byU1RcvBuf[i*2+6];
					for(;i<8;i++)
						u16Message[i]=0xA0A1;
						
					ShowMessage(3,19,u16Message,8);

					UART1_ISendBuf(0x01,0x55,SendBuf,0x00);
				}
				else if(byU1RcvBuf[4]==0x66)//PC向车载发送"考生姓名"内容
				{
					for(i=0;i<(byU1RcvBuf[3]-7)/2;i++)
						u16Name[i]=byU1RcvBuf[i*2+5]*0x100+byU1RcvBuf[i*2+6];
					for(;i<6;i++)
						u16Name[i]=0xA0A1;

					ShowName(3,40,u16Name,6);

					UART1_ISendBuf(0x01,0x56,SendBuf,0x00);
				}
				else if(byU1RcvBuf[4]==0x67)//PC向车载发送"考生考号"内容
				{
					for(i=0;i<(byU1RcvBuf[3]-7);i++)
						u8ExamNo[i]=byU1RcvBuf[i+5];
					for(;i<18;i++)                  
						u8ExamNo[i]=0x0;

					ShowExamNo(1,57,u8ExamNo,18);

					UART1_ISendBuf(0x01,0x57,SendBuf,0x00);
				}
				else if(byU1RcvBuf[4]==0x68)//PC允许车载主动回传信息,即PC处于接收状态
				{
					SendBuf[0] = byCarStatus;
					UART1_ISendBuf(0x01,0x58,SendBuf,0x01);
					bSendSelt=TRUE;
				}
				else if(byU1RcvBuf[4]==0x69)//PC禁止车载主动回传信息,即PC处于主动发送状态
				{
					SendBuf[0] = byCarStatus;
					UART1_ISendBuf(0x01,0x59,SendBuf,0x01);
					bSendSelt=FALSE;
				}
				else if(byU1RcvBuf[4]==0x6A)//PC要求车载马上回传信息,即PC处于接收状态
				{
					SendBuf[0] = byOldCarStatus;
					UART1_ISendBuf(0x01,0x5A,SendBuf,0x01);
				}
				else if(byU1RcvBuf[4]==0x30)//PC向车载询问通信错误,并复位这些错误的记录。
				{
					SendBuf[0]=byU1RcvBuf[4];
					SendBuf[1]=byUART1_RcvFlag;
					UART1_ISendBuf(0x01,0x31,SendBuf,0x02);
					byUART1_RcvFlag=0;
				}
				else if(byU1RcvBuf[4]==0x91)//PC向车载询问通信错误,并复位这些错误的记录。
				{
					byPowerJustOn=255;
				}
				else if(byU1RcvBuf[4]==0x99)//PC向车载询问通信错误,并复位这些错误的记录。
				{
					u16CarStatusSendOK=25500;
				}
				else						//车载收到没有定义的信息。
				{
					SendBuf[0]=byU1RcvBuf[4];
					SendBuf[1]=byUART1_RcvFlag;
					UART1_ISendBuf(0x01,0x32,SendBuf,0x02);
					byUART1_RcvFlag=0;
				}
			}
			else
			{
				SendBuf[0]=byU1RcvBuf[4];
				SendBuf[1]=byUART1_RcvFlag;
				UART1_ISendBuf(0x01,0x33,SendBuf,0x02);
				byUART1_RcvFlag=0;
			}
			byU1RcvBufOK=0;				
		}
		else
		{
			iGetCarStatusCounter++;
			if(iGetCarStatusCounter>10)
			{
				iGetCarStatusCounter=0;
				byCarStatus = GetCarStatus(20000,20000);
				if(byOldCarStatus!=byCarStatus)
				{
					byOldCarStatus=byCarStatus;
					ShowCarStatus(1,76,(byCarStatus & 0x0F));
					if(bSendSelt)
					{
						SendBuf[0] = byOldCarStatus;
						UART1_ISendBuf(0x01,0x98,SendBuf,0x01);
						u16CarStatusSendOK=0;
						byReSendCounter=0;
						byMainBoardClose=FALSE;
					}
				}
				//上电消息是否需要重新发。
				if(byPowerJustOn<250)
				{
					if(byPowerJustOn<200)
						byPowerJustOn++;
					else
					{
						byPowerJustOn=255;
						UART1_ISendBuf(0x01,0x90,SendBuf,0x00);
					}
				}
				//车状态没有发送到数传电台,需要重新发送。
				if(u16CarStatusSendOK<25000 && byMainBoardClose==FALSE)
				{
					if(u16CarStatusSendOK<20000)
						u16CarStatusSendOK++;
					else
					{
						if(byReSendCounter<5)
						{
							u16CarStatusSendOK=0;
							byReSendCounter++;
						}
						else
						{
							byMainBoardClose=TRUE;
						}
						
						SendBuf[0] = byOldCarStatus;
						UART1_ISendBuf(0x01,0x98,SendBuf,0x01);
						u16CarStatusSendOK=FALSE;
					}
				}
			}

		}
		delay(2);
	}
	return(0);
}


⌨️ 快捷键说明

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