基于STM32的DS1302闹铃代码
时间: 2024-04-30 19:24:30 浏览: 115
下面是基于STM32的DS1302闹铃代码,注释已尽可能详细,希望能帮到你。
```
#include "stm32f10x.h"
#include "ds1302.h"
#define BEEP_ON() GPIO_SetBits(GPIOB, GPIO_Pin_8)
#define BEEP_OFF() GPIO_ResetBits(GPIOB, GPIO_Pin_8)
uint16_t BEEP_TIM = 0; // 蜂鸣器定时器计数器
void InitBeep(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能TIM2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); // 配置GPIOB.8为推挽输出
TIM_TimeBaseInitStructure.TIM_Period = 5000 - 1; // 定时5ms
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; // 分频器72,1MHz计数频率
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); // TIM2初始化
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 使能TIM2更新中断
TIM_Cmd(TIM2, ENABLE); // 启动TIM2
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; // TIM2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); // NVIC初始化
}
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) // 如果是TIM2更新中断
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除TIM2更新中断标志位
if (BEEP_TIM > 0) // 如果计数器大于0
{
BEEP_TIM--; // 计数器减1
}
else // 如果计数器等于0
{
BEEP_OFF(); // 关闭蜂鸣器
}
}
}
int main()
{
uint8_t alarm_hour = 8; // 闹铃小时
uint8_t alarm_minute = 30; // 闹铃分钟
uint8_t hour, minute, second;
uint8_t alarm_triggered = 0; // 闹铃触发标志位
DS1302_Init(); // DS1302初始化
InitBeep(); // 蜂鸣器初始化
while (1)
{
DS1302_GetTime(&hour, &minute, &second); // 获取当前时间
if (hour == alarm_hour && minute == alarm_minute && !alarm_triggered) // 如果是闹铃时间且闹铃未触发
{
alarm_triggered = 1; // 设置闹铃触发标志位
BEEP_TIM = 1000; // 设置蜂鸣器计数器为1s
BEEP_ON(); // 打开蜂鸣器
}
else if (hour != alarm_hour || minute != alarm_minute) // 如果不是闹铃时间
{
alarm_triggered = 0; // 清除闹铃触发标志位
}
delay_ms(1000); // 延时1s
}
}
```
阅读全文