基于arduino 2560 编写一个程序,要求电路上电后,进入配置模式,通过三个按键来设置倒计时时间,并通过4位数码管显示出来,其中一个按键控制位选择,另外两个按键控制加和减。另外按下一个启动自锁按键,开启倒计时,再次按下启动自锁按键停止。要求断电重启后设置的倒计时不会重置,
时间: 2023-11-09 07:06:42 浏览: 148
一款可以设置倒计时关机,固定时间关机的程序
好的,以下是基于 Arduino 2560 的倒计时程序,请仔细阅读并按照电路图接线:
```C++
#include <EEPROM.h>
#define CLK 22
#define DIO 23
#define BS1 24
#define BS2 25
#define BS3 26
#define START 27
#define SET 28
#define SELECT 29
#define ADD 30
#define SUB 31
int seconds = 0; // 倒计时秒数
int minute = 0, second = 0; // 分钟数和秒数
int set_mode = 0; // 设置模式,0表示未进入设置模式,1表示进入设置秒模式,2表示进入设置分模式
int select_mode = 0; // 选择模式,0表示选择秒数,1表示选择分钟数
// 数码管显示数组
byte num[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F, // 9
0x00, // 空
};
void setup() {
pinMode(CLK, OUTPUT);
pinMode(DIO, OUTPUT);
pinMode(BS1, OUTPUT);
pinMode(BS2, OUTPUT);
pinMode(BS3, OUTPUT);
pinMode(START, INPUT_PULLUP);
pinMode(SET, INPUT_PULLUP);
pinMode(SELECT, INPUT_PULLUP);
pinMode(ADD, INPUT_PULLUP);
pinMode(SUB, INPUT_PULLUP);
// 读取 EEPROM 中保存的倒计时秒数
seconds = EEPROM.read(0);
minute = seconds / 60;
second = seconds % 60;
}
void loop() {
// 进入设置模式
if (digitalRead(SET) == LOW) {
delay(10); // 延时消抖
if (digitalRead(SET) == LOW) {
set_mode = 1; // 进入设置秒模式
select_mode = 0; // 选择秒数
}
} else {
set_mode = 0; // 退出设置模式
}
// 选择位
if (digitalRead(SELECT) == LOW) {
delay(10); // 延时消抖
if (digitalRead(SELECT) == LOW) {
select_mode = !select_mode; // 切换选择模式
}
}
// 加时
if (digitalRead(ADD) == LOW) {
delay(10); // 延时消抖
if (digitalRead(ADD) == LOW) {
if (set_mode == 1) {
// 设置秒数
seconds++;
if (seconds > 3599) seconds = 0; // 最大不超过1小时
minute = seconds / 60;
second = seconds % 60;
EEPROM.write(0, seconds); // 保存倒计时秒数到 EEPROM
} else if (set_mode == 2) {
// 设置分钟数
minute++;
if (minute > 99) minute = 0; // 最大不超过99分钟
second = 0;
seconds = minute * 60;
EEPROM.write(0, seconds); // 保存倒计时秒数到 EEPROM
}
}
}
// 减时
if (digitalRead(SUB) == LOW) {
delay(10); // 延时消抖
if (digitalRead(SUB) == LOW) {
if (set_mode == 1) {
// 设置秒数
seconds--;
if (seconds < 0) seconds = 3599; // 最小不低于0秒
minute = seconds / 60;
second = seconds % 60;
EEPROM.write(0, seconds); // 保存倒计时秒数到 EEPROM
} else if (set_mode == 2) {
// 设置分钟数
minute--;
if (minute < 0) minute = 99; // 最小不低于0分钟
second = 0;
seconds = minute * 60;
EEPROM.write(0, seconds); // 保存倒计时秒数到 EEPROM
}
}
}
// 显示倒计时时间
if (set_mode == 0) {
digitalWrite(BS1, LOW);
digitalWrite(BS2, LOW);
digitalWrite(BS3, HIGH); // 显示秒数
shiftOut(DIO, CLK, MSBFIRST, num[second % 10]);
shiftOut(DIO, CLK, MSBFIRST, num[second / 10]);
digitalWrite(BS1, LOW);
digitalWrite(BS2, HIGH);
digitalWrite(BS3, LOW); // 显示分钟数
shiftOut(DIO, CLK, MSBFIRST, num[minute % 10]);
shiftOut(DIO, CLK, MSBFIRST, num[minute / 10]);
} else {
// 显示设置的时间
if (select_mode == 0) {
digitalWrite(BS1, LOW);
digitalWrite(BS2, LOW);
digitalWrite(BS3, HIGH); // 显示秒数
shiftOut(DIO, CLK, MSBFIRST, num[second % 10]);
shiftOut(DIO, CLK, MSBFIRST, num[second / 10]);
digitalWrite(BS1, LOW);
digitalWrite(BS2, HIGH);
digitalWrite(BS3, LOW); // 显示分钟数
shiftOut(DIO, CLK, MSBFIRST, num[minute % 10]);
shiftOut(DIO, CLK, MSBFIRST, num[minute / 10]);
} else {
digitalWrite(BS1, HIGH);
digitalWrite(BS2, LOW);
digitalWrite(BS3, LOW); // 显示设置的秒数
shiftOut(DIO, CLK, MSBFIRST, num[seconds % 10]);
shiftOut(DIO, CLK, MSBFIRST, num[seconds / 10]);
digitalWrite(BS1, LOW);
digitalWrite(BS2, HIGH);
digitalWrite(BS3, LOW); // 显示设置的分钟数
shiftOut(DIO, CLK, MSBFIRST, num[minute % 10]);
shiftOut(DIO, CLK, MSBFIRST, num[minute / 10]);
}
}
// 启动倒计时
if (digitalRead(START) == LOW) {
delay(10); // 延时消抖
if (digitalRead(START) == LOW) {
while (digitalRead(START) == LOW); // 等待按键松开
unsigned long start_time = millis();
unsigned long elapsed_time = 0;
int countdown_seconds = seconds;
int countdown_minute = minute;
int countdown_second = second;
int countdown_mode = 0; // 倒计时模式,0表示未启动,1表示启动,2表示暂停
while (1) {
if (digitalRead(START) == LOW) {
delay(10); // 延时消抖
if (digitalRead(START) == LOW) {
while (digitalRead(START) == LOW); // 等待按键松开
countdown_mode = !countdown_mode; // 切换倒计时状态
}
}
if (countdown_mode == 1) {
elapsed_time = millis() - start_time;
if (elapsed_time >= 1000) {
start_time += 1000;
countdown_seconds--;
if (countdown_seconds < 0) {
countdown_seconds = 59;
countdown_minute--;
}
}
if (countdown_minute < 0) {
countdown_seconds = 0;
countdown_minute = 0;
countdown_mode = 0;
}
}
// 显示倒计时时间
digitalWrite(BS1, LOW);
digitalWrite(BS2, LOW);
digitalWrite(BS3, HIGH); // 显示秒数
shiftOut(DIO, CLK, MSBFIRST, num[countdown_second % 10]);
shiftOut(DIO, CLK, MSBFIRST, num[countdown_second / 10]);
digitalWrite(BS1, LOW);
digitalWrite(BS2, HIGH);
digitalWrite(BS3, LOW); // 显示分钟数
shiftOut(DIO, CLK, MSBFIRST, num[countdown_minute % 10]);
shiftOut(DIO, CLK, MSBFIRST, num[countdown_minute / 10]);
}
}
}
}
```
希望这份代码对你有所帮助!
阅读全文