新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 52單片機串口中斷知識

        52單片機串口中斷知識

        作者: 時間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
        1、單片機每“次”的確只能接收1個字節(jié),但由于串口的速度實在太低,通常都在115200bps以下(即使用了同步方式也“只能”達到1Mbps)。注意,是bps,位/秒,而不是“字節(jié)/秒”,這就是“串”行通信,要至少8個“bps時間”才能接收一個完整的字符,事實上,加上起始位等,8個位往往傳送不了一個字節(jié)(不知道我的理解是不是有偏差),這就是說,速度至少還要再慢上8倍。


        2、帶有USART的單片機里USART一般都是做為“外部設(shè)備”,獨立于MCU進行收發(fā)工作,即其收發(fā)過程中的串-并和并-串轉(zhuǎn)換以及數(shù)據(jù)IO過程都是“自主”和“自動”的,不需要CPU逐位進行收發(fā)處理,因此,在CPU將數(shù)據(jù)送到SBUF后,便可以放手不管了,USART收發(fā)器會自動將SBUF的內(nèi)容轉(zhuǎn)換成串行數(shù)據(jù)發(fā)送出去。接收時也是由USART將串行數(shù)據(jù)轉(zhuǎn)成并行數(shù)據(jù)并存放到SBUF后才會通知MCU(產(chǎn)生接收中斷)。MCU所需要做的只是往SBUF送數(shù)或從SBUF中取數(shù)(都只要1個指令周期)。

        3、設(shè)置串口參數(shù)的時候應(yīng)該能看出,為了適應(yīng)串口的慢,不得不動用定時器進行延時,以“產(chǎn)生”所需要的波特率,而這個“延時”通常都要給8位甚至16位定時器設(shè)置初值,定時器每一次計數(shù)都需要一個指令周期,即CPU可以執(zhí)行一條指令的時間,而定時器兩次串口溢出才僅僅接收或發(fā)送一個“位”,接收一個字節(jié)需要數(shù)倍于此的時間,那么這么長的時間對CPU來說,足以從容地從SBUF里取出數(shù)據(jù)并對其進行處理了。

        4、即使CPU的任務(wù)相當繁重,或?qū)邮盏降拿總€字節(jié)都需要進行相當復雜的處理,我們也完全可以通過建立接收緩沖區(qū)的方式將暫時來不及處理的數(shù)據(jù)暫存起來,等CPU空閑時再做處理。而從SBUF取出數(shù)據(jù)并保存到緩沖區(qū)只需要很少的幾條指令就能完成,不會影響到串口繼續(xù)接收。

        5、標準的RS-232協(xié)議并非只有TX、RX和GND三個引腳,即便是最簡單的9針插口,也專門設(shè)計了檢測傳輸狀態(tài)和收發(fā)請求的針腳。如果單片機真的實在無法及時完成收發(fā)動作,也完全可以利用一個口線作為狀態(tài)標識,使PC能夠知道單片機什么時候可以接收數(shù)據(jù),而不會任由數(shù)據(jù)丟失。

        6、為了增加數(shù)據(jù)傳輸?shù)目煽啃?,大量?shù)據(jù)傳輸時通常都會采用CRC校驗方式,并以“包”或“幀”的方式發(fā)送有格式約定的字節(jié)流,而非單個字符,這樣一來,完全可以通過約定一些“通信協(xié)議”的方式,使收發(fā)雙方都能夠及時知道接收的數(shù)據(jù)是否完整,并及時重發(fā)新發(fā)送出錯的數(shù)據(jù)。

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

        # include
        #include
        typedef unsigned char unchar ;
        unsigned char ch;
        bit read_flag= 0 ;

        void init_serialcom( void ) //串口通信初始設(shè)定

        {

        SCON = 0x50 ; //UART為模式1,8位數(shù)據(jù),允許接收

        TMOD = 0x20 ; //定時器1為模式2,8位自動重裝

        PCON = 0x80 ; //SMOD=1;

        TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHz

        TL1 = 0xFD ;
        IE = 0x90 ; //Enable Serial Interrupt

        TR1 = 1 ; // timer 1 run

        // TI=1;

        }

        //向串口發(fā)送一個字符

        void send_char_com( unchar ch)

        {

        SBUF=ch;

        while (TI== 0);

        TI= 0 ;

        }

        //串口接收中斷函數(shù) 功能:串口中斷。如果有數(shù)據(jù)從串口發(fā)送過來,首先從串口中讀出數(shù)據(jù),賦給串口緩沖數(shù)組,清中斷標志(RI和TI中有一個為1就會馬上進入中斷服務(wù)子程序)

        void serial () interrupt 4 using 3

        {

        if (RI)

        {

        RI = 0 ;

        ch=SBUF;

        read_flag= 1 ; //就置位取數(shù)標志

        }

        }

        void main()

        {

        init_serialcom(); //初始化串口

        while ( 1 )

        {

        if (read_flag) //如果取數(shù)標志已置位,就將讀到的數(shù)從串口發(fā)出

        {

        read_flag= 0 ; //取數(shù)標志清0

        send_char_com(ch);

        }

        }

        }



        關(guān)鍵詞: 52單片機串口中

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 威信县| 溆浦县| 南宁市| 双江| 水富县| 金溪县| 仪陇县| 大丰市| 酒泉市| 镶黄旗| 东乡县| 团风县| 安陆市| 苏州市| 高淳县| 新民市| 乌审旗| 时尚| 称多县| 三亚市| 宜良县| 五华县| 舒兰市| 兴海县| 裕民县| 泰顺县| 淳化县| 巨野县| 班玛县| 南昌市| 亚东县| 庆元县| 凤凰县| 固原市| 五台县| 荣昌县| 开江县| 三江| 离岛区| 甘孜| 昌吉市|