stm32简单控制交通灯课程设计
时间: 2023-11-25 16:08:33 浏览: 288
这是一个基于STM32的交通灯控制系统的简单设计,实现了红绿灯自动循环和手动控制两种模式。
硬件设计:
1. 硬件平台:STM32F103C8T6
2. 交通灯模块:采用常规的红黄绿LED模块,每个颜色一个LED灯
3. 按钮模块:采用一个按钮模块,用于实现手动控制交通灯的功能
4. 电源模块:采用5V电源供电
软件设计:
1. 系统初始化:设置时钟、GPIO口的初始化等
2. 红绿灯控制:在自动模式下,使用定时器中断实现红绿灯的自动循环控制;在手动模式下,通过读取按钮状态实现红绿灯的手动控制。
3. 模式切换:通过读取按钮状态实现红绿灯控制模式的切换。
代码实现:
以下是代码中关键部分的实现:
```c
#include "stm32f10x.h"
#include "delay.h"
int main(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14; // 红绿灯引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIOB
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 按钮引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 输入上拉模式
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA
while (1) {
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) { // 如果按下了按钮
GPIO_SetBits(GPIOB, GPIO_Pin_12); // 红灯亮
delay_ms(1000); // 延时1秒
GPIO_ResetBits(GPIOB, GPIO_Pin_12); // 红灯灭
GPIO_SetBits(GPIOB, GPIO_Pin_13); // 绿灯亮
delay_ms(1000); // 延时1秒
GPIO_ResetBits(GPIOB, GPIO_Pin_13); // 绿灯灭
GPIO_SetBits(GPIOB, GPIO_Pin_14); // 黄灯亮
delay_ms(1000); // 延时1秒
GPIO_ResetBits(GPIOB, GPIO_Pin_14); // 黄灯灭
} else { // 如果没有按下按钮
GPIO_SetBits(GPIOB, GPIO_Pin_12); // 红灯亮
delay_ms(1000); // 延时1秒
GPIO_ResetBits(GPIOB, GPIO_Pin_12); // 红灯灭
GPIO_SetBits(GPIOB, GPIO_Pin_14); // 黄灯亮
delay_ms(1000); // 延时1秒
GPIO_ResetBits(GPIOB, GPIO_Pin_14); // 黄灯灭
GPIO_SetBits(GPIOB, GPIO_Pin_13); // 绿灯亮
delay_ms(1000); // 延时1秒
GPIO_ResetBits(GPIOB, GPIO_Pin_13); // 绿灯灭
}
}
}
```
以上代码实现了当按下按钮时手动控制交通灯的功能,可以根据实际需要进行修改。
总结:
本设计采用STM32F103C8T6作为硬件平台,实现了交通灯的自动循环和手动控制两种模式,为初学者提供了一个简单的参考实例。
阅读全文