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

📄 gps.lst

📁 单片机上开发的微妙级GPS时钟
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.14  GPS                                                                    08/21/2002 10:44:35 PAGE 1   


C51 COMPILER V6.14, COMPILATION OF MODULE GPS
OBJECT MODULE PLACED IN .\gps.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE .\gps.c DEBUG OBJECTEXTEND

stmt level    source

   1          //
   2          //
   3          //		get the data from gps and output the time nGpsSentenceIndex and bcd nGpsSentenceIndex
   4          //
   5          
   6          #include "gps.h"
   7          
   8          uchar nBcdPos = 0;
   9          uchar nBcdField = 0;
  10          uchar nBcdCounter = 0;
  11          
  12          uchar nHeadSign = 0;
  13          uchar nHeadLength = 0;
  14          uchar nFieldLength = 0;
  15          uchar nGpsSentenceIndex = 0;
  16          uchar nReadLength = 0;
  17          
  18          //当前状态
  19          uint nIntervalSecond = 0;				// 卫星丢失时间间隔
  20          uint nUSCounter = 0;					// 时间间隔内钟差
  21          uchar nGpsStatus = GPS_LOST; 
  22          
  23          // 输出信号计数长度
  24          uint nSignCounteNum = 0;
  25          
  26          // 输出信号标志位
  27          char bdata nSignStatus = 0;
  28          sbit nSecondSign = nSignStatus^0;		// 下一个秒到时是否是整秒
  29          sbit nMinuteSign = nSignStatus^1;		// 下一个秒到时是否是整分
  30          sbit nHourSign = nSignStatus^2;			// 下一个秒到时是否是整时
  31          sbit nCheckKey = nSignStatus^3;			// 检查键输入标志位
  32          
  33          uchar nInputKey = 0;
  34          
  35          bit nIsSend = 0;
  36          uchar nSendPos = 0;
  37          
  38          void serial() interrupt 4 using 2
  39          {
  40   1      	if(RI)
  41   1      	{
  42   2      		uchar nChar = SBUF;
  43   2      		if(nChar == '$')
  44   2      		{
  45   3      			nHeadLength = 0;
  46   3      			nFieldLength = 0;
  47   3      			nHeadSign = 1;
  48   3      			nGpsSentenceIndex = 0;
  49   3      		}
  50   2      		else if(nHeadSign)
  51   2      		{
  52   3      			Buff[nHeadLength++] = nChar;
  53   3      			if(nHeadLength == HEAD_LENGTH-1)
  54   3      			{
  55   4      				uchar i;
C51 COMPILER V6.14  GPS                                                                    08/21/2002 10:44:35 PAGE 2   

  56   4      				nGpsSentenceIndex = 1;
  57   4      				for(i = 1;i<HEAD_LENGTH;i++)
  58   4      				{
  59   5      					if(Buff[i-1] != GPGGA_HEAD[i])
  60   5      					{
  61   6      						nGpsSentenceIndex = 0;
  62   6      						break;
  63   6      					}
  64   5      				}
  65   4      				
  66   4      				if(!nGpsSentenceIndex)
  67   4      				{
  68   5      					nGpsSentenceIndex = 2;
  69   5      					for(i = 1;i<HEAD_LENGTH;i++)
  70   5      					{
  71   6      						if(Buff[i-1] != GPRMC_HEAD[i])
  72   6      						{
  73   7      							nGpsSentenceIndex = 0;
  74   7      							break;
  75   7      						}
  76   6      					}
  77   5      				}
  78   4      				nHeadSign = 0;
  79   4      			}
  80   3      		}
  81   2      		else if(nGpsSentenceIndex == 1)
  82   2      		{
  83   3      			if(nChar == ',')
  84   3      			{
  85   4      				nFieldLength++;
  86   4      				switch( nFieldLength )
  87   4      				{
  88   5      				case 7:
  89   5      					nReadLength = 0;
  90   5      					break;
  91   5      				case 9: 
  92   5      					SateliteNum = (Buff[0]-'0')*10+Buff[1]-'0';
  93   5      					if(SateliteNum>= 3 && nGpsStatus != GPS_NORMAL)
  94   5      					{
  95   6      						EA = 0;
  96   6      						ET2 = 0;
  97   6      						EX0 = 1;
  98   6      						nGpsStatus = GPS_NORMAL;
  99   6      						EA = 1;
 100   6      					}
 101   5      					else if(SateliteNum < 3 && nGpsStatus == GPS_NORMAL)
 102   5      					{
 103   6      						EA = 0;
 104   6      						EX0 = 0;
 105   6      						ET2 = 1;
 106   6      						EXEN2 = 1;
 107   6      						nGpsStatus = GPS_NORMALLOST;
 108   6      						EA = 1;
 109   6      					}
 110   5      					nReadLength = 0;
 111   5      					{
 112   6      						nIsSend = 1;
 113   6      						nSendPos = 0;
 114   6      					}
 115   5      					break;
 116   5      				case 10:
 117   5      					{
C51 COMPILER V6.14  GPS                                                                    08/21/2002 10:44:35 PAGE 3   

 118   6      					uchar i;
 119   6      					for(i = 0;i<nReadLength;i++)
 120   6      						SeaHeight[i] = Buff[i];
 121   6      					SeaHeight[i] = 0;
 122   6      					nReadLength = 0;
 123   6      					}
 124   5      					break;
 125   5      				}
 126   4      			}
 127   3      			else
 128   3      			{
 129   4      				switch(nFieldLength)
 130   4      				{
 131   5      					case 7:
 132   5      					case 9:
 133   5      						Buff[nReadLength++] = nChar;
 134   5      						break;
 135   5      				}
 136   4      			}
 137   3      		}
 138   2      		else if(nGpsSentenceIndex == 2 && nGpsStatus == GPS_NORMAL)
 139   2      		{
 140   3      			if(nChar == ',')
 141   3      			{
 142   4      				nFieldLength++;
 143   4      				switch( nFieldLength )
 144   4      				{
 145   5      				case 1:
 146   5      					nReadLength = 0;
 147   5      					break;
 148   5      				case 3:		
 149   5      					{
 150   6      						uchar i;
 151   6      						for(i = 0;i<3;i++)
 152   6      							Time[i] = (Buff[2*i]-'0')*10 + Buff[2*i+1] - '0';
 153   6      						nReadLength = 0;
 154   6      					}
 155   5      					break;
 156   5      				case 5:
 157   5      					{
 158   6      						uchar i;
 159   6      						for(i = 0;i<7;i++)
 160   6      							Latitude[i] = Buff[i];
 161   6      						nReadLength = 0;
 162   6      					}
 163   5      					break;
 164   5      				case 9:
 165   5      					{
 166   6      						uchar i;
 167   6      						for(i = 0;i<8;i++)
 168   6      							Longitude[i] = Buff[i];
 169   6      						nReadLength = 0;
 170   6      					}
 171   5      					break;
 172   5      				case 10:
 173   5      					{
 174   6      						uchar i;
 175   6      						for(i = 0;i<3;i++)
 176   6      							Date[2-i] = (Buff[2*i]-'0')*10 + Buff[2*i+1] - '0';
 177   6      						nReadLength = 0;
 178   6      					}
 179   5      				case 11:
C51 COMPILER V6.14  GPS                                                                    08/21/2002 10:44:35 PAGE 4   

 180   5      					NextSecond();
 181   5      					break;
 182   5      				}
 183   4      			}
 184   3      			else
 185   3      			{
 186   4      				switch(nFieldLength)
 187   4      				{
 188   5      				case 1:
 189   5      				case 3:
 190   5      				case 5:
 191   5      				case 9:
 192   5      					Buff[nReadLength++] = nChar;
 193   5      					break;
 194   5      				}
 195   4      			}
 196   3      		}
 197   2      		RI = 0;
 198   2      	}
 199   1      	else if(TI)
 200   1      	{
 201   2      		if(nIsSend&&(nSendPos<3))
 202   2      		{
 203   3      			
 204   3      			if(nSendPos == 1)
 205   3      			{
 206   4      			   SBUF = '\n';
 207   4      			}
 208   3      			else if(nSendPos == 2)
 209   3      			{
 210   4      				SBUF = '\r';
 211   4        			}
 212   3      			else
 213   3      				SBUF = SateliteNum + '0';
 214   3      			TI = 0;	
 215   3      		}
 216   2      	}
 217   1      }
 218          
 219          void time0(void) interrupt 1 using 1
 220          {
 221   1      	TH0 = TH0CONST;	        	//		500us
 222   1      	TL0 = TL0CONST;    
 223   1      
 224   1      	OUT1KHZ = !OUT1KHZ;
 225   1       	if(nSignCounteNum == PPS_LENGTH)
 226   1      		OUTPPS = 0;
 227   1      	else if(nSignCounteNum == BCD_LENGTH*nBcdCounter)
 228   1      		OUTBCD = 0;
 229   1      	else if(nSignCounteNum == PPMS_LENGTH)
 230   1      		OUTPPMS = 0;
 231   1      	else if(nSignCounteNum == PPHS_LENGTH)
 232   1      		OUTPPHS = 0;
 233   1      	else if(nSignCounteNum == PPML_LENGTH)
 234   1      		OUTPPML = 0;
 235   1      	else if(nSignCounteNum & KEYBOADMASK )
 236   1      		nCheckKey = 1;
 237   1      }
 238          
 239          void externint0(void) interrupt 0 using 0
 240          {
 241   1      	OUTPPS = 1;
C51 COMPILER V6.14  GPS                                                                    08/21/2002 10:44:35 PAGE 5   

 242   1      	OutSign();
 243   1      }
 244          
 245          void timer2(void) interrupt 5 using 3
 246          {
 247   1      	OUTPPS = 1;
 248   1      	OutSign();	
 249   1      	TF2 = 0;
 250   1      	if(EXF2)
 251   1      	{
 252   2      		EXF2 = 0;
 253   2      		EXEN2 = 0;
 254   2      		nGpsStatus = GPS_LOST;
 255   2      	}
 256   1      }
 257          
 258          void main(void)
 259          {
 260   1      	Init();
 261   1      	while(1)
 262   1      	{
 263   2      		if(nSecondSign)
 264   2      		{
 265   3      			ShowLED();
 266   3      
 267   3      			// start the serial sending
 268   3      			nIsSend = 1;
 269   3      			nSendPos = 0;
 270   3      
 271   3      			// computer the bcd field length
 272   3      			if(++nBcdPos == 10)
 273   3      			{
 274   4      				nBcdPos = 0;
 275   4      				nBcdField++;
 276   4      			}
 277   3      
 278   3      			if(!nBcdPos)
 279   3      				nBcdCounter = 8;
 280   3      			else if(nBcdPos == 1)
 281   3      			{
 282   4      				if(!nBcdField)
 283   4      					nBcdCounter = 8;
 284   4      				else 
 285   4      					nBcdCounter = 1;
 286   4      			}
 287   3      			else 
 288   3      			{
 289   4      				uchar nData;

⌨️ 快捷键说明

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