STM32实现简单的电子钟

以下是基于STM32的电子钟的简单实现。这个电子钟可以显示当前的时间,并且能够设置闹钟,当闹钟时间到达时会触发蜂鸣器。这个电子钟基于STM32F103C8T6微控制器,使用了RTC模块,LCD显示屏和蜂鸣器。

  1. 硬件连接

将RTC模块连接到STM32的I2C总线,将LCD显示屏(例如16x2字符型LCD)连接到STM32的GPIO引脚,并将蜂鸣器连接到STM32的另一个GPIO引脚。

  1. STM32配置

使用STM32CubeMX配置STM32F103C8T6微控制器的时钟和外设。配置RTC模块作为时钟源,并启用I2C外设。生成代码并导入至IDE(例如Keil MDK)。

  1. 代码实现

首先,我们需要包含一些必要的库文件和头文件。

#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显示屏的间隔
  }
}

这是一个简单的电子钟的实现示例。你可以根据需要进行更多的功能扩展,例如增加设置日期、闹钟重复功能等。希望这个示例对你有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CrMylive.

穷呀,求求补助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值