頻度は、1秒あたりのサイクル数として定義されます。合計時間「T」の逆数として定義することもできます。このプロジェクトでは、8051マイクロコントローラーのポート3.5に入るパルスの数をカウントし、 16 * 2LCDディスプレイに表示します。したがって、基本的には8051のポート3.5で信号の周波数を測定します。ここではAT89S52 8051チップを使用し、デモンストレーション用のサンプルパルスを生成するために555ICを非安定モードで使用します。以前、Arduinoを使用して周波数カウンターを構築しました。
必要なコンポーネント:
- 8051マイクロコントローラー(AT89S52)
- 16 * 2LCDディスプレイ
- 周波数源(555タイマー)
- ポテンショメータ
- 接続線
回路図:
周波数の測定に8051のタイマーを使用する:
8051マイクロコントローラーは8ビットマイクロコントローラーで、128バイトのオンチップRAM、4KバイトのオンチップROM、2つのタイマー、1つのシリアルポートと4つの8ビットポートを備えています。8052マイクロコントローラーはマイクロコントローラーの拡張です。ポート3.5をカウンタとして設定するには、TMODレジスタ値を0x51に設定します。下の図はTMODレジスタを示しています。
ゲート | C / T | M1 | M0 | ゲート | C / T | M1 | M2 |
タイマー1 | タイマー0 |
GATE- GATEが設定されている場合、タイマーまたはカウンターは、INTxピンがHIGHでTRx制御ピンが設定されている場合にのみ有効になります。GATEがクリアされると、TRx制御ビットが設定されるたびにタイマーが有効になります。
C / T – C / T = 0の場合、タイマーとして機能します。C / T = 1の場合、カウンターとして機能します。
M1とM0は動作モードを示します。
TMOD = 0x51の場合、timer1はカウンターとして機能し、mode1(16ビット)で動作します。
16 * 2 LCDは、信号の周波数をヘルツ(Hz)で表示するために使用されます。16x2 LCDを初めて使用する場合は、16x2LCDのピンとそのコマンドの詳細をここで確認してください。LCDと8051のインターフェース方法も確認してください。
周波数ソースとしての555タイマー:
8051マイクロコントローラのポートは5Vを超える電圧を処理できないため、周波数源は方形波を生成する必要があり、最大振幅は5Vに制限されます。それは測定することができる最大周波数は655.35 kHzのためTH1とTL1レジスタのメモリ制限(各8ビットの)の。100ミリ秒で、TH1とTL1は最大65535カウントを保持できます。したがって、測定できる最大周波数は65535 * 10 = 655.35KHzです。
この8051周波数計プロジェクトでは、可変周波数の方形波を生成するために、非安定モードで555タイマーを使用しています。555 ICによって生成される信号の周波数は、このプロジェクトの最後に提供されるビデオに示されているように、ポテンショメータを調整することによって変更できます。
このプロジェクトでは、Timer1(T1)は、8051マイクロコントローラーのポート3.5に100ミリ秒入力されるパルスの数をカウントします。カウント値は、それぞれTH1レジスタとTL1レジスタに格納されます。TH1レジスタとTL1レジスタの値を組み合わせるには、次の式を使用します。
パルス= TH1 *(0x100)+ TL1
これで、「パルス」は100ミリ秒のサイクル数になります。ただし、信号の周波数は1秒あたりのサイクル数として定義されます。周波数に変換するには、以下の式を使用します。
パルス=パルス* 10
動作とコードの説明:
この周波数計の完全なCプログラムは、このプロジェクトの最後にあります。コードは意味のある小さなチャンクに分割され、以下で説明されています。
8051マイクロコントローラーとインターフェースする16 * 2 LCDの場合、16 * 2lcdが8051マイクロコントローラーに接続されるピンを定義する必要があります。16 * 2 lcdのRSピンはP2.7に接続され、16 * 2 lcdのRWピンはP2.6に接続され、16 * 2lcdのEピンはP2.5に接続されます。データピンは8051マイクロコントローラのポート0に接続されています。
sbit rs = P2 ^ 7; sbit rw = P2 ^ 6; sbit en = P2 ^ 5;
次に 、プログラムで使用されるいくつかの関数を定義する必要があり ます。 遅延 機能は、指定された時間遅延を作成するために使用されます。 Cmdwrt 関数は、コマンドを16 * 2lcd ディスプレイに送信するために使用されます。 datawrt 関数は、16 * 2lcd ディスプレイにデータを送信するために使用されます。
void delay(unsigned int); void cmdwrt(unsigned char); void datawrt(unsigned char);
コードのこの部分では、16 * 2lcdにコマンドを送信しています。表示のクリア、カーソルのインクリメント、カーソルを1行目の先頭に強制するなどのコマンドは、指定された時間遅延の後に1つずつ16 * 2lcdディスプレイに送信されます。
for(i = 0; i <5; i ++){cmdwrt(cmd); 遅延(1); }
コードのこの部分では、timer1がカウンターとして構成され、動作モードがモード1に設定されています。
Timer0はタイマーとして設定され、動作モードはモード1に設定されます。タイマー1はパルス数のカウントに使用され、タイマー0は時間遅延の生成に使用されます。TH1とTL1の値は0に設定され、カウントが0から開始されるようにします。
TMOD = 0x51; TL1 = 0; TH1 = 0;
コードのこの部分では、タイマーが100ミリ秒実行されるようになっています。遅延機能を使用して、100ミリ秒の遅延が生成されます。TR1 = 1はタイマーを開始するためのものであり、TR1 = 0は100ミリ秒後にタイマーを停止するためのものです。
TR1 = 1; delay(100); TR1 = 0;
コードのこの部分では、TH1レジスタとTL1レジスタに存在するカウント値を組み合わせてから、10を掛けて、1秒間の合計サイクル数を取得します。
パルス= TH1 *(0x100)+ TL1; パルス=パルス* 10;
コードのこの部分では、周波数値が1バイトに変換され、16 * 2lcdディスプレイでの表示が容易になっています。
d1 =パルス%10; s1 =パルス%100; s2 =パルス%1000; s3 =パルス%10000; s4 =パルス%100000; d2 =(s1-d1)/ 10; d3 =(s2-s1)/ 100; d4 =(s3-s2)/ 1000; d5 =(s4-s3)/ 10000; d6 =(パルス-s4)/ 100000;
コードのこの部分では、周波数値の個々の桁がASCII形式に変換され、16 * 2lcdディスプレイに表示されます。
If(pulses> = 100000)datawrt(0x30 + d6); if(pulses> = 10000)datawrt(0x30 + d5); if(pulses> = 1000)datawrt(0x30 + d4); if(pulses> = 100)datawrt(0x30 + d3); if(pulses> = 10)datawrt(0x30 + d2); datawrt(0x30 + d1);
コードのこの部分では、16 * 2lcdディスプレイにコマンドを送信しています。コマンドは8051マイクロコントローラのポート0にコピーされます。コマンド書き込み用にRSをローにします。書き込み動作のRWをローにします。イネーブル(E)ピンにハイパルスからローパルスを印加して、コマンド書き込み動作を開始します。
void cmdwrt(unsigned char x){P0 = x; rs = 0; rw = 0; en = 1; delay(1); en = 0; }
コードのこの部分では、16 * 2lcdディスプレイにデータを送信しています。データは8051マイクロコントローラのポート0にコピーされます。コマンド書き込み用にRSをHighにします。書き込み動作ではRWをローにします。データ書き込み動作を開始するために、ハイパルスからローパルスがenable(E)ピンに印加されます。
void datawrt(unsigned char y){P0 = y; rs = 1; rw = 0; en = 1; delay(1); en = 0; }
これは、8051マイクロコントローラーを使用して任意の信号の周波数を測定する方法です。以下の完全なコードとデモビデオを確認してください。