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

📄 xx.c

📁 pic16f76的GPS接收处理代码 还有串口模拟程序
💻 C
字号:
#include <pic.h>
#include "xx.h"
__CONFIG(HS&PWRTEN&BOREN&PROTECT&WDTEN); 
main()
{

	unsigned char i,k;
	for(i=0;i<16;i++)
	{
		ser_buffer[i] = i;
	}

	TRISA=0X00;
	TRISB=0X00;
//	PORTB=0XF0;

	txflag = 0;

	intil();
	RC0 = 0;
	RC1 = 0;
	while(1)
	{
		i = GetCommand(10);
//		i = GetChar();
#if 1

//		if(GetOneChar == 0x24)
		if(i)
		{
			RB5 = 0;
			DelayMain(8000);
			DelayMain(8000);
			//ComOutStr(RxBufffer, 6);
		}
		RB5 = 1;
#endif		
//		DelayMain(1000);
//		ComOutStr(ser_buffer, 2);
//		DelayMain(1000);
		RB5 = 1;
//		DelayMain(8000);
		CLRWDT();
	//	DelayMain(8000);
		DelayMain(8000);
		//ComOutStr(ser_buffer, 4);
		PutString(RxBufffer, 10);

	//putch(0x54);


	}

}
void Delay(unsigned int number)
{
	unsigned int temp;
	for(temp=0;temp<number;temp++);

}
void TXData(unsigned char *tx_data,unsigned char a)
{
	unsigned char i;
	unsigned int j;
	for(i=0x0;i<a;i++)
	{
  //       TRISA=0;
  //      RA5=1;
		 SPEN=1;
#if 0
         TRISC=0xc0;
         TXSTA=0x46;
#endif
		TXSTA=0x46;				/*低速模式*/
//		SPBRG=0X67;//67;			/*600*/

		SPBRG=25;
		TXIF=0;
		TXREG=*tx_data;
		tx_data++;
		GIE=1;
		PEIE=1;
		SPEN=1;
		TXEN=1;
		for(j=0;j<10000;j++);
		while(TXIF==0);
		TXIF=0;
	}
}
void interrupt uart(void)
{

	if(RCIF==1)					/* RS232接收中断 */
	{
		RCIF=0;					/* 清中断标志 */
		ser_buffer[receive_count]=RCREG;	/* 接收数据并存储 */
//		send232[receive_count]=RCREG;		/* 接收数据存放到发送缓冲数组 */
		receive_count++;		/* 接收计数器加1 */
		if(receive_count>7)		/* 如果已经接收到8个数据 */
		{
			receive_count=0;	/* 接收计数器清0 */
			txflag=1;			/* 置接收到8个数据标志 */
		}
	}
}
void intil(void)
{
	GIE=1;
	PEIE=1;
	SPEN=1;
	RCIE=1;

	SPEN=1;
	TRISC=0xc0;
//	TRISC=0xF0;	
//	TXSTA=0x22;
//	SPBRG=103;
//	TXEN=1;

	TXSTA=0x26;						/*高速模式*/
	SPBRG=129;						//9600 20M


	RCSTA=0x80;		/* 允许串行口工作使能 */
//	CREN=1;				/* 允许串口连续接收数据 */
	PIR1=0x00;			/* 清中断标志 */
//	PIE1=PIE1|0x20;		/* 允许串行通讯接口接收中断使能 */

}

/* output one byte 向串口输出一个字符(非中断方式)*/
void ComOutChar(unsigned char OutData)
{

	while(!TXIF)					/* set when register is empty */
		continue;
	TXREG = OutData;

}


/*向串口输出一个字符串(非中断方式)(含长度)*/
void ComOutStr(unsigned char *Str,unsigned int strlen)
{

	unsigned int k = 0;
	do 
	{
		ComOutChar(*(Str + k));
		k ++;
	} while(k < strlen);

}

void PutChar(unsigned char c)
{
	unsigned char	bitno;
#if BRATE > 1200
	unsigned char	dly;
#else
	unsigned int		dly;
#endif

	INIT_PORT;
	TxData = 0;			/* start bit */
	bitno = 12;
	do
	{
		dly = DELAY(TX_OHEAD);	/* wait one bit time */
		do
			/* waiting in delay loop */ ;
		while(--dly);
		if(c & 1)
			TxData = 1;
		if(!(c & 1))
			TxData = 0;
		c = (c >> 1) | 0x80;
	} while(--bitno);
	NOP();
}

unsigned char GetChar(void)
{
	unsigned char	c, bitno;
#if BRATE > 1200
	unsigned char	dly;
#else
	unsigned int		dly;
#endif

	for(;;) 
	{	
		TimeWait = 0;
		do
		{
			TimeWait++;
			if(TimeWait >10000)
				return ERROR;
		}while(RxData);
		while(RxData)
			continue;				/* wait for start bit */
		dly = DELAY(3)/2;
		do									/* waiting in delay loop */ ;
		while(--dly);
		if(RxData)
			continue;				/* twas just noise */
		bitno = 8;
		c = 0;
		do
		{
			dly = DELAY(RX_OHEAD);
			do
			
									/* waiting in delay loop */ ;
			while(--dly);
			c = (c >> 1) | (RxData << 7);
		} while(--bitno);
//		RxFlag = 1;
		GetOneChar = c;
		return SUCCESS;
	}

}

unsigned char GetCommand(unsigned char Num)
{
	unsigned char	c,i;
	unsigned int		dly;
	unsigned int		TimeWait2,TimeWait3;

	TimeWait2 = 0;
	TimeWait3 = 0;

	do
	{
		c = GetChar();	
		if(c)
		{
			if(GetOneChar==0x24)//判断是不是字符$
			{
				i = 1;
				RxBufffer[0] = GetOneChar;
				
				do
				{				
						//dly = DELAY(3)/2;
						dly = 130;//DELAY(RX_OHEAD);
						do
						
												/* waiting in delay loop */ ;
						while(--dly);
						//Delay(338);
						c = GetChar();
						RxBufffer[i] = GetOneChar;
						i++;
				}
				while(i<Num+1);// $GPRMC
				//if((RxBufffer[5] == 0x43)&&(RxBufffer[4] == 0x4D)&&(RxBufffer[3] == 0x52)) //判断是不需要的数据头,只能检测到$GPGGA
				//{
					return	SUCCESS;
				//}
			}

		}
		TimeWait2++;
	}while(TimeWait2<1000);
		
		return	ERROR;

}


void PutString(char *DataBuf,unsigned char Num)
{
	unsigned int k = 0;
	do 
	{
		PutChar(*(DataBuf + k));
		k ++;
	} while(k < Num);
}

unsigned int HEX2BCD(unsigned char hex_data)   /***hex_data(<0xff,>0)*/
{
	unsigned int bcd_data;
	unsigned char temp;
	temp = hex_data%100;
	bcd_data = ((unsigned int)hex_data)/100<<8;
	bcd_data = bcd_data|temp/10<<4;
	bcd_data = bcd_data|temp%10;
	return bcd_data;
}

void DelayMain(unsigned int number)
{
	unsigned int temp;
	for(temp=0;temp<number;temp++);

}


unsigned char HexToChar(unsigned char Data)				/*-转成asc码-*/
{
	unsigned char Rev;
	if(Data<0x0a)
	{
		Rev=Data+0x30;
	}
	else 
	{
		Rev=Data+0x37;
	}
	return Rev;
}


void _delay_ms(char a)	/*/毫秒级延时子函数 */
{
	unsigned char i,j;
	for(i=0;i<a;i++)
	for(j=0;j<40;j++);

}

⌨️ 快捷键说明

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