新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于單片機的軟件UART的設計思想

        基于單片機的軟件UART的設計思想

        作者: 時間:2010-09-26 來源:網絡 收藏

        3.3、數據發送子程序

        該程序過程中,當數據發送狀態結束時,檢測發送FIFO隊列是否為空,若非空則取出發送數據,然后啟動發送狀態;當處于發送狀態時,則按照狀態機的狀態進行起始位、數據位和停止位的發送。

        void Send()

        {

        if(TxdCnt1!=0) //字節發送狀態機

        {

        if(TxdCnt1==11) TxD1=0;//發起始位0

        else if(TxdCnt1>2) //發數據位

        { Mtbuf1>>=1; TxD1=CY;}

        else TxD1=1; //發終止位1

        TxdCnt1--;

        }

        else if(Tnum1>0) //檢測FIFO隊列

        {

        Tnum1--;

        Mtbuf1=Tbuf1[Tptr1]; //讀取FIFO數據

        if(++Tptr1>=BufLong) Tptr1=0;

        TxdCnt1=11; //啟動發送狀態機

        }

        }

        3.4、中斷程序

        中斷定時時間為波特率定時的1/3,即以3倍的波特率對RxD進行采樣,實現起始位的判別,當起始位到達時啟動接收過程狀態機。將該定時進行3分頻再調用數據的發送和接收過程,進行準確波特率下的串口通信。

        void Uart() interrupt 1 using 1

        {

        if(RxdCnt1==0 ) //接收起始識別

        {

        if(RxD1==0 Brxd1==0 Srxd1==1) { RxdCnt1=8; TimCnt1B=0;}

        }

        Srxd1=Brxd1; Brxd1=RxD1;

        if(++TimCnt1B>=3 RxdCnt1!=0) { TimCnt1B=0; Recv();}//數據接收

        if(++TimCnt1A>=3) { TimCnt1A=0; Send();} //數據發送

        }

        3.5、串口初始化

        打開定時器的中斷,將定時器的設置為自裝載模式,依照波特率設置定時中斷的定時間隔,啟動定時器,并進行各變量的初始化。

        void IniUart()

        {

        IE=0x82; TMOD=0x22;

        TH0=-BaudT; TL0=-BaudT; TR0=1;

        Rptr1=0;Rnum1=0;Tptr1=0;Tnum1=0;

        }

        4、結束語

        本文提出的模擬串口設計方法,其獨特之處在于:僅僅使用任意2個普通I/O引腳和1個定時中斷實現了全雙工串口,對硬件的占用較少,具有多可串口擴展能力;在串口接收的起始位判別時采用了連續3次采樣的判別方法,該方法實現簡單、準確率高;用定時中斷實現了串口數據的發送和接收,并實現了FIFO隊列,使串口發送和接收工作效率高。

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

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 大余县| 甘德县| 邵阳市| 克拉玛依市| 察哈| 泸溪县| 高淳县| 水城县| 朝阳区| 建昌县| 获嘉县| 兰考县| 新邵县| 永昌县| 图木舒克市| 连城县| 邵阳县| 利津县| 远安县| 惠安县| 鹰潭市| 孟津县| 喀喇沁旗| 平顺县| 思茅市| 武宁县| 平定县| 旺苍县| 丰城市| 洛川县| 太和县| 二手房| 丁青县| 乌兰察布市| 边坝县| 桦川县| 宿州市| 新乡市| 桂东县| 玛曲县| 运城市|