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

📄 main.c

📁 LPC2106 控制 GPRS 铁电存储器 时钟等源码
💻 C
字号:

#include "config.h"

/* 定义串口模式设置数据结构 */
typedef struct UartMode
{
	uint8 datab;		// 字长度,5/6/7/8可选
	uint8 stopb;		// 停止位,1/2可选
	uint8 parity;		// 奇偶校验位,0-无校验,1-奇校验,2-偶校验
}UARTMODE;

uint8 temp_uart0,temp_uart1;
uint16 Len_u0,Len_u1;
uint8 cp_re1[250];
uint8 cp_re0[250];
uint8 GPS_Flag = 0;
uint8 Pluse_u0 = 0;

uint8 Longitude[20];//jingdu
uint8 latitude[20];//weidu
uint8 height[20];//gaodu
/*
*********************************************************************************************************
** 函数名称 :IRQ_UART0()
** 函数功能 :串口0接收中断服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/

/*
*********************************************************************************************************
** 函数名称 :UART0_SendByte()
** 函数功能 :向串口0发送1字节数据
** 入口参数 :dat	要发送的数据
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendByte (uint8 dat)
{
	U0THR = dat;	// 要发送的数据
	while ((U0LSR & 0x40) == 0);	// 等待数据发送完毕
}


void SendStr_U0(uint8 *str,uint16 len)
{
	uint16  i;
	for(i=0;i<len;i++)
	{
		UART0_SendByte(str[i]);
	}

}


void __irq IRQ_UART0 (void)
{

	
	if ((U0IIR & 0x0F) == 0x04)
	{	
		temp_uart0 = U0RBR;		// 读取FIFO的数据,并清除中断	
		//Len_u0++;
		Pluse_u0 = 0;
		cp_re0[Len_u0++] = temp_uart0;
		
	}
	UART0_SendByte(temp_uart0);
	VICVectAddr = 0x00;			// 中断处理结束
}



uint8 Comm_Manage(void)
{

	if((cp_re0[0] == 0x0d)&&(cp_re0[1] == 0x0a))
	{
		switch(cp_re0[2])
		{
			case '>':
			break;
			
			case '+':
			//+CMTI:"SM",XX  来新的短信息

			break;
			
			default:
			break;	
		}
		return 1;	
	}
	else
	{
		return 0;
	}
}
/*
*********************************************************************************************************
** 函数名称 :IRQ_UART0()
** 函数功能 :串口0接收中断服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq IRQ_UART1 (void)
{
	uint8 step;
	
	if ((U1IIR & 0x0F) == 0x04)
	{	
		temp_uart1 = U1RBR;		// 读取FIFO的数据,并清除中断	
		
					if(temp_uart1 == '$') 
					step = 1;
					else if( (temp_uart1 == 'G')&&(step == 1))  
					step = 2;
					else if( (temp_uart1 == 'P')&&(step == 2))  
					step = 3;
					else if( (temp_uart1 == 'R')&&(step == 3))  
					step = 4;
					else if( (temp_uart1 == 'M')&&(step == 4))  
					step = 5;
					else if( (temp_uart1 == 'C')&&(step == 5))  
					step = 6;
					else if(step >=6)
					{
						
						
						cp_re1[Len_u1++]=temp_uart1;
						//if(Len_u1>250)Len_u1 = 0;
						if(temp_uart1 == '\r')
						{
							GPS_Flag = 1;
							SendStr_U0(cp_re1,Len_u1-1);
							step = 0;
							Len_u1 = 0;
											
						}
					
					}
					else;	
					
					/*
					$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh<CR><LF>
					<1> UTC时间,hhmmss(时分秒)格式
					<2> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
					<3> 纬度半球N(北半球)或S(南半球)
					<4> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
					<5> 经度半球E(东经)或W(西经)
					<6> GPS状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算
					<7> 正在使用解算位置的卫星数量(00~12)(前面的0也将被传输)
					<8> HDOP水平精度因子(0.5~99.9)
					<9> 海拔高度(-9999.9~99999.9)
					<10> 地球椭球面相对大地水准面的高度
					<11> 差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
					<12> 差分站ID号0000~1023(前面的0也将被传输,如果不是差分定位将为空)
					*/
	}
	//UART0_SendByte(temp_uart1);
	VICVectAddr = 0x00;			// 中断处理结束
}


