打印
[应用相关]

使用STM32制作倒计时器

[复制链接]
226|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-7-22 16:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32是一款功能强大的微控制器,可用于制作各种电子设备和应用程序。在本文中,我们将使用STM32来制作一个倒计时器。倒计时器是一种常见的应用,可用于计时器、倒计时器、比赛计时器等。

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

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

一个STM32微控制器开发板(例如STM32F103C8T6)
一个LCD液晶显示器
4个按钮开关(用于设置倒计时时间和启动/停止倒计时)
杜邦线和面包板
连接硬件
将STM32开发板和LCD显示器连接起来。使用杜邦线将STM32的GPIO引脚连接到LCD的对应引脚。使用杜邦线将按钮开关连接到STM32的GPIO引脚。

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

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

编写代码
以下是使用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;
                }
            }
        }
    }
}

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

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

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

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_67153941/article/details/140452733

使用特权

评论回复
沙发
guijial511| | 2024-7-23 19:30 | 只看该作者
有点浪费MCU了,用数字电路就可以实现了。

使用特权

评论回复
板凳
呐咯密密| | 2024-7-24 11:35 | 只看该作者
是有些浪费资源,不过可以用于学习定时器

使用特权

评论回复
地板
Bowclad| | 2024-7-26 12:43 | 只看该作者
这个咋用硬件电路实现啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1733

主题

15116

帖子

10

粉丝