51シングルチップマイクロコンピュータの学習プロセスにおける一般的な疑問

1. 51 MCUとは何ですか?AT89C51、STC89C51、BF7615BM28はすべて51個のマイクロコントローラーですか?

        回答:51 MCUは、 Intel 8051命令システムと互換性のあるMCUの総称であり、特定のメーカーやMCUモデルとは直接関係ありません。上記のシングルチップマイクロコンピュータはすべてIntel8051命令システム(命令の独立した追加の拡張バージョンを含む)を使用しているため、すべて51のシングルチップマイクロコンピュータです。

2. MCS-51と8051は同じですか?

回答: MCSは、MCS-48、MCS-51、MCS-96、およびその他のシリーズを含むIntelのシングルチップマイクロコンピュータのシリアルシンボルですが、従来のMCS-51シリーズには、3つの基本タイプ80C31、8051、8751、および対応する低消費電力モデル80C31、8051、87C51であるため、MCS-51は特にこれらのIntelモデルを指します。Intelは2007年以降MCSシリーズマイクロコントローラの生産を停止したため、正確には、AT89C51および他のメーカーが製造した他のマイクロコントローラはMCS-51シリーズに属していません。

        8051は、一般にIntel 8051命令システム(命令セット)を指します。マイクロコントローラーがIntel 8051命令システムを使用している限り、8051マイクロコントローラーまたは略して51マイクロコントローラーと呼ぶことができます。

---リファレンス「MCS51と8051は同じですか?

3. 8051の古典的な内部構造は何ですか?

 4.AT89C51は51MCUですが、AT89C52は52 MCUですか?

        回答:いいえ、51シングルチップマイクロコンピュータとは、Intel 8051命令システム(命令セット)を使用するシングルチップマイクロコンピュータを指します。一般に、52シングルチップマイクロコンピュータのようなものはありません。AT89C52シングルチップマイクロコンピュータが存在する理由は、初期のAT89C51シングルチップマイクロコンピュータに基づいてタイマー/カウンタT2が追加され、RAMとROMメモリがアップグレードされているため、AT89C52は拡張されたものと見なすことができます。 AT89C51のバージョン。

 5.学生時代、中国で一般的な51個のシングルチップマイクロコンピュータは、STC社が製造したSTC89C52RCです。プログラミングの際には何に注意する必要がありますか?

        回答:STC89C52RCは、8051コアをベースにSTC(Hongjing Technology)社が立ち上げた51 MCUです。プログラミングの前に、STCが立ち上げたISPダウンロードソフトウェアを介してデバイスパッケージをKeilソフトウェアインストールディレクトリに挿入し、正確に選択する必要があります。 MCUモデル。

        もちろん、8051命令システムを使用しているため、AT89C52でMCUモデルをコンパイルすることもできますが、STCによって追加された特殊機能レジスタの一部は直接使用できません(ヘッダーファイルは一部のレジスタを宣言していません)。 SFR宣言を自分で使用します。

 6.プログラムの先頭に組み込みのヘッダーファイルがあることがよくありますが、#include<REG51.h>と#include<REG52.h>の違いは何ですか。

        回答:実際、ヘッダーファイルでは非常に明確です。関連する説明は次のとおりです。

        REG51.h:汎用80C51および80C31マイクロコントローラのヘッダーファイル。

        REG52.h:汎用80C52および80C32マイクロコントローラのヘッダーファイル。

        WinMergeによるこれら2つのファイルの比較分析により、REG52.hがREG51.hに基づいてタイマー/カウンターT2関連レジスターの宣言を追加していることが明確にわかります。つまり、プログラムでタイマー/カウンターT2関連レジスターが使用されている場合は、#include <REG51.h>のときに関連レジスターを自分で宣言する必要があります。そうしないと、コンパイラーがエラーを報告します。関連するレジスタはヘッダーファイルREG52.hで宣言されており、プログラムで直接使用できます。

 7. #include<REG51.h>と#include"REG52.h"の違いは何ですか?

        回答:山括弧に含まれているヘッダーファイルは、コンパイラに付属しているヘッダーファイルであり、通常、コンパイラのインストールディレクトリに配置されます。英語の二重引用符で囲まれたヘッダーファイルは、通常、自分で作成したヘッダーファイルであり、通常はプロジェクトファイルディレクトリに配置されます。プログラムがコンパイル時にファイルを見つけられない場合は、コンパイラのインストールディレクトリにもありますが、それでも、仕様に従ってプログラムすることをお勧めします。

 8.プログラムに#include<REG51.h>または#include"REG52.h"が表示されないことがあるのはなぜですか?そのようなプログラムも実行できますか?

        回答:ヘッダーファイルは必要ありません。それほど面倒でない場合は、プログラムで使用するレジスタを自分で宣言できます。

 9.プログラムに#include<STC89C5xRC.H>が表示されることがありますが、#include <REG52.h>がないのはなぜですか?

        回答:STC89C5xRC.Hは実際にはSTC(Hongjing Technology)がREG51F.Hに基づいていくつかの自己設計の特殊機能レジスタを追加しました。STC89C5xRC.Hが組み込まれている場合、STCによって追加されたレジスタを宣言する必要はありません。簡単に言えば、REG51F.HはSTC89C5xRC.Hの真のサブセットです。

 10.製造元が各マイクロコントローラーのヘッダーファイルを定義しているが、プログラムに名前を追加する方法がわからない場合はどうすればよいですか?

        回答:実際、プログラムを右クリックするだけで、ヘッダーファイルを挿入するための関連するプロンプトが表示されます。 

