根据所学知识,自行设计一个电子钟电路包含两或三个铵键和8个数码管的电路,并编写对应的程序实现以下功能: 1) 可以显示当前的时间(时分秒各2位); 2)可以通过铵键设置时间; 3)可以通过铵键切换时间与日期的显示;
时间: 2024-03-19 16:41:43 浏览: 147
以下是一个基于ATmega328P微控制器的电子钟电路设计,包含两个按键和8个数码管。程序使用Arduino IDE进行编写,可以实现所述的三个功能。
电路图如下:
![电路图](https://i.imgur.com/3t8Q6Z2.png)
程序如下:
```c++
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 rtc;
int hour = 0;
int minute = 0;
int second = 0;
int current_digit = 0;
int current_mode = 0;
const int button1 = 2;
const int button2 = 3;
const int digitPins[] = {4, 5, 6, 7, 8, 9, 10, 11};
const int segments[] = {A0, A1, A2, A3, A4, A5, A6, A7};
const byte digitToSegment[] = {
B11111100, // 0
B01100000, // 1
B11011010, // 2
B11110010, // 3
B01100110, // 4
B10110110, // 5
B00111110, // 6
B11100000, // 7
B11111110, // 8
B11100110 // 9
};
void setup() {
Wire.begin();
rtc.begin();
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
for (int i = 0; i < 8; i++) {
pinMode(digitPins[i], OUTPUT);
digitalWrite(digitPins[i], LOW);
pinMode(segments[i], OUTPUT);
digitalWrite(segments[i], HIGH);
}
}
void loop() {
DateTime now = rtc.now();
hour = now.hour();
minute = now.minute();
second = now.second();
if (digitalRead(button1) == LOW) {
current_digit = (current_digit + 1) % 6;
delay(200);
}
if (digitalRead(button2) == LOW) {
current_mode = (current_mode + 1) % 2;
delay(200);
}
if (current_mode == 0) {
displayTime();
} else {
displayDate(now.day(), now.month(), now.year());
}
}
void displayTime() {
int digits[] = {hour / 10, hour % 10, minute / 10, minute % 10, second / 10, second % 10};
for (int i = 0; i < 6; i++) {
digitalWrite(digitPins[i], HIGH);
for (int j = 0; j < 8; j++) {
digitalWrite(segments[j], (digitToSegment[digits[i]] >> j) & 1);
}
delay(2);
digitalWrite(digitPins[i], LOW);
}
}
void displayDate(int day, int month, int year) {
int digits[] = {day / 10, day % 10, month / 10, month % 10, year / 1000, (year % 1000) / 100, (year % 100) / 10, year % 10};
for (int i = 0; i < 8; i++) {
digitalWrite(digitPins[i], HIGH);
for (int j = 0; j < 8; j++) {
digitalWrite(segments[j], (digitToSegment[digits[i]] >> j) & 1);
}
delay(2);
digitalWrite(digitPins[i], LOW);
}
}
```
程序具体实现了以下功能:
1. 初始化时钟并读取当前时间;
2. 两个按键分别用于切换当前显示的位数和时间/日期模式;
3. 按照当前的时间或日期,依次显示8个数码管的内容。
其中,`displayTime()` 函数用于显示时间,`displayDate()` 函数用于显示日期。这两个函数分别将时间或日期转换为数组,并依次将数组中的数字显示在数码管上。数组中的每个元素都是一个数字,代表数码管应该显示的值。每个数字都由两个数码管表示,因此一共需要8个数字。在循环中,程序会依次将每个数字显示在对应的数码管上,然后延迟2毫秒。最后,切换到下一个数码管并重复此过程,直到所有数码管都被显示一次。
这个程序可以通过Arduino IDE上传到ATmega328P微控制器中。在上传后,程序会自动开始运行,同时数码管会显示当前的时间。按下第一个按键可以切换当前显示的位数,按下第二个按键可以切换时间/日期模式。在时间模式下,数码管会显示时分秒,而在日期模式下,数码管会显示日月年。按下按键后,程序会等待200毫秒,以避免按键抖动。
阅读全文