8051 マイコンアーキテクチャ:ピン図、内部設計および実世界のインターフェース

公開済み 10月 31, 2026

8051は、統合CPU、128〜256バイトのRAM、4KBの典型ROM、4つのI/Oポート、2つの16ビットタイマー、全デュプレックスUARTを備えた8ビットマイクロコントローラで、すべて1チップ上にあります。ハーバードアーキテクチャを採用しており、プログラムメモリとデータメモリが別々のアドレス空間を占めることで、命令フェッチが簡素化され、制御ループの決定性が向上します。以下では、ピン配置、ブロックレベルのアーキテクチャ、コンクリートインターフェースの例、そして8051が今日でも意味を持つ場所を紹介します。

主なポイント:

  • 8051はCPU、メモリ、タイマー、割り込み、シリアル通信を含む完全な制御システムを1つのICに統合し、ほとんどの外部接着ロジックを排除します。
  • ポート0とポート2は外部メモリを追加する際にアドレス/データバスとしても使われます。ポート3のピンには代替機能(シリアルTx/Rx、外部割り込み、タイマー入力、メモリ制御ストロボ)があります。
  • ハーバードアーキテクチャはコードとデータを分離しており、命令フェッチがデータ読み取り時に停止することはありません。これは決定論的なリアルタイムループにとって重要です。
  • エンハンストバリアント(AT89S52、STC15シリーズ)はシステム内プログラミング、高速クロック、追加RAMなどの機能を追加しますが、コア命令セットは互換性があります。
  • 8051はDSP、高速通信、浮動小数点演算には適していません。もしアプリケーションにそれらが必要なら、Cortex-M0+やハードウェア乗算付きのAVRを検討してみてください。

ピン構成と官能基

標準の8051は40ピンDIPまたはPLCCパッケージで提供されています。ピンは電源、クロック、制御、そして4つの8ビットI/Oポートに分類されています。

Figure 1. 8051 40-pin DIP pinout with port assignments and dual-function labels

ピン 名前 タイプ 機能
1-8 P1.0-P1.7 I/O 汎用双方向ポート;基本の8051には代替機能はありません。
9 RST 入力 アクティブ・ハイリセット;パルス≥2サイクルでCPUと周辺機器がリセットされます。
10-17 P3.0-P3.7 I/O/スペシャル デュアルファンクションポート:RXD、TXD、INT0、INT1、T0、T1、WR、RD。シリアル通信、割り込み、タイマー入力、外部メモリ制御に使用。
18 XTAL2 出力 内部反転アンプからの出力;結晶の片側に接続しています。
19 XTAL1 入力 オシレーターと内部クロック分圧器への入力。
20 GND パワー 接地基準(0V)。
21-28 P2.0-P2.7 I/O/アドレス EAが低く外部プログラムメモリが有効の場合、一般的なI/Oまたは高次アドレスバス(A8-A15)を使用します。
29 PSEN 出力 プログラムストアの有効化;ストロボは外部プログラムメモリ(アクティブロー)を制御します。
30 ALE/プログ 出力/入力 アドレスラッチ有効化;1回のマシンサイクルに1回パルスをしてポート0のアドレス/データをデマルチプレックスします。また、一部のバリエーションではプログラミングパルス入力としても使用されます。
31 EA/VPP 入力/電力 外部アクセス:内部ROMから実行するには高をタイ、外部プログラムメモリを強制するために低をタイドします。一部のフラッシュバリエーションでは、このピンを電圧のプログラムに使います。
32-39 P0.0-P0.7 I/O/AD バス 外部メモリとインターフェースする際に多重化された低次アドレス/データ(AD0-AD7);一般的なI/O使用のために外部プルアップが必要なオープンドレイン出力。
40 VCC パワー +5V電源(一部の現代派生型では3.3V)。

ポート0はオープンドレインなので、一般的なI/Oとして使う場合は外部の10 kΩプルアップを追加する必要があります。エンジニアがこれを忘れて何時間もかけて断続的な高レベル読み取りをデバッグする設計も見たことがあります。

内部ブロックアーキテクチャ

8051のハーバードレイアウトは命令フェッチとデータアクセスを別々のバスに分けているため、データオペランドが命令パスをクリアするのを待つCPUのストールは見られません。

Figure 2. 8051 block diagram showing CPU, memory spaces, bus structure, timers, UART, and interrupt controller

