机考在前不想弄啊啊啊老师给个确定的截止时间吧!!!!
大作业超级极限,老师要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个阶段:(为了仿真验证,时间相应压小)
该阶段一路红,一路绿。
该阶段一路红灯不变,一路绿灯开始闪烁。
该阶段一路红灯不变,一路变黄灯。
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 纵向黄灯