亚洲春色中文字幕久久久-三上亚,啪啪啪网站,国产午夜伦鲁鲁,四虎影视在线永久免费观看,中国精品视频一区二区 ,半夜妺妺叫我吃她胸,亚洲无线看天堂av,人妻互换免费中文字幕,被群CAO的合不拢腿H的皇后,护士的下面又湿又紧10P
標(biāo)題:
[原創(chuàng)設(shè)計]51單片機DS18B20溫度采集+LCD1602顯示(完整代碼+仿真)
[打印本頁]
作者:
嫌疑人1號
時間:
2026-7-7 11:58
標(biāo)題:
[原創(chuàng)設(shè)計]51單片機DS18B20溫度采集+LCD1602顯示(完整代碼+仿真)
一、前言
DS18B20是Dallas公司生產(chǎn)的一線式數(shù)字溫度傳感器,具有體積小、精度高、抗干擾能力強等特點,可直接將被測溫度轉(zhuǎn)換為數(shù)字信號輸出,廣泛用于工業(yè)控制、環(huán)境監(jiān)測等場合。
本文將詳細(xì)介紹如何使用51單片機(STC89C52)讀取DS18B20溫度數(shù)據(jù),并通過LCD1602液晶顯示屏實時顯示,同時附帶完整的C語言源代碼和Proteus仿真電路說明。
二、硬件清單
1. STC89C52RC 單片機 x1
2. DS18B20 數(shù)字溫度傳感器 x1
3. LCD1602 字符液晶屏 x1
4. 4.7KΩ 上拉電阻 x1
5. 10KΩ 可調(diào)電阻 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可調(diào)電阻中間抽頭
RS → P1.0
RW → P1.1
E → P1.2
D0~D7 → P0.0~P0.7
LED+ → +5V(串100Ω電阻)
LED- → GND
四、工作原理
DS18B20采用一線通信協(xié)議(1-Wire),所有指令和數(shù)據(jù)都在一根數(shù)據(jù)線上完成傳輸。
溫度讀取流程:
1. 復(fù)位DS18B20
2. 發(fā)送跳過ROM指令(0xCC)
3. 發(fā)送啟動溫度轉(zhuǎn)換指令(0x44)
4. 等待轉(zhuǎn)換完成(約750ms)
5. 復(fù)位DS18B20
6. 發(fā)送跳過ROM指令(0xCC)
7. 發(fā)送讀取暫存器指令(0xBE)
8. 讀取LSB和MSB溫度數(shù)據(jù)
9. 將數(shù)據(jù)合并計算實際溫度值
五、完整源代碼(main.c)
#include <reg51.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P3^7;
sbit LCD_RS = P1^0;
sbit LCD_RW = P1^1;
sbit LCD_E = P1^2;
uchar temp_buf[16];
bit negative_flag = 0;
void delay_us(uint us) { while(--us); }
void delay_ms(uint ms)
{
uint i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 120; j++);
}
bit DS18B20_Init(void)
{
bit presence;
DQ = 1; delay_us(8);
DQ = 0; delay_us(600);
DQ = 1; delay_us(80);
presence = DQ;
delay_us(400);
return presence;
}
void DS18B20_WriteByte(uchar dat)
{
uchar i;
for(i = 0; i < 8; i++)
{
DQ = 0; delay_us(2);
DQ = dat & 0x01;
delay_us(60); DQ = 1;
dat >>= 1;
}
}
uchar DS18B20_ReadByte(void)
{
uchar i, dat = 0;
for(i = 0; i < 8; i++)
{
dat >>= 1; DQ = 0;
delay_us(2); DQ = 1;
delay_us(2);
if(DQ) dat |= 0x80;
delay_us(60);
}
return dat;
}
int DS18B20_GetTemp(void)
{
uchar LSB, MSB;
int temp;
DS18B20_Init();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0x44);
delay_ms(750);
DS18B20_Init();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE);
LSB = DS18B20_ReadByte();
MSB = DS18B20_ReadByte();
temp = (MSB << 8) | LSB;
if(temp & 0x8000)
{
temp = (~temp) + 1;
negative_flag = 1;
}
else
{
negative_flag = 0;
}
temp = temp * 100 / 16;
return temp;
}
void LCD_CheckBusy(void)
{
uchar status;
LCD_RS = 0; LCD_RW = 1;
do {
LCD_E = 1; delay_us(5);
status = P0; LCD_E = 0;
delay_us(5);
} while(status & 0x80);
}
void LCD_WriteCmd(uchar cmd)
{
LCD_CheckBusy();
LCD_RS = 0; LCD_RW = 0;
P0 = cmd; LCD_E = 1;
delay_us(5); LCD_E = 0;
delay_ms(2);
}
void LCD_WriteData(uchar dat)
{
LCD_CheckBusy();
LCD_RS = 1; LCD_RW = 0;
P0 = dat; LCD_E = 1;
delay_us(5); LCD_E = 0;
delay_ms(2);
}
void LCD_Init(void)
{
delay_ms(15);
LCD_WriteCmd(0x38);
LCD_WriteCmd(0x0C);
LCD_WriteCmd(0x06);
LCD_WriteCmd(0x01);
delay_ms(2);
}
void LCD_SetPos(uchar row, uchar col)
{
uchar addr;
if(row == 0) addr = 0x80 + col;
else addr = 0xC0 + col;
LCD_WriteCmd(addr);
}
void LCD_ShowString(uchar row, uchar col, uchar *str)
{
LCD_SetPos(row, col);
while(*str) LCD_WriteData(*str++);
}
void Display_Temperature(int temp)
{
uchar i = 0;
int integer_part, decimal_part;
integer_part = temp / 100;
decimal_part = temp % 100;
if(negative_flag) temp_buf[i++] = '-';
if(integer_part >= 100)
temp_buf[i++] = '0' + integer_part / 100;
if(integer_part >= 10)
temp_buf[i++] = '0' + (integer_part % 100) / 10;
temp_buf[i++] = '0' + integer_part % 10;
temp_buf[i++] = '.';
temp_buf[i++] = '0' + decimal_part / 10;
temp_buf[i++] = 0xDF;
temp_buf[i++] = 'C';
temp_buf[i] = '\0';
LCD_ShowString(1, 4, temp_buf);
}
void main(void)
{
int temperature;
LCD_Init();
LCD_ShowString(0, 0, "Temp Monitor");
LCD_ShowString(1, 0, "Temp: ");
while(1)
{
temperature = DS18B20_GetTemp();
Display_Temperature(temperature);
delay_ms(500);
}
}
復(fù)制代碼
六、Keil工程配置
1. 新建工程,選擇AT89C52或STC89C52RC
2. 創(chuàng)建main.c,粘貼代碼
3. 晶振頻率設(shè)為12MHz
4. 勾選生成HEX文件
5. 編譯通過后生成.hex文件
七、Proteus仿真搭建
1. 放置AT89C52、DS18B20、LCD1602、RESPACK-8排阻
2. 晶振電路:12MHz晶振+30pF電容x2
3. 復(fù)位電路:10μF+10KΩ
4. 按接線圖連接
5. 加載.hex文件到單片機
6. 運行仿真
八、注意事項
1. DS18B20數(shù)據(jù)線必須接4.7KΩ上拉電阻
2. 溫度轉(zhuǎn)換時間最長750ms,讀取間隔不能小于此值
3. LCD1602的V0需電位器調(diào)節(jié)對比度
4. STC系列注意IRC頻率與代碼延時匹配
九、擴(kuò)展方向
1. 加蜂鳴器+LED實現(xiàn)溫度報警
2. 加EEPROM存儲溫度記錄
3. 加按鍵設(shè)置溫度閾值
4. 串口發(fā)送溫度到PC
5. 加DS1302實現(xiàn)帶時間戳的溫度記錄儀
十、總結(jié)
本文介紹了51單片機+DS18B20+LCD1602溫度采集系統(tǒng)的硬件設(shè)計、工作原理和完整代碼。系統(tǒng)結(jié)構(gòu)簡單、成本低廉,適合初學(xué)者作為綜合練習(xí)。代碼在Keil C51編譯通過,Proteus 8.9仿真驗證。
如有問題歡迎回帖交流!
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1