机考在前不想弄啊啊啊老师给个确定的截止时间吧!!!!
大作业超级极限,老师要pre,最后极限3小时赶出来笑死,只局限他所教的。
目录
STM32CubeMX、STM32CubeIDE、PROTEUS
本次报告需要实现十字路口交通灯控制,那么可以把把十字路口划分为横纵两个条路,各自的亮灯情况是一样的,这里我用字母T、M分别表示横纵2条路。
因为共2条路,每条路有3盏灯,那么我们可以把十字路口交通灯分为2大部分:横向通行和纵向通行。
每部分又可分为以下3个阶段:(为了仿真验证,时间相应压小)
该阶段一路红,一路绿。
该阶段一路红灯不变,一路绿灯开始闪烁。
该阶段一路红灯不变,一路变黄灯。
2路3灯,共需要6个输出引脚。本次为了仿真我采用STM32F103R6芯片,设置PB0-PB5分别为横向和纵向的绿黄红灯输出。采用高输出功率,推挽输出,上拉电平,最大输出速度为低。命名方面横向路为T_Green, T_Yellow, T_Red;纵向路为M_Green, M_Yellow, M_Red。
我采用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 生成工程文件
可以不断循环3个阶段,在while循环里先横向路通行(3阶段),再纵向路通行(3阶段)。以下以横向路3阶段为例演示过程。
该阶段一路红,一路绿。那么我们需要对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)
该阶段一路红灯不变,一路绿灯开始闪烁。可以用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变黄灯代码如下:
- //【横向通行阶段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 电路图
双击芯片加入代码文件,点击运行。
该阶段一路红,一路绿。(图表 8)
图表 8 横向通行亮绿灯
该阶段一路红灯不变,一路绿灯开始闪烁。(图表 9)
图表 9 绿灯闪烁
该阶段一路红灯不变,一路变黄灯。(图表 10)
图表 10 黄灯亮
图表 11 纵向绿灯
图表 12 纵向黄灯