设计基于STM32单片机开发板的LED数码管显示倒计时器,要求如下: (1)用4位LED数码管显示倒计时时间。 (2)通过按键可以对倒计时设定初值。倒计时初始值范围在00:00---60:00之间(0--60分钟),用户可根据需要对其进行设置,设置成功后复位初始值为成功设定值。 (3)倒计时时间为零时,控制蜂鸣器报警5秒。实验代码
时间: 2024-03-26 19:39:59 浏览: 231
好的,我可以给你提供一份简单的代码作为参考。但需要注意的是,这只是一个简单的倒计时器程序,你需要根据自己的实际需求对代码进行修改和完善。
```
/* 头文件 */
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
/* 宏定义 */
#define KEY_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY_DOWN GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)
#define KEY_OK GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)
/* 函数声明 */
void TIM3_Int_Init(u16 arr,u16 psc);
/* 全局变量 */
u8 t_hour = 0; // 时
u8 t_min = 0; // 分
u8 t_sec = 0; // 秒
u8 t_cnt = 0; // 计时器
/* 主函数 */
int main(void)
{
/* 系统初始化 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();
USART1_Init(115200);
LED_Init();
KEY_Init();
TIM3_Int_Init(10000,7200-1); // 定时器初始化
/* 主循环 */
while(1)
{
/* 设置倒计时时间 */
if(KEY_UP == 0)
{
delay_ms(10);
if(KEY_UP == 0)
{
if(t_min < 60)
t_min++;
else
t_min = 0;
}
while(KEY_UP == 0);
}
if(KEY_DOWN == 0)
{
delay_ms(10);
if(KEY_DOWN == 0)
{
if(t_min > 0)
t_min--;
else
t_min = 60;
}
while(KEY_DOWN == 0);
}
if(KEY_OK == 0)
{
delay_ms(10);
if(KEY_OK == 0)
{
t_hour = 0;
t_sec = 0;
t_cnt = 0;
}
while(KEY_OK == 0);
}
/* 显示倒计时时间 */
LED_ShowNum(0, t_hour);
LED_ShowNum(1, t_min);
LED_ShowNum(2, t_sec);
/* 倒计时 */
if(t_hour == 0 && t_min == 0 && t_sec == 0)
{
BEEP = 1; // 蜂鸣器响
delay_ms(5000); // 延时5秒
BEEP = 0; // 蜂鸣器停止
t_min = 1; // 时间重置
}
}
}
/* 定时器3初始化函数 */
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseInitStructure.TIM_Period = arr;
TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3,ENABLE);
}
/* 定时器3中断服务函数 */
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
if(t_cnt++ == 100) // 时间计数
{
t_cnt = 0;
if(t_sec > 0)
t_sec--;
else if(t_min > 0)
{
t_sec = 59;
t_min--;
}
else if(t_hour > 0)
{
t_sec = 59;
t_min = 59;
t_hour--;
}
}
}
}
```
这份代码使用了定时器3来实现倒计时功能,使用了LED数码管和按键来进行倒计时时间的设置和显示。你需要根据自己的实际需求对代码进行修改和完善,比如添加其他功能或者界面等。希望这份代码能对你有所帮助。
阅读全文