CPUコア ALUは8ビットですが、乗算と除算用の別個のBレジスタが含まれています(これを使うのはこの2つの命令だけです)。アキュムレータ(A)は主要な作業レジスタです。プログラムステータスワード(PSW)は、キャリー、補助キャリー、オーバーフロー、レジスタバンクセレクト、パリティのフラグを保持します。16ビットプログラムカウンタ(PC)は最大64KBのプログラムメモリをアドレッシングします。16ビットデータポインタ(DPTR)は外部データメモリへのインデックスドアドレッシングを提供します。

記憶の整理 内部プログラムメモリは通常、バリアントによって4KBのマスクROMまたはフラッシュで構成されます。内部RAMは、オリジナルの8051で128バイト(アドレス00h-7Fh)、8052で256バイト(上位128バイトは間接アドレス指定のみ)です。下位32バイトは4つのレジスタバンク(PSWビットで選択可能)に分割されており、それぞれ8つのレジスタR0-R7を含みます。アドレス20h〜2Fhはビットアドレス指定可能であり、シングルサイクル命令で個々のビットを設定、クリア、テストできるため、フラグ管理やI/O制御に役立ちます。

特殊機能レジスタ(SFR)は80h-FFhのアドレスを占有し、タイマー(TMOD、TCON、TH0、TL0、TH1、TL1)、シリアルポート(SCON、SBUF)、割り込みシステム(IE、IP)、ポート(P0-P3)などすべての周辺機器を制御します。この範囲の部分集合のみが実際に実装されています。未実装のSFRを読み取ると未定義のデータが返されます。

タイマー/カウンター タイマー0とタイマー1は16ビットで、4つのモードで動作します:13ビットタイマー(モード0、8048からのレガシーな残留)、16ビットタイマー/カウンター(モード1)、8ビット自動リロード(モード2)、そしてスプリットモード(モード3、タイマー0が2つの独立した8ビットタイマーになる状態)。モード2はボーレート生成に最も有用で、リロード値はハイバイト(TH0またはTH1)にあり、カウンターはローバイトで動作し、オーバーフロー時に自動的にリロードします。私はモード2で11.0592 MHzのクリスタルを使い、標準的なボーレート(9600、19200など)をエラーゼロで生成しました。他のクリスタル周波数では丸めが発生します。

割り込みコントローラ 8051には5つの割り込みソースがあります:2つは外部(INT0、INT1)、2つはタイマーオーバーフロー(TF0、TF1)、1つはシリアル(RI/TI)です。各ソースは固定ベクターアドレス(0003h、000Bh、0013h、001Bh、0023h)を持ちます。割り込み有効化(IE)レジスタは割り込みをグローバルに有効化し、各ソースを個別にマスクします。割り込み優先度(IP)レジスタは高優先度または低優先度を割り当てます。高優先度割り込みは低優先度のサービスルーチンをプリエンプトできますが、同じ優先度の割り込みは固定順序で処理されます:INT0 > TF0 > INT1 > TF1 >シリアル。

シリアルポート(UART) UARTは全二重で、4つのモードをサポートしています:同期シフトレジスタ(モード0)、可変ボーレートの8ビットUART(モード1)、固定ボーレートの9ビットUART(モード2)、そして可変ボーレートの9ビットUART(モード3)。モード1は標準的な非同期シリアルモードです。ボーレートはモード2(自動リロード)のタイマー1オーバーフローから導かれ、式は次の通りです。 ボーレート=(タイマー1オーバーフローレート)/ 32(PCONでSMOD=0時) または ボーレート=(タイマー1オーバーフローレート)÷16(SMOD=1時)。

9600ボーレートで11.0592 MHzのクリスタル、SMOD=1の場合、タイマー1をモード2に設定し、TH1 = 0xFDと設定すると、オーバーフローレートは11059200 / 12 / (256 - 253) = 307200 Hz、307200 / 16 = 19200...待って、それは違う。再計算します:11059200 / (12 × 16 × 2) = 1カウントあたり28800 Hz、つまりTH1 = 0xFDは(256 - 253) = 3 カウント、オーバーフローレート = 28800 / 3 = 9600 Hzとなります。それが正しいリロードの値です。私はエンジニアが間違ったSMODビットを使って4800ボーになったプロジェクトで、まさに同じミスをデバッグしたことがあります。

オシレーターと時計 オンチップ発振器には、XTAL1およびXTAL2に外部の結晶またはセラミック共振器が接続され、2つの22-33 pFコンデンサが接地に接続される必要があります。内部では、発振器の出力を12で割って機械のサイクルクロックを生成します。したがって、12 MHzの結晶は1 MHzの命令レートを与えます(ほとんどの命令は1〜2回の機械サイクルで実行されるため、1〜2μs程度です)。STCなどのメーカーの現代の1T(シングルサイクル)バリエーションでは割り除きが廃止され、同じクリスタルが12×より速く動作します。

