📄 gps.lst
字号:
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 + -