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マイクロコントローラーと呼ぶことができます。
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スタートアップファイルコードをプロジェクトに追加するように求めるプロンプトが表示されます。これは必要なファイルですか?
回答:はい。マイクロコントローラーの電源がオンになると、通常、スタックやピンなどを初期化する必要があります。これらはすべて、アセンブリで記述されたスタートアップコードによって実行される必要があります。
12.ソースファイルの下にヘッダーファイルを追加するにはどうすればよいですか?
A:ソースファイルで#include "xxx.h"を使用して追加できますが、コンパイルする前に、図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は間接アドレス指定のみを使用できます。
3つのキーワードsfr、sfr16、およびsbitは、特殊機能レジスタ領域での変数の宣言を担当します。sfrは8ビット変数の宣言に使用され、sfrは16ビット変数の宣言に使用され、sbitはビットの宣言に使用されます。変数。特殊機能レジスタでは、アドレスが8の整数倍である変数は、ビットアドレス指定(0x80、0x88など)をサポートします。つまり、図13.2に示すように、ビット変数を宣言するためのsbitの使用をサポートします。
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から、ベースアドレスを任意に指定できないことがわかります。
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