void Comm_gps(void)
{

	uint8 i;
	uint8 k=0;
	uint8 m=0;uint8 n=0;uint8 j=0;
	
	if(GPS_Flag == 1)
	{
		GPS_Flag = 0;
		//SendStr_U0(cp_re1,Len_u1-1);
		/*for(i=0;i<Len_u1;i++)
		{
			if(  cp_re1[i]==','    )
			{
				k++;
			}
			else
			{
				switch(k)
				{
					case 2://纬度
					latitude[j+1] = cp_re1[i];
					j++;
					break;
					case 3://纬度标记
					latitude[0] = cp_re1[i];
					break;
					case 4://经度
					Longitude[m+1] = cp_re1[i];
					m++;
					break;
					case 5://经度标记
					Longitude[0] = cp_re1[i];
					break;
					case 9://高度
					height[n] = cp_re1[i];
					n++;
					break;
					
					default:
					break;
					
				}
			}
		
		}*/
		Len_u1 = 0;
	}
}


/*
*********************************************************************************************************
** 函数名称 :UART0_SendByte()
** 函数功能 :向串口0发送1字节数据
** 入口参数 :dat	要发送的数据
** 出口参数 :无
*********************************************************************************************************
*/
void UART1_SendByte (uint8 dat)
{
	U1THR = dat;	// 要发送的数据
	while ((U1LSR & 0x40) == 0);	// 等待数据发送完毕
}

void SendStr_U1(uint8 *str,uint16 len)
{
	uint16  i;
	for(i=0;i<len;i++)
	{
		UART1_SendByte(str[i]);
	}

}

/*
*********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置工作模式和波特率。
** 入口参数 :baud	波特率
**			  set	模式设置(UARTMODE数据结构)
** 出口参数 :1-初始化成功,  0-初始化失败
*********************************************************************************************************
*/
int8 UART0_Init (uint32 baud, UARTMODE set)
{
	uint32 bak;
	PINSEL0 = (PINSEL0&0xfffffff0)|0x00000005;				// 设置I/O连接到UART1
	/* 参数过滤 */
	if ((baud ==0 ) || (baud > 115200))	return (0);
	if ((set.datab <5) || (set.datab > 8))	return (0);
	if ((set.stopb == 0) || (set.stopb > 2)) 	return (0);
	if (set.parity > 4)	return (0);
	
	/* 设置串口波特率 */
	U0LCR = 0x80;						// DLAB = 1	
	bak   = (Fpclk >> 4) / baud;
	U0DLM = bak >> 8;
	U0DLL = bak & 0xFF;
	
	/* 设置串口模式 */
	bak   = set.datab - 5;				// 设置字长
	if (set.stopb == 2)	bak |= 0x04;	// 判断是否为2位停止位
	
	if (set.parity != 0)
	{
		set.parity = set.parity - 1;
		bak |= 0x08;
	}
	bak |= set.parity << 4;				// 设置奇偶校验
	
	U0LCR = bak;
	U0FCR = 0x01;						// bu使能FIFO,并设置触发点为8字节
	U0IER = 0x01;						// 允许RBR中断,即接收中断
	
	/* 使能UART0中断 */
	VICIntSelect = 0x00000000;			// 设置所有的通道为IRQ中断
	VICVectCntl0 = 0x20 | 0x06;			// UART0分配到IRQ slot0,即最高优先级
	VICVectAddr0 = (uint32)IRQ_UART0;	// 设置UART0向量地址
	VICIntEnable = 1 << 0x06;			// 使能UART0中断
	
	return (1);
}
/*
*********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置工作模式和波特率。
** 入口参数 :baud	波特率
**			  set	模式设置(UARTMODE数据结构)
** 出口参数 :1-初始化成功,  0-初始化失败
*********************************************************************************************************
*/
int8 UART1_Init (uint32 baud, UARTMODE set)
{
	uint32 bak;
	PINSEL0 = (PINSEL0&0xffff0fff)|0x00050000;				// 设置I/O连接到UART1
	/* 参数过滤 */
	if ((baud ==0 ) || (baud > 115200))	return (0);
	if ((set.datab <5) || (set.datab > 8))	return (0);
	if ((set.stopb == 0) || (set.stopb > 2)) 	return (0);
	if (set.parity > 4)	return (0);
	
	/* 设置串口波特率 */
	U1LCR = 0x80;						// DLAB = 1	
	bak   = (Fpclk >> 4) / baud;
	U1DLM = bak >> 8;
	U1DLL = bak & 0xFF;
	
	/* 设置串口模式 */
	bak   = set.datab - 5;				// 设置字长
	if (set.stopb == 2)	bak |= 0x04;	// 判断是否为2位停止位
	
	if (set.parity != 0)
	{
		set.parity = set.parity - 1;
		bak |= 0x08;
	}
	bak |= set.parity << 4;				// 设置奇偶校验
	
	U1LCR = bak;
	
	U1FCR = 0x01;						// bu使能FIFO,并设置触发点为8字节
	U1IER = 0x01;						// 允许RBR中断,即接收中断
	
	/* 使能UART0中断 */
	VICIntSelect = 0x00000000;			// 设置所有的通道为IRQ中断
	VICVectCntl1 = 0x20 | 0x07;			// UART0分配到IRQ slot0,即最高优先级
	VICVectAddr1 = (uint32)IRQ_UART1;	// 设置UART0向量地址
	VICIntEnable = 1 << 0x07;			// 使能UART0中断
	
	return (1);
}