11.新しいプロジェクトを作成するときに、標準の8051スタートアップファイルコードをプロジェクトに追加するように求めるプロンプトが表示されます。これは必要なファイルですか?

        回答:はい。マイクロコントローラーの電源がオンになると、通常、スタックやピンなどを初期化する必要があります。これらはすべて、アセンブリで記述されたスタートアップコードによって実行される必要があります。

11.1スタートアップファイルを追加するためのヒント
11.2スタートアップファイルによって生成されたアセンブリ命令がありません
11.3スタートアップファイルによって生成されたアセンブリ命令を追加します

 12.ソースファイルの下にヘッダーファイルを追加するにはどうすればよいですか?

        A:ソースファイルで#include "xxx.h"を使用して追加できますが、コンパイルする前に、図12.1に示すように、ヘッダーファイルの場所をコンパイラに通知します。ヘッダーファイルのパスを追加する必要があります。

12.1ヘッダーファイルのパスを追加する

         注:この操作は、コンパイラーに付属のヘッダーファイル(つまり、#include <xxx.h>)を使用するために必要ではありません。

  13. 3つのキーワードsfr、sfr16、およびsbitの機能は何ですか?

        A:3つのキーワードsfr、sfr16、およびsbitはC99仕様に属しておらず、KeilC51でのみ使用できます。8051ストレージ構造を研究したことのある人なら誰でも、8051特殊機能レジスタと内部RAM領域の0x80〜0xffが同じアドレスを共有することを知っています(ただし、物理ストレージユニットは独立しています)。書きます。規則によれば、特殊機能レジスタの読み取りと書き込みは直接アドレス指定(部分的にビットアドレス指定可能)を使用し、内部RAM領域の0x80〜0xffは間接アドレス指定のみを使用できます。

13.1ストレージ構造

        3つのキーワードsfr、sfr16、およびsbitは、特殊機能レジスタ領域での変数の宣言を担当します。sfrは8ビット変数の宣言に使用され、sfrは16ビット変数の宣言に使用され、sbitはビットの宣言に使用されます。変数。特殊機能レジスタでは、アドレスが8の整数倍である変数は、ビットアドレス指定(0x80、0x88など)をサポートします。つまり、図13.2に示すように、ビット変数を宣言するためのsbitの使用をサポートします。

13.2ビットアドレス指定領域

   14. sbitとbitの違いは何ですか?

         回答:sbitはビットアドレス指定をサポートする特殊機能レジスタ変数を宣言するために使用され、bitはビット変数を定義するために使用されます。定義されたビット変数は内部一般RAM領域(内部RAMアドレス領域(0x20〜0x2f))に格納されます。ビットアドレス指定)。それでもわからない場合は、生成された組み立て手順を通じて、以下の問題を解決します。

sbitの一般的な使用法:

C语言:sbit P0_0 = P0^0;        P0_0=1;//P0已通过sfr声明,其地址为0x80
汇编指令:SETB     P0_0(0x80.0)

sbitの一般的な使用法:

