• 【嵌入式系统设计与实现】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. //【横向通行阶段1:通行(5s)】
    2. //T横向绿亮,红黄灭,上拉需要反
    3. HAL_GPIO_WritePin(T_Green_GPIO_Port, T_Green_Pin, GPIO_PIN_RESET);
    4. HAL_GPIO_WritePin(T_Yellow_GPIO_Port, T_Yellow_Pin, GPIO_PIN_SET);
    5. HAL_GPIO_WritePin(T_Red_GPIO_Port, T_Red_Pin, GPIO_PIN_SET);
    6. //M纵向红亮,红黄灭
    7. HAL_GPIO_WritePin(M_Green_GPIO_Port, M_Green_Pin, GPIO_PIN_SET);
    8. HAL_GPIO_WritePin(M_Yellow_GPIO_Port, M_Yellow_Pin, GPIO_PIN_SET);
    9. HAL_GPIO_WritePin(M_Red_GPIO_Port, M_Red_Pin, GPIO_PIN_RESET);
    10. HAL_Delay(5000); //通行5秒,(仿真暂且设为5s)

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

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

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

    阶段3:变黄灯(1s)

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

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

    主函数完整代码展示

    1. int main(void)
    2. {
    3. /* USER CODE BEGIN 1 */
    4. /* USER CODE END 1 */
    5. /* MCU Configuration--------------------------------------------------------*/
    6. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    7. HAL_Init();
    8. /* USER CODE BEGIN Init */
    9. /* USER CODE END Init */
    10. /* Configure the system clock */
    11. SystemClock_Config();
    12. /* USER CODE BEGIN SysInit */
    13. /* USER CODE END SysInit */
    14. /* Initialize all configured peripherals */
    15. MX_GPIO_Init();
    16. /* USER CODE BEGIN 2 */
    17. int times; //绿灯闪烁计数
    18. /* USER CODE END 2 */
    19. /* Infinite loop */
    20. /* USER CODE BEGIN WHILE */
    21. while (1)
    22. {
    23. /* USER CODE END WHILE */
    24. /* USER CODE BEGIN 3 */
    25. //先横向通行,再纵向通行
    26. //【横向通行】
    27. //【横向通行阶段1:通行(5s)】
    28. //T横向绿亮,红黄灭,上拉需要反
    29. HAL_GPIO_WritePin(T_Green_GPIO_Port, T_Green_Pin, GPIO_PIN_RESET);
    30. HAL_GPIO_WritePin(T_Yellow_GPIO_Port, T_Yellow_Pin, GPIO_PIN_SET);
    31. HAL_GPIO_WritePin(T_Red_GPIO_Port, T_Red_Pin, GPIO_PIN_SET);
    32. //M纵向红亮,红黄灭
    33. HAL_GPIO_WritePin(M_Green_GPIO_Port, M_Green_Pin, GPIO_PIN_SET);
    34. HAL_GPIO_WritePin(M_Yellow_GPIO_Port, M_Yellow_Pin, GPIO_PIN_SET);
    35. HAL_GPIO_WritePin(M_Red_GPIO_Port, M_Red_Pin, GPIO_PIN_RESET);
    36. HAL_Delay(5000); //通行5秒,(仿真暂且设为5s)
    37. //【横向通行阶段2:绿灯闪烁(5次共1s)】
    38. //横向绿灯闪烁5次
    39. for(times=0;times<5;times++){
    40. HAL_GPIO_TogglePin(T_Green_GPIO_Port,T_Green_Pin); //翻转绿灯
    41. HAL_Delay(150); //每150ms闪烁1次
    42. }
    43. //【横向通行阶段3:变黄灯(1s)】
    44. //T横向黄亮,红绿灭,上拉需要反
    45. HAL_GPIO_WritePin(T_Green_GPIO_Port, T_Green_Pin, GPIO_PIN_SET);
    46. HAL_GPIO_WritePin(T_Yellow_GPIO_Port, T_Yellow_Pin, GPIO_PIN_RESET);
    47. HAL_Delay(1000); //黄灯1秒
    48. //【纵向通行】
    49. //【纵向通行阶段1:通行(5s)】
    50. //M纵向绿亮,红黄灭,上拉需要反
    51. HAL_GPIO_WritePin(M_Green_GPIO_Port, M_Green_Pin, GPIO_PIN_RESET);
    52. HAL_GPIO_WritePin(M_Yellow_GPIO_Port, M_Yellow_Pin, GPIO_PIN_SET);
    53. HAL_GPIO_WritePin(M_Red_GPIO_Port, M_Red_Pin, GPIO_PIN_SET);
    54. //T横向红亮,红黄灭
    55. HAL_GPIO_WritePin(T_Green_GPIO_Port, T_Green_Pin, GPIO_PIN_SET);
    56. HAL_GPIO_WritePin(T_Yellow_GPIO_Port, T_Yellow_Pin, GPIO_PIN_SET);
    57. HAL_GPIO_WritePin(T_Red_GPIO_Port, T_Red_Pin, GPIO_PIN_RESET);
    58. HAL_Delay(5000); //通行5秒,(仿真暂且设为5s)
    59. //【纵向通行阶段2:绿灯闪烁(5次共1s)】
    60. //纵向绿灯闪烁5次
    61. for(times=0;times<5;times++){
    62. HAL_GPIO_TogglePin(M_Green_GPIO_Port,M_Green_Pin); //翻转绿灯
    63. HAL_Delay(150); //每200ms闪烁1次
    64. }
    65. //【纵向通行阶段3:变黄灯(1s)】
    66. //纵向黄亮,红绿灭,上拉需要反
    67. HAL_GPIO_WritePin(M_Green_GPIO_Port, M_Green_Pin, GPIO_PIN_SET);
    68. HAL_GPIO_WritePin(M_Yellow_GPIO_Port, M_Yellow_Pin, GPIO_PIN_RESET);
    69. HAL_Delay(1000); //黄灯1秒
    70. }
    71. /* USER CODE END 3 */
    72. }

    硬件详细实现过程

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

     

    图表 6 新建工程

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

    图表 7 电路图

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

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

    阶段1:通行(5s)

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

     

    图表 8 横向通行亮绿灯

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

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

     

    图表 9 绿灯闪烁

    阶段3:变黄灯(1s)

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

     

    图表 10 黄灯亮

    纵向通行无误

    图表 11 纵向绿灯

     

    图表 12 纵向黄灯

  • 相关阅读:
    Java百度地图教程:创建地图应用与基本API的使用
    软考架构师知识点
    POJ2676数独游戏题解
    leetcode 215.数组中第k大的元素
    Zookeeper 入门
    SpringBoot实践(三十四):Gradle的使用
    GreenPlum优化点之参数篇
    C++中“AVL”树的模拟实现以及实现中遇见的问题
    高级java每日一道面试题-2024年8月10日-网络篇-websocket应用的是哪个协议?
    如何用 Markdown 写出可以在各个平台兼容方便查看并且非常好看的readme或文章?附详细举例图文说明、工具、模版
  • 原文地址:https://blog.csdn.net/weixin_51695846/article/details/125430375