【嵌入式系统设计与实现】4 十字路口交通灯控制(简易版)

    机考在前不想弄啊啊啊老师给个确定的截止时间吧!!!!

大作业超级极限,老师要pre,最后极限3小时赶出来笑死,只局限他所教的。

目录

环境

(软硬件)方案设计与论证

软件方案设计

阶段1:通行(5s)

阶段2:绿灯闪烁(5次,每次150ms)

阶段3:变黄灯(1s)

硬件仿真方案设计

项目(软硬件)详细实现过程分析说明

利用STM32CubeMX生成工程

芯片选型

配置引脚

时钟配置

生成工程文件并打开(图表 5)

软件详细实现过程

阶段1:通行(5s)

阶段2:绿灯闪烁(5次,每次150ms)

阶段3:变黄灯(1s)

主函数完整代码展示

硬件详细实现过程

测试方案设计及结果分析说明

阶段1:通行(5s)

阶段2:绿灯闪烁(5次,每次150ms)

阶段3:变黄灯(1s)

纵向通行无误


环境

STM32CubeMX、STM32CubeIDE、PROTEUS

(软硬件)方案设计与论证

软件方案设计

本次报告需要实现十字路口交通灯控制,那么可以把把十字路口划分为横纵两个条路,各自的亮灯情况是一样的,这里我用字母T、M分别表示横纵2条路。

因为共2条路,每条路有3盏灯,那么我们可以把十字路口交通灯分为2大部分:横向通行和纵向通行。

每部分又可分为以下3个阶段:(为了仿真验证,时间相应压小)

阶段1:通行(5s)

    该阶段一路红,一路绿。

阶段2:绿灯闪烁(5次,每次150ms)

    该阶段一路红灯不变,一路绿灯开始闪烁。

阶段3:变黄灯(1s)

该阶段一路红灯不变,一路变黄灯。

硬件仿真方案设计

    2路3灯,共需要6个输出引脚。本次为了仿真我采用STM32F103R6芯片,设置PB0-PB5分别为横向和纵向的绿黄红灯输出。采用高输出功率,推挽输出,上拉电平,最大输出速度为低。命名方面横向路为T_Green, T_Yellow, T_Red;纵向路为M_Green, M_Yellow, M_Red。

项目(软硬件)详细实现过程分析说明

利用STM32CubeMX生成工程

芯片选型

我采用STM32F103R6芯片,选型进行选择。(图表 1)

图表 1 芯片选型

配置引脚

2路3灯,共需要6个输出引脚。本次为了仿真我采用STM32F103R6芯片,设置PB0-PB5分别为横向和纵向的绿黄红灯输出。采用高输出功率,推挽输出,上拉电平,最大输出速度为低。(图表 3)

本次我采用引脚配置对应如下:(T为横向路,M为纵向路)(图表 2)

引脚

PB0

PB1

PB2

PB3

PB4

PB5

T_Green

T_Yellow

T_Red

M_Green

M_Yellow

M_Red

图表 2 引脚配置

图表 3 STM32CubeMX引脚配置

时钟配置

我采用内部时钟,APB1 Prescaler改为/1,HCLK=8MHz。(图表 4)

图表 4 时钟配置

生成工程文件并打开(图表 5

图表 5 生成工程文件

软件详细实现过程

    可以不断循环3个阶段,在while循环里先横向路通行(3阶段),再纵向路通行(3阶段)。以下以横向路3阶段为例演示过程。

阶段1:通行(5s)

该阶段一路红,一路绿。那么我们需要对6个等进行设置。注意因为因为我们GPIO设置为上拉电平,则RESET为亮灯。可用电平设置函数设置,再延时函数。4.2.1    阶段1通行(5s)代码如下:

	  //【横向通行阶段1:通行(5s)】
	  //T横向绿亮,红黄灭,上拉需要反
	  HAL_GPIO_WritePin(T_Green_GPIO_Port, T_Green_Pin, GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(T_Yellow_GPIO_Port, T_Yellow_Pin, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(T_Red_GPIO_Port, T_Red_Pin, GPIO_PIN_SET);

	  //M纵向红亮,红黄灭
	  HAL_GPIO_WritePin(M_Green_GPIO_Port, M_Green_Pin, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(M_Yellow_GPIO_Port, M_Yellow_Pin, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(M_Red_GPIO_Port, M_Red_Pin, GPIO_PIN_RESET);

	  HAL_Delay(5000);	//通行5秒,(仿真暂且设为5s)

阶段2:绿灯闪烁(5次,每次150ms)

该阶段一路红灯不变,一路绿灯开始闪烁。可以用times变量存放闪烁次数(5),用循环计数,在循环里电平翻转即可实现。阶段2绿灯闪烁代码如下:

	  //【横向通行阶段2:绿灯闪烁(5次共1s)】
	  //横向绿灯闪烁5次
	  for(times=0;times<5;times++){
		  HAL_GPIO_TogglePin(T_Green_GPIO_Port,T_Green_Pin);	//翻转绿灯
		  HAL_Delay(150);	//每150ms闪烁1次
	  }

阶段3:变黄灯(1s)

该阶段一路红灯不变,一路变黄灯。与绿灯显示,另外一路不变不操作。阶段3变黄灯代码如下:

	  //【横向通行阶段3:变黄灯(1s)】
	  //T横向黄亮,红绿灭,上拉需要反
	  HAL_GPIO_WritePin(T_Green_GPIO_Port, T_Green_Pin, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(T_Yellow_GPIO_Port, T_Yellow_Pin, GPIO_PIN_RESET);

	  HAL_Delay(1000);	//黄灯1秒

主函数完整代码展示

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
  int times;	//绿灯闪烁计数
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  //先横向通行,再纵向通行

	  //【横向通行】
	  //【横向通行阶段1:通行(5s)】
	  //T横向绿亮,红黄灭,上拉需要反
	  HAL_GPIO_WritePin(T_Green_GPIO_Port, T_Green_Pin, GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(T_Yellow_GPIO_Port, T_Yellow_Pin, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(T_Red_GPIO_Port, T_Red_Pin, GPIO_PIN_SET);

	  //M纵向红亮,红黄灭
	  HAL_GPIO_WritePin(M_Green_GPIO_Port, M_Green_Pin, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(M_Yellow_GPIO_Port, M_Yellow_Pin, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(M_Red_GPIO_Port, M_Red_Pin, GPIO_PIN_RESET);

	  HAL_Delay(5000);	//通行5秒,(仿真暂且设为5s)


	  //【横向通行阶段2:绿灯闪烁(5次共1s)】
	  //横向绿灯闪烁5次
	  for(times=0;times<5;times++){
		  HAL_GPIO_TogglePin(T_Green_GPIO_Port,T_Green_Pin);	//翻转绿灯
		  HAL_Delay(150);	//每150ms闪烁1次
	  }

	  //【横向通行阶段3:变黄灯(1s)】
	  //T横向黄亮,红绿灭,上拉需要反
	  HAL_GPIO_WritePin(T_Green_GPIO_Port, T_Green_Pin, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(T_Yellow_GPIO_Port, T_Yellow_Pin, GPIO_PIN_RESET);

	  HAL_Delay(1000);	//黄灯1秒




	  //【纵向通行】
	  //【纵向通行阶段1:通行(5s)】
	  //M纵向绿亮,红黄灭,上拉需要反
	  HAL_GPIO_WritePin(M_Green_GPIO_Port, M_Green_Pin, GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(M_Yellow_GPIO_Port, M_Yellow_Pin, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(M_Red_GPIO_Port, M_Red_Pin, GPIO_PIN_SET);

	  //T横向红亮,红黄灭
	  HAL_GPIO_WritePin(T_Green_GPIO_Port, T_Green_Pin, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(T_Yellow_GPIO_Port, T_Yellow_Pin, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(T_Red_GPIO_Port, T_Red_Pin, GPIO_PIN_RESET);

	  HAL_Delay(5000);	//通行5秒,(仿真暂且设为5s)


	  //【纵向通行阶段2:绿灯闪烁(5次共1s)】
	  //纵向绿灯闪烁5次
	  for(times=0;times<5;times++){
		  HAL_GPIO_TogglePin(M_Green_GPIO_Port,M_Green_Pin);	//翻转绿灯
		  HAL_Delay(150);	//每200ms闪烁1次
	  }

	  //【纵向通行阶段3:变黄灯(1s)】
	  //纵向黄亮,红绿灭,上拉需要反
	  HAL_GPIO_WritePin(M_Green_GPIO_Port, M_Green_Pin, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(M_Yellow_GPIO_Port, M_Yellow_Pin, GPIO_PIN_RESET);

	  HAL_Delay(1000);	//黄灯1秒

  }
  /* USER CODE END 3 */
}

硬件详细实现过程

打开proteus,新建工程(图表 6)。

图表 6 新建工程

    并加入器件。我们需要模拟十字路口,在各自路口放置红黄绿3灯,共需要12个灯。为了避免烧坏板子都需要加上10k电阻。注意横纵路的同色灯可以连在一起。将灯与对应引脚连接。画图如下:(图表 7)

图表 7 电路图

测试方案设计及结果分析说明

双击芯片加入代码文件,点击运行。

阶段1:通行(5s)

该阶段一路红,一路绿。(图表 8)

图表 8 横向通行亮绿灯

阶段2:绿灯闪烁(5次,每次150ms)

该阶段一路红灯不变,一路绿灯开始闪烁。(图表 9)

图表 9 绿灯闪烁

阶段3:变黄灯(1s)

该阶段一路红灯不变,一路变黄灯。(图表 10)

图表 10 黄灯亮

纵向通行无误

图表 11 纵向绿灯

图表 12 纵向黄灯

  • 12
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jennie佳妮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值