久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

51單片機軟件用定時器模擬串口程序

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年11月06日   【字體:

模擬串口用定時器完成,每一個串口要占用一個定時器,發送很好辦,每次定時器中斷(1BIT的時間)傳送一個Bit,接收就要你好好處理了,這個我模擬的一個串口,用的W77E58,實際工作時只用到了半雙工。


//使用硬件:定時器0,定時器0中斷,定時器1中斷,外中斷5
//波特率      9600 4800 2400 1200 600   300
//每BIT周期數  96  96*2 96*4 96*8 96*16 96*32
//以96為單位不同的波特率選用不同的倍率
//如果對方在每位的1/2處采樣,則發送中斷的響應時間最多是48個時鐘周期
//也許可以置發送中斷以較高的優先級來解決,實驗表明發送可以工作于9600
//但若有其它中斷,并且串口工作于全雙工,則晶體頻率最好是22.1184以上
//!!實測表明當用11.0592時鐘,標準51,收發同時,最高只能到2400波特。
//但單發可以工作于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;  //置串口發送為高優先級
    EA=1;
}
//-----------------------------------------------------------
//模擬串口發送中斷,原定時器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;
}
//----------------------------------------------------------
//模擬串口接收中斷,原定時器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 start bit found 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;
        }
    }
}
//-----------------------------------------------------------

關閉窗口

相關文章

主站蜘蛛池模板: av日韩在线播放 | 一区二区三区四区在线视频 | av在线一区二区三区 | 综合久久久 | 亚洲国产精品一区二区第一页 | 玩丰满女领导对白露脸hd | 日韩精品一区二区三区中文字幕 | 日本午夜网 | 欧美精品一区二区在线观看 | 在线天堂免费中文字幕视频 | 久久一 | 在线免费av电影 | 欧美一区二区三区在线视频 | 欧美精品久久久久久久久久 | 久久精品在线 | 亚洲小视频| 91中文视频| 欧美成人精品欧美一级 | 久久久久国产精品一区二区 | 精品国产18久久久久久二百 | 日韩精品久久久久久 | 国产成人精品一区二三区在线观看 | 国产精品久久久久久久久久免费看 | 中文字幕亚洲国产 | 国产资源一区二区三区 | 天天操天天干天天爽 | 91精品一区二区三区久久久久 | 国产亚洲精品久久情网 | 国产一区91精品张津瑜 | 午夜电影网| 日韩久久久久 | 精品国产一区一区二区三亚瑟 | 国产精品一区二区在线观看 | 日本在线一区二区 | 欧美一区二区视频 | 日韩久久久久 | 久久青视频 | 亚洲天堂色| 一区二区三区日韩精品 | 国产中文字幕网 | 看一级毛片 |