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

📄 uart.c

📁 此程序是GPS的定位程序
💻 C
字号:

#include "common.h"
#include "uart.h"


// 串口数据定义 

//unsigned char UART_Buffer[UART_BUFFERSIZE];
unsigned char UART_Buffer_Size = 0; 
unsigned char UART_Input_First = 0;
static unsigned char  tmp;

// GPS数据接收定义

extern unsigned char JD[10];			    //经度
extern unsigned char JD_a;		              	    //经度方向
extern unsigned char WD[9];			    //纬度
extern unsigned char WD_a;			                //纬度方向
extern unsigned char time[6];	            //时间
extern unsigned char date[6];		        //日期
extern unsigned char speed[5];		                    //速度
extern unsigned char Height[6];		                    //高度
extern unsigned char angle[5];		                    //方位角
extern unsigned char use_sat[2];	            	//使用的卫星数
extern unsigned char total_sat[2];	            //天空中总卫星数

//串口中断需要的变量
extern unsigned char seg_count;		//逗号计数器
extern unsigned char dot_count;		//小数点计数器
extern unsigned char byte_count;		//位数计数器
extern unsigned char cmd_number;		//命令类型
extern unsigned char mode;				//0:结束模式,1:命令模式,2:数据模式
extern unsigned char buf_full;			//1:整句接收完成,相应数
extern unsigned char cmd[5];			//命令类型存储数组

//显示需要的变量
extern unsigned char dsp_count;		//刷新次数计数器
extern unsigned char time_count;

extern unsigned char Height_num,a_num,s_num;

void UART0_Init (void)
{
   char SFRPAGE_SAVE;

   SFRPAGE_SAVE = SFRPAGE;             // Preserve SFRPAGE

   SFRPAGE = TMR2_PAGE;

   TMR2CN = 0x00;                      // Timer in 16-bit auto-reload up timer
                                       // mode
   TMR2CF = 0x08;                      // SYSCLK is time base; no output;
                                       // up count only
   RCAP2 = - ((long) SYSTEMCLOCK/BAUDRATE/16);
   TMR2 = RCAP2;
   TR2= 1;                             // Start Timer2

   SFRPAGE = UART0_PAGE;

   SCON0 = 0x50;                       // 8-bit variable baud rate;
                                       // 9th bit ignored; RX enabled
                                       // clear all flags
   SSTA0 = 0x15;                       // Clear all flags; enable baud rate
                                       // doubler (not relevant for these
                                       // timers);
                                       // Use Timer2 as RX and TX baud rate
                                       // source;
   ES0 = 1;  
   IP |= 0x10;

   SFRPAGE = SFRPAGE_SAVE;             // Restore SFRPAGE
}


void UART0_Interrupt (void) interrupt 4
{
   SFRPAGE = UART0_PAGE;

   if (RI0 == 1)
   {
      if( UART_Buffer_Size == 0)  {      // If new word is entered
         UART_Input_First = 0;    }

      RI0 = 0;                           // Clear interrupt flag

      tmp=SBUF0;            //将接收数据暂时保存
        switch(tmp){
		case '$':
			cmd_number=0;		//命令类型清空
			mode=1;				//接收命令模式
			byte_count=0;		//接收位数清空
			break;
		case ',':
			seg_count++;		//逗号计数加1
			byte_count=0;
			break;
		case '*':
			switch(cmd_number){
				case 1:
					buf_full|=0x01;
					break;
				case 2:
					buf_full|=0x02;
					break;
				case 3:
					buf_full|=0x04;
					break;
				case 4:
					buf_full|=0x08;
					break;
			}
			mode=0;
			break;
		default:
			if(mode==1){
				//命令种类判断
				cmd[byte_count]=tmp;			//接收字符放入类型缓存
				if(byte_count>=4){				//如果类型数据接收完毕,判断类型
					if(cmd[0]=='G'){
						if(cmd[1]=='P'){
							if(cmd[2]=='G'){
								if(cmd[3]=='G'){
									if(cmd[4]=='A'){
										cmd_number=1;
										mode=2;
										seg_count=0;
										byte_count=0;
										Height_num=0;
									}
								}
								else if(cmd[3]=='S'){
									if(cmd[4]=='V'){
										cmd_number=2;
										mode=2;
										seg_count=0;
										byte_count=0;
									}
								}
							}
							else if(cmd[2]=='R'){
								if(cmd[3]=='M'){
									if(cmd[4]=='C'){
										cmd_number=3;
										mode=2;
										seg_count=0;
										byte_count=0;
										a_num=0;
										s_num=0;
									}
								}
							}
							else if(cmd[2]=='Z'){
								if(cmd[3]=='D'){
									if(cmd[4]=='A'){
										cmd_number=4;
										mode=2;
										seg_count=0;
										byte_count=0;
									}
								}
							}
						}
					}
				}
			}
			else if(mode==2){
				//接收数据处理
				switch (cmd_number){
					case 1:				//类型1数据接收。GPGGA
						switch(seg_count){
							case 2:								//纬度处理
								if(byte_count<9){
									WD[byte_count]=tmp;
								}
								break;
							case 3:								//纬度方向处理
								if(byte_count<1){
									WD_a=tmp;
								}
								break;
							case 4:								//经度处理
								if(byte_count<10){
									JD[byte_count]=tmp;
								}
								break;
							case 5:								//经度方向处理
								if(byte_count<1){
									JD_a=tmp;
								}
								break;
							case 7:								//定位使用的卫星数
								if(byte_count<2){
									use_sat[byte_count]=tmp;
								}
								break;
							case 9:								//高度处理
								if(byte_count<6){
									Height[byte_count]=tmp;
									Height_num++;
								}
								break;
						}
						break;
					case 2:				//类型2数据接收。GPGSV
						switch(seg_count){
							case 3:								//天空中的卫星总数
								if(byte_count<2){
									total_sat[byte_count]=tmp;
								}
								break;
						}
						break;
					case 3:				//类型3数据接收。GPRMC
						switch(seg_count){
							case 7:								//速度处理
								if(byte_count<5){
									speed[byte_count]=tmp;
									s_num++;
								}
								break;
							case 8:								//方位角处理
								if(byte_count<5){
									angle[byte_count]=tmp;
									a_num++;
								}
								break;
						}
						break;
					case 4:				//类型4数据接收。GPZDA
						switch(seg_count){
							case 1:
								if(byte_count<6){				//时间处理
									time[byte_count]=tmp;	
								}
								break;
							case 2:
								if(byte_count<2){
									date[byte_count]=tmp;
								}
								break;
							case 3:
								if(byte_count<2){
									date[byte_count+2]=tmp;
								}
								break;
							case 4:
								if((byte_count<4)&&(byte_count>1)){
									date[byte_count+2]=tmp;
								}
								break;							
						}
						break;
				}
			}
			byte_count++;		//接收数位加1
			break;
	}

   }

}

⌨️ 快捷键说明

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