LEDインターフェース:具体的な例

ポート1からLEDを駆動する最小限の動作回路を示します。これはポート0のサポート回路全体とオープンドレイン挙動を示しています。

Figure 3. Schematic of 8051 interfacing a single LED on P1.0 via 220Ω resistor, with reset circuit, crystal oscillator, and Port 0 pull-ups

回路説明

  • LED回路: P1.0は出力として設定されています。220Ωの抵抗は、電流をおおよそ(5 V - 2 V) / 220Ω ≈13.6 mAに制限し、これは8051の1ピンあたり15 mAの電源制限内です。1からP1.0のソースを現在に書き込むこと;LEDライト。0と書くとピンが低下し、LEDが消えます。
  • リセット回路: 10μFコンデンサと10kΩ抵抗が電源オン時のリセットを形成します。VCCが上昇すると、コンデンサは抵抗を通過してRSTを数ミリ秒間高く保ちます。8.2kΩの抵抗をグラウンドに接続することで、通常動作中にRSTが低く保たれます(一部の回路図ではこれを省略し、内部の弱いプルダウンに頼っていますが、その構成ではノイズによるリセットが起きているのを見たことがあります)。
  • 発振器: 11.0592 MHzの結晶で、2つの33pFコンデンサがクロックを提供します。この特定の周波数は標準的なUARTボーレートに均等に分割され、誤差ゼロであるため、8051設計で広く使われています。
  • ポート0プルアップ: ポート0を一般的なI/O(アドレス/データバスとしてではなく)として使用する場合、VCCに10kΩの抵抗パックを追加する必要があります。これがなければ、ポート0のピンは高く書き込まれて不確定な論理レベルとして読み取られて浮かびます。

LEDを点滅させるためのCコードは以下の通りです:

「」 #include < reg51.h> sbit LED = P1^0; P1.0をLEDに割り当てる

Void delay_ms(unsigned int ms) { 無署名インターンI、J; for(i = 0; i < ms; i++) for(j = 0; j < 123; j++); 12 MHzクロック向けにキャリブレーション済み }

void main(void) { while(1) { LED = 1; オンにしてください delay_ms(500); LED = 0; 電源を切ってください delay_ms(500); } }


この遅延ループは粗雑でコンパイラの最適化によってドリフトしますが、I/Oメカニズムを示すには十分です。

## 技術仕様

|カテゴリ |仕様 |注釈 |
|----------|---------------|-------|
|CPU |8ビットアキュムレータベース |乗算/除算用のBレジスタを含む |
|命令セット |111の命令 |主に1バイトまたは2バイトのオペコードです。レジスタ操作のための単一サイクル |
|プログラムメモリ |4KBの内部ROM/フラッシュは典型的|PSEN、ポート0、ポート2 |
|データメモリ |128バイトRAM(8051)、256バイト(8052) |下位32バイトは4つのレジスタバンクとして構成されています。16バイト ビットアドレス指定 |
|I/O |32ピン(P0-P3) |P0はオープンドレインで、他のものは内部プルアップが弱い |
|タイマー |2つの16ビット(タイマー0、タイマー1) |それぞれ4つの動作モードがあり、内部でクロックされる場合も、外部ピンからも可能です。
|割り込み |5つの情報源、2つの優先度レベル |固定ベクトルアドレス;優先度付きでサポートされるネスト割り込み |
|シリアルポート |フルデュプレックスUART |4つのモードがあります。モード1(8ビット非同期)最も一般的な|
|時計|最大12 MHz(クラシック)、24-48 MHz(エンハンス)|機械サイクル = 古典建築における12回の振動周期 |
|電源供給 |5 V(クラシック)、3.3 Vまたは2.7-5.5 V(現代のバリエーション) |電流消費量 ~10-20 mAアクティブ、~2 mAのアイドル(大幅にバリアント依存) |
|パッケージ|40ピンDIP、PLCC、TQFP |DIPは今でもプロトタイピングや教育に一般的です。

## 8051がまだ合う場所(そして合わない場所)

**適切な応用例:**

- シンプルなオン/オフ制御:リレードライバー、ソレノイドコントローラ、LEDマトリックスドライバー。
- 低速シリアル通信:RS-232インターフェース、基本的なUARTからUSBへのブリッジ。
- タイミングとカウント:イベントカウンタ、周波数分割器、PWM生成(ソフトウェアまたはタイマー割り込みによるもの)。
- 教育と訓練:指導書は1学期で教えられるほど小さく、ハードウェアも寛容です。
- レガシーシステムの保守:8051ベースの製品は数百万台あり、交換部品は依然として製造されています。

