?? uart0.lst
字號:
271 1 ES0 = 1; // 使能串口中斷
272 1
273 1
274 1 }
275
276 //-------------------------------
277 // 功能: 初始化單片機內部資源
278 // 輸入參數:無
279 // 輸出參數:無
280 //-------------------------------
281 void Init_Device(void)
282 {
283 1 Timer_Init();
284 1
285 1 Port_IO_Init();
286 1
287 1 Oscillator_Init();
288 1
289 1 UART0_Init();
290 1
291 1 Interrupts_Init();
292 1 }
293
294 //------------------------------------------------
295 // 函數名稱:InitVariable()
296 // 函數功能:初始化系統全局變量
297 //------------------------------------------------
298 void InitVariable()
299 {
300 1 g_cMainSignal = 0;
301 1
302 1 g_sTime.base = 0;
C51 COMPILER V7.05 UART0 08/18/2007 20:00:10 PAGE 6
303 1 g_sTime.second= 0;
304 1 g_sTime.minute= 0;
305 1
306 1 g_cRecvPointer =0;
307 1 g_cRecvLength =0;
308 1
309 1
310 1 }
311
312 //-------------------------------------------------------------
313 // 函數名稱:定時器0中斷入口函數,完成計時功能,定時時間為25ms
314 // 輸入參數: 無
315 // 輸出參數: 無
316 //-------------------------------------------------------------
317
318 void timer0() interrupt 1
319 {
320 1 TH0=TMR0H;
321 1 TL0=TMR0L;
322 1
323 1 // 程序時基信號
324 1 if(++g_sTime.base>=TICKS_PER_SEC)
325 1 {// 1s到
326 2 g_sTime.base = 0;
327 2
328 2 g_cMainSignal|=SECD_SIGNAL; // 產生秒信號
329 2
330 2 if(++g_sTime.second>59)
331 2 {// 1分鐘到
332 3 g_sTime.second = 0;
333 3
334 3 g_cMainSignal|=MINU_SIGNAL; // 產生分信號
335 3
336 3 if(++g_sTime.minute>59) g_sTime.minute=0;
337 3 }
338 2 }
339 1
340 1
341 1
342 1 }
343
344 //..................................................
345 // 串口0中斷服務程序
346 //
347 //.................................................
348 void Uart0() interrupt 4
349 {
350 1 BYTE cRecvData;
351 1
352 1 if(RI0) // 如果收到數據
353 1 {
354 2 RI0=0; // 清除收到數據標志
355 2
356 2 cRecvData = SBUF0; // 讀取數據
357 2 SBUF0 = cRecvData; // 回顯
358 2
359 2 if(cRecvData=='\r')
360 2 {// 回車符作為結束標志
361 3 g_cRecvBuffer[g_cRecvPointer]=0; // 接收結束
362 3 g_cRecvPointer = 0;
363 3
364 3 g_cMainSignal|=UART0RECV_SIGNAL; // 接收完成信號
C51 COMPILER V7.05 UART0 08/18/2007 20:00:10 PAGE 7
365 3
366 3 }
367 2 else if(cRecvData==0x08)
368 2 {// CTRL+H控制鍵,退格
369 3 if(g_cRecvPointer>0) g_cRecvPointer--;
370 3 }
371 2 else
372 2 {
373 3 if(g_cRecvPointer<RECVBUF_LEN)
374 3 {
375 4 if(isupper(cRecvData))
376 4 {// 大寫字符轉換為小寫
377 5 cRecvData = _tolower(cRecvData);
378 5 }
379 4 g_cRecvBuffer[g_cRecvPointer++]=cRecvData;
380 4 }
381 3 else
382 3 {// 數據長度錯誤
383 4 g_cRecvPointer = 0;
384 4 }
385 3 }
386 2
387 2
388 2 }
389 1
390 1 if(TI0) // 如果數據發送結束
391 1 {
392 2 TI0=0;
393 2 }
394 1
395 1 }
396
397
398 //------------------------------------------------------------------
399 // 主函數開始
400 //-------------------------------------------------------------------
401 void main()
402 {
403 1 Init_Device(); // 初始化系統
404 1 InitVariable(); // 初始化變量
405 1
406 1 EA=0; // 禁止看門狗
407 1 WDTCN = 0xDE; // 實驗中不使用看門狗
408 1 WDTCN = 0xAD;
409 1
410 1 EA = 1; //
411 1
412 1 TR0 = 1; // 啟動定時器0
413 1
414 1 SendString("C8051F02x core Module EC1,v1.0\r\n");
415 1
416 1 while(1)
417 1 {
418 2
419 2 if(g_cMainSignal&SECD_SIGNAL)
420 2 {// 秒信號
421 3 g_cMainSignal&=~SECD_SIGNAL;
422 3
423 3 }
424 2
425 2 if(g_cMainSignal&MINU_SIGNAL)
426 2 {// 分信號
C51 COMPILER V7.05 UART0 08/18/2007 20:00:10 PAGE 8
427 3 g_cMainSignal&=~MINU_SIGNAL;
428 3
429 3
430 3 }
431 2
432 2 if(g_cMainSignal&UART0RECV_SIGNAL)
433 2 {// UART0接收完成信號
434 3 g_cMainSignal&=~UART0RECV_SIGNAL;
435 3
436 3 // 確保接收緩沖區內的字符串有結尾
437 3 g_cRecvBuffer[RECVBUF_LEN-1] = 0;
438 3 // 分析接收的命令
439 3 CommandProc(g_cRecvBuffer);
440 3
441 3 }
442 2
443 2 }
444 1
445 1 }
446
447 //......................................
448 // 功能:分析接收的命令
449 // 輸入參數:
450 // pRecvString,char *:輸入字符串
451 // 輸出參數:無
452 // 命令格式說明:
453 // setled=燈序號,開關狀態 \r
454 // 燈序號: 1,LED1;2,LED2
455 // 開關狀態:ON,打開燈;OFF,關閉燈
456 // 命令字符不區分大小寫
457 //.......................................
458 void CommandProc(char *pRecvString)
459 {
460 1 BYTE cRet=0;
461 1 int iPos;
462 1
463 1
464 1 if(strncmp(pRecvString,"setled=",7)==0)
465 1 {// 設置LED狀態命令
466 2
467 2 pRecvString+=7;
468 2
469 2 iPos=strpos(pRecvString,',');
470 2
471 2 if(iPos==-1)
472 2 {// 無效命令
473 3 cRet = 0;
474 3 }
475 2 else
476 2 {
477 3
478 3 if(strncmp(pRecvString,"2",1)==0)
479 3 {// 控制LED2
480 4 pRecvString+=2;
481 4
482 4 if(strcmp(pRecvString,"on")==0)
483 4 {// 打開LED
484 5 P_LED2 = 1;
485 5
486 5 cRet = 1;
487 5 }
488 4 else if(strcmp(pRecvString,"off")==0)
C51 COMPILER V7.05 UART0 08/18/2007 20:00:10 PAGE 9
489 4 {// 關閉LED
490 5 P_LED2 = 0;
491 5
492 5 cRet = 1;
493 5 }
494 4 else
495 4 {
496 5 cRet = 0;
497 5 }
498 4 }
499 3 }
500 2
501 2 }
502 1 else
503 1 {// 無效命令
504 2 cRet = 0;
505 2 }
506 1
507 1 // 向主機發送應答
508 1 if(cRet)
509 1 {
510 2 SendString("\r\nOK\r\n");
511 2 }
512 1 else SendString("\r\nError\r\n");
513 1
514 1 }
515
516 //-----------------------------------------------------
517 // 函數功能:循環方式發送字符串
518 // 輸出參數:pSendString,char*:欲發送的字符串的緩沖區
519 // 輸出:無
520 //-----------------------------------------------------
521 void SendString(char *pSendString)
522 {
523 1
524 1 // 循環發送,首先關閉中斷
525 1 ES0 =0;
526 1
527 1 while(*pSendString!=0)
528 1 {
529 2 SBUF0 = *pSendString++;
530 2 while(TI0==0);
531 2 TI0=0;
532 2 }
533 1
534 1 ES0 = 1;
535 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 621 ----
CONSTANT SIZE = 67 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 8
IDATA SIZE = 20 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -