智能交通灯模拟系统:led灯模拟红绿灯,定时器控制倒计时(红灯控制30秒,绿灯控制25秒,红灯亮的时候绿灯灭,绿灯亮的时候红灯灭)。Led的显示和定时器的定时功能。红灯引脚PB5,绿灯引脚PB4。stm32f103c8t6芯片 keil5完整代码
时间: 2025-06-14 15:10:41 浏览: 20
<think>好的,用户想要一个基于STM32F103C8T6的智能交通灯模拟系统的完整代码,使用Keil5开发环境。系统需要用LED模拟红绿灯,定时器控制倒计时,红灯30秒,绿灯25秒,交替亮灭。红灯接PB5,绿灯接PB4。我需要确保代码结构正确,并且符合STM32的标准库开发流程。
首先,我需要确认硬件连接是否正确。红灯接PB5,绿灯接PB4,这两个引脚需要配置为推挽输出模式。然后,定时器的部分,可能需要使用SysTick或者通用定时器。考虑到倒计时需要精确控制,通用定时器可能更合适,比如TIM2。
接下来,系统的工作流程应该是:初始化GPIO和定时器,启动定时器,然后在中断服务函数中更新倒计时时间,并根据当前状态切换红灯和绿灯。需要定义两个变量,一个用于当前状态(红灯或绿灯),另一个用于倒计时剩余时间。
可能还需要处理中断优先级,确保定时器中断能够及时响应。同时,考虑到用户可能需要显示倒计时时间,这里可能需要使用串口或者数码管,但用户提到的是LED模拟,所以可能暂时不需要显示部分,但代码中可能需要预留处理。
另外,要注意红灯和绿灯的互斥,即红灯亮时绿灯灭,反之亦然。在状态切换时,需要同时切换LED的状态,并重新加载倒计时时间。
代码结构方面,应该包括系统时钟配置、GPIO初始化、定时器初始化、中断服务函数以及主循环。主循环可能处理其他任务,但在这里可能只需要进入空闲状态,等待中断触发。
需要检查定时器的配置是否正确,包括预分频器和重装载值,以确保定时器中断的频率正确。例如,如果系统时钟是72MHz,预分频设置为7200-1,那么定时器每0.1秒触发一次中断,这样倒计时可以以秒为单位递减,但需要调整重装载值和计数方式。
此外,需要处理中断服务函数中的逻辑,每次中断将计数器递减,当计数器减到0时切换状态,并重新设置计数器为30或25秒。同时,切换LED的状态。
可能还需要处理GPIO的置位和复位操作,确保在切换状态时正确控制PB4和PB5的电平。
最后,确保代码中没有语法错误,所有函数和变量正确定义,中断服务函数名称正确,并且链接正确的库文件。
现在需要将这些思路转化为具体的代码,按照STM32标准库的编写方式,配置相应的寄存器,编写初始化函数,中断服务程序,以及主函数。</think>以下是一个基于STM32F103C8T6的智能交通灯模拟系统完整代码实现(使用标准库开发):
```c
/* 硬件连接 */
// 红灯 -> PB5
// 绿灯 -> PB4
#include "stm32f10x.h"
/* 全局变量定义 */
volatile uint32_t g_countdown = 30; // 倒计时时间
volatile uint8_t g_traffic_state = 0; // 0:红灯 1:绿灯
/* 函数声明 */
void GPIO_Configuration(void);
void TIM2_Configuration(void);
void NVIC_Configuration(void);
int main(void)
{
SystemInit();
GPIO_Configuration();
TIM2_Configuration();
NVIC_Configuration();
while(1)
{
// 主循环保持空转,由中断处理所有逻辑
}
}
/* GPIO初始化 */
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置PB5(红灯)和PB4(绿灯)为推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 初始状态:红灯亮,绿灯灭
GPIO_SetBits(GPIOB, GPIO_Pin_5);
GPIO_ResetBits(GPIOB, GPIO_Pin_4);
}
/* TIM2初始化 */
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 定时器配置:1秒中断
TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
/* 中断配置 */
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
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);
}
/* TIM2中断服务函数 */
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
if(g_countdown > 0)
{
g_countdown--;
}
else
{
// 切换交通灯状态
g_traffic_state = !g_traffic_state;
if(g_traffic_state) // 绿灯状态
{
g_countdown = 25;
GPIO_ResetBits(GPIOB, GPIO_Pin_5); // 关红灯
GPIO_SetBits(GPIOB, GPIO_Pin_4); // 开绿灯
}
else // 红灯状态
{
g_countdown = 30;
GPIO_SetBits(GPIOB, GPIO_Pin_5); // 开红灯
GPIO_ResetBits(GPIOB, GPIO_Pin_4); // 关绿灯
}
}
}
}
```
代码说明:
1. **硬件连接**
- 红灯连接PB5,绿灯连接PB4
- 使用TIM2实现秒级定时
2. **核心功能**
- 红灯30秒/绿灯25秒自动切换
- 定时器中断实现倒计时
- LED状态互斥控制(红灯亮时绿灯灭,反之亦然)
3. **关键配置**
- 定时器配置为1秒中断:
$$ TIM\_Period = 9999 $$
$$ TIM\_Prescaler = 7199 $$
$$ f_{TIM2} = \frac{72MHz}{(7199+1)} = 10kHz $$
$$ 中断周期 = \frac{10000}{10kHz} = 1秒 $$
4. **状态切换逻辑**
- 当倒计时归零时切换状态
- 更新LED控制信号
- 重新加载倒计时时间
使用注意事项:
1. 需要安装STM32标准外设库
2. 在Keil5中创建工程时选择正确芯片型号
3. 根据实际硬件调整延时精度(修改TIM_Prescaler和TIM_Period)
4. 可通过添加数码管显示模块扩展倒计时显示功能
扩展建议:
1. 增加按键控制紧急模式
2. 添加黄灯过渡状态
3. 使用PWM实现亮度渐变效果
4. 添加串口通信进行状态监控
阅读全文
相关推荐

















