【51マイコンシリーズ】C51の基礎

この記事の内容は、C51 のデータ型、変数、演算子、関数、reg52.h ファイルの内容など、C51 言語の基本的な内容に関するものです。C と同じ内容の一部はここには記録されていません。定数と特定の変数、式、プログラム構造、配列などはカバーされません。

C51 データ型

C51 のデータ型は、基本データ型と複合データ型に分かれます。

1. C51の基本データ型

  • 整数
    • 署名済み
      • (符号付き) int、16 ビット、-2^15 ~ 2^15-1;
      • (符号付き) short、16 ビット、-2^15 ~ 2^15-1;
      • (符号付き) ロング、32 ビット、-2^31 ~ 2^31-1;
    • 署名されていない
      • unsigned int、16位、0 ~ 2^16-1;
      • unsigned short int、16位、0 ~ 2^16-1;
      • unsigned long int、32位、0 ~ 2^32-1;
  • 実数型
    • 署名済み
      • float、32位、3.4e-38 ~ 3.4e38;
      • ダブル、64 ビット、1.7e-308 ~ 1.7e308;
  • 文字の種類
    • 署名済み
      • 文字、8 ビット、-128 ~ 127;
    • 署名されていない
      • unsigned char、8位、0 ~ 255;

2. ポインタ型

ポインタには他のデータを指すアドレスが格納されており、C51 内のポインタの長さは通常 1 ~ 3 バイトです。

3. 特殊機能レジスタの種類

この型は C51 の拡張データ型で、51 マイクロコントローラーの特殊機能レジスタ データにアクセスするために使用されます。

sfrとのsfr162種類に分かれます。C51 の特殊機能レジスタへのアクセスは、最初に sfr または sfr16 で宣言する必要があります。

  • sfrバイト型の特殊機能レジスタタイプで、1 バイトを占有し、51 個の内部のすべての特殊機能レジスタにアクセスできます。
  • sfr16これは 2 バイトを占有する 2 バイトの特殊機能レジスタであり、51 内のすべての 2 バイトの特殊機能レジスタにアクセスできます。

4. ビットタイプ

この型は C51 の拡張データ型でもあり、51 マイクロコントローラーのアドレス指定可能なビット単位にアクセスするために使用されます。

bitC51 は、と の2 つのビット タイプをサポートします。sbitこれらはメモリ内で 1 つのバイナリ ビットのみを占有し、値は 1 または 0 です。

  • bit定義されたビット変数が C51 コンパイラでコンパイルされる場合、アドレスはさまざまな時点で変更される可能性があります。
  • sbit定義されたビット変数は、51 マイクロコントローラーのアドレス指定可能なビット単位またはビットアドレス指定可能なバイト単位内のビットに関連付けられている必要があり、対応するビット アドレスはコンパイル中に不変です。

C51 では、任意の標準データ型を優先順位に従って暗黙的に変換できます
bit → char → int → long → float → signed → unsigned

括弧を使用して強制することもできます()

C51変数

C51 変数定義の形式は次のとおりです。

[存储种类] 数据类型说明符 [存储器类型] 变量名1 [= 初值], 变量名2[=初值],...

1. ストレージタイプ

格納タイプとは、プログラム実行時の変数の有効範囲を指し、C51 変数には自動 (auto)、外部 (extern)、静的 (static)、レジスタ (register) の 4 つの格納タイプがあります。

  • auto定義された変数は自動変数と呼ばれ、その有効範囲はそれを定義した関数本体または複合文内にあり、関数本体または定義された複合文が実行されると、C51 は変数にメモリ空間を割り当て、占有されたメモリ空間は最後に解放されます。自動変数は通常、メモリのスタック領域に割り当てられます。変数を定義するときにストレージタイプを省略すると、変数はデフォルトの自動変数になります。

  • extern定義された変数は外部変数と呼ばれます。関数本体内で、関数本体外や他のプログラムで定義した変数を使用したい場合は、関数本体内に extern で変数を記述する必要があります。外部変数を定義した後、固定メモリ空間が割り当てられ、変数はプログラムの実行中に割り当てられ、プログラムが終了して解放されるまで有効です。

  • static定義された変数は静的変数と呼ばれ、内部静的変数と外部静的変数に分けられます。
    内部静的変数は関数本体内で定義され、対応する関数本体内で有効であり、常に存在しますが、関数本体の外では見えません。これにより、変数が定義されている関数本体の外で変数が保護されるだけでなく、値も許可されます。関数を終了するときに実現されます。変更されません。
    外部静的変数は関数の外部で定義されます。これらは常にプログラム内に存在しますが、定義されたスコープの外では表示されません。たとえば、複数ファイルまたは複数モジュールの処理では、外部静的変数はこのファイルまたはモジュール内でのみ有効です。

  • register定義した変数はレジスタ変数と呼ばれ、定義した変数はCPU内部のレジスタに格納され、処理速度は速いですが数は少ないです。C51 コンパイラは、コンパイル時にプログラム内で最も頻繁に使用される変数を自動的に識別し、特別な宣言を行わずにそれらをレジスタ変数として自動的に使用します。

