设计一个带温度检测的24小时计时的时钟,在四位数码管上显示时分秒,显示格式为:时-分-秒(例如12-45-35),写出具体代码。 1.利用开发板上的LM75温度传感器,实时显示测量温度值 2.通过按键能够对显示时间进行校正; 3.通过LCD1602液晶显示器显示时分秒和温度值
时间: 2024-03-21 18:44:32 浏览: 47
好的,下面是代码实现。首先需要用到的硬件有:
- Arduino开发板
- LM75温度传感器
- LCD1602液晶显示器
- 4位共阳数码管
- 4个NPN三极管(用于驱动数码管)
接下来是具体代码实现:
```
#include <Wire.h>
#include <LiquidCrystal.h>
#define DIGIT_NUM 4
#define LED_PIN_A 2
#define LED_PIN_B 3
#define LED_PIN_C 4
#define LED_PIN_D 5
#define LED_PIN_E 6
#define LED_PIN_F 7
#define LED_PIN_G 8
#define LED_PIN_DP 9
#define TEMP_SENSOR_ADDR 0x48
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
byte digitPins[DIGIT_NUM] = {A0, A1, A2, A3};
byte numMap[10][7] = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 1, 0, 1, 1} // 9
};
int currDigit = 0;
byte digits[DIGIT_NUM] = {0, 0, 0, 0};
unsigned long prevMillis = 0;
int buttonPin = 2;
int tempSensorAddr = 0x48;
float tempC = 0.0;
void setup() {
// 初始化数码管引脚
pinMode(LED_PIN_A, OUTPUT);
pinMode(LED_PIN_B, OUTPUT);
pinMode(LED_PIN_C, OUTPUT);
pinMode(LED_PIN_D, OUTPUT);
pinMode(LED_PIN_E, OUTPUT);
pinMode(LED_PIN_F, OUTPUT);
pinMode(LED_PIN_G, OUTPUT);
pinMode(LED_PIN_DP, OUTPUT);
// 初始化按键
pinMode(buttonPin, INPUT_PULLUP);
// 初始化LCD显示器
lcd.begin(16, 2);
// 初始化I2C总线
Wire.begin();
}
void loop() {
unsigned long currMillis = millis();
// 更新温度值
tempC = getTemperature();
// 获取按键状态
int buttonState = digitalRead(buttonPin);
// 根据按键状态校正时间
if (buttonState == LOW) {
setDigits(0, 0, 0, 0);
} else {
// 更新数码管显示
if (currMillis - prevMillis >= 1000) {
prevMillis = currMillis;
updateDigits();
}
}
// 更新LCD显示
updateDisplay();
}
void updateDigits() {
// 更新时间
digits[3] = (digits[3] + 1) % 10;
if (digits[3] == 0) {
digits[2] = (digits[2] + 1) % 6;
if (digits[2] == 0) {
digits[1] = (digits[1] + 1) % 10;
if (digits[1] == 0) {
digits[0] = (digits[0] + 1) % 10;
}
}
}
// 更新数码管显示
digitalWrite(digitPins[currDigit], HIGH);
for (int i = 0; i < 7; i++) {
digitalWrite(i + LED_PIN_A, numMap[digits[currDigit]][i]);
}
digitalWrite(digitPins[currDigit], LOW);
currDigit = (currDigit + 1) % DIGIT_NUM;
}
void setDigits(byte d0, byte d1, byte d2, byte d3) {
digits[0] = d0;
digits[1] = d1;
digits[2] = d2;
digits[3] = d3;
}
void updateDisplay() {
// 更新LCD显示
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.print(getTimeStr());
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(tempC);
lcd.print("C");
}
String getTimeStr() {
String timeStr = "";
for (int i = 0; i < DIGIT_NUM; i++) {
timeStr += digits[i];
if (i == 1 || i == 3) {
timeStr += "-";
}
}
return timeStr;
}
float getTemperature() {
Wire.beginTransmission(tempSensorAddr);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(tempSensorAddr, 2);
byte msb = Wire.read();
byte lsb = Wire.read();
int temp = (msb << 8) | lsb;
temp = temp >> 5;
return temp * 0.125;
}
```
其中 `updateDigits` 函数用于更新数码管显示,`setDigits` 函数用于设置数码管显示,`updateDisplay` 函数用于更新LCD显示,`getTimeStr` 函数用于生成时分秒字符串,`getTemperature` 函数用于获取温度值。在 `setup` 函数中,我们初始化了数码管引脚、按键、LCD显示器和I2C总线。在 `loop` 函数中,我们实时更新温度值,并根据按键状态来校正时间或更新数码管显示。每秒钟调用一次 `updateDigits` 函数来更新时间和数码管显示。最后还需要注意的是,为了实现数码管多位数显示,我们需要用到4个NPN三极管来控制每一位数码管的亮灭。
阅读全文