C语言:bit P0_0;    P0_0=1;//为了演示效果,变量特意重名
汇编指令:SETB     P0_0(0x20.0)

        ビットによって定義された変数は内部RAMの下位128バイトに格納され(アドレス0x20.0、.0は無視できないことに注意してください)、sbitによって宣言された変数はSFR領域に格納され、アドレスは8の整数倍(例0x80のように)。

        アドレスが8の整数倍であるSFR領域でのみsbitを宣言できることを確認するために、実際の詳細によって次のことを確認します。図13.3から、ベースアドレスを任意に指定できないことがわかります。

14.1sbitベースアドレスエラー

    15.特殊機能レジスタ領域には、ポインタを介してアクセスできますか?

       A:試してみましたが、うまくいきませんでした。他の方法があることは否定されません、批判と訂正は大歓迎です。

関連するコードは次のように比較されます。

15.1ポインタ変数アクセスを使用する場合:

C语言:unsigned char *P0=0x80;*P0=0x0C;
汇编指令:    
//    12:         unsigned char *P0=0x80; 
C:0x0003    7B00     MOV      R3,#0x00
C:0x0005    7A00     MOV      R2,#0x00
C:0x0007    7980     MOV      R1,#P0(0x80)
C:0x0009    8B08     MOV      0x08,R3
C:0x000B    8A09     MOV      0x09,R2
C:0x000D    890A     MOV      0x0A,R1
//    13:         *P0=0x0C; 
C:0x000F    AB08     MOV      R3,0x08
C:0x0011    AA09     MOV      R2,0x09
C:0x0013    A90A     MOV      R1,0x0A
C:0x0015    740C     MOV      A,#0x0C
C:0x0017    120020   LCALL    C?CSTPTR(C:0020)

                 C?CSTPTR:
C:0x0020    BB0106   CJNE     R3,#0x01,C:0029
C:0x0023    8982     MOV      DPL(0x82),R1
C:0x0025    8A83     MOV      DPH(0x83),R2
C:0x0027    F0       MOVX     @DPTR,A
C:0x0028    22       RET      
C:0x0029    5002     JNC      C:002D
C:0x002B    F7       MOV      @R1,A
C:0x002C    22       RET      
C:0x002D    BBFE01   CJNE     R3,#0xFE,C:0031
C:0x0030    F3       MOVX     @R1,A
C:0x0031    22       RET           

15.2 SFRアクセスを使用する場合:

C语言:sfr P0 = 0x80;  P0 = 0x0c;
汇编指令:
//    12:         P0=0x0C; 
C:0x000F    75800C   MOV      P0(0x80),#0x0C    

15.3絶対アドレスアクセスを使用する場合の組み込みABSACC.H:

头文件部分:
#define CBYTE ((unsigned char volatile code  *) 0)
#define DBYTE ((unsigned char volatile data  *) 0)
#if !defined (__CX2__)
#define PBYTE ((unsigned char volatile pdata *) 0)
#endif
#define XBYTE ((unsigned char volatile xdata *) 0)

#define CWORD ((unsigned int volatile code  *) 0)
#define DWORD ((unsigned int volatile data  *) 0)
#if !defined (__CX2__)
#define PWORD ((unsigned int volatile pdata *) 0)
#endif

C语言用户代码:
DBYTE[0x80]=0x0c;

其实没有验证的必要,code指向代码FLASH区,data指向通用RAM区(0x00~0xff),
xdata指向片内拓展通用RAM区(0x0000~0xffff),pdata指向片外拓展64K内存区,都不指向SFRs

    16. sfrを使用して、複数の場所で特殊機能レジスタを宣言できますか?

        回答:いいえ、再定義を促します。

    17. sbitが特殊機能レジスタを宣言するときに、複数の書き込み方法があるのはなぜですか?

        回答:説明は次のとおりです。一般的な記述は次のとおりです。

方式1:sbit P0_2 = P0^2;        //前提:P0已通过sfr声明
方式2:sbit P0_2 = 0x80^2;      //0x80就是特殊功能寄存器中支持位寻址的寄存器
方式3:sbit P0_2 = 0x82;        //此0x82为直接寻址中的位地址,需要和直接寻址中的字节地址区分开

