新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STC12C5A60S2 串口中斷接收程序

        STC12C5A60S2 串口中斷接收程序

        作者: 時間:2016-11-09 來源:網絡 收藏
        #define UART0_BUF_LEN32


        int UART1_Recv_count; //接收計數

        本文引用地址:http://www.104case.com/article/201611/318043.htm

        bit UART1_Overflow_Flag; //緩沖區滿標志

        idata uchar UART1_Recv_BUF[UART0_BUF_LEN]; //串口接收緩沖區

        //串口初始化
        void Init_Uart()
        {
        UART1_Overflow_Flag=0;
        UART1_Recv_count=0;
        //22.1184M 晶振 115200波特率
        PCON &= 0x7f;//波特率不倍速
        SCON = 0x50;//8位數據,可變波特率
        BRT = 0xFA;//設定獨立波特率發生器重裝值
        AUXR |= 0x04;//獨立波特率發生器時鐘為Fosc,即1T
        AUXR |= 0x01;//串口1選擇獨立波特率發生器為波特率發生器
        AUXR |= 0x10;//啟動獨立波特率發生器
        ES = 1; //充許串口1中斷

        }

        //串口中斷接收程序

        /*

        說明:

        (1)如果緩沖區接收滿了,則中斷接收程序不在接收數據。UART1_Recv_count=32

        (2)如果接收到“回車符”、“換行符”,則中斷不在接收數據。UART1_Recv_count={實際接收到的數據個數}

        以上2種情況觸發后 UART1_Overflow_Flag標志位置為1,等待MAIN函數(主程序處理)

        */
        void UART1_Int(void) interrupt 4
        {
        if (RI == 1)
        {
        RI = 0;
        if(UART1_Overflow_Flag==0)
        {
        if(UART1_Recv_count {
        UART1_Recv_BUF[UART1_Recv_count++] = SBUF;
        if(SBUF==r || SBUF==n)
        {
        UART1_Overflow_Flag=1;
        }
        }
        else
        {
        UART1_Overflow_Flag=1; // 關閉串口中斷,停止接收
        }
        }
        LED2=~LED2;
        }
        }

        int main()
        {
        char i;
        TMOD=0x00;
        AUXR=0x00;

        LED1=0;
        LED2=1;

        Init_Uart();
        EA=1; //開總中斷

        printf("System is start...rn");

        while(1)
        {
        if (UART1_Overflow_Flag==1) //串口中斷數據接收完畢,開始處理
        {
        for(i=0;i printf("%c",UART1_Recv_BUF[i]);
        Appcall(UART1_Recv_BUF,UART1_Recv_count);
        printf("rn");
        UART1_Recv_count = 0; //緩存清零
        UART1_Overflow_Flag=0;//允許串口繼續接收數據
        }
        }
        }

        小知識:

        [1]換行符、回車符的定義

        ASICC語言編程描述
        回車符0a(13)r
        換行符0dn

        換行符、回車符的來歷:

        在計算機還沒有出現之前,有一種叫做電傳打字機(Teletype Model 33)的玩意,每秒鐘可以打10個字符。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字符。要是在這0.2秒里面,又有新的字符傳過來,那么這個字符將丟失。于是,研制人員想了個辦法解決這個問題,就是在每行后面加兩個表示結束的字符。一個叫做“回車”,告訴打字機把打印頭定位在左邊界;另一個叫做“換行”,告訴打字機把紙向下移一行。這就是“換行”和“回車”的來歷,從它們的英語名字上也可以看出一二。

        后來,計算機發明了,這兩個概念也就被般到了計算機上。那時,存儲器很貴,一些科學家認為在每行結尾加兩個字符太浪費了,加一個就可以。于是,就出現了分歧。

        Unix系統里,每行結尾只有“<換行>”,即“n”;

        Windows系統里面,每行結尾是“<換行><回車>”,即“nr”;Mac系統里,每行結尾是“<回車>”。

        在ascii中,回車和換行是不同的字符。0x0A是回車,即光標移動到本行的最左面; 0x0D是換行,即光標移動到下一行。

        [2]常見的串口工具如何發生“換行符”

        在用串口工具發送數據時,如果勾選了發送新行,串口工具就會在數據尾部添加“換行符”

        [2] STC單片機波特率計算

        STC單片機官網上有一個比較好用的波特率計算工具,大家都可以自己下載了使用。

        選擇好晶振,波特率發生器、定時器時鐘后, 該程序就可以自動生成代碼了。非常方便。

        STC官網地址:http://www.stcmcu.com/

        [3]關于STC單片機獨立波特率發生器的理解

        a. STC單片機有1個獨立的波特率發生器,雖然用獨立的波特率發生器就不需要用定時器了。但是要注意的時,獨立波特率發生器和“晶振”頻率還是有關的。

        b. 如果要串口的數據收發誤碼率較低,還是要選用 11.0592 、22.1184 這些晶振。

        注意看上圖,誤碼率為 0.00%

        c. 6M、 12M 、24M 這些晶振如果在串口通信里,是不建議用的

        d. 在STC單片機上,用 11.0592 晶振,是可以非常方便的上 115200 波特率高速傳輸的,這是普通的AT89S51單片機很難實現的。

        只要讓單片機工作在1T的工作模式下,11.0592的晶振,也可以輕松跑到115200波特率。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 巴中市| 葫芦岛市| 商城县| 紫金县| 右玉县| 象州县| 神木县| 赣州市| 桑植县| 文昌市| 美姑县| 镇巴县| 玉门市| 名山县| 凤山县| 建德市| 乡宁县| 赤城县| 合江县| 南充市| 集安市| 曲阳县| 琼中| 太湖县| 加查县| 垣曲县| 江北区| 长岭县| 阳山县| 嘉义县| 金门县| 宣恩县| 天津市| 于都县| 五莲县| 蒲江县| 万源市| 陇西县| 武功县| 富平县| 乐业县|