アセンブリ言語での8051プログラミング入門

問題を排除するために楽器を試してください





アセンブリ言語は、ニーモニックの観点からプログラムコードを記述するために使用される低レベルのプログラミング言語です。現在求められている高水準言語はたくさんありますが、アセンブリプログラミング言語は多くのアプリケーションで広く使用されており、ハードウェアを直接操作するために使用できます。それはまた書くのに使用されます 8051プログラミングコード 他の高級言語と比較して、より少ないメモリを消費することにより、より少ないクロックサイクルで効率的に。

8051アセンブリ言語でのプログラミング

8051プログラミング



8051アセンブリ言語でのプログラミング

アセンブリ言語は、完全にハードウェア関連のプログラミング言語です。組み込み設計者は、プログラムを作成する前に、特定のプロセッサまたはコントローラのハードウェアに関する十分な知識を持っている必要があります。アセンブリ言語はニーモニックによって開発されているため、ユーザーはプログラムを変更するためにそれを簡単に理解することはできません。


8051アセンブリ言語でのプログラミング

8051アセンブリ言語でのプログラミング



アセンブリプログラミング言語は、さまざまなコンパイラによって開発され、 ボーリング場「」 に最適です マイクロコントローラープログラミング 開発。 Microcontrollersまたは、プロセッサは「0または1」の形式のバイナリ言語のみを理解できます。アセンブラは、アセンブリ言語をバイナリ言語に変換してから、マイクロコントローラー特定のタスクを実行するためのメモリ。

8051マイクロコントローラーアーキテクチャ

8051マイクロコントローラーそれは CISCベースのハーバードアーキテクチャ 、32 I / O、タイマー/カウンター、シリアル通信、メモリなどの周辺機器があります。ザ・マイクロコントローラー保存のためにメモリを必要とする操作を実行し、関数を読み取るためのプログラムが必要です。 8051マイクロコントローラー命令を格納するためのRAMおよびROMメモリで構成されています。

8051マイクロコントローラーArctitecuture

8051マイクロコントローラーアーキテクチャ

レジスターはの主要部分です プロセッサとマイクロコントローラー これはメモリに含まれており、データをより高速に収集および保存する方法を提供します。 8051アセンブリ言語プログラミングは、メモリレジスタに基づいています。減算や加算などを実行してプロセッサまたはコントローラへのデータを操作する場合、それをメモリに直接実行することはできませんが、データを処理および格納するためのレジスタが必要です。マイクロコントローラーそれらで動作する命令またはコンテンツに従って分類できるいくつかのタイプのレジスタが含まれています。

アセンブリ言語の8051マイクロコントローラプログラム

アセンブリ言語は、プログラムの記述に使用される要素で構成されています。シーケンシャルな方法。与えられた規則に従って、アセンブリ言語でプログラミングを記述します。


アセンブリ言語の規則

  • アセンブリコードは大文字で記述する必要があります
  • ラベルの後にはコロンを付ける必要があります(label :)
  • すべての記号とラベルは文字で始まる必要があります
  • すべてのコメントは小文字で入力されます
  • プログラムの最後の行はENDディレクティブでなければなりません

アセンブリ言語のニーモニックは、操作を実行するために使用されるMOV、ADD、JMPなどのオペコードの形式です。

オペコード: オペコードは、CPUが実行できる単一の命令です。ここで、オペコードはMOV命令です。

オペランド: オペランドは、オペコードで操作できる単一のデータです。たとえば、乗算演算は、オペランドで乗算されるオペランドによって実行されます。

構文:MUL ab

アセンブリ言語プログラミングの要素:

  • 組み立てガイドライン
  • 指図書
  • アドレッシングモード

組み立て手順:

組み立てディレクティブは、CPUに指示を与えます。 8051マイクロコントローラーコントロールユニットに方向を与えるためのさまざまな種類のアセンブリディレクティブで構成されます。最も有用なディレクティブは、次のような8051プログラミングです。

  • ORG
  • DB
  • EQU
  • 終わり

