基于stm32F108R6的红绿灯设计
时间: 2023-10-27 08:06:37 浏览: 107
红绿灯设计
红绿灯控制系统是一个基于嵌入式系统的典型应用。在这个系统中,我们需要控制三个LED灯(红、黄、绿)的点亮和熄灭,以实现交通信号灯的功能。下面是一个基于 STM32F108R6 的红绿灯设计方案:
1. 硬件设计
STM32F108R6 是一款 ARM Cortex-M3 内核的微控制器,具有多个通道的定时器、多个串行接口、模拟数字转换器等外设,非常适合用于嵌入式系统的设计。
在硬件设计中,需要连接三个LED灯到 STM32F108R6 的 GPIO 口上,同时使用一个外部按键作为触发开关,以便手动切换红绿灯状态。具体的硬件连接如下所示:
![image-20211207094518948](https://img-blog.csdnimg.cn/img_convert/5d2e0e8a52e6f8f52d7c21d0d1f5d1d8.png)
其中,PA0 口连接外部按键,PB0、PB1、PB2 口分别连接红、黄、绿三个LED灯。
2. 软件设计
在软件设计中,我们需要使用 Keil C51 编译器,以及 STM32F10x 标准外设库进行开发。主要的程序逻辑如下:
1. 初始化 GPIO 口和定时器
首先需要初始化 GPIO 口和定时器,以便控制 LED 灯的点亮和熄灭。具体的代码如下所示:
```c
#include "stm32f10x.h"
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_InitStructure.TIM_Period = 1000 - 1;
TIM_InitStructure.TIM_Prescaler = 7200 - 1;
TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_InitStructure);
TIM_Cmd(TIM2, ENABLE);
}
```
2. 控制 LED 灯的点亮和熄灭
在定时器的中断服务函数中,根据当前的状态,确定红绿灯的点亮和熄灭时间。具体的代码如下所示:
```c
void TIM2_IRQHandler(void)
{
static uint8_t state = 0;
static uint16_t delay = 0;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
if (state == 0) //红灯亮
{
GPIO_ResetBits(GPIOB, GPIO_Pin_0); //红灯亮
GPIO_SetBits(GPIOB, GPIO_Pin_1); //黄灯灭
GPIO_SetBits(GPIOB, GPIO_Pin_2); //绿灯灭
delay = 5000;
}
else if (state == 1) //红灯闪
{
GPIO_ResetBits(GPIOB, GPIO_Pin_0); //红灯亮
GPIO_SetBits(GPIOB, GPIO_Pin_1); //黄灯灭
GPIO_SetBits(GPIOB, GPIO_Pin_2); //绿灯灭
delay = 1000;
}
else if (state == 2) //绿灯亮
{
GPIO_SetBits(GPIOB, GPIO_Pin_0); //红灯灭
GPIO_SetBits(GPIOB, GPIO_Pin_1); //黄灯灭
GPIO_ResetBits(GPIOB, GPIO_Pin_2); //绿灯亮
delay = 5000;
}
else if (state == 3) //黄灯亮
{
GPIO_SetBits(GPIOB, GPIO_Pin_0); //红灯灭
GPIO_ResetBits(GPIOB, GPIO_Pin_1); //黄灯亮
GPIO_SetBits(GPIOB, GPIO_Pin_2); //绿灯灭
delay = 2000;
}
delay--;
if (delay == 0)
{
state++;
if (state > 3)
{
state = 0;
}
}
}
}
```
3. 响应外部按键
在主循环中,需要检测外部按键的状态,以便手动切换红绿灯的状态。具体的代码如下所示:
```c
int main(void)
{
GPIO_Configuration();
TIM_Configuration();
while (1)
{
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET)
{
while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET)
;
TIM_Cmd(TIM2, DISABLE);
GPIO_SetBits(GPIOB, GPIO_Pin_0);
GPIO_SetBits(GPIOB, GPIO_Pin_1);
GPIO_SetBits(GPIOB, GPIO_Pin_2);
delay_ms(1000);
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
GPIO_ResetBits(GPIOB, GPIO_Pin_2);
TIM_Cmd(TIM2, ENABLE);
}
}
}
```
这样,基于 STM32F108R6 的红绿灯控制系统就完成了。在程序运行时,红、黄、绿三个LED灯会按照规定的时间间隔轮流点亮和熄灭,同时可以通过外部按键手动切换红绿灯状态,以模拟交通信号灯的功能。
阅读全文