51单片机实验 - 温度传感器与LCD显示

实验目的

本实验旨在使用51单片机读取温度传感器的数据,并通过LCD显示屏显示当前温度。通过这个实验,学习如何使用ADC模块读取模拟量数据,以及如何驱动LCD显示屏。具体目标包括:

实验原理

1. LM35温度传感器

LM35是一种常用的精密集成温度传感器,其主要特点有:

  • 输出电压与温度呈线性关系:10mV/℃
  • 测量范围:-55℃ 到 +150℃
  • 精度:±0.5℃(在25℃时)
  • 工作电压:4V-30V

LM35的输出电压计算公式:

Vout = 10mV/℃ × T(℃)

2. ADC转换原理

51单片机通过ADC模块将LM35输出的模拟电压转换为数字量。在本实验中,我们使用8位ADC,转换过程如下:

  • ADC参考电压:5V
  • ADC分辨率:8位(0-255)
  • 温度计算公式:T = ADC值 × (5V/255) × (100℃/1V)

3. LCD1602显示原理

LCD1602是一种常用的字符型液晶显示模块,具有以下特点:

  • 显示容量:2行×16字符
  • 字符大小:5×8点阵
  • 工作电压:5V
  • 支持4位和8位数据传输模式

实验步骤

1. 硬件连接

将LM35温度传感器的3个引脚分别连接到51单片机的VCC、GND和ADC输入引脚。将LCD显示屏的数据线和控制线连接到51单片机的相应引脚。

注意事项:

  • 确保所有连接牢固,避免虚接
  • 注意电源极性,防止器件损坏
  • LCD对比度引脚可通过电位器调节
LM35 引脚:
- VCC 连接到 51MCU VCC
- GND 连接到 51MCU GND 
- OUT 连接到 51MCU ADC输入引脚 (如 P1.0)

LCD 引脚:
- RS 连接到 51MCU 数字引脚 (如 P2.0)
- RW 连接到 51MCU 数字引脚 (如 P2.1) 
- E  连接到 51MCU 数字引脚 (如 P2.2)
- D4-D7 连接到 51MCU 数字引脚 (如 P0.4 - P0.7)

2. 软件编程

编写51单片机程序,实现以下功能:

  • 初始化ADC模块,读取LM35的模拟量输出
  • 将ADC读取的数值转换为温度值
  • 初始化LCD显示屏,并将温度值显示在LCD上
  • 定期更新温度值的显示
#include <reg51.h>
#include <stdio.h>

// LCD引脚定义
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_E = P2^2;
#define LCD_DATA P0

// 温度传感器引脚定义
sbit LM35_OUT = P1^0;

// 函数声明
void lcd_init(void);
void lcd_write_cmd(unsigned char cmd);
void lcd_write_data(unsigned char dat);
void lcd_display_temp(float temp);
void delay_ms(unsigned int ms);

// LCD初始化函数
void lcd_init(void) {
    delay_ms(15);
    lcd_write_cmd(0x38);    // 8位数据接口,2行显示,5×7点阵
    delay_ms(5);
    lcd_write_cmd(0x38);
    delay_ms(5);
    lcd_write_cmd(0x38);
    lcd_write_cmd(0x0C);    // 显示开,光标关闭
    lcd_write_cmd(0x06);    // 光标右移,字符不移动
    lcd_write_cmd(0x01);    // 清屏
    delay_ms(5);
}

// LCD写命令函数
void lcd_write_cmd(unsigned char cmd) {
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_DATA = cmd;
    LCD_E = 1;
    delay_ms(5);
    LCD_E = 0;
}

// LCD写数据函数
void lcd_write_data(unsigned char dat) {
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_DATA = dat;
    LCD_E = 1;
    delay_ms(5);
    LCD_E = 0;
}

// 显示温度函数
void lcd_display_temp(float temp) {
    char temp_str[16];
    lcd_write_cmd(0x80);    // 设置光标位置到第一行开始
    sprintf(temp_str, "Temperature:");
    for(int i = 0; temp_str[i] != '\0'; i++) {
        lcd_write_data(temp_str[i]);
    }
    
    lcd_write_cmd(0xC0);    // 设置光标位置到第二行开始
    sprintf(temp_str, "%.2f C", temp);
    for(int i = 0; temp_str[i] != '\0'; i++) {
        lcd_write_data(temp_str[i]);
    }
}

// 延时函数
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for(i = ms; i > 0; i--)
        for(j = 110; j > 0; j--);
}

void main() {
    unsigned int adc_value;
    float temperature;

    lcd_init(); // 初始化LCD
    
    while (1) {
        // 读取LM35模拟量输出
        adc_value = (unsigned int)(LM35_OUT * 255.0 / 5.0);
        
        // 将ADC值转换为温度值
        temperature = (float)adc_value * 100.0 / 255.0;
        
        // 在LCD上显示温度
        lcd_display_temp(temperature);
        
        // 延时1秒
        delay_ms(1000);
    }
}

代码说明:

  • 程序使用8位并行方式驱动LCD1602
  • LCD初始化包括设置显示模式、清屏等操作
  • 温度显示格式为:两行显示,第一行显示"Temperature:",第二行显示具体温度值
  • 使用sprintf函数格式化温度字符串,保留两位小数

3. 调试方法

  • 使用万用表测量LM35输出电压,验证传感器工作是否正常
  • 观察LCD显示内容,检查显示格式是否正确
  • 调节LCD对比度电位器,获得最佳显示效果
  • 可以用手捂热传感器,观察温度变化

实验结果

预期显示效果

Temperature:
25.75 C

实验现象

  • LCD第一行显示"Temperature:"
  • 第二行显示当前温度值,精确到小数点后两位
  • 温度值每秒更新一次
  • 用手触摸传感器时,可以观察到温度值逐渐升高

常见问题及解决方法:

  • LCD显示乱码:检查接线是否正确,确认初始化代码是否正确执行
  • 温度显示异常:检查ADC转换公式,确认LM35连接是否正确
  • 显示不清晰:调节LCD对比度电位器
  • 程序无响应:检查晶振和复位电路

实验思考

  1. 如何提高温度测量的精度?
  2. 如何添加温度报警功能?
  3. 如何将数据记录到EEPROM中?
  4. 如何通过串口将温度数据发送到电脑?
返回文章列表