C 51遅延関数作成[李園7舎_404]
2675 ワード
背景:STC 89 C 52
1_nop_()
1_nop_()
機能:nop_関数は、コードにNOP命令を生成するために使用されます.この命令は1つの機械周期の時間を遅らせるために使用することができる.
戻り値:なし.
ヘッダファイル:#include
検証#ケンショウ#
1.C 51エンジニアリングのメインファイルのmain関数でテスト_nop_()関数の実行時間.テスト前に現在のプロジェクトを選択し、プロジェクト-->Option for targetプロジェクト名-->TargetAを選択し、Xtal(MHz)オプションを単片機の結晶振動数に変更します.私のSTC 89 C 52は11.0592 MHZです.設定したらOKをクリックします.
2.main関数には簡単な次の文テストが含まれています.nop_()関数の実行時間:int i;
i = 0;
_nop_();
i++;
そして、keil文の遅延時間の正確な計算方法(KEIL文の実行時間の計算)に基づいて実行時間を決定し、実行_nop_()前の時間は424.26微妙で、実行完了_nop_()の時間が425.35微妙である場合、この文を実行する時間は425.35–424.26=1.09微妙である.この単片機を計算する機械周期は12*1/1059200=1.085微妙で、4捨5入で1.09微妙です.得られた結論は_nop_()文はマシンサイクルの時間を遅延します.
2循環文による遅延
ループ文が実行されるとき自体も実行時間がかかるので、単純に_nop_()サイクルの実行遅延時間は,サイクル数とマシンサイクルとの乗算に等しくない.したがって,比較的正確な遅延時間を得るにはkeilのシミュレーションを用いてコードが実行される時間が必要である.
2.1純循環文遅延
結晶振動が11.0592 MHZの単片機にとって,郭天祥先輩は比較的正確なサイクル遅延方式を試験した.2層サイクルを用いると,内層サイクルの最大値は110に固定され,外層サイクル回数は遅延ミリ秒数に相当する.C言語コードで次のように表します.unsigned int i, j;
for(i = delay_ms; i > 0; i--)
for(j = 110; j > 0; j--);
テスト後、delay_msの値は1000 ms(すなわち1 sの場合)に設定され、このコードが実行される実際の時間は965717で微妙で、差は少なく1秒である.テスト後、delay_msの値は1000 ms(すなわち1 sの場合)に設定され、このコードが実行される実際の時間は965717で微妙で、差は少なく1秒である.テスト後、delay_msの値は1000 ms(すなわち1 sの場合)に設定され、このコードが実行される実際の時間は965717で微妙で、差は少なく1秒である.
2.2呼び出し_nop_()遅延
ベース_nop_()このように特殊で、ちょうど1つの機械の周期の時間を遅らせて、それを使いたくなければなりません.しかし、遅延時間は本当に小さすぎて、微妙です.微妙な呼び出しを1、2つ遅らせるだけでこの関数は最適ですが、必要であれば_nop_()関数で遅延する場合は、keilソフトウェアでループ文と_を計算する必要があります.nop_()合計でどれくらい時間がかかりますか.このセクションを遅延関数に設定し、誤差のないループ文で呼び出します.8ビット最大数255サイクル関数の作成unsigned char i;
for(i = 255; i > 0; i--){
_nop_();
}
測定した遅延時間は−42.26+291558=24911.32微妙に測定した遅延時間は−42.26+291558=24911.32微妙に測定した遅延時間は−42.26+291558=24911.32微妙であった.
1000サイクル関数の作成for(i = 1000; i > 0; i--){
_nop_();
}
測定した遅延時間は−42.35+10196.40=9771.05の10 ms近くであった.
10000サイクル関数の作成for(i = 10000; i > 0; i--){
_nop_();
}
測定した遅延時間は−42.35+98126.09=97700.74であり,約100 msであった.
5000サイクルの遅延時間は49276.26–425.35=48850.91,月50 msであった.
3まとめ
キーボードジッタの除去や10 msの遅延など、簡単な遅延を行うには、上述したループ文を用いた方法で遅延することができる.実際の状況分析によれば、あまり正確にする必要はないからだ.正確な遅延が必要な場合は、タイマ/カウンタが必要になります.
また、プログラム設計の過程で2つの概念を混同した:カウンタプラス1操作には機械周期と変数++に必要な時間が必要である.プログラムを作成するときに変数++の実行時間を1つのマシンサイクルとして計算するのは間違っています.1つの命令が実行される前に命令を取るなどの基本操作も含まれていますが、1つのマシンサイクルは1つの基本操作しか完了していないので、変数++の実行時間はマシンサイクルより大きいです.
今回のメモは記録済みです.
検証#ケンショウ#
1.C 51エンジニアリングのメインファイルのmain関数でテスト_nop_()関数の実行時間.テスト前に現在のプロジェクトを選択し、プロジェクト-->Option for targetプロジェクト名-->TargetAを選択し、Xtal(MHz)オプションを単片機の結晶振動数に変更します.私のSTC 89 C 52は11.0592 MHZです.設定したらOKをクリックします.
2.main関数には簡単な次の文テストが含まれています.nop_()関数の実行時間:
int i;
i = 0;
_nop_();
i++;
そして、keil文の遅延時間の正確な計算方法(KEIL文の実行時間の計算)に基づいて実行時間を決定し、実行_nop_()前の時間は424.26微妙で、実行完了_nop_()の時間が425.35微妙である場合、この文を実行する時間は425.35–424.26=1.09微妙である.この単片機を計算する機械周期は12*1/1059200=1.085微妙で、4捨5入で1.09微妙です.得られた結論は_nop_()文はマシンサイクルの時間を遅延します.
2循環文による遅延
ループ文が実行されるとき自体も実行時間がかかるので、単純に_nop_()サイクルの実行遅延時間は,サイクル数とマシンサイクルとの乗算に等しくない.したがって,比較的正確な遅延時間を得るにはkeilのシミュレーションを用いてコードが実行される時間が必要である.
2.1純循環文遅延
結晶振動が11.0592 MHZの単片機にとって,郭天祥先輩は比較的正確なサイクル遅延方式を試験した.2層サイクルを用いると,内層サイクルの最大値は110に固定され,外層サイクル回数は遅延ミリ秒数に相当する.C言語コードで次のように表します.unsigned int i, j;
for(i = delay_ms; i > 0; i--)
for(j = 110; j > 0; j--);
テスト後、delay_msの値は1000 ms(すなわち1 sの場合)に設定され、このコードが実行される実際の時間は965717で微妙で、差は少なく1秒である.テスト後、delay_msの値は1000 ms(すなわち1 sの場合)に設定され、このコードが実行される実際の時間は965717で微妙で、差は少なく1秒である.テスト後、delay_msの値は1000 ms(すなわち1 sの場合)に設定され、このコードが実行される実際の時間は965717で微妙で、差は少なく1秒である.
2.2呼び出し_nop_()遅延
ベース_nop_()このように特殊で、ちょうど1つの機械の周期の時間を遅らせて、それを使いたくなければなりません.しかし、遅延時間は本当に小さすぎて、微妙です.微妙な呼び出しを1、2つ遅らせるだけでこの関数は最適ですが、必要であれば_nop_()関数で遅延する場合は、keilソフトウェアでループ文と_を計算する必要があります.nop_()合計でどれくらい時間がかかりますか.このセクションを遅延関数に設定し、誤差のないループ文で呼び出します.8ビット最大数255サイクル関数の作成unsigned char i;
for(i = 255; i > 0; i--){
_nop_();
}
測定した遅延時間は−42.26+291558=24911.32微妙に測定した遅延時間は−42.26+291558=24911.32微妙に測定した遅延時間は−42.26+291558=24911.32微妙であった.
1000サイクル関数の作成for(i = 1000; i > 0; i--){
_nop_();
}
測定した遅延時間は−42.35+10196.40=9771.05の10 ms近くであった.
10000サイクル関数の作成for(i = 10000; i > 0; i--){
_nop_();
}
測定した遅延時間は−42.35+98126.09=97700.74であり,約100 msであった.
5000サイクルの遅延時間は49276.26–425.35=48850.91,月50 msであった.
3まとめ
キーボードジッタの除去や10 msの遅延など、簡単な遅延を行うには、上述したループ文を用いた方法で遅延することができる.実際の状況分析によれば、あまり正確にする必要はないからだ.正確な遅延が必要な場合は、タイマ/カウンタが必要になります.
また、プログラム設計の過程で2つの概念を混同した:カウンタプラス1操作には機械周期と変数++に必要な時間が必要である.プログラムを作成するときに変数++の実行時間を1つのマシンサイクルとして計算するのは間違っています.1つの命令が実行される前に命令を取るなどの基本操作も含まれていますが、1つのマシンサイクルは1つの基本操作しか完了していないので、変数++の実行時間はマシンサイクルより大きいです.
今回のメモは記録済みです.
unsigned int i, j;
for(i = delay_ms; i > 0; i--)
for(j = 110; j > 0; j--);
unsigned char i;
for(i = 255; i > 0; i--){
_nop_();
}
for(i = 1000; i > 0; i--){
_nop_();
}
for(i = 10000; i > 0; i--){
_nop_();
}
キーボードジッタの除去や10 msの遅延など、簡単な遅延を行うには、上述したループ文を用いた方法で遅延することができる.実際の状況分析によれば、あまり正確にする必要はないからだ.正確な遅延が必要な場合は、タイマ/カウンタが必要になります.
また、プログラム設計の過程で2つの概念を混同した:カウンタプラス1操作には機械周期と変数++に必要な時間が必要である.プログラムを作成するときに変数++の実行時間を1つのマシンサイクルとして計算するのは間違っています.1つの命令が実行される前に命令を取るなどの基本操作も含まれていますが、1つのマシンサイクルは1つの基本操作しか完了していないので、変数++の実行時間はマシンサイクルより大きいです.
今回のメモは記録済みです.