/*
*********************************************************************************************************
** 函数名称 :IRQ_Timer0()
** 函数功能 :定时器0中断服务程序,取反LED9控制口。
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq IRQ_Timer0 (void)
{
	Pluse_u0 ++;
	
	T0IR = 0x01;				/* 清除中断标志									*/
	VICVectAddr = 0x00;			/* 通知VIC中断处理结束							*/
}


void Time1_Ini(void)
{
	/* 定时器0初始化 */
	T0TC   = 0;			/* 定时器设置为0										*/
	T0PR   = 0;			/* 时钟不分频											*/
	T0MCR  = 0x03;		/* 设置T0MR0匹配后复位T0TC,并产生中断标志				*/
	T0MR0  = Fpclk/20;	/* 0.05秒钟定时											*/
	T0TCR  = 0x01;		/* 启动定时器											*/
	
	/* 设置定时器0中断IRQ */
	VICIntSelect = 0x00;				/* 所有中断通道设置为IRQ中断			*/
	VICVectCntl2 = 0x20 | 0x04;			/* 设置定时器0中断通道分配最高优先级	*/
	VICVectAddr2 = (uint32)IRQ_Timer0;	/* 设置中断服务程序地址					*/
	VICIntEnable = 1 << 0x04;			/* 使能定时器0中断						*/

}

uint8 Str_Find(uint8 *str,uint16 Len)//GPSwx
{
	uint16 i;
	uint8 step = 0;
	for(i=0;i<Len;i++)
	{
					if(str[i] == '$') 
					step = 1;
					else if( (str[i] == 'G')&&(step == 1))  
					step = 2;
					else if( (str[i] == 'P')&&(step == 2))  
					step = 3;
					else if( (str[i] == 'S')&&(step == 3))  
					step = 4;
					else if( (str[i] == 'w')&&(step == 4))  
					step = 5;
					else if( (str[i] == 'x')&&(step == 5))  
					step = 6;
					
	
	
	}
	if(step>=6)
	{
		return 1;
	}
	else
	{
		return 0;
	}

}

/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示。
** 调试说明 :需要PC串口显示终端软件如EasyARM.exe。
*********************************************************************************************************
*/
int main (void)
{
	UARTMODE set;

	set.datab  = 8;
	set.stopb  = 1;
	set.parity = 0;

	IRQEnable();						// 使能IRQ中断

	UART0_Init(115200, set);//0			// 串口0初始化
	UART1_Init(9600, set);//1			    // 串口1初始化
	Time1_Ini();//0.05s定时器//2
	SendStr_U0((uint8 *)("yuyingang!"),10);

	while (1)
	{
		Comm_Manage();
		Comm_gps();
	}
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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