📄 mmm.lst
字号:
223 3 }
224 2
225 2 }
226 1 else
227 1 {
228 2 TI_1=0;
229 2
230 2 }
231 1 }
232 /****************************************************************************
233 * *
234 * Function: isr_UART *
235 * *
236 * Input: - *
237 * Output: - *
C51 COMPILER V7.05 MMM 04/11/2005 02:18:28 PAGE 5
238 * *
239 * Description: *
240 ****************************************************************************/
241 void isr_UART(void) interrupt 4 using 2
242 {
243 1 unsigned char c , oldRecvState , i , bcc;
244 1
245 1 // WatchDog();
246 1
247 1 if ( RI ) // Receive Command
248 1 {
249 2 TR0 = 0 ; //stop t0
250 2 c = SBUF;
251 2 RI = 0;
252 2 if (RecvReady)
253 2 {
254 3 SendReady = FALSE;
255 3 oldRecvState = RecvState;
256 3 RecvState = RECV_STX;
257 3
258 3
259 3 switch (oldRecvState)
260 3 {
261 4 case RECV_STX: // Receive STX and answer DLE
262 4 if (c == STX)
263 4 {
264 5 RecvState = RECV_ADDR0;
265 5 START_T0(T_533_ms);
266 5 }
267 4 else
268 4 {
269 5 CALL_isr_T0() ;
270 5 };
271 4 break;
272 4
273 4 case RECV_ADDR0:
274 4 if (c == ADDR)//0xd2)//MeterNum.chrX[3])
275 4 {
276 5 RecvState = RECV_ADDR1;
277 5 START_T0(T_533_ms);
278 5 }
279 4 else
280 4 {
281 5 CALL_isr_T0() ;
282 5 };
283 4 break;
284 4 case RECV_ADDR1:
285 4 if (c == 0x02)//MeterNum.chrX[2])
286 4 {
287 5 RecvState = RECV_ADDR2;
288 5 START_T0(T_533_ms);
289 5 }
290 4 else
291 4 {
292 5 CALL_isr_T0() ;
293 5 };
294 4 break;
295 4 case RECV_ADDR2:
296 4 if (c == 0x96)//MeterNum.chrX[1])
297 4 {
298 5 RecvState = RECV_ADDR3;
299 5 START_T0(T_533_ms);
C51 COMPILER V7.05 MMM 04/11/2005 02:18:28 PAGE 6
300 5 }
301 4 else
302 4 {
303 5 CALL_isr_T0() ;
304 5 };
305 4 break;
306 4
307 4 case RECV_ADDR3:
308 4 if (c ==0x49) //MeterNum.chrX[0])
309 4 {
310 5 // LED_RED = ~LED_RED;
311 5 En485 = SEND;
312 5 //Ir_En = SEND;
313 5 SBUF = DLE ;
314 5 RecvState = RECV_DATA_DLE_ETX;
315 5 DataDleReceived = FALSE;
316 5 Index = 0;
317 5 Cmdok = FALSE;
318 5
319 5 while( !TI );
320 5 TI = FALSE;
321 5 En485 = RECV;
322 5 //Ir_En = RECV;
323 5 START_T0(T_533_ms);
324 5 }
325 4 else
326 4 {
327 5 CALL_isr_T0() ;
328 5 };
329 4 break;
330 4
331 4 case RECV_DATA_DLE_ETX:// Receive data,DEL,ETX and answer DLE
332 4 if (c == DLE)
333 4 {
334 5 if (!DataDleReceived) //如果上一个不是DLE 丢掉
335 5 {
336 6 DataDleReceived = TRUE;
337 6 RecvState = RECV_DATA_DLE_ETX;
338 6 START_T0(T_533_ms);
339 6 break;
340 6 }
341 5 else //如果上一个是DLE
342 5 {
343 6 DataDleReceived = FALSE; //留下
344 6 };
345 5 }
346 4 else if (c == ETX)
347 4 {
348 5 if (DataDleReceived) //如果是结束标记 处理
349 5 {
350 6 DataDleReceived = FALSE;
351 6
352 6 bcc = 0;
353 6 for (i = 0; i < Index; i++)
354 6 {
355 7 bcc ^= SerBuffer[i];
356 7 } ;
357 6
358 6 if( bcc == 0)
359 6 { En485 = SEND;
360 7 //Ir_En = SEND;
361 7 Cmdok = TRUE;
C51 COMPILER V7.05 MMM 04/11/2005 02:18:28 PAGE 7
362 7 SBUF = DLE ;
363 7 while( !TI );
364 7 TI = FALSE;
365 7 En485 = RECV;
366 7 //LED_RED = ~LED_RED;
367 7 //Ir_En = RECV;
368 7 }
369 6 else
370 6 { En485 = SEND;
371 7 //Ir_En = SEND;
372 7 Cmdok = FALSE;
373 7 SBUF = NAK ;
374 7 while( !TI );
375 7 TI = FALSE;
376 7 En485 = RECV;
377 7 //Ir_En = RECV;
378 7 };
379 6 RecvState=RECV_STX;
380 6 break;
381 6 }
382 5 else
383 5 {
384 6 DataDleReceived = FALSE; //如果不是结束标记 留下
385 6 };
386 5 };
387 4
388 4 if (Index < SERBUFLEN) //将数据写入SerBuffer[]
389 4 {
390 5 SerBuffer[Index++] = c;
391 5 };
392 4 RecvState = RECV_DATA_DLE_ETX;
393 4 START_T0(T_533_ms);
394 4 break;
395 4
396 4 case RECV_DLE: //Recieve answer from HOST
397 4 if ( c == DLE)
398 4 {
399 5 En485 = SEND;
400 5 //Ir_En = SEND;
401 5 for (i = 0; i < (3 + SerBuffer[2] +1); i++) //send data
402 5 {
403 6 SBUF = SerBuffer[i];
404 6 while (!TI);
405 6 TI = FALSE;
406 6 if ( SerBuffer[i] == DLE ) //send DLE two
407 6 {
408 7 SBUF = DLE;
409 7 while (!TI);
410 7 TI = FALSE;
411 7 };
412 6 };
413 5
414 5 SBUF = DLE; //send END
415 5 while (!TI);
416 5 TI = FALSE;
417 5
418 5 SBUF = ETX;
419 5 while (!TI);
420 5 TI = FALSE;
421 5 RecvState = RECV_DLE_OR_NAK ;
422 5 START_T0(T_533_ms);
423 5 En485 = RECV;
C51 COMPILER V7.05 MMM 04/11/2005 02:18:28 PAGE 8
424 5 //Ir_En = RECV;
425 5 }
426 4 else
427 4 {
428 5 CALL_isr_T0() ;
429 5 };
430 4 break;
431 4
432 4 case RECV_DLE_OR_NAK: //Recieve answer from HOST
433 4 if ( c == DLE)
434 4 {
435 5 SendOk = TRUE;
436 5 SendReady = FALSE;
437 5 RecvReady = TRUE;
438 5 RecvState = RECV_STX;
439 5 }
440 4 else
441 4 {
442 5 SendOk = FALSE;
443 5 SendReady = TRUE;
444 5 RecvReady = FALSE;
445 5 CALL_isr_T0() ;
446 5 };
447 4 En485 = RECV;
448 4 //Ir_En = RECV;
449 4 break;
450 4
451 4 default:
452 4 CALL_isr_T0() ;
453 4 break;
454 4
455 4 };//end of case
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -