ボーレート計算式: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 。 }
実験の現象:
ボーレートが文字化けしているので理由はアナログポートを使用することはお勧めしません。