使用STM32制作倒计时器

STM32是一款功能强大的微控制器,可用于制作各种电子设备和应用程序。在本文中,我们将使用STM32来制作一个倒计时器。倒计时器是一种常见的应用,可用于计时器、倒计时器、比赛计时器等。

以下是制作倒计时器的详细步骤:

  1. 硬件准备

首先,我们需要准备以下硬件设备:

  • 一个STM32微控制器开发板(例如STM32F103C8T6)
  • 一个LCD液晶显示器
  • 4个按钮开关(用于设置倒计时时间和启动/停止倒计时)
  • 杜邦线和面包板
  1. 连接硬件

将STM32开发板和LCD显示器连接起来。使用杜邦线将STM32的GPIO引脚连接到LCD的对应引脚。使用杜邦线将按钮开关连接到STM32的GPIO引脚。

具体的连接方法可以参考STM32的引脚定义和LCD显示器的数据手册。

  1. 设置开发环境

下载并安装STM32的开发环境,例如Keil MDK或STM32CubeIDE。选择一个适合自己的开发环境,并配置好STM32开发板的相关设置。

  1. 编写代码

以下是使用C语言编写的倒计时器的代码示例:

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_usart.h"
#include "lcd.h"

#define BUTTON_1 GPIO_Pin_0
#define BUTTON_2 GPIO_Pin_1
#define BUTTON_3 GPIO_Pin_2
#define BUTTON_4 GPIO_Pin_3

uint8_t hours = 0;
uint8_t minutes = 0;
uint8_t seconds = 0;

void delay_ms(uint32_t time)
{
    uint32_t i;
    for(i = 0; i < time * 3600; i++) {}
}

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void TIM2_Configuration(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Prescaler = 35999;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_Period = 999;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    TIM_ARRPreloadConfig(TIM2, ENABLE);

    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
}

void TIM2_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
    {
        seconds++;

        if (seconds >= 60)
        {
            seconds = 0;
            minutes++;

            if (minutes >= 60)
            {
                minutes = 0;
                hours++;

                if (hours >= 24)
                {
                    hours = 0;
                }
            }
        }

        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    }
}

int main(void)
{
    LCD_Init();

    GPIO_Configuration();
    TIM2_Configuration();

    while (1)
    {
        if (GPIO_ReadInputDataBit(GPIOA, BUTTON_1) == 0)
        {
            hours++;

            if (hours >= 24)
            {
                hours = 0;
            }

            delay_ms(500);
        }

        if (GPIO_ReadInputDataBit(GPIOA, BUTTON_2) == 0)
        {
            minutes++;

            if (minutes >= 60)
            {
                minutes = 0;
            }

            delay_ms(500);
        }

        if (GPIO_ReadInputDataBit(GPIOA, BUTTON_3) == 0)
        {
            seconds++;

            if (seconds >= 60)
            {
                seconds = 0;
            }

            delay_ms(500);
        }

        if (GPIO_ReadInputDataBit(GPIOA, BUTTON_4) == 0)
        {
            LCD_Clear();

            while (1)
            {
                char time[10];
                sprintf(time, "%02d:%02d:%02d", hours, minutes, seconds);
                LCD_DisplayStringLine(Line1, (unsigned char*) time);

                delay_ms(1000);

                seconds--;

                if (seconds <= 0)
                {
                    seconds = 59;

                    if (minutes <= 0)
                    {
                        minutes = 59;

                        if (hours > 0)
                        {
                            hours--;
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        minutes--;
                    }
                }

                if ((GPIO_ReadInputDataBit(GPIOA, BUTTON_1) == 0) || (GPIO_ReadInputDataBit(GPIOA, BUTTON_2) == 0)
                        || (GPIO_ReadInputDataBit(GPIOA, BUTTON_3) == 0))
                {
                    break;
                }
            }
        }
    }
}

  1. 烧录程序

将编写好的代码烧录到STM32开发板中。使用开发环境提供的烧录工具,连接开发板并烧录程序到开发板中。

  1. 测试倒计时器

将LCD显示器连接到STM32开发板上,并使用按钮开关设置倒计时时间。按下启动/停止按钮开始或停止倒计时。

通过上述步骤,我们可以制作一个简单的倒计时器。使用STM32的GPIO功能和定时器功能,我们可以实现简单的倒计时功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大黄鸭duck.

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值