**適していない:**

- 高速通信:USB、イーサネット、または専用コントローラーや外部PHYチップが必要になる場合があります。
- デジタル信号処理:ハードウェアの乗算蓄積装置や浮動小数点ユニットがなく、8ビットALUにより固定小数点計算も遅くなります。
- 大規模なデータバッファ:128バイトのRAMは、単純なデータ構造以外は外部メモリに強制的に使用され、コストと複雑さが増します。
- バッテリー駆動のIoT:最新のCortex-M0+またはRISC-V部品は×MIPSあたり10〜100のエネルギー効率を向上させます。

私はAT89C51を使って直交エンコーダのパルスを読み取り、Hブリッジを駆動するモーターコントローラーをメンテナンスしています。うまくいきましたが、割り込み遅延(数マイクロ秒)が、私たちが確実に追跡できる最大エンコーダ速度を制限していました。ハードウェアクアドラチャーデコーダ付きのCortex-M0に切り替えたことで、そのボトルネックは解消されました。

## 8051 vs. 8085:なぜ混乱が存在するのか

どちらも1970年代後半の8ビットIntel設計ですが、役割は異なります。

|アスペクト|8051 マイコン |8085マイクロプロセッサ |
|--------|----------------------|---------------------|
|積分 |CPU、RAM、ROM、I/O、タイマー、UARTを1チップに搭載 |CPUのみ;外部RAM、ROM、I/O、周辺機器が必要 |
|建築 |ハーバード(プログラムとデータメモリが別) |フォン・ノイマン(統一メモリ空間) |
|I/O |4つのポートにまたがる32本の組み込みライン |オンチップI/Oはありません。8255 PPIまたはそれに類似したものを使用 |
|タイマー |2つの16ビットタイマーオンチップ |外部タイマーIC(8253/8254)が必要 |
|割り込み |5つのソース、2つの優先度レベル、オンチップコントローラ|5つの割り込み入力がありますが、優先度/ベクトル制御のために外部8259 PICが必要です |
|シリアル通信 |組み込みUART |外部UART(8251 USART)が必要 |
|典型的なシステムコスト|下部(外部部品が少ない) |高く(複数サポートIC) |
|ユースケース |組み込み制御(家電、計器) |汎用コンピューティング(初期のPCや開発キット) |

8085はマイクロプロセッサで、コンピュータシステムのCPUとして設計されています。8051はマイクロコントローラで、完全なシステム・オン・チップとして設計されています。この区別が重要です。8051は電源、クリスタル、リセットキャップだけでPCB上単独で動作できますが、8085は少なくとも8155(RAM + I/O + タイマー)、EPROM、アドレスデコードロジックが必要です。

## 実際に気づく利点

- **シングルチップソリューション:** 基本的な用途には外部RAM、ROM、I/Oエクスパンダーは不要。これによりPCB面積が減少し、BOMコストが削減されます。
- **予測可能なタイミング:** ハーバードアーキテクチャと固定命令タイミングにより、リアルタイムループは決定論的です。キャッシュもパイプラインの停滞も驚きもありません。
- **ビット操作:** 128ビットアドレス指定可能な場所でビットをセット/クリア/テストする命令は、フラグやI/Oピンを扱う際の読み書き・修正・書き込み競争を排除します。
- **成熟したツールチェーン:** Keil C51、SDCC、そして数十の中国製IDEはすべて、緻密なコードを生成しています。データシートやアプリノートは網羅的です。
- **長い生産寿命:** AT89S52およびSTC15ファミリーは現在も生産中で、終了通知はありません。2030年には部品が入手可能になると自信を持って設計できます。

## 実際のプロジェクトで直面する制限

- **RAMボトルネック:** 128バイトは数変数と小さなスタックには十分ですが、64要素のルックアップテーブルはRAMの半分を消費します。テーブルはコードメモリに保存する(MOVC命令を使うが扱いにくい)か、外部RAMを追加する(これによりシングルチップの利点が失われる)かのどちらかだ。
- **オリジナルの8051にはハードウェア乗算はありません:** MUL AB命令は存在しますが、4つの機械サイクル(12 MHzのクリスタルで48クロックサイクル=4μs)を要します。32ビットの固定小数点乗算は100+ μsの試練になります。強化型(8052AH、STC15)は乗算が速いですが、ハードウェアMACよりは遅いです。
- **遅いADCインターフェース:** オンチップADCがないため、外部ADC0804などを追加し、ビットバンギングや並列データキャプチャが必要です。10kHz以上のサンプリングレートは、組み立て時のサイクルカウントなしには達成が難しいです。
- **柔軟性のないメモリマッピング:** 64KBプログラムと64KBのデータアドレス空間はハードパーティションです。データメモリから実行したり、コードメモリを大きなデータストアとして使うと、バンク切り替えの手口がかかります。

