51單片機putchar函數的說明


原文排版遠些亂,整理了一下。

 1 #include <reg51.h>
 2 
 3 #define XON  0x11            /*串口流控制符  啟動*/
 4 #define XOFF 0x13            /*串口流控制符  中斷*/
 5 
 6 /* putchar (full version):  expands '\n' into CR LF and handles        完整版 每次發送數據都要檢查sbuf是否有中斷信號
 7  *XON/XOFF (Ctrl+S/Ctrl+Q) protocol                                    XON啟動 XOFF中斷      通信協議*/
 8 char putchar (char c)
 9 {
10     if (c == '\n') /*判斷是否是換行符的原因,是因為字符串的標准格式是末尾為\r(回車符)\n(換行符)這兩個字符*/
11     { 
12         if (RI) /*判斷接收標識符是否為1,若為1則說明SBUF接受到了信息*/
13         {
14             if (SBUF == XOFF) /*判斷SBUF中的信息是否為中斷信號  是則執行以下程序*/
15             {
16                 do
17                 {
18                     RI = 0; /*將接收標識符置1 可以繼續接收信息*/
19                     while (!RI); /*判斷是否接收到了信息,是則往下循環*/
20                 }while (SBUF != XON); /*判斷接收的信息是否為啟動信息,是則退出循環,不是繼續循環*/
21                 RI = 0; /*將接受標識符置1 可以繼續接收信息*/
22             }
23         } /*只要c是換行符,最終都要執行這里判斷發送標識符是否為1,只有為1才往下執行,這點非常重要調用printf函數時,必須將TI置1*/
24         while (!TI);
25         TI = 0; /*將TI置0 准備發送數據*/
26         SBUF = 0x0d; /* output CR  */          /*  發送回車符*/
27     }
28     if (RI) /*下面的if函數又是判斷SBUF中是否接收了中斷信號與上面的一樣*/
29     {
30         if (SBUF == XOFF)
31         {
32             do
33             {
34                 RI = 0;
35                 while (!RI);
36             } while (SBUF != XON);
37             RI = 0; 
38         }
39     }
40     while (!TI); /*判斷發送標識符是否為1*/
41     TI = 0; /*將TI置0 准備發送數據*/
42     return (SBUF = c); /*發送字符c*/
43 }
44 
45 
46 
47 #if 0  // comment out versions below
48 /*
49 * putchar (basic version): expands '\n' into CR LF  精簡版
50 */
51 char putchar (char c)
52 {              
53     if (c == '\n') /*還是判斷字符c是不是換行符*/
54     {
55         while (!TI); /*判斷TI是否置1     為1向下執行*/
56         TI = 0;
57         SBUF = 0x0d; /* output CR  */       /* c是換行符先發送回車符*/
58     }
59     while (!TI); /*又是判斷TI是否為1   為1向下執行*/
60     TI = 0; /*將TI置0 准備發送數據*/
61     return (SBUF = c); /*發送字符c*/
62 }
63 
64 
65 /*
66 * putchar (mini version): outputs charcter only  少了判斷字符c是否為換行符的步驟
67 */
68 char putchar (char c)
69 {
70     while (!TI);  /*判斷TI是否置1     為1向下執行*/
71     TI = 0;  /*將TI置0 准備發送數據*/
72     return (SBUF = c);  /*發送字符c*/
73 }                                                          
74 #endif

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM