亚洲春色中文字幕久久久-三上亚,啪啪啪网站,国产午夜伦鲁鲁,四虎影视在线永久免费观看,中国精品视频一区二区 ,半夜妺妺叫我吃她胸,亚洲无线看天堂av,人妻互换免费中文字幕,被群CAO的合不拢腿H的皇后,护士的下面又湿又紧10P

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 407|回復: 0
打印 上一主題 下一主題
收起左側

[原創設計]51單片機DS18B20溫度采集+LCD1602顯示(完整代碼+仿真)

[復制鏈接]
跳轉到指定樓層
樓主
ID:842146 發表于 2026-7-7 11:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一、前言
DS18B20是Dallas公司生產的一線式數字溫度傳感器,具有體積小、精度高、抗干擾能力強等特點,可直接將被測溫度轉換為數字信號輸出,廣泛用于工業控制、環境監測等場合。

本文將詳細介紹如何使用51單片機(STC89C52)讀取DS18B20溫度數據,并通過LCD1602液晶顯示屏實時顯示,同時附帶完整的C語言源代碼和Proteus仿真電路說明。

二、硬件清單
1. STC89C52RC 單片機 x1
2. DS18B20 數字溫度傳感器 x1
3. LCD1602 字符液晶屏 x1
4. 4.7KΩ 上拉電阻 x1
5. 10KΩ 可調電阻 x1
6. 12MHz 晶振 x1
7. 30pF 瓷片電容 x2
8. 10μF 電解電容 x1
9. 按鍵 x1
10. 面包板及杜邦線若干

三、硬件接線

DS18B20 連接(單總線):
DS18B20 → 51單片機
GND    → GND
DQ     → P3.7(接4.7KΩ上拉到VCC)
VDD    → +5V

LCD1602 連接(8位并行):
LCD1602 → 51單片機
VSS     → GND
VDD     → +5V
V0      → 10K可調電阻中間抽頭
RS      → P1.0
RW      → P1.1
E       → P1.2
D0~D7   → P0.0~P0.7
LED+    → +5V(串100Ω電阻)
LED-    → GND

四、工作原理

DS18B20采用一線通信協議(1-Wire),所有指令和數據都在一根數據線上完成傳輸。

溫度讀取流程:
1. 復位DS18B20
2. 發送跳過ROM指令(0xCC)
3. 發送啟動溫度轉換指令(0x44)
4. 等待轉換完成(約750ms)
5. 復位DS18B20
6. 發送跳過ROM指令(0xCC)
7. 發送讀取暫存器指令(0xBE)
8. 讀取LSB和MSB溫度數據
9. 將數據合并計算實際溫度值

五、完整源代碼(main.c)
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #include <string.h>

  4. #define uchar unsigned char
  5. #define uint  unsigned int

  6. sbit DQ = P3^7;
  7. sbit LCD_RS = P1^0;
  8. sbit LCD_RW = P1^1;
  9. sbit LCD_E  = P1^2;

  10. uchar temp_buf[16];
  11. bit negative_flag = 0;

  12. void delay_us(uint us) { while(--us); }

  13. void delay_ms(uint ms)
  14. {
  15.     uint i, j;
  16.     for(i = 0; i < ms; i++)
  17.         for(j = 0; j < 120; j++);
  18. }

  19. bit DS18B20_Init(void)
  20. {
  21.     bit presence;
  22.     DQ = 1; delay_us(8);
  23.     DQ = 0; delay_us(600);
  24.     DQ = 1; delay_us(80);
  25.     presence = DQ;
  26.     delay_us(400);
  27.     return presence;
  28. }

  29. void DS18B20_WriteByte(uchar dat)
  30. {
  31.     uchar i;
  32.     for(i = 0; i < 8; i++)
  33.     {
  34.         DQ = 0; delay_us(2);
  35.         DQ = dat & 0x01;
  36.         delay_us(60); DQ = 1;
  37.         dat >>= 1;
  38.     }
  39. }

  40. uchar DS18B20_ReadByte(void)
  41. {
  42.     uchar i, dat = 0;
  43.     for(i = 0; i < 8; i++)
  44.     {
  45.         dat >>= 1; DQ = 0;
  46.         delay_us(2); DQ = 1;
  47.         delay_us(2);
  48.         if(DQ) dat |= 0x80;
  49.         delay_us(60);
  50.     }
  51.     return dat;
  52. }

  53. int DS18B20_GetTemp(void)
  54. {
  55.     uchar LSB, MSB;
  56.     int temp;

  57.     DS18B20_Init();
  58.     DS18B20_WriteByte(0xCC);
  59.     DS18B20_WriteByte(0x44);
  60.     delay_ms(750);

  61.     DS18B20_Init();
  62.     DS18B20_WriteByte(0xCC);
  63.     DS18B20_WriteByte(0xBE);

  64.     LSB = DS18B20_ReadByte();
  65.     MSB = DS18B20_ReadByte();

  66.     temp = (MSB << 8) | LSB;
  67.     if(temp & 0x8000)
  68.     {
  69.         temp = (~temp) + 1;
  70.         negative_flag = 1;
  71.     }
  72.     else
  73.     {
  74.         negative_flag = 0;
  75.     }

  76.     temp = temp * 100 / 16;
  77.     return temp;
  78. }

  79. void LCD_CheckBusy(void)
  80. {
  81.     uchar status;
  82.     LCD_RS = 0; LCD_RW = 1;
  83.     do {
  84.         LCD_E = 1; delay_us(5);
  85.         status = P0; LCD_E = 0;
  86.         delay_us(5);
  87.     } while(status & 0x80);
  88. }

  89. void LCD_WriteCmd(uchar cmd)
  90. {
  91.     LCD_CheckBusy();
  92.     LCD_RS = 0; LCD_RW = 0;
  93.     P0 = cmd; LCD_E = 1;
  94.     delay_us(5); LCD_E = 0;
  95.     delay_ms(2);
  96. }

  97. void LCD_WriteData(uchar dat)
  98. {
  99.     LCD_CheckBusy();
  100.     LCD_RS = 1; LCD_RW = 0;
  101.     P0 = dat; LCD_E = 1;
  102.     delay_us(5); LCD_E = 0;
  103.     delay_ms(2);
  104. }

  105. void LCD_Init(void)
  106. {
  107.     delay_ms(15);
  108.     LCD_WriteCmd(0x38);
  109.     LCD_WriteCmd(0x0C);
  110.     LCD_WriteCmd(0x06);
  111.     LCD_WriteCmd(0x01);
  112.     delay_ms(2);
  113. }

  114. void LCD_SetPos(uchar row, uchar col)
  115. {
  116.     uchar addr;
  117.     if(row == 0) addr = 0x80 + col;
  118.     else addr = 0xC0 + col;
  119.     LCD_WriteCmd(addr);
  120. }

  121. void LCD_ShowString(uchar row, uchar col, uchar *str)
  122. {
  123.     LCD_SetPos(row, col);
  124.     while(*str) LCD_WriteData(*str++);
  125. }

  126. void Display_Temperature(int temp)
  127. {
  128.     uchar i = 0;
  129.     int integer_part, decimal_part;

  130.     integer_part = temp / 100;
  131.     decimal_part = temp % 100;

  132.     if(negative_flag) temp_buf[i++] = '-';

  133.     if(integer_part >= 100)
  134.         temp_buf[i++] = '0' + integer_part / 100;
  135.     if(integer_part >= 10)
  136.         temp_buf[i++] = '0' + (integer_part % 100) / 10;
  137.     temp_buf[i++] = '0' + integer_part % 10;
  138.     temp_buf[i++] = '.';
  139.     temp_buf[i++] = '0' + decimal_part / 10;
  140.     temp_buf[i++] = 0xDF;
  141.     temp_buf[i++] = 'C';
  142.     temp_buf[i] = '\0';

  143.     LCD_ShowString(1, 4, temp_buf);
  144. }

  145. void main(void)
  146. {
  147.     int temperature;
  148.     LCD_Init();
  149.     LCD_ShowString(0, 0, "Temp Monitor");
  150.     LCD_ShowString(1, 0, "Temp: ");

  151.     while(1)
  152.     {
  153.         temperature = DS18B20_GetTemp();
  154.         Display_Temperature(temperature);
  155.         delay_ms(500);
  156.     }
  157. }
復制代碼

六、Keil工程配置
1. 新建工程,選擇AT89C52或STC89C52RC
2. 創建main.c,粘貼代碼
3. 晶振頻率設為12MHz
4. 勾選生成HEX文件
5. 編譯通過后生成.hex文件

七、Proteus仿真搭建
1. 放置AT89C52、DS18B20、LCD1602、RESPACK-8排阻
2. 晶振電路:12MHz晶振+30pF電容x2
3. 復位電路:10μF+10KΩ
4. 按接線圖連接
5. 加載.hex文件到單片機
6. 運行仿真

八、注意事項
1. DS18B20數據線必須接4.7KΩ上拉電阻
2. 溫度轉換時間最長750ms,讀取間隔不能小于此值
3. LCD1602的V0需電位器調節對比度
4. STC系列注意IRC頻率與代碼延時匹配

九、擴展方向
1. 加蜂鳴器+LED實現溫度報警
2. 加EEPROM存儲溫度記錄
3. 加按鍵設置溫度閾值
4. 串口發送溫度到PC
5. 加DS1302實現帶時間戳的溫度記錄儀

十、總結
本文介紹了51單片機+DS18B20+LCD1602溫度采集系統的硬件設計、工作原理和完整代碼。系統結構簡單、成本低廉,適合初學者作為綜合練習。代碼在Keil C51編譯通過,Proteus 8.9仿真驗證。

如有問題歡迎回帖交流!

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表