用Arduino多功能扩展板,LM35温度传感器模块测量温度,不需外接线,将LM35模块有字面向前(数码管方向),三个脚按顺序插入图中三个插孔中。
Arduino源程序如下:
- // LM35温度传感器 + 4位数码管显示(74HC595驱动)
- // 引脚定义
- #define LM35_PIN A4 // LM35连接到模拟引脚A4
- int latchPin = 4; // 74HC595锁存引脚
- int clockPin = 7; // 74HC595时钟引脚
- int dataPin = 8; // 74HC595数据引脚
- // 数码管段选表(0-9,共阴数码管)
- // 格式:dp,g,f,e,d,c,b,a
- unsigned char segTable[] = {
- 0xC0, // 0: 1100 0000
- 0xF9, // 1: 1111 1001
- 0xA4, // 2: 1010 0100
- 0xB0, // 3: 1011 0000
- 0x99, // 4: 1001 1001
- 0x92, // 5: 1001 0010
- 0x82, // 6: 1000 0010
- 0xF8, // 7: 1111 1000
- 0x80, // 8: 1000 0000
- 0x90, // 9: 1001 0000
- 0xFF // 空白显示
- };
- // 数码管位选表(4位共阴数码管)
- // 每个位选码选中一位数码管(低电平有效)
- unsigned char digitSelect[] = {
- 0xF1, // 1111 0001 - 选中第1位(最左边)
- 0xF2, // 1111 0010 - 选中第2位
- 0xF4, // 1111 0100 - 选中第3位
- 0xF8 // 1111 1000 - 选中第4位(最右边)
- };
- // 显示缓冲区
- unsigned char displayBuffer[] = {0, 0, 0, 0};
- // 温度变量
- float temperature = 0.0;
- // 时间变量
- unsigned long lastTempRead = 0;
- const unsigned long tempReadInterval = 1000; // 1秒读取一次温度
- void setup() {
- Serial.begin(9600); // 初始化串口
-
- // 设置74HC595引脚为输出
- pinMode(latchPin, OUTPUT);
- pinMode(clockPin, OUTPUT);
- pinMode(dataPin, OUTPUT);
-
- // 设置LM35引脚为输入
- pinMode(LM35_PIN, INPUT);
-
- // 初始显示"----"
- for (int i = 0; i < 4; i++) {
- displayBuffer[i] = 10; // 10对应空白
- }
-
- Serial.println("LM35温度传感器 - 4位数码管显示");
- Serial.println("初始化完成...");
- }
- // 读取LM35温度
- float readLM35Temperature() {
- // 读取模拟值
- int sensorValue = analogRead(LM35_PIN);
-
- // 转换为电压(假设参考电压为5V)
- float voltage = sensorValue * (5.0 / 1023.0);
-
- // LM35每10mV对应1°C,所以电压*100得到温度
- float temp = voltage * 100.0;
-
- return temp;
- }
- // 更新显示缓冲区
- void updateDisplayBuffer(float temp) {
- // 确保温度在合理范围内
- if (temp < 0) temp = 0;
- if (temp > 99.9) temp = 99.9;
-
- // 将温度值乘以10转换为整数,便于分离各位数字
- int tempInt = (int)(temp * 10);
-
- // 分离各位数字
- int tens = tempInt / 100; // 十位
- int ones = (tempInt % 100) / 10; // 个位
- int tenths = tempInt % 10; // 十分位
-
- // 更新显示缓冲区
- if (tens == 0) {
- displayBuffer[0] = 10; // 十位为0时显示空白
- } else {
- displayBuffer[0] = tens; // 显示十位
- }
-
- displayBuffer[1] = ones; // 显示个位(带小数点)
- displayBuffer[2] = tenths; // 显示十分位
-
- // 第4位显示"C"表示摄氏度(这里用8表示,但实际会特殊处理)
- displayBuffer[3] = 12; // 特殊值,在显示函数中会转换为"C"
- }
- // 数码管显示函数
- void displayDigits() {
- // 循环显示4位数码管
- for (int i = 0; i < 4; i++) {
- digitalWrite(latchPin, LOW); // 准备发送数据
-
- // 获取当前位的段选码
- unsigned char segCode;
-
- if (i == 3) {
- // 第4位显示摄氏度符号"C"(段码:1100 0110 = 0xC6)
- segCode = 0xC6;
- } else {
- segCode = segTable[displayBuffer[i]];
-
- // 如果是第1位(个位),添加小数点
- if (i == 1 && displayBuffer[i] != 10) {
- segCode &= 0x7F; // 清除最高位(dp位),使其显示小数点
- }
- }
-
- // 发送段选数据
- shiftOut(dataPin, clockPin, MSBFIRST, segCode);
-
- // 发送位选数据
- shiftOut(dataPin, clockPin, MSBFIRST, digitSelect[i]);
-
- digitalWrite(latchPin, HIGH); // 锁存数据,更新显示
-
- // 短暂延时,实现动态扫描
- delay(1);
- }
- }
- void loop() {
- unsigned long currentMillis = millis();
-
- // 定期读取温度
- if (currentMillis - lastTempRead >= tempReadInterval) {
- lastTempRead = currentMillis;
-
- // 读取温度
- temperature = readLM35Temperature();
-
- // 更新显示缓冲区
- updateDisplayBuffer(temperature);
-
- // 串口输出
- Serial.print("温度: ");
- Serial.print(temperature, 1); // 显示1位小数
- Serial.println(" °C");
- }
-
- // 持续刷新数码管显示
- // 每50ms刷新20次,确保稳定显示
- static unsigned long lastDisplayTime = 0;
- if (currentMillis - lastDisplayTime >= 50) {
- lastDisplayTime = currentMillis;
-
- // 显示20次(约40ms)
- for (int i = 0; i < 20; i++) {
- displayDigits();
- }
- }
- }
- /*
- 硬件连接说明:
- 1. LM35连接:
- VCC -> Arduino 5V
- OUT -> Arduino A4
- GND -> Arduino GND
- 2. 74HC595连接(两个芯片级联):
- 第一个74HC595(控制段选):
- DS (14脚) -> Arduino 8
- SH_CP (11脚) -> Arduino 7
- ST_CP (12脚) -> Arduino 4
- MR (10脚) -> VCC
- OE (13脚) -> GND
- Q0-Q7 -> 数码管段选引脚(a,b,c,d,e,f,g,dp)
- 第二个74HC595(控制位选):
- DS (14脚) -> 第一个74HC595的Q7' (9脚)
- SH_CP (11脚) -> Arduino 7(与第一个共用)
- ST_CP (12脚) -> Arduino 4(与第一个共用)
- MR (10脚) -> VCC
- OE (13脚) -> GND
- Q0-Q3 -> 数码管位选引脚(COM1-COM4)
- 3. 4位共阴数码管:
- 段选引脚(a-g,dp) -> 第一个74HC595的Q0-Q7
- 公共阴极(COM1-COM4) -> 第二个74HC595的Q0-Q3
- 注意:
- 1. 段选引脚需要串联220Ω限流电阻
- 2. 确保74HC595的VCC(16脚)接5V,GND(8脚)接GND
- 3. 数码管是共阴极,所以位选低电平时该位数码管被选中
- 显示格式:
- 第1位:十位温度(如果为0则显示空白)
- 第2位:个位温度(带小数点)
- 第3位:十分位温度
- 第4位:摄氏度符号"C"
- 示例:25.6°C 显示为 "25.6C"
- */
- // 如果需要显示负温度,可以使用以下扩展代码:
- /*
- // 在segTable数组中添加负号
- unsigned char segTable[] = {
- // ... 原有的0-9和空白
- 0xBF, // 负号 (-): 1011 1111
- };
- // 修改updateDisplayBuffer函数:
- void updateDisplayBuffer(float temp) {
- if (temp < 0) {
- // 显示负号
- temp = -temp;
- if (temp > 99.9) temp = 99.9;
-
- int tempInt = (int)(temp * 10);
- int ones = (tempInt % 100) / 10;
- int tenths = tempInt % 10;
-
- displayBuffer[0] = 11; // 负号
- displayBuffer[1] = ones;
- displayBuffer[2] = tenths;
- displayBuffer[3] = 12; // "C"
- } else {
- // 正温度显示逻辑(保持不变)
- if (temp > 99.9) temp = 99.9;
-
- int tempInt = (int)(temp * 10);
- int tens = tempInt / 100;
- int ones = (tempInt % 100) / 10;
- int tenths = tempInt % 10;
-
- if (tens == 0) {
- displayBuffer[0] = 10; // 空白
- } else {
- displayBuffer[0] = tens;
- }
-
- displayBuffer[1] = ones;
- displayBuffer[2] = tenths;
- displayBuffer[3] = 12; // "C"
- }
- }
- */
复制代码
|