用stm32单片机做闹钟
用stm32单片机做闹钟
更多
以下是使用STM32单片机设计闹钟的基本步骤和代码框架(基于STM32CubeIDE和HAL库):
硬件需求
- STM32开发板(如STM32F103C8T6)
- RTC模块(使用内部RTC或外部DS1307)
- 显示模块(LCD1602或OLED)
- 蜂鸣器(报警输出)
- 按键(设置时间/闹钟)
- 32.768kHz晶振(用于RTC)
功能设计
- 显示当前时间(时:分:秒)
- 设置闹钟时间
- 闹钟触发时蜂鸣器报警
- 按键控制:设置/确认/加减
软件实现步骤
1. RTC初始化(使用内部RTC)
// 在main.c中添加
#include "stm32f1xx_hal_rtc.h"
RTC_HandleTypeDef hrtc;
void SystemClock_Config(void) {
// 启用PWR和BKP时钟
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_RCC_BKP_CLK_ENABLE();
// RTC初始化
hrtc.Instance = RTC;
hrtc.Init.AsynchPrediv = 0x7F; // 异步分频
hrtc.Init.SynchPrediv = 0xFF; // 同步分频
HAL_RTC_Init(&hrtc);
}
void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) {
// 启用RTC时钟
__HAL_RCC_RTC_ENABLE();
}
2. 主程序框架
// 全局变量
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
uint8_t alarm_hour = 7, alarm_min = 30; // 默认闹钟时间
uint8_t alarm_enabled = 1; // 闹钟使能标志
int main(void) {
HAL_Init();
SystemClock_Config();
// 初始化外设
MX_GPIO_Init();
MX_RTC_Init();
LCD_Init(); // 显示初始化
// 设置初始时间(首次运行时设置)
sTime.Hours = 12;
sTime.Minutes = 0;
sTime.Seconds = 0;
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
while (1) {
// 1. 读取当前时间
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
// 2. 显示时间
LCD_DisplayTime(sTime.Hours, sTime.Minutes, sTime.Seconds);
// 3. 检查闹钟触发
if(alarm_enabled &&
sTime.Hours == alarm_hour &&
sTime.Minutes == alarm_min &&
sTime.Seconds == 0) {
TriggerAlarm(); // 触发报警
}
// 4. 按键扫描
Key_Scan();
HAL_Delay(200);
}
}
3. 按键处理函数
void Key_Scan(void) {
static uint8_t mode = 0; // 0:正常 1:设置小时 2:设置分钟
if(HAL_GPIO_ReadPin(SET_BTN_GPIO_Port, SET_BTN_Pin) == GPIO_PIN_RESET) {
HAL_Delay(50); // 消抖
mode = (mode + 1) % 3; // 切换模式
while(!HAL_GPIO_ReadPin(SET_BTN_GPIO_Port, SET_BTN_Pin)); // 等待释放
}
if(mode > 0) {
if(HAL_GPIO_ReadPin(INC_BTN_GPIO_Port, INC_BTN_Pin) == GPIO_PIN_RESET) {
if(mode == 1) alarm_hour = (alarm_hour + 1) % 24;
else alarm_min = (alarm_min + 1) % 60;
}
if(HAL_GPIO_ReadPin(DEC_BTN_GPIO_Port, DEC_BTN_Pin) == GPIO_PIN_RESET) {
if(mode == 1) alarm_hour = (alarm_hour + 23) % 24;
else alarm_min = (alarm_min + 59) % 60;
}
}
}
4. 报警触发函数
void TriggerAlarm(void) {
// 蜂鸣器鸣叫30秒
for(int i=0; i<30; i++) {
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);
HAL_Delay(500);
// 检测停止按键
if(HAL_GPIO_ReadPin(STOP_BTN_GPIO_Port, STOP_BTN_Pin) == GPIO_PIN_RESET) {
break;
}
}
}
关键注意事项
- RTC电池供电:使用VBAT引脚连接3V电池保证掉电走时
- 时间格式:使用24小时制简化处理
- 按键消抖:所有按键需硬件/软件消抖
- 显示更新:避免频繁刷新LCD(每200-500ms更新一次)
- 低功耗:在等待状态可进入Sleep模式
扩展功能建议
- 添加日期显示(年/月/日)
- 多组闹钟设置
- 渐强式报警(PWM控制蜂鸣器)
- 通过串口校准时间
- OLED动画显示效果
完整实现需要根据具体硬件调整引脚定义和外设驱动。建议使用STM32CubeMX配置时钟和引脚初始化,再添加业务逻辑代码。
基于51单片机的闹钟系统设计
本次闹钟系统使用的是STC89C52单片机作为主控芯片,通过八位数码管显示时间,通过DS1302定时模块设置定时,采集到的数据会上传到单片机中,
2023-09-01 09:09:32
stm32单片机用什么语言 编程 stm32各种型号
C语言是STM32单片机最常用的编程语言之一,它具有结构化、模块化和可移植性强的特点,可以很好地描述STM32
2023-04-12 13:22:48
STM32单片用什么编程?如何学习STM32单片机开发
在大学刚开始接触51单片机的时候,我们学习的都是汇编指令,再到后来学习了C语言,用C语言代替汇编指令来开发编程单片机。
资料下载
佚名
2021-11-13 12:51:01
stm32单片机用什么软件编程
想学单片机开发,最主要是熟悉stm32的软件开发环境,目前stm32的开发环境,主流是KEIL和IAR,当然主要是windows版本运行。
2022-07-15 11:06:42
7天热门专题
换一换
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机