文章目录
- 一、前言
- 二、交通灯
- 1.题目要求
- 2.思路
- 3.画图
- 正常情况
- 模拟故障情况
- 4.软件
- 三、总结
一、前言
最近下载了Proteus仿真软件,闲来无事也试试画一个简单的仿真图。
有需要软件的朋友可以去我的另外一篇博客下载和安装。
自用Proteus(8.15)仿真下载安装过程(附详细安装过程图)
二、交通灯
1.题目要求
基本要求:
额外要求:复位模块,数码管倒计时显示、故障报警、车流量检测和调整模块
故障报警:bcde四个指示灯的绿灯不能同时点亮;如果同时被点亮,则应自动立即停止系统,同时发出警告提示信号。
车流量检测和调整模块:车流量计数程序在一个状态变换循环先后计数两个方向的车流量,然后调用红绿灯时间调整程序,更新红绿灯时间。当前状态时间已到,判断其状态装入相应数据,然后进入下一状态。表现为检测一个方向车流量大于 30时,此方向自动增加 10 秒,车流量大于 50 时,此方向自动增加 20 秒,会自动清空一分钟以前的数据。
2.思路
首先,看基本要求,总共有5个方向的灯,分别是a,b,c,d,e方向的灯,一共有24个灯,只要按照要求逐一点亮和熄灭即可。
额外要求的话,复位模块可以直接用单片机的RST复位引脚进行复位,显示倒计时的话数码管占用GPIO太多,我这里选用OLED显示屏进行显示,故障报警的话直接模拟故障情况,用一个按键,当按键被按下时,出现故障,bcde四个指示灯的绿灯同时点亮,自动立即停止系统(停止倒计时和交通灯显示),同时发出警告提示信号(用一个蜂鸣器响)。车流量检测和调整模块没想好怎么用仿真表示。
3.画图
正常情况
按照基本要求的表格进行交通灯显示。
模拟故障情况
通过按键按下模拟故障情况,倒计时停止,bcfe方向的绿灯同时点亮。
4.软件
主函数
/* Includes ------------------------------------------------------------------*/
#include "Drv_UserSystem.h"
/**
* @brief main function.
* @param none
* @retval none
*/
int main(void)
{
UserSystemInit();//用户配置初始化
while (1)
{
if (stSysTime.flg._10ms + TEN_MILLISECOND < Time_millis()) //10ms
{
stSysTime.flg._10ms = Time_millis();
Key_Scan();//按键扫描
}
if (stSysTime.flg._50ms + FIFTY_MILLISECOND < Time_millis()) //50ms
{
stSysTime.flg._50ms = Time_millis();
}
if (stSysTime.flg._100ms + BEST_MILLISECOND < Time_millis()) //100ms
{
stSysTime.flg._100ms = Time_millis();
Receive_data_Handel();//数据接收判断
IWDG_ReloadCounter();//清开门狗
}
if (stSysTime.flg._1s + THOUSAND_MILLISECOND < Time_millis()) //1s
{
stSysTime.flg._1s = Time_millis();
Led_Run_Mode();//灯光模式
Led_Run();//灯光运行
OLED_Handel();//OLED显示
}
}
}
三、总结
今天主要讲了基于STM32的交通灯(OLED屏显示倒计时)的Proteus仿真。
感谢你的观看!