一般に、auto 自動変数は特別な要件なしで定義されます。
関数が呼び出された回数を記録するなど、関数が呼び出されるたびに変数の値を記録する必要がある場合は、static を使用して内部静的変数を変更できます。関数本体内;
ファイル内の場合 ファイル内のすべての関数は特定の変数を使用する必要がありますが、他のファイルではそれが必要ないため、ファイル内の外部静的変数を変更するために static を使用できます
。関数本体で変数を定義した場合は、 extern を使用して変更します。

2. メモリの種類

メモリタイプは、変数が配置されているマイクロコントローラのメモリ領域を示すために使用されます。メモリの種類はストレージの種類とはまったく異なります。
C51コンパイラが認識できるメモリタイプは以下の通りで、メモリタイプを省略した場合はそのメモリタイプがデフォルトとなります。

メモリの種類 説明する
data 直接アドレス指定されたオンチップ RAM は 128B と低く、アクセス速度が高速です
bdata オンチップRAMのビットアドレス可能領域(20H~2FH)により、バイトとビットの混合アクセスが可能
idata オンチップ RAM は間接アドレス指定によってアクセスされ、すべてのオンチップ RAM へのアクセスが可能
pdata Ri を使用して間接的にアクセスされるオフチップ RAM の下位 256B
xdata オフチップ RAM は DPTR を使用して間接的にアクセスされ、64k のオフチップ RAM すべてにアクセスできます。
code プログラムメモリ ROM 64kスペース

3. 特殊機能レジスタ変数

51シリーズマイコンには多数の特殊機能レジスタがあり、これらの特殊機能レジスタを介して、51シリーズマイコンのタイマ、カウンタ、シリアルポート、I/Oなどの機能を制御できます。内蔵RAMに1バイト単位または2バイト単位で設定可能です。reg52.h一般的に使用されるいくつかの特殊関数レジスタ変数が定義されています。この記事の付録を参照してください。

C51 を使用すると、これらの特殊機能レジスタにアクセスできます。アクセスするときは、指定子sfrまたはsfr16型指定子を使用して定義する必要があります。定義するときは、対応する内蔵 RAM ユニットのアドレスも指定する必要があります。形式は次のとおりです。

sfr或sfr16 特殊功能寄存器名 = 地址;

特殊機能レジスタは通常大文字で表され、アドレスは通常直接アドレスの形式になります。

例:

// 特殊功能寄存器的定义
sfr PSW = 0xd0;
sfr SCON = 0x98;
sfr TMOD = 0x89;
sfr P1 = 0x90;
sfr16 DPTR =0x82;
sfr16 T1 = 0x8A;

4. ビット変数

C51 では、ビット型 (bit または sbit) を通じてビット変数を定義できます。

  • ビット タイプは、一般的なビット処理可能なビット変数を定義するために使用されます。形式は次のとおりです: bit 位变量名;、さまざまな変更を追加できますが、メモリ タイプは bdata、data、idata のみにすることができ、ビット アドレス指定可能な領域のみにすることができます。オンチップ RAM 厳密に言えば、bdata のみです。
  • sbit ビット タイプは、ビット アドレス指定可能なバイトまたは特殊機能レジスタのビットを定義するために使用されます。定義するときは、そのビット アドレスを指定する必要があります。直接ビット アドレス、ビット番号を持つビット アドレス指定可能な変数、またはそれを指定することができます。特殊機能レジスタ名にはビット番号が付きます。フォーマットは でsbit 位变量名 = 位地址;、ビットアドレスがビットダイレクトアドレスの場合、値の範囲は 0x00 ~ 0xff で、ビットアドレスがビット番号付きのビットアドレス指定可能な変数またはビット番号付きの特殊機能レジスタ名の場合は、変数または特殊関数レジスタの前にビットアドレス指定可能である必要があります。バイトアドレスとビット番号の間、および特殊機能レジスタとビット番号の間のギャップを使用します^たとえば、51 個のマイクロコントローラー ピンを定義すると、sbit LED = P1^0;LED が P1 のポート 0 に接続されることを意味します。

C51は、51マイコンで共通に使用される特殊機能レジスタや特殊ビットを定義し、ヘッダファイルreg51.hに記述していますreg52.h(本記事の付録を参照)。使用する場合は、ヘッダファイルをインクルードするだけです。

C51オペレーター

