ゼロ基礎学習単片機(一)--LED
最近、会社はスマートカーの改装をします.私はとても耻ずかしくて、ぼんやりと大学で4年の电子の専门を読んで、结局単片机はすべて2回游んだことがありません.
一眼レフをプレイして、一番簡単なLEDから始める予定です.
このシリーズの学習ノート開発環境は次のとおりです.
开発板:HC 800 EM 3はとても良い开発板だと感じて、提供する外部のインターフェースは少なくなくて、板はまた単片机とARMの“交换のインターフェース”を提供しました.
シングルチップマシン型番:STC 90 C 516 RD+
ARM:STM32
開発ツール:keil 3(モノリシック版)
一、原理図
ネット上のチュートリアルが多いため、keilの使用やボードの回路分析については具体的に紹介しません.△ありがたいことに、板の原理図が多少読めるようになった.
分かりやすく、1ピンを0にすると、このランプD 8が点灯します.
二、単片機遅延プログラムの粗浅分析
LEDランプに多様な効果(例えば点滅)をもたらすためには、必ず遅延プログラムが用いられる.一部のネットユーザーによると、単片機の遅延プログラムの精度は高くなく、タイマーを使うことを提案している.でもさすがに入門ですから、あとでタイマーを検討しましょう.
次の手順は12 MHZ結晶振動源で1 ms遅延するc手順である.
1つのマシンサイクルは12クロックサイクルを含む.クロック周期の計算式=(1/結晶振動数)秒.
例えば、結晶振動12 MHZ
このモノリシックマシンのクロック周期=(1/12)マイクロ秒であることから、マシン周期が1 usであることが得られる.
ここで機械周期は命令周期と理解でき,単片機が1つの命令を実行するのにかかる時間である.注意:ここの命令はC言語の命令ではありません.そして、機械の命令は、逆アセンブリで見ることができます.
2、逆アセンブリ
対応する逆アセンブリコードを表示するために、プログラムが実行される時間を計算します.ここに上記のプログラムの逆アセンブリコードを添付し、keilは逆アセンブリコードを呼び出してウィンドウを表示することができます.
以下にdelay_を示します.ms()各命令に対応するマシンサイクル.
ここに8051の命令周期表ダウンロードアドレスを添付します.
DJNZ R 5,C:004 B,このサイクルを実行するためのマシンサイクル数は2*2=4である.
第3条指令から第5条指令までのサイクルは、そのサイクルを実行するためのマシンサイクル数が(1+2*2+2)*142
2番目の命令から6番目の命令までのサイクルは、そのサイクルを実行するためのマシンサイクル数が(1+(1+2*2+2)*142+2)*1
三、メインプログラム
一眼レフをプレイして、一番簡単なLEDから始める予定です.
このシリーズの学習ノート開発環境は次のとおりです.
开発板:HC 800 EM 3はとても良い开発板だと感じて、提供する外部のインターフェースは少なくなくて、板はまた単片机とARMの“交换のインターフェース”を提供しました.
シングルチップマシン型番:STC 90 C 516 RD+
ARM:STM32
開発ツール:keil 3(モノリシック版)
一、原理図
ネット上のチュートリアルが多いため、keilの使用やボードの回路分析については具体的に紹介しません.△ありがたいことに、板の原理図が多少読めるようになった.
分かりやすく、1ピンを0にすると、このランプD 8が点灯します.
二、単片機遅延プログラムの粗浅分析
LEDランプに多様な効果(例えば点滅)をもたらすためには、必ず遅延プログラムが用いられる.一部のネットユーザーによると、単片機の遅延プログラムの精度は高くなく、タイマーを使うことを提案している.でもさすがに入門ですから、あとでタイマーを検討しましょう.
次の手順は12 MHZ結晶振動源で1 ms遅延するc手順である.
void delay_ms(void)
{
unsigned char a,b,c;
for(c = 1;c > 0; c--)
for(b = 142; b > 0; b--)
for(a = 2; a>0; a--);
}
1、機械周期1つのマシンサイクルは12クロックサイクルを含む.クロック周期の計算式=(1/結晶振動数)秒.
例えば、結晶振動12 MHZ
このモノリシックマシンのクロック周期=(1/12)マイクロ秒であることから、マシン周期が1 usであることが得られる.
ここで機械周期は命令周期と理解でき,単片機が1つの命令を実行するのにかかる時間である.注意:ここの命令はC言語の命令ではありません.そして、機械の命令は、逆アセンブリで見ることができます.
2、逆アセンブリ
対応する逆アセンブリコードを表示するために、プログラムが実行される時間を計算します.ここに上記のプログラムの逆アセンブリコードを添付し、keilは逆アセンブリコードを呼び出してウィンドウを表示することができます.
54: void delay(void)
55: {
56: unsigned char a,b,c;
57: for(c=1;c>0;c--)
C:0x0045 7F01 MOV R7,#0x01
58: for(b=142;b>0;b--)
C:0x0047 7E8E MOV R6,#0x8E
59: for(a=2;a>0;a--);
C:0x0049 7D02 MOV R5,#0x02
C:0x004B DDFE DJNZ R5,C:004B
C:0x004D DEFA DJNZ R6,C:0049
C:0x004F DFF6 DJNZ R7,C:0047
60: }
C:0x0051 22 RET
3、逆アセンブリ分析以下にdelay_を示します.ms()各命令に対応するマシンサイクル.
ここに8051の命令周期表ダウンロードアドレスを添付します.
C:0x0045 7F01 MOV R7,#0x01 1
C:0x0047 7E8E MOV R6,#0x8E 1
C:0x0049 7D02 MOV R5,#0x02 1
C:0x004B DDFE DJNZ R5,C:004B 2
C:0x004D DEFA DJNZ R6,C:0049 2
C:0x004F DFF6 DJNZ R7,C:0047 2
C:0x0051 22 RET 2
では、プログラムにどれだけの時間がかかるかを計算します.(アセンブル命令を理解していなければ8051命令周期表を見ることができます)DJNZ R 5,C:004 B,このサイクルを実行するためのマシンサイクル数は2*2=4である.
第3条指令から第5条指令までのサイクルは、そのサイクルを実行するためのマシンサイクル数が(1+2*2+2)*142
2番目の命令から6番目の命令までのサイクルは、そのサイクルを実行するためのマシンサイクル数が(1+(1+2*2+2)*142+2)*1
delay_time = 1+(1+(1+2*2+2)*142+2)*1+2
ネット上では、優れた遅延プログラム計算ソフトウェアが提供されています.モノリシックポケモンソフト三、メインプログラム
int main(void)
{
P2 = 0xFE;
while(1)
{
delay_ms(100); // 100ms
P2 ^= (1 << 0); //
}
return 0;
}
D1 100ms
, , LED 。 ~~ 。
, , 。 , 。 :[email protected]