用单片机编写时间采集记录仪的程序,用到DS1302采集、IIC储存、LCD1602显示
时间: 2023-07-16 07:16:05 浏览: 45
以下是一个基于DS1302、IIC EEPROM、LCD1602的时间采集记录仪的程序示例:
```
#include <Wire.h>
#include <LiquidCrystal.h>
#include <DS1302.h>
#include <EEPROM.h>
#define RTC_CE 2
#define RTC_IO 3
#define RTC_CLK 4
DS1302 rtc(RTC_CE, RTC_IO, RTC_CLK);
#define IIC_EEPROM_ADDR 0x50
#define IIC_EEPROM_SIZE 512
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
byte buffer[8];
void setup() {
Wire.begin();
rtc.begin();
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Time Recorder");
delay(2000);
}
void loop() {
// 获取当前时间
rtc.readTime(buffer);
int year = buffer[6] + 2000;
int month = buffer[5];
int day = buffer[4];
int hour = buffer[2];
int minute = buffer[1];
int second = buffer[0];
// 显示当前时间
lcd.clear();
lcd.setCursor(0,0);
lcd.print(year);
lcd.print("-");
if (month < 10) lcd.print("0");
lcd.print(month);
lcd.print("-");
if (day < 10) lcd.print("0");
lcd.print(day);
lcd.setCursor(0,1);
if (hour < 10) lcd.print("0");
lcd.print(hour);
lcd.print(":");
if (minute < 10) lcd.print("0");
lcd.print(minute);
lcd.print(":");
if (second < 10) lcd.print("0");
lcd.print(second);
// 保存当前时间到EEPROM
int addr = 0;
EEPROM.write(addr++, year >> 8);
EEPROM.write(addr++, year & 0xFF);
EEPROM.write(addr++, month);
EEPROM.write(addr++, day);
EEPROM.write(addr++, hour);
EEPROM.write(addr++, minute);
EEPROM.write(addr++, second);
// 从EEPROM读取之前保存的时间并显示
lcd.setCursor(0,0);
lcd.print("Last record:");
addr = IIC_EEPROM_SIZE - 7;
int last_year = (EEPROM.read(addr++) << 8) | EEPROM.read(addr++);
int last_month = EEPROM.read(addr++);
int last_day = EEPROM.read(addr++);
int last_hour = EEPROM.read(addr++);
int last_minute = EEPROM.read(addr++);
int last_second = EEPROM.read(addr++);
lcd.setCursor(0,1);
lcd.print(last_year);
lcd.print("-");
if (last_month < 10) lcd.print("0");
lcd.print(last_month);
lcd.print("-");
if (last_day < 10) lcd.print("0");
lcd.print(last_day);
lcd.print(" ");
if (last_hour < 10) lcd.print("0");
lcd.print(last_hour);
lcd.print(":");
if (last_minute < 10) lcd.print("0");
lcd.print(last_minute);
lcd.print(":");
if (last_second < 10) lcd.print("0");
lcd.print(last_second);
// 延时1秒
delay(1000);
}
```
这个程序会每秒钟读取当前时间并将其显示在LCD1602上,然后将时间保存到IIC EEPROM中。在LCD1602上还会显示之前最后一次保存到EEPROM中的时间。这个程序可以自行根据实际需求进行修改。