時々、変動のためにアナログ温度計から温度を読み取るのが難しいと感じることがあります。そこで、ここでは 、LM35センサーを使用して温度を測定する8051マイクロコントローラーを使用して簡単なデジタル温度計を作成します。また、LM35を使用して、Arduino、NodeMCU、PIC、RaspberryPiおよびその他のマイクロコントローラーを使用したデジタル体温計を構築しました。
このプロジェクトは、ADC0804と8051および16 * 2LCDと8051マイクロコントローラーの適切なインターフェースとしても機能します。
必要なコンポーネント:
- 8051開発ボード
- ADC0804ボード
- 16 * 2LCDディスプレイ
- LM35センサー
- ポテンショメータ
- ジャンパー線
回路図:
LM35を使用したデジタル体温計回路の回路図を 以下に示します。
8051を使用したLM35での温度測定:
8051マイクロコントローラーは8ビットマイクロコントローラーで、128バイトのオンチップRAM、4KバイトのオンチップROM、2つのタイマー、1つのシリアルポートと4つの8ビットポートを備えています。8052マイクロコントローラーはマイクロコントローラーの拡張です。以下の表は、8051ファミリーメンバーの比較を示しています。
特徴 |
8051 |
8052 |
ROM(バイト単位) |
4K |
8K |
RAM(バイト) |
128 |
256 |
タイマー |
2 |
3 |
I / Oピン |
32 |
32 |
シリアルポート |
1 |
1 |
割り込みソース |
6 |
8 |
16x2 LCD:
16 * 2 LCDは、組み込みアプリケーションで広く使用されているディスプレイです。16 * 2LCDディスプレイのピンと動作について簡単に説明します。LCD内には2つの非常に重要なレジスタがあります。データレジスタとコマンドレジスタです。コマンドレジスタは、クリア表示、自宅カーソルなどのコマンドを送信するために使用され、データレジスタは、16 * 2LCDに表示されるデータを送信するために使用されます。以下の表は、16 * 2lcdのピンの説明を示しています。
ピン |
シンボル |
I / O |
説明 |
1 |
対 |
- |
接地 |
2 |
Vdd |
- |
+ 5V電源 |
3 |
ヴィー |
- |
コントラストを制御する電源 |
4 |
RS |
私 |
コマンドレジスタのRS = 0、 データレジスタのRS = 1 |
5 |
RW |
私 |
書き込みの場合はR / W = 0、読み取りの場合はR / W = 1 |
6 |
E |
I / O |
有効にする |
7 |
D0 |
I / O |
8ビットデータバス(LSB) |
8 |
D1 |
I / O |
8ビットデータバス |
9 |
D2 |
I / O |
8ビットデータバス |
10 |
D3 |
I / O |
8ビットデータバス |
11 |
D4 |
I / O |
8ビットデータバス |
12 |
D5 |
I / O |
8ビットデータバス |
13 |
D6 |
I / O |
8ビットデータバス |
14 |
D7 |
I / O |
8ビットデータバス(MSB) |
15 |
A |
- |
バックライト用+ 5V |
16 |
K |
- |
接地 |
以下の表は、頻繁に使用されるLCDコマンドコードを示しています。
コード(16進数) |
説明 |
01 |
表示画面をクリア |
06 |
カーソルをインクリメント(右シフト) |
0A |
表示オフ、カーソルオン |
0C |
表示オン、カーソルオフ |
0F |
表示、カーソル点滅 |
80 |
カーソルを1行目の先頭に移動します |
C0 |
カーソルを2行目の先頭に移動します |
38 |
2行と5 * 7マトリックス |
ADC0804 IC:
ADC0804 ICは、ナショナルセミコンダクターからADC0800シリーズのファミリーの8ビット並列ADCあります。+5ボルトで動作し、8ビットの解像度を持っています。ステップサイズとVin範囲は、Vref / 2の値によって異なります。次の表は、Vref / 2とVin範囲の関係を示しています。
Vref / 2(V) |
ヴィン(V) |
ステップサイズ(mV) |
開いた |
0から5 |
19.53 |
2.0 |
0から4 |
15.62 |
1.5 |
0から3 |
11.71 |
1.28 |
0から2.56 |
10 |
この場合、Vref / 2は1.28ボルトに接続されているため、ステップサイズは10mVです。ADC0804の場合、ステップサイズは(2 * Vref / 2)/ 256として計算されます。
次の式を使用して出力電圧を計算します。
Dout = Vin /ステップサイズ
Doutが10進数で出力されるデジタルデータである場合、Vin =アナログ入力電圧であり、ステップサイズ(分解能)が最小の変化です。ADC0804の詳細については、こちらをご覧ください。また、ADC0808と8051のインターフェイスも確認してください。
LM35温度センサー:
LM35は、出力電圧が摂氏温度に直線的に比例する温度センサーです。LM35はすでに校正済みであるため、外部校正は必要ありません。摂氏温度ごとに10mVを出力します。
LM35センサーは温度に対応する電圧を生成します。この電圧はADC0804によってデジタル(0〜256)に変換され、8051マイクロコントローラーに供給されます。8051マイクロコントローラーは、このデジタル値を摂氏温度に変換します。次に、この温度は表示に適したASCII形式に変換されます。このASCII値は16 * 2 lcdに送られ、画面に温度が表示されます。このプロセスは、指定された間隔の後に繰り返されます。
以下は、8051を使用したLM35デジタル体温計のセットアップ画像です 。
LM35ベースのすべてのデジタル体温計はここにあります。
コードの説明:
LM35を使用したこのデジタル体温計の完全な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; // 16 * 2のSelect(RS)ピンを登録しますlcd sbit rw = P2 ^ 6; // 16 * 2の読み取り/書き込み(RW)ピンlcd sbit en = P2 ^ 5; // 16 * 2 lcdのEnable(E)ピン
同様に、8051マイクロコントローラとインターフェイスするADC0804の場合、ADC0804が8051マイクロコントローラに接続されるピンを定義する必要があります。ADC0804のRDピンはP3.0に接続され、ADC0804のWRピンはP3.1に接続され、ADC0804のINTRピンはP3.2に接続されます。データピンは8051マイクロコントローラのポート1に接続されています。
sbit rd_adc = P3 ^ 0; // ADC0804 sbitのRead(RD)ピンwr_adc = P3 ^ 1; // ADC0804 sbitのWrite(WR)ピンintr_adc = P3 ^ 2; // ADC0804のInterrupt(INTR)ピン
次に、プログラムで使用されるいくつかの関数を定義する必要があります。 遅延 関数は指定された時間遅延を作成するために使用され、 cmdwrt 関数はコマンドを16 * 2 lcdディスプレイに送信するために使用され、 datawrt 関数はデータを16 * 2 lcdディスプレイに送信するために使用され、 convert_display 関数はADCデータを温度に変換するために使用されますそしてそれを16 * 2lcdディスプレイに表示します。
void delay(unsigned int); //遅延を作成するための関数voidcmdwrt(unsigned char); //コマンドを16 * 2に送信する関数lcddisplay void datawrt(unsigned char); //データを16 * 2に送信する関数lcddisplay void convert_display(unsigned char); // ADC値を温度に変換し、16 * 2液晶ディスプレイに表示する関数
コードの以下の部分では、16 * 2lcdにコマンドを送信しています。表示のクリア、カーソルのインクリメント、カーソルを1行目の先頭に強制するなどのコマンドは、指定された時間遅延の後に1つずつ16 * 2lcdディスプレイに送信されます。
for(i = 0; i <5; i ++)//コマンドを16 * 2に送信lcd一度に1つのコマンドを表示{cmdwrt(cmd); //コマンドを16 * 2に送信する関数呼び出しlcddisplay delay(1); }
コードのこの部分では、16 * 2lcdにデータを送信しています。 16 * 2液晶ディスプレイに表示されるデータは、一定の時間遅延を経て1つずつ表示されます。
for(i = 0; i <12; i ++)//データを16 * 2に送信液晶ディスプレイは一度に1文字ずつ表示{datawrt(data1); //データを16 * 2に送信する関数呼び出しlcddisplay delay(1);コードのこの部分では、LM35センサーによって生成されたアナログ電圧をデジタルデータに変換してから、温度に変換して16 * 2lcdディスプレイに表示します。 ADC0804が変換を開始するには、ADC0804のWRピンにローからハイのパルスを送信する必要があります。その後、変換の終了を待つ必要があります。 INTRは変換の終わりに低くなります。 INTRがローになると、RDがローになり、デジタルデータが8051マイクロコントローラのポート0にコピーされます。指定された時間遅延の後、次のサイクルが開始されます。このプロセスは永遠に繰り返されます。
while(1)//永遠に繰り返す{wr_adc = 0; // WRピンdelay(1);でLOWからHIGHパルスを送信します。wr_adc = 1; while(intr_adc == 1); //変換の終了を待つrd_adc = 0; // RD = 0にして、ADC0804からデータを読み取りますvalue = P1; // ADCデータをコピーするconvert_display(value); // ADCデータを温度に変換し、16 * 2 lcd display delay(1000);に表示する関数呼び出し。//すべてのサイクル間の間隔rd_adc = 1; //次のサイクルでRD = 1にします}
コードの以下の部分では、16 * 2lcdディスプレイにコマンドを送信しています。コマンドは8051マイクロコントローラのポート0にコピーされます。コマンド書き込み用にRSをローにします。書き込み動作のRWをローにします。コマンド書き込み動作を開始するために、イネーブル(E)ピンにハイパルスからローパルスが印加されます。
void cmdwrt(unsigned char x){P0 = x; // 16 * 2lcdが接続されているポート0にコマンドを送信しますrs = 0; //コマンドrw = 0に対してRS = 0にします。//書き込み操作のRW = 0にしますen = 1; // Enable(E)ピンでHIGHからLOWのパルスを送信して、コマンド書き込み操作を開始しますdelay(1); en = 0; }
コードのこの部分では、16 * 2lcdディスプレイにデータを送信しています。データは8051マイクロコントローラのポート0にコピーされます。コマンド書き込みのRSをハイにします。書き込み動作のRWをローにします。データ書き込み動作を開始するために、ハイパルスからローパルスがenable(E)ピンに印加されます。
void datawrt(unsigned char y){P0 = y; // 16 * 2lcdが接続されているポート0にデータを送信しますrs = 1; //コマンドrw = 0に対してRS = 1にします。//書き込み操作のRW = 0にしますen = 1; // Enable(E)ピンでHIGHからLOWのパルスを送信して、データ書き込み操作を開始しますdelay(1); en = 0; }
コードのこの部分では、デジタルデータを温度に変換し、16 * 2液晶ディスプレイに表示しています。
void convert_display(unsigned char value){unsigned char x1、x2、x3; cmdwrt(0xc6); //カーソルを16 * 2の2行目の6番目の位置に設定するコマンドlcdx1 =(value / 10); //値を10で割り、商を変数x1 x1 = x1 +(0x30);に格納します。// 0x30 x2 = value%10;を追加して、変数x1をASCIIに変換します。//値を10で割り、余りを変数x2 x2 = x2 +(0x30);に格納します。// 0x30 x3 = 0xDFを追加して、変数x2をASCIIに変換します。//度(°)記号のASCII値datawrt(x1); // 16 * 2の表示温度lcddisplay datawrt(x2); datawrt(x3); datawrt( 'C'); }
また、さまざまなマイクロコントローラーでLM35を使用している他の温度計を確認してください。
- ArduinoとLM35を使用したデジタル体温計
- LM35とAVRマイクロコントローラーを使用した温度測定
- RaspberryPiを使用した室温測定