ORG((原点): このディレクティブは、プログラムの開始を示します。これは、アセンブリ中にレジスタアドレスを設定するために使用されます。たとえば、ORG 0000hは、アドレス0000hで始まる後続のすべてのコードをコンパイラーに通知します。

構文: ORG 0000h

DB((バイトを定義): 定義バイトは、バイトの文字列を許可するために使用されます。たとえば、「EDGEFX」を印刷します。各文字はアドレスによって取得され、最後にDBによって「文字列」が二重引用符で直接印刷されます。

構文:

ORG 0000h

MOV a、#00h
————-
————-
DB「EDGEFX」

EQU(同等): 同等のディレクティブは、変数のアドレスを同等にするために使用されます。

構文:

reg equ09時間
—————–
—————–
MOVreg#2時間

終わり ENDディレクティブは、プログラムの終了を示すために使用されます。

構文:

reg equ09時間

—————–
—————–
MOVreg#2時間
終わり

アドレッシングモード:

データにアクセスする方法は、アドレッシングモードと呼ばれます。 CPUは、アドレッシングモードを使用してさまざまな方法でデータにアクセスできます。 8051マイクロコントローラー次のような5つのアドレッシングモードで構成されます。

  • 即時アドレッシングモード
  • レジスタアドレッシングモード
  • ダイレクトアドレッシングモード
  • 間接アドレッシングモード
  • ベースインデックスアドレッシングモード

即時アドレッシングモード:

このアドレッシングモードでは、送信元は「#」が後に続く値である必要があり、宛先は SFRレジスタ、汎用レジスタ と住所。値をメモリレジスタにすぐに格納するために使用されます。

構文:

MOV A、#20h // AはANアキュムレータレジスタ、20はA //に格納されます
MOV R0#15 // R0は汎用レジスタです15はR0レジスタに格納されます//
MOV P0、#07h // P0はSFRレジスタです07はP0 //に格納されます
MOV 20h#05h // 20hは、20h //に格納されているレジスタ05のアドレスです。

前者:

MOV R0、#1
MOV R0、#20 // R0<—R0[15] +20、最終値はR0 //に格納されます

レジスタアドレッシングモード:

このアドレッシングモードでは、送信元と宛先はレジスタである必要がありますが、汎用レジスタではありません。したがって、データは内に移動されません 汎用銀行レジスタ

構文:

MOV A、B // AはSFRレジスタ、Bは汎用レジスタ//
MOV R0、R1 //無効な命令、GPRからGPRへの変換は不可能//

前者:

MOV R0、#02h
MOV A、#30h
ADD R0、A // R0<—R0+A, the final value is stored in the R0 register//

ダイレクトアドレッシングモード

このアドレッシングモードでは、送信元または宛先(または送信元と宛先の両方)はアドレスである必要がありますが、値ではありません。

構文:

MOV A20h // 20hはアドレスAはレジスタ//
MOV 00h、07h //両方ともGPSレジスタのアドレス指定//

前者:

MOV 07h#01h
MOV A、#08h
Aを追加07h // A<—A+07h the final value is stored in A//

間接アドレッシングモード:

このアドレッシングモードでは、送信元または宛先(または宛先または送信元)は次のようになります。間接アドレスですが、値ではありません。このアドレッシングモードは、ポインタの概念をサポートしています。ポインタは、他の変数のアドレスを格納するために使用される変数です。このポインタの概念は、R0およびR1レジスタにのみ使用されます。

構文:

MOVR0、#01h // 01値はR0レジスタに格納され、R0アドレスは08h //です。
MOV R1、#08h // R1は、次のようなポインタ変数です。店舗R0のアドレス(08h)//
MOV 20h@ R1 // 01値はGPレジスタの20hアドレスに格納されます//

間接アドレッシングモード

間接アドレッシングモード

ベースインデックスアドレッシングモード:

このアドレッシングモードは、からデータを読み取るために使用されます。 外部メモリまたはROMメモリ 。すべてのアドレッシングモードでコードメモリからデータを読み取ることはできません。コードはDPTRレジスタを介して読み取る必要があります。 DPTRは、コードまたは外部メモリ内のデータを指すために使用されます。

構文:

MOVC A、@ A + DPTR // Cはコードメモリを示します//
MOCX A、@ A + DPTR // Xは外部メモリを示します//
例:MOV A、#00H // 00HはAレジスタに格納されます//
MOV DPTR、#0500H // DPTRはメモリ内の0500hアドレスを指します//
MOVC A、@ A + DPTR //値を送信Aレジスタ//
MOV P0、A // POレジストラへのA送信の日付//

指図書:

命令セットは、データを処理するためにコントローラーをガイドするコマンドをコントローラーに提供するコントローラーまたはプロセッサーの構造です。命令セットは、命令、ネイティブデータ型、アドレッシングモード、割り込みレジスタ、例外処理、およびメモリアーキテクチャで構成されています。ザ・ 8051マイクロコントローラー ハーバードアーキテクチャでCISCの指示に従うことができます。 8051プログラミングの場合、さまざまなタイプのCISC命令が含まれます。

  • データ転送命令セット
  • シーケンシャル命令セット
  • 算術命令セット
  • 分岐I指導セットする
  • ループ命令セット
  • 条件付き命令セット
  • 無条件命令セット
  • 論理命令セット
  • ブール命令セット

算術命令セット:

算術命令は、次のような基本的な操作を実行します。

  • 添加
  • 乗算
  • 減算
  • 分割

添加:

ORG 0000h
MOV R0、#03H //値3をレジスタR0 //に移動します
MOV A、#05H //値5をアキュムレータAに移動します//
A、00Hを追加//addAR0値の値と結果を保存しますinA//
終わり

乗算:

ORG 0000h
MOV R0、#03H //値3をレジスタR0 //に移動します
MOV A、#05H //値5をアキュムレータAに移動します//
MUL A、03H //乗算結果はアキュムレータAに保存されます//
終わり

減算:

ORG 0000h
MOV R0、#03H //値3をレジスタR0 //に移動します
MOV A、#05H //値5をアキュムレータAに移動します//
SUBB A、03H //結果値はアキュムレータAに格納されます//
終わり

分割:

ORG 0000h
MOV R0、#03H //値3をレジスタR0 //に移動します
MOV A、#15H //値5をアキュムレータAに移動します//
DIV A、03H //最終値はアキュムレータAに格納されます//
終わり

条件付きの説明

CPUは、シングルビットステータスまたはバイトステータスをチェックすることにより、条件に基づいて命令を実行します。 8051マイクロコントローラー次のようなさまざまな条件付き命令で構成されます。

  • JB —>下にジャンプ
  • JNB —>以下でない場合はジャンプ
  • JC —>キャリーの場合はジャンプ
  • JNC —>ジャンプする場合ない運ぶ
  • JZ —>ゼロの場合はジャンプ
  • JNZ —>ジャンプする場合ないゼロ
条件付きの説明

条件付きの説明

1.構文:

JB P1.0、ラベル
---- ---- ---- ----
---- ---- ---- ----
ラベル:– – – – – – – –
---- ---- ---- ----
終わり

2.構文:

JNB P1.0、ラベル
---- ---- ---- ----
---- ---- ---- ----
ラベル:– – – – – – – –
---- ---- ---- ----
終わり

3.構文:

JC、ラベル
---- ---- ---- ----
---- ---- ---- ----
ラベル:– – – – – – – –
---- ---- ---- ----
終わり

4.構文:

JNC、ラベル
---- ---- ---- ----
---- ---- ---- ----
ラベル:– – – – – – – –
---- ---- ---- ----
終わり
5.構文:

JZ、レーベル
---- ---- ---- ----
---- ---- ---- ----
ラベル:– – – – – – – –
---- ---- ---- ----
終わり

6.構文:

JNZ、ラベル
---- ---- ---- ----
---- ---- ---- ----
ラベル:– – – – – – – –
---- ---- ---- ----
終わり

呼び出しとジャンプの手順:

呼び出し命令とジャンプ命令は、プログラムのコード複製を回避するために使用されます。プログラムのさまざまな場所で特定のコードが複数回使用された場合特定の名前次にコード毎回コードを入力しなくても、プログラムのどこでもその名前を使用できます。これにより、プログラムの複雑さが軽減されます。 8051プログラミングは、LCALL、SJMPなどの呼び出しおよびジャンプ命令で構成されています。

  • LCALL
  • 呼び出し
  • SJMP
  • LJMP

1.構文:

ORG 0000h
---- ---- ---- ----
---- ---- ---- ----
ACALL、ラベル
---- ---- ---- ----
---- ---- ---- ----
SJMPストップ
ラベル:– – – – – – – –
---- ---- ---- ----
---- ---- ---- ----
正しい
やめるNOP

2.構文:

ORG 0000h
---- ---- ---- ----
---- ---- ---- ----
LCALL、ラベル
---- ---- ---- ----
---- ---- ---- ----
SJMPストップ
ラベル:– – – – – – – –
---- ---- ---- ----
---- ---- ---- ----
正しい
やめるNOP

呼び出しとジャンプの手順

呼び出しとジャンプの手順

ループ命令:

ループ命令は、インクリメントおよびデクリメント操作を実行している間、毎回ブロックを繰り返すために使用されます。 8051マイクロコントローラー2種類のループ命令で構成されます。

  • CJNE —>等しくない場合は比較してジャンプする
  • DJNZ —>ゼロでない場合はデクリメントしてジャンプ

1.構文:

CJNE
MOV A、#00H
MOV B、#10H
ラベル INC A
--------。
--------。
CJNE A、ラベル

2.構文:

DJNE

MOV R0、#10H
ラベル: --------。
--------。
DJNE R0、ラベル
--------。
--------。
終わり

論理命令セット:

8051マイクロコントローラ命令セットは、プログラムの必要性に基づいて、セット用のAND、OR、XOR、TEST、NOT、およびブール論理命令を提供し、ビットをクリアします。

論理命令セット

論理命令セット

1.構文:

MOV A、#20H / 00100000 /
MOV R0、#03H / 00000101 /
ORL A、R0 // 00100000/00000101 = 00000000 //

2.構文:

MOV A、#20H / 00100000 /
MOV R0、#03H / 00000101 /
ANL A、R0

3.構文:

MOV A、#20H / 00100000 /
MOV R0、#03H / 00000101 /
XRL A、R0

シフト演算子

シフト演算子は、データを効率的に送受信するために使用されます。 8051マイクロコントローラー4つのシフト演算子で構成されます。

  • RR —>右に回転
  • RRC —>キャリーを介して右に回転
  • RL —>左に回転
  • RLC —>キャリーを介して左に回転

右回転(RR):

このシフト操作では、MSBはLSBになり、すべてのビットがビットごとにシリアルに右側にシフトします。

構文:

MOV A、#25h
RR A

左回転(RL):

このシフト操作では、MSBはLSBになり、すべてのビットがビットごとにシリアルに左側にシフトします。

構文:

MOV A、#25h
RL A

RRCはキャリーを介して右に回転します:

このシフト動作では、LSBがキャリーに移動し、キャリーがMSBになり、すべてのビットがビット位置ごとに右側にシフトされます。

構文:

MOV A、#27h
RRC A

RLCはキャリーを介して左に回転します:

このシフト動作では、MSBがキャリーに移動し、キャリーがLSBになり、すべてのビットがビットごとの位置で左側にシフトします。

構文:

MOV A、#27h
RLC A

基本的な組み込みCプログラム:

ザ・マイクロコントローラープログラミングは、オペレーティングシステムの種類ごとに異なります。がある 多くのオペレーティングシステム Linux、Windows、RTOSなど。ただし、RTOSには組み込みシステムの開発にいくつかの利点があります。アセンブリレベルのプログラミング例のいくつかを以下に示します。

8051で使用してLEDが点滅マイクロコントローラー

  • 8051マイクロコントローラを使用した7セグメントディスプレイでの数値表示
  • 8051を使用したタイマー/カウンターの計算とプログラムマイクロコントローラー
  • 8051を使用したシリアル通信の計算とプログラムマイクロコントローラー

8051MのLEDプログラムicrocontrller

1.WAPでPORT1LEDを切り替えます

ORG 0000H
トグル: MOV P1、#01 //移動する00000001をp1レジスタに//
CALL DELAY //遅延を実行します//
MOV A、P1 //移動p1値アキュムレータへ//
CPL A //補数A値//
MOV P1、A // 11111110をport1レジスタに移動//
CALL DELAY //遅延を実行します//
SJMPトグル
遅延:MOV R5、#10H //レジスタR5に10 //をロード
TWO:MOV R6、#200 //レジスタR6に200 //をロード
ONE:MOV R7、#200 //レジスタR7に200をロード//
DJNZ R7、$ //ゼロになるまでR7をデクリメント//
DJNZ R6、ONE //ゼロになるまでR7をデクリメント//
DJNZ R5、TWO //ゼロになるまでR7をデクリメント//
RET //メインプログラムに戻る//
終わり

8051Mを使用したタイマー/カウンターの計算とプログラムicrocontroller

遅延は、アプリケーションソフトウェア開発における重要な要素の1つです。ザ・ タイマーとカウンター のハードウェアコンポーネントですマイクロコントローラー、カウントパルスで正確な時間遅延を提供するために多くのアプリケーションで使用されます。 B他のタスクは、ソフトウェア技術によって実装されます。

1.WAPで500usの時間遅延を計算します。

MOV TMOD、#10H //レジスタでタイマーモードを選択//
MOV TH1、#0FEH //遅延時間を上位ビットに格納//
MOV TL1、#32H //遅延時間をロービットに格納//
JNB TF1、$ //タイマーの値をゼロになるまでデクリメントします//
CLR TF1 //タイマーフラグをクリアしますビット//
CLR TR1 //タイマーをオフにする//

2.LEDを切り替えるWAPとともに5時間遅延

ORG 0000H
戻り値:MOV PO、#00H
ACALL DELAY
MOV P0、#0FFH
ACALL DELAY
ジャンプリターン
遅延:MOV R5、#50H //レジスタR5に50 //をロード
遅延1:MOV R6、#200 //レジスタR6に200 //をロード
DELAY2:MOV R7、#229 //レジスタR7に200 //をロード
DJNZ R7、$ //ゼロになるまでR7をデクリメント//
DJNZ R6、DELAY2 // R6をゼロになるまでデクリメントします//
DJNZ R5、DELAY1 // R5をゼロになるまでデクリメントします//
RET //メインプログラムに戻る//
終わり

3. mode0count0を使用して250パルスをカウントするWAP

構文:

ORG 0000H
MOV TMOD、#50H //カウンターを選択//
MOV TH0、#15 //カウントパルスを上位ビットに移動//
MOV TH1、#9FH //移動するカウントパルス、下位ビット//
SET TR0 //タイマーをオン//
JNB $ //カウント値をゼロまでデクリメントします//
CLR TF0 //カウンターをクリアし、フラグを立てますビット//
CLR TR0 //タイマーを停止します//
終わり

8051Mを使用したシリアル通信プログラミングicrocontroller

シリアル通信 通常、データの送受信に使用されます。 8051マイクロコントローラーUART / USARTシリアル通信で構成され、信号はによって送受信されます。TxおよびRxピン。 UART通信はデータをビットごとにシリアルに転送します。 UARTは、データを転送および受信する半二重プロトコルですが、同時には受信しません。

1.ハイパーターミナルにキャラクターを送信するためのWAP

MOV SCON、#50H //シリアル通信を設定//
MOV TMOD、#20H //タイマーモードを選択//
MOV TH1、#-3 //ボーレートを設定//
SET TR1 //タイマーをオン//
MOV SBUF、# ’S’ // Sをシリアルウィンドウに送信します//
JNB TI、$ //タイマーの値をゼロになるまでデクリメントします//
CLR RI //受信割り込みをクリアする//
CLR TR1 //タイマーをクリア//

2.ハイパーターミナルで受信文字を送信するWAP

MOV SCON、#50H //シリアル通信を設定//
MOV TMOD、#20H //タイマーモードを選択//
MOV TH1、#-6 //ボーレートを設定//
SET TR1 //タイマー上//
MOV SBUF、# ’S’ // Sをシリアルウィンドウに送信します//
JNB RI、$ //タイマーの値をゼロになるまでデクリメントします//
CLR RI //受信割り込みをクリアする//
MOV P0、SBUF // SBUFレジスタ値をport0 //に送信します
CLR TR1 //タイマーをクリア//

これは、サンプルベースのプログラムを使用したアセンブリ言語での8051プログラミングの概要です。アセンブリ言語に関するこの適切な情報が読者の皆様のお役に立てば幸いです。以下のコメントセクションでの貴重なコメントをお待ちしております。