注:^ 叫异或,可以了解一下他的运算规则

    18. 51 MCUはDEBUG(エミュレーション)をサポートしていますか?

        回答:サポート。keil C51は、仮想シミュレーション(シミュレーター)と物理シミュレーションをサポートしています。STCのIAPシリーズは、シミュレーターなしでオンチップシミュレーションを実行することもできます。実際の方法については、他のブロガーによる「HongjingSTCMCUオンチップシミュレーション方法」を参照してください。

    19. C99標準と比較して、Keil C51の拡張キーワードは何ですか?

        A:余分な部分を次の表に示します。

_で_   エイリアン   見る     少し     コード   compac     データ
遠い   idata   割り込み   大きい   pdata   _優先順位_   リエントラント
sbit   sfr     sfr16     小さい   _タスク_   を使用して xdata

------リファレンス「KeilC51基本キーワード」

    20.プログラムの実行時間をKeilC51で観察できますか?

        A:はい、シミュレーションモードで[レジスタ]列(単位は2番目)で秒の変化を観察できます。

21. Keil C51でピンレベルの変化を観察できますか?

        A:はい、シミュレーションモードで、変数名を右クリックし、監視する変数をロジックアナライザーに追加します。

         変数名、表示タイプ、値の範囲、位置操作、表示する左シフト番号を構成し、プログラム実行ボタンをクリックして変数の変化を観察します。

22.変数変換はKeilC51で観察できますか?

        A:はい、シミュレーションモードでは、表示する変数をウォッチウィンドウに追加できます。

22.住所の下の特定の値を確認できますか?

       A:はい、[メモリ]ウィンドウから表示できます。表示している物理アドレスパーティションによって、入力する必要のあるプレフィックスも異なります。

コードエリア(CODE) C:絶対アドレスを入力します(例:C:0X20)
下位128バイトの汎用RAM領域(DATA) D:絶対アドレスを入力してください(例:D:0X20)
上位128バイトの汎用RAM領域(IDATA) 入力I:絶対アドレス(例:I:0X80)
内部拡張1024バイト汎用RAM領域(XDATA) X:絶対アドレスを入力します(例:X:0X80)

23.ビットセグメント(ビットフィールド)操作を使用することと変数を使用することの違いは何ですか?

23.1ビットフィールドはビット演算を実装します。

C语言:
#include <STC89C5xRC.H>
#include<absacc.h>

union BYTE
{
	unsigned char byte;
	struct 
	{
		unsigned char bit0:1;
		unsigned char bit1:1;
		unsigned char bit2:1;
		unsigned char bit3:1;
		unsigned char bit4:1;
		unsigned char bit5:1;
		unsigned char bit6:1;
		unsigned char bit7:1;
	}BIT;
};
 
int main()
{
	union BYTE data value;
	value.BIT.bit0 = 1;		  

	return 0;
}
汇编代码:
   126: ?C_STARTUP:     LJMP    STARTUP1 
   127:  
   128:                 RSEG    ?C_C51STARTUP 
   129:  
   130: STARTUP1: 
   131:  
   132: IF IDATALEN <> 0 
C:0x0000    020003   LJMP     STARTUP1(C:0003)
   133:                 MOV     R0,#IDATALEN - 1 
C:0x0003    787F     MOV      R0,#0x7F
   134:                 CLR     A 
C:0x0005    E4       CLR      A
   135: IDATALOOP:      MOV     @R0,A 
C:0x0006    F6       MOV      @R0,A
   136:                 DJNZ    R0,IDATALOOP 
C:0x0007    D8FD     DJNZ     R0,IDATALOOP(C:0006)
   185:                 MOV     SP,#?STACK-1 
   186:  
   187: ; This code is required if you use L51_BANK.A51 with Banking Mode 4 
   188: ;<h> Code Banking 
   189: ; <q> Select Bank 0 for L51_BANK.A51 Mode 4 
   190: #if 0    
   191: ;     <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4. 
   192: EXTRN CODE (?B_SWITCH0) 
   193:                 CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0 
   194: #endif 
   195: ;</h> 
C:0x0009    758108   MOV      SP(0x81),#0x08
   196:                 LJMP    ?C_START 
C:0x000C    02000F   LJMP     main(C:000F)
    20: int main() 
    21: { 
    22:         union BYTE data value; 
    23:         value.BIT.bit0 = 1;             
    24:  
C:0x000F    430801   ORL      0x08,#0x01
    25:         return 0; 
C:0x0012    E4       CLR      A
C:0x0013    7E00     MOV      R6,#0x00
C:0x0015    7F00     MOV      R7,#0x00
    26: }
