プロジェクト概要
本プロジェクトは、STC89C52やAT89C51といった標準的な8051コアマイコン向けのDS18B20温度センサー駆動実装です。メイン制御プログラム(main.c)、独立した温度センサードライバモジュール(temp.c, temp.h)、およびコンパイル済みHEXファイル(template.hex)を含み、DS18B20の1-Wire通信プロトコルを厳密に実装しています。
システム設計とアーキテクチャ
1-Wireプロトコルの実装アプローチ
DS18B20は厳密なタイミング制御を必要とする1-Wire通信方式を採用しています。本実装ではソフトウェアベースの精密遅延ループを使用し、11.0592MHz水晶発振器を基準とした機械サイクル計算によりマイクロ秒単位のタイミングを実現しています。
#define FOSC 11059200L
#define DELAY_1US() { _nop_(); _nop_(); }
void sensor_delay_us(uint16_t us) {
while(us--) {
DELAY_1US();
}
}
モジュール構造
システムは以下の3層に分割されています:
- ハードウェア抽象層:物理的なセンサー通信を担当
- データ処理層:生データから温度値への変換を実行
- アプリケーション層:簡潔なAPIを提供
実装の詳細
ハードウェア接続
DS18B20はオープンドレイン出力のため、4.7kΩのプルアップ抵抗が必須です。推奨接続構成:
- VDD: フローティング(寄生電源モード)
- GND: グランド接続
- DQ: P3.7ピンに接続(4.7kΩでVCCにプルアップ)
通信タイミング
主要な通信タイミングポイント:
- リセットパルス:480μs以上のLow出力
- 書き込みタイミング:1-15μsのLowパルス
- 読み込みタイミング:1-15μsのLowパルス後、15μs以内にサンプリング
uint8_t sensor_init(void) {
DQ = 0;
sensor_delay_us(480);
DQ = 1;
sensor_delay_us(60);
return DQ == 0;
}
温度データの変換処理
DS18B20から取得した16ビット生データを摂氏温度に変換:
float convert_raw_to_celsius(uint16_t raw_data) {
int16_t temp_value = raw_data;
if (temp_value & 0x8000) {
temp_value = ~temp_value + 1;
return -(temp_value * 0.0625f);
}
return temp_value * 0.0625f;
}
実装検証とキャリブレーション
実装の精度検証には氷水混合物(0.0℃)を使用します。複数回測定の平均値からオフセット補正値を算出し、temp_convert_raw_to_celsius()関数に組み込みます。
主要なトラブルシューティング
| 現象 | 原因 | 対策 |
|---|---|---|
| 初期化失敗 | 配線不良またはプルアップ抵抗未接続 | 接続確認と4.7kΩ抵抗の追加 |
| 85.0℃固定表示 | 温度変換未完了 | 変換待機時間の確認と調整 |
| 値が変動 | 電源ノイズ | 電源平滑コンデンサの追加 |
応用拡張例
LCD表示への対応
void display_temperature(float temperature) {
char buffer[16];
sprintf(buffer, "Temp:%.1fC", temperature);
lcd_display_string(buffer);
}
複数センサー対応
ROM検索機能を追加することで、最大8個までのDS18B20を同一バスで制御可能です。