基于51单片机交通信号灯仿真_东西管制+南北管制

2023-11-09 15:50

本文主要是介绍基于51单片机交通信号灯仿真_东西管制+南北管制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于51单片机交通信号灯仿真_东西管制+南北管制

仿真:proteus 7.8

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:J003

基本功能

通过单片机模拟交通灯,东西方向黄绿红,南北方向黄绿红的工作方式。

1、显示时间倒计时;

2、南北方向14秒绿灯,最后3秒绿灯闪烁,之后1秒黄灯再转红灯20秒;

3、东西方向19秒绿灯,最后3秒绿灯闪烁,之后1秒黄灯再转红灯15秒;

4、通过按键控制东西方向强制绿灯,或南北方向强制绿灯,数码管显示00,应对紧急情况。

5、具体秒数可在程序改数字实现。

仿真图

正常倒计时和红黄绿灯显示

显示时间倒计时;

1南北方向14秒绿灯,最后3秒绿灯闪烁,之后1秒黄灯再转红灯20秒;

2东西方向19秒绿灯,最后3秒绿灯闪烁,之后1秒黄灯再转红灯15秒;

具体倒计时时间可以根据代码里面的宏定义做修改

img

南北管控状态

南北方向强制绿灯,东西方向强制红灯,倒计时显示00

img

东西管控状态

东西方向强制绿灯,南北方向强制红灯,倒计时显示00

img

程序

img

程序讲解

主要的核心点是倒计时,东西直行绿灯时间+黄灯时间=南北红灯时间,

在南北红灯的过程中,东西完成了绿灯倒计时+黄灯倒计时两个步骤。

倒计时的产生

记住这个点就可以设计软件了。首先要有时间基础,倒计时从哪来呢?

一般两个来源:

1,延时

delay(1000ms);

通过死循环卡主软件的运行来达到延时效果,程序执行效率极低,不可取。

2,定时

通过定时器产生时基。软件设置50ms产生一次定时中断,在中断执行函数中做计数。

void InintTimer0()
{TMOD |=0X01;TH0=0X4C;TL0=0X00;ET0=1;TR0=1;//打开定时器中断
}

20ms执行一次中断函数,通过count1s累加到50判断时间过去了一秒。设置一秒标志位flag1s置一。

void Timer0() interrupt 1
{TH0=0XBB;TL0=0X00;KeyScan();if(++count500ms<25){}else{count500ms = 0;if(FilteFlag){//闪烁标志位FilteFlag = 0;}else{FilteFlag =1;}} if(++count1s<50)	return;count1s=0;if(StaSysterm==NormalRun) flag1s=1;	 //非正常运行时,不红绿灯数值不减一	all_mode_flag1s =1;
}

在主函数while循环里判断标志位,如果是1,则倒计时计数值减一,即完成了倒计时的软件设计思路

    	LEDScan();				  		//数码管即LED扫描KeyDriver();			  		//键盘驱动扫描if(flag1s)//1S执行一次{flag1s=0;NS_time--;			  		//红绿灯倒计时时间减WE_time--;}	

闪烁状态则通过特殊标志位和时间控制

		if((index == 1)&&(NS_time<5)&&(StaSysterm==NormalRun)){//绿灯闪烁,红灯不变if(FilteFlag){//绿灯闪烁 L0闪烁 L3常亮 其他灭 P2 :0000 1001(0x09) 或 0000 1000(0x08)P2=0x09;}else{P2=0x08;}}else if((index == 3)&&((WE_time<5))&&(StaSysterm==NormalRun)){//绿灯闪烁 L5闪烁 L2常亮 其他灭 P2 :0010 0100(0x24) 或 0000 0100(0x04)if(FilteFlag){P2=0x24;	}else{P2=0x04;	}			}

数码管动态显示驱动方式,在主函数中扫描显示倒计时时间。

#include "use.h"
#include "main.h"uchar code seg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code seg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar BackupGreen,BackupRed,CopyLight;void Seg_Display(uchar number,uchar wei)	//数码管动态显示程序 wei代表数码管Q0 Q1 Q2 Q3的位选
{P0=0XFF;//清零,防止重影we=1;we=0;P0=seg_du[number];du=1;du=0;P0=seg_we[wei];we=1;we=0;
}
红黄绿灯状态处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1CnrleaK-1661873815319)(https://picturebed-1300424929.cos.ap-nanjing.myqcloud.com/typora/%E4%BA%A4%E9%80%9A%E7%81%AF.jpg)]

交通灯状态实际上分为四个状态:

1.南北道绿灯通行,东西道红灯

2.南北道黄灯通行,东西道红灯

3.南北道红灯,东西道绿灯通行

4.南北道红灯,东西道黄灯通行

做一个状态机,设置四个状态,在四个状态的变化中,设置红绿黄灯的亮和灭实现基础交通灯运行逻辑

倒计时显示处理

实际上倒计时显示就是显示main_road_time–; secondary_road_time–;设计函数通过数码管分别显示南北道的NS_time和东西道的WE_time即可

		Seg_Display(NS_time/10,0);Seg_Display(NS_time%10,1);Seg_Display(WE_time/10,2);Seg_Display(WE_time%10,3);

资料清单

资料下载链接

img

这篇关于基于51单片机交通信号灯仿真_东西管制+南北管制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/377081

相关文章

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。从而减轻手动跑仿真,手动查看log信息的重复无效低质量的操作。下面简单记录下自己的思路并贴出自己的代码,方便自己以后使用和修正。 2 思路整理 作为一个IC d

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

代码训练营 Day26 | 47.排序II | 51. N-皇后 |

47.排序II 1.跟46题一样只不过加一个树层去重 class Solution(object):def backtracking(self,nums,path,result,used):# recursion stopif len(path) == len(nums):# collect our setresult.append(path[:])return for i in range(

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

Matlab simulink建模与仿真 第十章(模型扩展功能库)

参考视频:simulink1.1simulink简介_哔哩哔哩_bilibili 一、模型扩展功能库中的模块概览         注:下面不会对Block Support Table模块进行介绍。 二、基于触发的和基于时间的线性化模块 1、Trigger-Based Linearization基于触发的线性化模块 (1)每次当模块受到触发时,都会调用linmod或者dlinmod函数