C:0x0017    22       RET      

23.2ビット変数はビット演算を実装します。

C语言:
#include <STC89C5xRC.H>
#include<absacc.h>

int main()
{
	bit bit0 = 1;
	return 0;
}
  
汇编指令:
 126: ?C_STARTUP:     LJMP    STARTUP1 
   127:  
   128:                 RSEG    ?C_C51STARTUP 
   129:  
   130: STARTUP1: 
   131:  
   132: IF IDATALEN <> 0 
C:0x0000    020003   LJMP     STARTUP1(C:0003)
   133:                 MOV     R0,#IDATALEN - 1 
C:0x0003    787F     MOV      R0,#0x7F
   134:                 CLR     A 
C:0x0005    E4       CLR      A
   135: IDATALOOP:      MOV     @R0,A 
C:0x0006    F6       MOV      @R0,A
   136:                 DJNZ    R0,IDATALOOP 
C:0x0007    D8FD     DJNZ     R0,IDATALOOP(C:0006)
   185:                 MOV     SP,#?STACK-1 
   186:  
   187: ; This code is required if you use L51_BANK.A51 with Banking Mode 4 
   188: ;<h> Code Banking 
   189: ; <q> Select Bank 0 for L51_BANK.A51 Mode 4 
   190: #if 0    
   191: ;     <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4. 
   192: EXTRN CODE (?B_SWITCH0) 
   193:                 CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0 
   194: #endif 
   195: ;</h> 
C:0x0009    758120   MOV      SP(0x81),#0x20
   196:                 LJMP    ?C_START 
C:0x000C    02000F   LJMP     main(C:000F)
    20: int main() 
    21: { 
       
    24:         bit bit0 = 1; 
C:0x000F    D200     SETB     0x20.0
    25:         return 0; 
C:0x0011    E4       CLR      A
C:0x0012    7E00     MOV      R6,#0x00
C:0x0014    7F00     MOV      R7,#0x00
    26: }
C:0x0016    22       RET      

違い:

位域实现原理:ORL      0x08,#0x01
位操作实现原理:SETB     0x20.0

        対照的に、ビットフィールドを使用して定義された変数は、ビットアドレス指定をサポートするアドレス領域に格納されません。ORLは、イミディエートデータ(0x01)とダイレクトアドレスユニット(0x08)のORをとるために使用され、命令コードは3バイトを占有します。そしてそれは24マシンサイクルを要します(12MHz水晶振動子の下で24us時間)。ビットアドレス指定を使用して定義された変数は、SETBを介してアドレス0x20.0を直接設定します。命令コードは2バイトを占有し、12マシンサイクルかかります(12MHz水晶発振器では12us時間)。

        2つの実装原理が異なることがわかります。ハードウェアビットアドレス指定を使用して定義された変数は、より高速に動作し、より少ないメモリを占有します。ビットフィールド演算では、論理演算のために変数値を読み込んでからアドレスを復元する必要があります。データの読み書き処理は内外の要因により干渉され、データが乱れる可能性があります。

24. 51 MCUで利用可能なRTOSはありますか?

        A:51 MCUはRTOSをサポートしていますが、ハードウェアリソースが不足しているため、非常に軽量なRTOSをサポートすることになっています。Keil_C51 \ C51 \ RtxTiny2の下にRTX51という名前のRTOSがありますが、これはLIBライブラリにパッケージ化されており、特定のソースコードを確認できません。ライブラリの簡素化の程度に応じて、フル機能バージョンのRTX51-FULLと合理化されたバージョンのRTX51-TINYに分けられます。RTX51-FULLは、RTX51-TINYに基づくタスクの優先順位設定をサポートしています。関連するエンジニアリング構成については、他のブロガーの紹介を参照してください。

24.1クラシック12Tマイクロコントローラーエンジニアリング構成:ハードウェアプラットフォームはSTC89C52RC、ソフトウェアはKeil C51

24.2拡張1Tマイクロコントローラーエンジニアリング構成:ハードウェアプラットフォームはSTC15W1K16S、ソフトウェアはKeil C51

24.3RTX51-TINYユーザーマニュアル

おすすめ

転載: blog.csdn.net/fantastic_sky/article/details/120479161