STM32实现简单的电子钟
以下是基于STM32的电子钟的简单实现。这个电子钟可以显示当前的时间,并且能够设置闹钟,当闹钟时间到达时会触发蜂鸣器。这个电子钟基于STM32F103C8T6微控制器,使用了RTC模块,LCD显示屏和蜂鸣器。
- 硬件连接
将RTC模块连接到STM32的I2C总线,将LCD显示屏(例如16×2字符型LCD)连接到STM32的GPIO引脚,并将蜂鸣器连接到STM32的另一个GPIO引脚。
- STM32配置
使用STM32CubeMX配置STM32F103C8T6微控制器的时钟和外设。配置RTC模块作为时钟源,并启用I2C外设。生成代码并导入至IDE(例如Keil MDK)。
- 代码实现
首先,我们需要包含一些必要的库文件和头文件。
#include "stm32f1xx_hal.h"
#include "lcd.h" // LCD库文件
#include "ds3231.h" // RTC库文件
接下来,我们需要定义一些全局变量,以及一些常数。
RTC_HandleTypeDef hrtc;
extern I2C_HandleTypeDef hi2c1;
char time_str[9]; // 用于存储时间字符串
char alarm_str[9]; // 用于存储闹钟时间字符串
uint8_t alarm_hours = 0; // 闹钟小时
uint8_t alarm_minutes = 0; // 闹钟分钟
_Bool alarm_triggered = 0; // 闹钟是否触发
#define ALARM_PIN GPIO_PIN_13 // 蜂鸣器连接的GPIO引脚
#define ALARM_PORT GPIOC // 蜂鸣器连接的GPIO端口
然后,我们需要实现一些辅助函数,用于将时间和闹钟时间转换为字符串,并显示在LCD上。
// 将时间转换为字符串
void time_to_string(RTC_TimeTypeDef rtc_time, char* str) {
sprintf(str, "%02d:%02d:%02d", rtc_time.Hours, rtc_time.Minutes, rtc_time.Seconds);
}
// 将闹钟时间转换为字符串
void alarm_time_to_string(char* str) {
sprintf(str, "%02d:%02d:00", alarm_hours, alarm_minutes);
}
// 在LCD上显示时间和闹钟时间
void display_time_and_alarm() {
lcd_set_cursor(0, 0);
lcd_print(time_str);
lcd_set_cursor(0, 1);
lcd_print(alarm_str);
}
接下来,我们需要实现RTC的初始化函数。
void rtc_init() {
RTC_TimeTypeDef rtc_time;
// 检测RTC是否已经初始化
if (HAL_RTC_Init(&hrtc) != HAL_OK) {
Error_Handler();
}
// 检测电池是否连接(如果没有连接电池,则RTC时间会在供电断开后丢失)
if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x32F2) {
// 如果没有连接电池,则设置RTC时间为00:00:00
rtc_time.Hours = 0;
rtc_time.Minutes = 0;
rtc_time.Seconds = 0;
if (HAL_RTC_SetTime(&hrtc, &rtc_time, RTC_FORMAT_BIN) != HAL_OK) {
Error_Handler();
}
// 将电池连接标识写入备份寄存器
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x32F2);
}
}
然后,我们需要实现闹钟设置函数和闹钟触发函数。
// 设置闹钟时间
void set_alarm(uint8_t hours, uint8_t minutes) {
alarm_hours = hours;
alarm_minutes = minutes;
alarm_time_to_string(alarm_str);
// 设置闹钟触发标志为未触发
alarm_triggered = 0;
}
// 闹钟触发函数
void alarm_trigger() {
// 闹钟触发标志设置为已触发
alarm_triggered = 1;
// 触发蜂鸣器
HAL_GPIO_WritePin(ALARM_PORT, ALARM_PIN, GPIO_PIN_SET);
HAL_Delay(1000); // 持续蜂鸣器发声1秒
HAL_GPIO_WritePin(ALARM_PORT, ALARM_PIN, GPIO_PIN_RESET);
}
最后,我们需要实现主函数。
int main(void)
{
// 初始化硬件
HAL_Init();
SystemClock_Config();
// 初始化LCD显示屏
lcd_init();
lcd_clear();
// 初始化RTC
rtc_init();
// 设置闹钟为08:00
set_alarm(8, 0);
while (1)
{
RTC_TimeTypeDef rtc_time;
// 获取当前RTC时间
HAL_RTC_GetTime(&hrtc, &rtc_time, RTC_FORMAT_BIN);
time_to_string(rtc_time, time_str);
// 如果闹钟时间到达,则触发闹钟
if (rtc_time.Hours == alarm_hours && rtc_time.Minutes == alarm_minutes && !alarm_triggered) {
alarm_trigger();
}
// 在LCD上显示时间和闹钟时间
display_time_and_alarm();
HAL_Delay(500); // 更新时间和LCD显示屏的间隔
}
}
这是一个简单的电子钟的实现示例。你可以根据需要进行更多的功能扩展,例如增加设置日期、闹钟重复功能等。希望这个示例对你有所帮助!
作者:CrMylive.