マイクロシミュレーションシリアル通信ノート

ボーレート計算式:1,3ボーレートモード= 1/32又は1/16 * タイマ 2オーバーフローレート

        ボーレート= 1/16又は1/32 *(水晶周波数/ 12 *(256-TH1))

    

 

 

 

 シリアルモード1つの動作では、それぞれT / C1及びT / C2は、以下のように共通の初期値テーブルは料金をボー

 

 

 

 

 

 アナログシリアルポートのボーレートの設定方法について:

9600b / sの - > 104us - 遅延時間104usを達成するためのタイマカウンタ2の動作>モード、 - >すなわち12MHzの104のカウントの周波数で

- > SCM + 1カウントし、初期値が設定される(256から104) - >関数のニーズは非常に初期値を設定し、特定の実行時間を消費するので

エラーを減らすために(256から99)であります

 

 

作業モード4におけるマイクロコントローラタイミングカウンタ51:

仕事 機能
0 モード0、唯一の16ビットカウンタ13、すなわち、タイマ/カウンタT0オペレーティング、TH0高い8ビットとTL0の下位5ビットは、13ビットタイマ/カウンタを形成します。
1 タイマーT0ワークとワーク1 0と同様に、カウンタのビット数の差の嘘。13ビット・カウンタのカウント作業に0に関わる作業は、16ビット・カウンタがカウント置きます。
2

操作のT0タイマモードにて2、二つの別々の8ビットカウンタTH0とTL0に16ビットカウンタ。

3 3 T0タイマはのみ有効に機能します。タイマT0は、2つの別個の8ビットカウンタTH0とTL0にモード3、16ビット・カウンタを作動します。

シリアル関連レジスタ:

 

 

 

 

シリアル通信のタイミング図。

 出力タイミングダイアグラム:

 

 入力タイミングダイアグラム:

 

 

1 RENソフトウェアセットは、時間RXD端子のレベルをサンプリングし、選択したボーレートに受信機16は、RXD端子の入力レベルを検出する負の遷移が発生し、その後、スタートビットは、有効です入力シフトレジスタにシフトされ、フレーム情報の残りのビットの受信を開始します。受信は、データは左のスタートビットが入力シフトレジスタ、制御回路最後のシフト中にシフト、右への入力シフトレジスタから転送されています。RI = 0、およびSM2 = 0(または受信ストップビットが1である)場合、受信した9ビットデータの最初の8ビットデータは、RB8に受信SBUF、9番目のビット(ストップビット)にロード並置されますRI = 1、CPUへの割り込み要求。
----------------
免責事項:この記事は元の記事CSDNブロガー「To_dreams」で、CC 4.0 BY-SAの著作権契約書に従って、元のソースのリンクと、この文を添付してください、再現。 。
オリジナルリンクします。https://blog.csdn.net/to_dreams/java/article/details/7716678

 

マイクロコントローラの割り込み信号の方法:

 INT0 外部割り込み0、アクティブ・ロー。P3.2ピン。
 INT1 外部割り込み要求がアクティブローです。ピンP3.3により、
T0 タイマ/カウンタ割り込み要求0オーバーフロー。
T1 タイマ/カウンタ1溢れ割り込み要求
TXD / RXD シリアルポート割り込み要求。シリアルポートの完了は、データを送信または受信する際には、割り込みを要求します。

 

51マイクロコントローラの割り込みとC言語プログラミングのフォーマットについて形

無効)(INT0割り込み   0   使用  1 
{ 

} 
割り込み   0は、    外部割り込み0を示す
割り込み       0割り込み指定されたタイマー使用0はゼロ番目のレジスタ群で
 使用1第一のレジスタ群であります

  

 

例えば:

/ *   外部割込みプログラム* / 
ボイド ISR_Key(ボイド割り込み)0  使用 1。
{ 
    P1の = P1の〜; // S3トリガーが押されると、一旦反転P1 
} 

/ *    シリアル割込みプログラム   * / 
ボイド UART_SER(ボイド)割り込み4  / / シリアル割り込みサービスルーチン
{ 
    符号なしchar型温度; // 一時変数の定義
    IF(RI)// 割り込みが受信された決定
    { 
        RI = 0 ; // フラグがクリアされ、 
        温度= SBUF; //は、バッファ値に読み込ま
        温度= P1; // 表示するための出力ポートに値P1 
        SBUF =温度を; // バックコンピュータ端末に、受信した値
    }
     IF(TI)// 送信フラグがクリアされた場合 
    TI = 0 ; 
}

            

 

マイクロシミュレーションシリアル通信コード:

#include " reg52.h " 
// トランシーバピンバイト定義受信したデータの最大数
 // の#include "stdio.hの"
 // SBIT RXD P3 ^ = 0; 


// 。の#define TXD P3 ^ 1 

に#define RECEIVE_MAX_BYTES 16 の#define TIMER_ENABLE(){TH0はTL0 =である。= TR0 1; fTimeouts = 0;} // Tを有効/ C の#define TIMER_DISABLE(){TR0 = 0; fTimeouts = 0;} // 禁止T / C用の#define TIMER_WAIT(){(fTimeouts!)fTimeouts = 0つつ;} // T / Cタイムアウト待機
符号なしチャー fTimeouts = 0 ; // T / Cタイムアウトフラグ 
符号なしチャー recvbuf [ 16





]; // バッファデータ受信 
符号なしチャー RecvCount = 0 ; //は、データカウンタを受信

// 、バイト送信
空隙 SendByte(符号なしチャーB)
{ 
    符号なし文字 Iは= 8 ; 
    TXD = 0 ; 
    TIMER_ENABLE(); 
    TIMER_WAIT()。
    一方、(i-- 
    { 
            IF(&B 1 
                TXD = 1 ;
              
                TXD = 0 
            TIMER_WAIT(); 
            B >> = 1 
    } 
    
        TIMER_ENABLE()。
    TIMER_DISABLE(); 
    
} 

// 接收字节 
符号なしチャー RecvByte(ボイド
{ 
    符号なしチャーI; 
    符号なしチャー B = 0 

    TIMER_ENABLE(); 
    TIMER_WAIT(); 
    以下のために(私は= 0 ; iは< 8 ; I ++ 
    { 
            場合(RXD)
                B | =(1 << I)。
            TIMER_WAIT();
            
    }
     
    TIMER_WAIT(); // 終了待ちビット
    ; TIMER_DISABLE()
     戻りB; 
    
} 
// 印字文字列
ボイド PrintfStr(CHAR * PSTR)
{ 
    一方(PSTR && * PSTR)
    { 
        SendByte( * PSTR ++ ); 
    } 
} 

// Tを/ Cの初期
空隙 TimerInit(ボイド
{ 
    TMOD = 0X02 ; 
    TR0 = 0 ; 
    TF0 = 0 ; 
    TH0である =(256 -99 ); 
    TL0 = TH0であり、
    参照作物蒸発散 = 1 ; 
    EA = 1 ; 
} 


// スタートビットが到着がある場合 
、符号なしチャー StartBitCome(ボイド
{ 
    リターン(RXD == 0 ); 
} 



// メイン関数

ボイドメイン(ボイド
{ 
    符号なしチャーI; 
    TimerInit(); 
    // のprintf( "こんにちは80C52 \ R&LT \ N-"); 
    一方、1 
    { 
        IF(StartBitCome())
        { 
                RecvBuf [RecvCount ++] = RecvByte()。
            もし(RecvCount> = RECEIVE_MAX_BYTES)
            { 
                RecvCount = 0 以下のために(私は= 0 ; I <RECEIVE_MAX_BYTES; I ++ 
                { 
                    SendByte(RecvBuf [I])。
                } 
            } 
                
        } 
    } 
    
} 

// 定时器中断服务函数
空隙 Timer0IRQ(ボイド)割り込み1  使用 0 
{ 
    fTimeouts =を1 
}

 

実験の現象:

 ボーレートが文字化けしているので理由はアナログポートを使用することはお勧めしません。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

おすすめ

転載: www.cnblogs.com/xwtstudio/p/12602745.html