一、基于STM32F103C8T6的LED闪烁和LED流水灯

目录

一、引言

二、实验器材

三、实验原理

3.1 硬件连接

3.2 LED闪烁接线图

3.3 LED流水灯接线图

四、实验步骤

五、软件设计

5.1 延时函数

5.2 延时函数头文件

5.3 LED闪烁主函数

5.4 LED流水灯主函数

六、实物接线图和实验结果

6.1 LED灯闪烁

6.2 LED流水灯

七、实验总结


一、引言

流水灯是一种常见的电子实验,也是学习嵌入式系统开发的入门实例。本实验旨在通过使用STM32微控制器,设计和实现一个简单的流水灯电路。

二、实验器材

  • STM32最小系统
  • LED灯
  • 杜邦线
  • ST-Link

三、实验原理

3.1 硬件连接

将STM32开发板上的IO口与LED灯连接起来。将ST-Link按对应的管脚进行连线。

3.2 LED闪烁接线图

一、基于STM32F103C8T6的LED闪烁和LED流水灯_第1张图片

3.3 LED流水灯接线图

一、基于STM32F103C8T6的LED闪烁和LED流水灯_第2张图片

四、实验步骤

  1. 接线
  2. 初始化:设置正确的时钟频率和GPIO控制。
  3. 配置引脚:选择用于连接LED的GPIO引脚,并将其配置为输出模式。
  4. 循环输出控制:通过对GPIO引脚的高低电平控制,实现流水灯的效果。可以使用延时函数来控制每个LED亮灭的时间间隔。
  5. 烧录程序

五、软件设计

5.1 延时函数

#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

5.2 延时函数头文件

#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

5.3 LED闪烁主函数

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	while (1)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);
		Delay_ms(500);
		GPIO_SetBits(GPIOA, GPIO_Pin_0);
		Delay_ms(500);
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
		Delay_ms(500);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
		Delay_ms(500);
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);
		Delay_ms(500);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);
		Delay_ms(500);
	}
}

5.4 LED流水灯主函数

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	while (1)
	{
		GPIO_Write(GPIOA, ~0x0001);	//0000 0000 0000 0001
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0002);	//0000 0000 0000 0010
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0004);	//0000 0000 0000 0100
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0008);	//0000 0000 0000 1000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0010);	//0000 0000 0001 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0020);	//0000 0000 0010 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0040);	//0000 0000 0100 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0080);	//0000 0000 1000 0000
		Delay_ms(100);
	}
}

六、实物接线图和实验结果

6.1 LED灯闪烁

完成以上步骤后,将代码下载到STM32开发板上。打开电源,如果一切正常,你将看到LED灯闪烁

一、基于STM32F103C8T6的LED闪烁和LED流水灯_第3张图片

6.2 LED流水灯

完成以上步骤后,将代码下载到STM32开发板上。打开电源,如果一切正常,你将看到LED灯按照流水灯的方式依次亮起和熄灭。

 在实际实验中,你可能需要调整延时时间和LED的亮灭顺序,以实现不同的流水灯效果。

一、基于STM32F103C8T6的LED闪烁和LED流水灯_第4张图片

七、实验总结

通过本实验,我学习了基于STM32微控制器的流水灯设计和实现。这对进一步学习嵌入式系统开发和电子电路设计提供了基础。

你可能感兴趣的:(STM32单片机,stm32,嵌入式硬件,单片机)