本实验旨在使用51单片机读取温度传感器的数据,并通过LCD显示屏显示当前温度。通过这个实验,学习如何使用ADC模块读取模拟量数据,以及如何驱动LCD显示屏。具体目标包括:
LM35是一种常用的精密集成温度传感器,其主要特点有:
LM35的输出电压计算公式:
Vout = 10mV/℃ × T(℃)
51单片机通过ADC模块将LM35输出的模拟电压转换为数字量。在本实验中,我们使用8位ADC,转换过程如下:
LCD1602是一种常用的字符型液晶显示模块,具有以下特点:
将LM35温度传感器的3个引脚分别连接到51单片机的VCC、GND和ADC输入引脚。将LCD显示屏的数据线和控制线连接到51单片机的相应引脚。
注意事项:
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)
编写51单片机程序,实现以下功能:
#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);
}
}
Temperature:
25.75 C