シングルチップマイコンのC言語プログラミング
シングルチップマイコンアプリケーションシステムのプログラミングは、アセンブリ言語に加えてC言語で実装できます。51シリーズのシングルチップコンピュータのハードウェアを操作できるC言語には様々な種類があり、一般にC51と呼ばれています。
C51は、標準C(ANSI C)に基づいて、シングルチップマイクロコンピューターのハードウェアリソースに対応するデータ型と変数を拡張します。C51は、標準Cと同じ構文、プログラム構造、および設計方法を備えています。この章では、C51の標準Cへの拡張に焦点を当て、いくつかの簡単な例を使用してC51のプログラミング方法を説明します。
C51を使用する理由
- C言語は、高いコードレート、豊富なデータ型と演算子、優れたプログラム構造を備えた一般的なプログラミング言語です。さまざまなアプリケーションのプログラミングに適しています。現在、マイクロコントローラーで最も広く使用されているプログラミング言語です。 C51コンパイラ。
- C51によって生成されたターゲットコードは、実行速度が速く、必要なストレージ容量が小さく、C言語のANSI標準に準拠し、生成されたコードはIntelターゲットファイル形式に従い、A51アセンブリ言語またはPL / M51言語のターゲットコードと混合できます。
プログラムの構造
全局变量说明 /*可被各函数引用*/
main( ) /*主函数*/
{
局部变量说明 /* 只在本函数引用 */
执行语句 (包括函数调用语句);
}
Fun1(形式参数表) /*函数1*/
形式参数说明
{
局部变量说明
执行语句(包括调用其他函数语句);
}
…
Funn(形式参数表) /*函数n*/
形式参数说明
{
局部变量说明
执行语句 (包括调用其他函数语句)
}
データ型
メモリーモード
data char var; //字符变量var定位在片内RAM区
char code MSG[]=″ENTER PARAMETER:″ //字符数组定位在程序存储区
unsigned long xdata array[100]; /* 无符号长型数组定位在片外RAM区,每元素占4bytes*/
float idata x,y,z; /*实型变量x,y,z,定位在片内用 间址访问的内部RAM区*/
bit lock; /*位变量Lock定位在片内RAM可位寻址区*/
unsigned int pdata dimension; /* 无符号整型变量 dimension定位
在分页的外部RAM区 */
unsigned char xdata vector [10][4][4]; /* 无符号字符型三维数组,定位在片外RAM区*/
sfr P0=0x80; /*定义P0口,地址为80H*/
char bdata flags; /*字符变量flags定位在可位寻址内部RAM区*/
sbit flag0=flags^0; /*定义flag0为flags.0
ポインター変数
ポインタは記憶装置のアドレスであり、このアドレスを格納する変数をポインタ変数といいます。
演習
2。C51とアセンブリ言語の特徴は何ですか?2つの補完的な利点をどのように実現しますか?
回答:プログラミングにC51を使用すると、システムハードウェアリソースの割り当てがアセンブリ言語を使用するよりも簡単になり、プログラムの読み取りや変更が容易になり、大規模なプログラムの作成に適しています。
アセンブリ言語によって生成されたターゲットプログラムは、使用するストレージスペースが少なく、実行速度が速く、高効率と強力なリアルタイムパフォーマンスという利点があり、短くて効率的なプログラムの記述に適しています。
7。割り込み関数はどのように定義されていますか?さまざまなオプションの意味は何ですか?
回答:割り込みnは、割り込み関数を定義するために使用されます。Nは、割り込み番号であり、0〜31にすることができます。割り込みアドレスは、割り込みサービスプログラムのエントリアドレスを決定できます。
一般的に使用される割り込みソースに対応する割り込み番号
割り込みソース | 外部割り込み0 | タイマー0 | 外部割り込み1 | タイマー1 | シリアルポート |
---|---|---|---|---|---|
割り込み番号 | 0 | 1 | 2 | 3 | 4 |
9。一般的なポインタとメモリベースのポインタの違いは何ですか?
回答:指すオブジェクトのメモリタイプが定義時に指定されていない場合、ポインタ変数は汎用ポインタとみなされます。
通常、ポインターは3バイトを占有します。最初のバイトはポインターのメモリー・タイプ・コード(コンパイル・モードのデフォルト値によって決定されます)を保管し、2番目と3番目のバイトはそれぞれポインターの上位および下位アドレス・オフセットを保管しますシフト量。**指すオブジェクトの格納タイプが定義時に指定されている場合、ポインタ変数はメモリベースのポインタに属します。
メモリベースのポインタはオブジェクトに効率的にアクセスでき、タイプはC51ソースコードのメモリタイプによって決定され、コンパイル時に決定されます。
12。次のプログラムのエラーを修正してください。
#include<reg51.h>
main ()
{a = c;
int a = 7,c;
delay (10)
void delay( );
{
char i;
for (i = 0;i< = 255;i++);
}
回答:このプログラムには次のエラーがあります。
変数は、参照される前に定義する必要があります。
関数を呼び出した後、5番目の文の後にセミコロンを付ける必要があります。
Main()関数の最後に、中かっこがありません。
呼び出される関数delay()はmain()の後に続き、その前に宣言する必要があります。
関数の6番目の文は、ステートメントの後のセミコロンを削除する必要があることを示しています。
13。xdataタイプのポインター長が2バイトを使用する理由を説明してください。
回答:xdataは外部データメモリであるため、64KBの最大ストレージユニットを持つことができます。xdataポインターは、外部データストレージユニットのアドレスです。64KBユニットアドレスを表すには、2バイトの16バイトで表す必要があります。
64KB = 65536B = 2 ^ 16B