C51 演算子は C 演算子と一貫性があり、以下をサポートします。

  • 代入演算子 =
  • 算術演算子 + - * / %
  • 関係演算子 > < >= <= == !=
  • 論理演算子 && || !
  • ビット演算子 & | ^ ~ << >>
  • 複合代入演算子 += -= *= /= %= &= |= ^= ~= <<= >>=
  • カンマ演算子、
  • 条件演算子?:
  • ポインタおよびアドレス演算子 *&

1. ビット演算子

C51 はオペランドに対してビット単位の演算を実行できます。ビット演算は変数をビットごとに操作しますが、演算に関与する変数の値は変更されません。
C51 ビット演算子は整数のみを操作でき、浮動小数点数は操作できません。
C51 のビット演算子は次のとおりです。

  • &ビットごとの AND
  • |ビットごとの OR
  • ^ビットごとの XOR
  • ~ビットごとの否定
  • <<左にシフト
  • >>右に動く

C51の機能

C51 関数定義の一般的な形式は次のとおりです。

函数类型 函数名(形参列表) [reentrant][interrupt m][using n]

1. リエントラント修飾子

リエントラント修飾子は、関数をリエントラントとして定義するために使用されます。リエントラント関数は、再帰的に呼び出すことができる関数です。

関数の再帰的呼び出しとは、関数が呼び出されてもまだ返されていないときに、関数自体を直接または間接的に呼び出すことを指します。再入可能な関数のみが再帰的に呼び出すことができます。

リエントラント関数を使用する場合の注意事項:

  • リエントラントにより変更されたリエントラント関数を呼び出す場合、実パラメータにビット型パラメータを使用することはできません。関数本体内ではビット変数に対する操作は許可されず、ビット型の値を返すことも許可されません。
  • コンパイル時に、システムは内部または外部メモリにリエントラント関数用のシミュレートされたスタック領域 (リエントリ スタックと呼ばれる) を作成します。リエントラント関数のローカル変数とパラメータはリエントラント スタックに配置されるため、リエントラント関数を再帰的に呼び出すことができます。
  • パラメータの受け渡しに関しては、間接的に呼び出されるリエントラント関数に実際のパラメータを渡すことができます。リエントラントなしで間接的に呼び出される関数には呼び出しパラメータを含めることはできませんが、定義されたグローバル変数はパラメータの受け渡しに使用できます。

2. 割り込み m 修飾子

C51 では、interrupt m 修飾子は重要な修飾子であり、この修飾子によって割り込み関数が変更されます。

関数を定義するときに割り込み m 修飾子が使用されると、システムはコンパイル中に対応する関数を割り込み関数に変換し、プログラムのヘッダーと末尾のセグメントを自動的に追加し、51 の規則に従ってプログラム メモリ内の対応する位置に自動的に配置します。システム割り込み処理メソッド、場所。

この修飾子では、m の値は 0 ~ 31 で、対応する割り込み状況は次のとおりです。

  • 0 外部中断0
  • 1 タイマー/カウンター T0
  • 2 外部中断1
  • 3 タイマー/カウンター T1
  • 4 シリアルポート割り込み
  • 5 タイマー/カウンター T2
  • 他の値は予約されています

付録

reg52.h ファイルで定義されている特殊レジスタ変数とビット変数は次のとおりです。

// 特殊功能寄存器
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;  // 四个IO口
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;

// 8052 额外增加的寄存器变量
sfr T2CON = 0xC8;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2 = 0xCC;
sfr TH2 = 0xCD;

// 位变量

// PSW的位变量
sbit CY = PSW^7;  // 即 0xD0的bit7位
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0;  // 仅8052支持

// TCON寄存器的位变量
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;

// IE寄存器的位变量
sbit EA = IE^7;
sbit ET2 = IE^5;  // 8052 ONLY
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;

// IP寄存器的位变量
sbit PT2 = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX1 = IP^0;

// P3口的位变量
sbit RD = P3^7;
sbit WR = P3^6;
sbit T1 = P3^5;
sbit T0 = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD = P3^1;
sbit RXD = P3^0;

// SCON寄存器的位变量
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;

// P1口的位变量
sbit T2EX = P1^1;  // 8052 ONLY
sbit T2 = P1^1;  // 8052 ONLY

// T2CON寄存器的位变量,8052 ONLY
sbit TF2 = T2CON^7;
sbit EXF2 = T2CON^6;
sbit RCLK = T2CON^5;
sbit TCLK = T2CON^4;
sbit EXEN2 = T2CON^3;
sbit TR2 = T2CON^2;
sbit C_T2 = T2CON^1;
sbit CP_RL2 = T2CON^0;

おすすめ

転載: blog.csdn.net/sinat_41752325/article/details/134465712