以前、8051に256タップのFIRフィルターを実装しようと試みました。係数アレイだけで256バイト、円形サンプルバッファもさらに256バイトでした。係数を外部コードメモリに移し、MOVCで取得する必要があり、これによりタップごとに2サイクルのマシンサイクルが増えました。フィルターは2 kHzのサンプルレートで動作し、かろうじて許容範囲でした。1ドルのCortex-M0なら同じフィルターを48kHzで動作させていました。

## よくある質問

**8051で動作するプログラミング言語は何ですか?** 
組み込みC(Keil C51またはSDCCを使用)が標準です。割り込みハンドラやタイミングクリティカルループでは、アセンブリが今でも一般的です。高水準言語はRAMやスタックの制約により実用的ではありません。

**どの開発ツールを使うべきでしょうか?** 
Keil μVisionは業界標準のIDEです。評価版は2KBのコード制限があり、学習には十分です。SDCCは、8051を完全にサポートする無料のオープンソースCコンパイラです。Proteus Design Suiteは8051回路をサイクル的に正確にシミュレートし、ハードウェア構築前のデバッグに非常に役立ちます。

**8051を12 MHzより速く動かせるか?** 
クラシック部品は内部伝搬遅延のため最大12〜16 MHzです。STCやNuvotonの現代のシングルサイクル(1T)バリアントは、除算12クロックプリスケーラを排除するため、24〜48 MHzで動作します。命令セットは同一ですが、周辺タイミング定数(ボーレート、タイマーリロード値)を再計算する必要があります。

**I2CやSPIデバイスをどのようにインターフェースすればよいか?** 
基本的な8051にはハードウェアI2CやSPIがないため、ポート1またはポート3のピンでビットバン接続します。100kHzでのソフトウェアI2Cはシンプルです。400kHzは達成可能ですが、他の作業に割くCPU時間はほとんどありません。一部の強化型8051バリアント(STC15W、N76E003)にはハードウェアI2CおよびSPI周辺機器が含まれています。

**AT89C51、AT89S52、P89V51の違いは何ですか?** 
- **AT89C51(Atmel/Microchip):** 4 KBフラッシュ、並列プログラミング、クラシック8051コア。
- **AT89S52(Atmel/Microchip):** 8KBフラッシュ、SPIによるシステム内シリアルプログラミング、その他は同一。
- **P89V51(NXP):** 4KBフラッシュ、システム内プログラミング、やや高速(12クロックから6クロック)。

3つすべてピン互換性と命令セット互換性があります。フラッシュサイズ、プログラミング方法、入手状況に基づいて選択してください。

**8051は2026年でもまだ重要でしょうか?** 
新しい商用設計ならおそらく無理でしょう。Cortex-M0+部品は同等のコストで性能が向上し、消費電力も低く、周辺機器も多数搭載可能です。しかし8051は教育(すべての電子工学プログラムで教えられているもの)、従来の機器(産業用制御、家電)、そして中国国内のIC市場(STCは年間数百万台を0.50ドル未満で販売している)に根ざしています。15年前のマシンで故障した基板を交換するなら、8051は必ず存在します。

## 最後の感想

8051の価値は単なる性能ではなく、アーキテクチャ全体を頭の中で把握できることにあります。命令が何サイクルかかるか、RAMの各ビットがどこに位置しているか、各SFRが何をしているかを正確に把握できます。この透明性によりデバッグは簡単でタイミングも予測可能であり、8051は今でも多くの大学で最初に教えられているマイクロコントローラです。また、2026年になっても洗濯機や信号機、モーターコントローラーなど、AT89S52がまだ使われている理由でもあります。これらの場所では「十分良い」と言えば十分であり、動作する設計を置き換えることがわずかな性能向上よりもコストがかかるのです。プロジェクトに10 MIPS以上、128KB以上のRAM、または最新の周辺機器が必要な場合は、8051は飛ばしてください。しかし、40年の歴史を持つシンプルで決定論的なコントローラーが必要なら、これに勝るものはほとんどありません。