在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)軟件用定時(shí)器模擬串口程序

            51單片機(jī)軟件用定時(shí)器模擬串口程序

            作者: 時(shí)間:2016-11-30 來(lái)源:網(wǎng)絡(luò) 收藏
            模擬串口定時(shí)器完成,每一個(gè)串口要占用一個(gè)定時(shí)器,發(fā)送很好辦,每次定時(shí)器中斷(1BIT的時(shí)間)傳送一個(gè)Bit,接收就要你好好處理了,這個(gè)我模擬的一個(gè)串口,用的W77E58,實(shí)際工作時(shí)只用到了半雙工。


            //使用硬件:定時(shí)器0,定時(shí)器0中斷,定時(shí)器1中斷,外中斷5
            //波特率 9600 4800 2400 1200 600 300
            //每BIT周期數(shù)9696*2 96*4 96*8 96*16 96*32
            //以96為單位不同的波特率選用不同的倍率
            //如果對(duì)方在每位的1/2處采樣,則發(fā)送中斷的響應(yīng)時(shí)間最多是48個(gè)時(shí)鐘周期
            //也許可以置發(fā)送中斷以較高的優(yōu)先級(jí)來(lái)解決,實(shí)驗(yàn)表明發(fā)送可以工作于9600
            //但若有其它中斷,并且串口工作于全雙工,則晶體頻率最好是22.1184以上
            //!!實(shí)測(cè)表明當(dāng)用11.0592時(shí)鐘,標(biāo)準(zhǔn)51,收發(fā)同時(shí),最高只能到2400波特。
            //但單發(fā)可以工作于9600
            #define BAUD_RATE 300
            //#define BAUD_RATE 600
            //#define BAUD_RATE 1200
            //#define BAUD_RATE 2400
            //#define BAUD_RATE 4800
            //#define BAUD_RATE 9600

            #define clock 110592
            //#define clock 221184


            #define RELOAD(TIMER,SVALUE) TIMER+=SVALUE+1

            bit tTI;
            bit rRI;

            unsigned char rSBUF;
            unsigned char tSBUF;

            unsigned char rSBUF0;
            unsigned char RxdCnt;
            unsigned char rSmpCnt;

            unsigned char TxdCnt;
            unsigned char tSmpCnt;
            unsigned char multiple;
            //-----------------------------------------------------------

            void SimuUARTinit(void)
            {
            #if BAUD_RATE==300
            if(clock==110592)
            multiple=32;
            else if(clock==221184)
            multiple=64;
            #endif
            #if BAUD_RATE==600
            if(clock==110592)
            multiple=16;
            else if(clock==221184)
            multiple=32;
            #endif
            #if BAUD_RATE==1200
            if(clock==110592)
            multiple=8;
            else if(clock==221184)
            multiple=16;
            #endif
            #if BAUD_RATE==2400
            if(clock==110592)
            multiple=4;
            else if(clock==221184)
            multiple=8;
            #endif
            #if BAUD_RATE==4800
            if(clock==110592)
            multiple=2;
            else if(clock==221184)
            multiple=4;
            #endif
            #if BAUD_RATE==9600
            if(clock==110592)
            multiple=1;
            else if(clock==221184)
            multiple=2;
            #endif
            tTI=1;
            tTXD=1;
            rRXD=1;

            TMOD&=0xf0;
            TMOD|=0x03;
            ET0=1;
            ET1=1;
            TR0=1;
            IT0=1;
            EX0=1;
            TR1=1;
            PT1=1; //置串口發(fā)送為高優(yōu)先級(jí)
            EA=1;
            }
            //-----------------------------------------------------------
            //模擬串口發(fā)送中斷,原定時(shí)器1中斷
            void IntTH0(void) interrupt 3
            {
            RELOAD(TH0,-96);
            if(--tSmpCnt == 0)
            {
            tSmpCnt=multiple;
            if(tTI) return;
            switch(TxdCnt++)
            {
            case 0:
            tTXD=0;
            break;
            case 9:
            tTXD=1;
            tTI=1;
            TxdCnt=0;
            break;
            default:
            tTXD=tSBUF&0x01;
            tSBUF>>=1;
            break;
            }
            }
            }
            //-----------------------------------------------------------
            void RxdInt0(void) interrupt 0
            {
            TL0=-96+4; //The time of inter interrup
            ET0=1;
            TF0=0;
            rSmpCnt=multiple/2;
            }
            //----------------------------------------------------------
            //模擬串口接收中斷,原定時(shí)器0中斷
            void IntTL0(void) interrupt 1
            {
            RELOAD(TL0,-96);

            if(--rSmpCnt == 0)
            {
            rSmpCnt=multiple;
            switch(RxdCnt++)
            {
            case 0:
            if(rRXD==1){RxdCnt=0;}//ET0=0 added,no startbitfound then stop interrup
            break;
            case 9:
            RxdCnt=0;
            if(rRXD==0) return;
            rSBUF=rSBUF0;
            rRI=1;
            break;
            default:
            if(RxdCnt>9){ RxdCnt=0;return;}
            rSBUF0>>=1;
            rSBUF0|=rRXD?0x80:0;
            break;
            }
            }
            }
            //-----------------------------------------------------------


            評(píng)論


            技術(shù)專(zhuān)區(qū)

            關(guān)閉