基于51单片机的交通信号灯系统设计

news2024/12/25 0:32:37

功能:

十字路口交通灯控制程序: 正常时,EW方向计时60s,SN方向计时40s 若按时间加按键(Add_Button)按钮,EW、SN方向各加5s,不可大于99s,79s 若按时间减按键(Reduces_Button)按键,EW、SN方向各减5s,不可小于40s,20s 若按EW方向强制通行(QZ_EW_Btton)按钮,EW方向强制通行,SN方向禁止通行 若按SN方向强制通行(QZ_SN_Btton)按钮,SN方向强制通行,EW方向禁止通行。

程序运行图:

仿真原理图:

 

部分程序:

/ #define TRAFFIC_GLOBAL 1 

#include "TRAFFIC.H" 

/********************************************************************************************

* 函数名称:延时子程序

* 功    能:延时,给LED显示的延时时间

* 入口参数:时间参数

* 出口参数:无

*********************************************************************************************/

void Delay(uchar     a)

         {

                  uchar       i;

                  i=a;

                  while(i--){;}

         }

/********************************************************************************************

* 函数名称:显示子函数

* 功    能:EW方向,SN方向主干道数码管显示驱动

* 入口参数:无

* 出口参数:无

*********************************************************************************************/

void Display(void)

         {

                  char h,l;

                  h=Time_EW/10;              //EW方向计时的十位数

                  l=Time_EW%10;              //EW方向计时的个位数

          P0=table[l];              //显示EW计时时间的低位

                  EW_LED2=1;

                  Delay(2);

                  EW_LED2=0;

             P0=table[h];            //显示EW计时时间的高位

                  EW_LED1=1;

                  Delay(2);

                  EW_LED1=0;

                  h=Time_SN/10;                //SN方向计时的十位数

                  l=Time_SN%10;               //SN方向计时的个位数

                  P0=table[l];              //显示SN计时时间的低位

                  SN_LED2=1;

                  Delay(2);

                  SN_LED2=0;

             P0=table[h];            //显示SN计时时间的高位

                  SN_LED1=1;

                  Delay(2);

                  SN_LED1=0;

                 

                  h= EW1/10;                      //直行时间的十位

                  l= EW1%10;                      //直行时间的个位

                  P0=table[l];              //时间的个位显示

                  Time_Show_LED1=1;

                  Delay(2);

        Time_Show_LED1=0;

                  P0=table[h];             //时间的十位显示

                  Time_Show_LED2=1;

                  Delay(2);

             Time_Show_LED2=0;

}

/********************************************************************************************

* 函数名称:外部0中断服务程序

* 功    能:中断,检测按钮的类别,执行相应的操作;

            若Add_Button==0,通行时间加5s ;

            若Reduces_Button==0,通行时间减5s ;

            若Busy_Btton==0,开繁忙信号灯,关特殊信号灯,通行时间45s,30s;

            若Add_Button==0,关繁忙信号灯,开特殊信号灯,通行时间75s,55s;

* 入口参数:无

* 出口参数:无

*********************************************************************************************/

void EXINT0(void) interrupt 0 using 0

         {

                  EA = 0;                    //关中断

if(Add_Button==0)                  //时间加

       {

            EW1+=5;                                      //通行时间加5s

            SN1+=5;

              if(EW1>=100)                 //通行时间不得大于100s,80s

                             {

                               EW1=99;

                               SN1=79;

               }

            }

if(Reduces_Button==0)             //时间减

       {

            EW1-=5;                         //通行时间减5s

            SN1-=5;

            if(EW1<=40)                  //通行时间不得小于40s,20s

              {

                               EW1=40;

                 SN1=20;

               }

                      }              

                  EA = 1;                  //开中断

         }

/******************************************************************************

* 函数名称:外部中断1

* 功    能:中断,当遇到紧急情况,需要人工控制时,强制直行的函数处理

           若QZ_EW_Btton按下时,EW方向绿灯亮,SN方向红灯亮 ,并点亮QZ_EW_LED指示灯

                     若QZ_SN_Btton按下时,EW方向红灯亮,SN方向绿灯亮 ,并点亮QZ_SN_LED指示灯

* 入口参数:无

* 出口参数:无

********************************************************************************/

void EXINT1(void) interrupt 2 using 2

{

EA = 0; 

if(QZ_EW_Btton==0)              //EW方向强制通行按键是否按下

        {          

                          QZ_EW = ~QZ_EW;        //

                          QZ_SN = 0;                                                                        

                          if(QZ_EW) 

                          {QZ_EW_LED = 1;

                           QZ_SN_LED = 0;}

                          else           QZ_EW_LED = 0;

        }

if(QZ_SN_Btton==0)             //测试按键是否按下,按下为特殊状态

        {

                      QZ_SN = ~QZ_SN;

                          QZ_EW = 0;    

                          if(QZ_SN) 

                          {QZ_SN_LED = 1;

                           QZ_EW_LED = 0;}

                          else           

                           QZ_SN_LED = 0;

             }                                      

EA = 1;                      

}

/******************************************************************************

* 函数名称:main()

* 功    能:主函数

* 入口参数:无

* 出口参数:无

********************************************************************************/

void main(void)

{

         QZ_EW_LED = 0;

         QZ_SN_LED = 0;

         QZ_EW = 0;

         QZ_SN = 0;

         IT0=1;                          //INT0负跳变触发

         IT1=1;                  //INT0负跳变触发       

    TMOD=0x01;                  //定时器工作于方式1

         TH0=(65536-50000)/256;      //定时器赋初值

         TL0=(65536-50000)%256;

         EA=1;                       //CPU开中断总允许

         ET0=1;                      //开定时中断

         EX0=1;                      //开外部INTO中断

         EX1=1;                      //开外部INT1中断

    TR0=1;                      //启动定时

     while(1)

{                                  /*******SN通行,EW红灯*** ***************/

                Flag_EW_Yellow=0;             //EW关黄灯显示信号

                                   Time_EW=EW;       

                                   Time_SN=SN;         

                                   while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)

                              {P1=LIGHT[0];                       //SN通行,EW红灯

                           Display();}

                                   /*******SN黄灯亮,等待左拐信号,EW红灯***/

                              P1=0x00;

                                   while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)

                             {Flag_SN_Yellow=1;           //SN开黄灯信号位

                              EW_Red=1;                     //SN黄灯亮,等待左拐信号,EW红灯                                

                               Display();

                                   }

                                   /*******SN左拐绿灯亮,EW红灯*************/

                              Flag_SN_Yellow=0;             //SN关黄灯显示信号

                                   Time_SN=SNL;                                                                     

                                   while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)

                                   {P1=LIGHT[2];                 //SN左拐绿灯亮,EW红灯

                                    Display();}

                            /*******SN黄灯亮,等待停止信号,EW红灯******/

                                   P1=0x00;

                                   while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)

                             {Flag_SN_Yellow=1;           //SN开黄灯信号位

                              EW_Red=1;                     //SN黄灯亮,等待停止信号,EW红灯                              

                              Display();}                   

                        

                                   /****EW黄灯亮,等待停止信号,SN红灯***/

                                   P1=0X00;                                                      

                                   while(Time_EW>=0&QZ_EW == 0&QZ_SN == 0)

                             {Flag_EW_Yellow=1;               //EW开黄灯信号位

                              SN_Red=1;                       //EW黄灯亮,等待停止信号,SN红灯 

                              Display();}

                                   /*********EW方向强制通行**************/

                                   while(QZ_EW)

                                   {Time_EW = 88;

                                    Time_SN = 88;

                                    EW1 = 88;                                                                 

                                    Display();

                                    P1=LIGHT[4];                         //EW通行,SN红灯      

                                    EW1 = 60;

                                    SN1 = 40;} 

                                   /*********SN方向强制通行**************/

                                   while(QZ_SN)

                                   {Time_EW = 88;

                                    Time_SN = 88;

                                    EW1 = 88;                                                                 

                                    Display();

                                    P1=LIGHT[0];                          //EW通行,SN红灯       

                                    EW1 = 60;

                                    SN1 = 40;} 

                         

                               /***********赋值**********/

                              EW=EW1;

                                   SN=SN1;

                                   EWL=EWL1;

                                   SNL=SNL1;

                          }

         }

资料包括:

需要完整的资料可在我的资源里下载,也可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。

纷传点击用微信打开即可,过程有点繁琐请见谅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全网最新的Fiddler(3):fiddler界面工具栏介绍

fiddler界面工具栏介绍 &#xff08;1&#xff09;WinConfig&#xff1a;windows 使用了一种叫做“AppContainer”的隔离技术&#xff0c;使得一些流量无法正常捕获&#xff0c;在 fiddler中点击 WinConfig 按钮可以解除这个诅咒&#xff0c;这个与菜单栏 Tools→Win8 Loopback…

【Flutter 组件】003-基础组件:按钮

【Flutter 组件】003-基础组件&#xff1a;按钮 文章目录【Flutter 组件】003-基础组件&#xff1a;按钮一、ElevatedButton 悬浮按钮1、概述2、构造方法3、示例代码示例运行结果二、TextButton 文本按钮1、概述2、构造方法3、示例代码示例运行结果三、OutlinedButton 边框按钮…

本地搭建xxl-job服务及连接验证

1、本地搭建xxl-job服务 1.1、使用git下载https://github.com/xuxueli/xxl-job.git代码 1.2、使用idea打开下载的项目&#xff0c;切换2.2.0分支 1.3、 源码主要包括3部分&#xff0c;admin模块是控制台的 core包是核心包&#xff0c;包括一些调度的逻辑等&#xff0c;项目中…

负荷预测|一种改进支持向量机的电力负荷预测方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

[附源码]Python计算机毕业设计SSM基于的防疫隔离服务系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

从Qt 4到Qt 5(一)Qt 5.2安装、程序迁移和发布

导语 Qt 5的第二个重大版本Qt 5.2的beta版终于发布了&#xff0c;Qt 5.2是官方一再强调开发Android要使用的版本。经过了近一年的等待&#xff0c;这次终于可以完成夙愿&#xff0c;继续更新Qt系列教程了。在后面的教程中会尽量涉及大家经常问到、急需解决的问题&#xff0c;也…

YOLOV7 目标检测模型调试记录

前言 YOLO系列在目标检测领域可谓名声赫赫&#xff0c;其性能表现不俗&#xff0c;如今其已经更新到了YOLOV7版本&#xff0c;今天便来一睹其风采。 博主之前只是对YOLO算法的原理一知半解&#xff0c;并未实验&#xff0c;因此并不熟练&#xff0c;因此&#xff0c;借此机会来…

【JavaSE成神之路】一文洞悉Java的方法

哈喽&#xff0c;我是兔哥呀&#xff0c;今天就让我们继续这个JavaSE成神之路&#xff01; 这一节啊&#xff0c;咱们要学习的内容是Java语言的方法。 目录 1.什么是Java方法 2.快速入门Java方法 3.如何调用Java方法 4.关于Java方法重载这件事 作业 1.什么是Java方法 Jav…

补遗: CS61a

补遗&#xff1a; CS61a 通过“圣经”《SICP》 了解到这门课。SCIP读着有点困难&#xff0c;想通过课程的引导。但是这个课程要比书基础很多&#xff0c;就当对计科学习的回顾和补遗了。本笔记也会在我读完 SICP 后更新。 课程地址&#xff1a;CS 61A Fall 2022 参照原书目录…

第52篇 Qt Quick简介

导语 在上一篇我们已经安装好了Qt 5.5&#xff0c;现在正式开始学习Qt5中全新的Qt Quick编程。Qt Quick对于大部分人来说是一个全新的概念&#xff0c;对这样一个全新的东西要怎样开始学习呢&#xff1f;在没有专业书籍&#xff08;当然&#xff0c;《Qt 5编程入门》现在已经出…

java计算机毕业设计ssm在线学习系统的设计与开发3nnzq(附源码、数据库)

java计算机毕业设计ssm在线学习系统的设计与开发3nnzq&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&a…

MapReduce 工作原理

文章目录MapReduce 工作原理一、MapReduce工作过程二、MapTask工作原理三、Reduce Task工作原理四、Shuffle工作原理五、MapReduce编程组件1、inputFormat组件2、Mapper组件3、Reducer组件4、Partitioner组件5、Combiner组件6、OutputFormat组件六、MapReduce运行模式1、本地运…

关于个人网站的搭建日志(1)静态网页

注&#xff1a;这篇文章不是教程&#xff0c;仅仅是个人踩过的一些坑的整理&#xff0c;建议大家去和前辈们多多交流&#xff0c;祝早日进步 &#xff08;1&#xff09;第一步&#xff0c;关于服务器&#xff1a; 我这里使用的是阿里云的云服务器&#xff08;0元一个月。。。…

视觉合集4

这里总结一些论文,包括多标签分类、姿态估计、目标检测、HOI、小样本学习等研究方向。 01 面向具有标注噪声的人脸表情识别 Attack can Benefit: An Adversarial Approach to Recognizing Facial Expressions under Noisy Annotations 大规模人脸表情数据集通常表现出极端的…

基于VBA实现电缆结构自动出图(一)——自动出圆形

大家敢相信吗&#xff0c;原来VBA竟然可以实现电缆结构自动出图&#xff0c;换句话说&#xff0c;只要输入数据&#xff0c;VBA会自动将电缆的结构画出来&#xff0c;同时还可以渲染&#xff0c;结果竟然不输画图软件&#xff0c;真真让我刮目相看。这里我就不过多介绍VBA了&am…

类的六个默认成员函数

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情 况下&#xff0c;都会自动生成下面6个默认成员函数。 2.构造函数 构造函数是一个特殊的成员函数&#xff0c;名字与…

STM32F4 | 跑马灯实验

文章目录一、 STM32F4 IO 口简介二、硬件设计三、软件设计1.位带操作&#xff08;F7除外&#xff09;四、实验现象五、STM32CubeMX 配置 IO 口输入在本章中&#xff0c;我们将通过代码控制 ALIENTEK 阿波罗 STM32 开发板上的两个 LED 灯 DS0 和 DS1 交替闪烁&#xff0c;实…

【salesforce Admin必备】-想到啥写点啥

【salesforce Admin必备】-想到啥写点啥 文章目录【salesforce Admin必备】-想到啥写点啥前言一&#xff0c;货币相关1.带汇率的多种货币-Activate multiple currencies with exchange rates1.1 启用多币种2.Update the Exchange Rate with ACM2.1启用高级货币管理&#xff08;…

数据结构【树和二叉树的相关知识和题目】

文章目录引言&#xff1a;一、树和二叉树的相关知识&#xff08;一、&#xff09;什么是树1.树&#xff08;1.&#xff09;日常生活中的树&#xff08;2.&#xff09;树的基本概念&#xff08;非线性结构&#xff09;&#xff08;3.&#xff09;代码人眼中的树&#xff1a;&…

ORB-SLAM2 --- Tracking::UpdateLocalKeyFrames函数

目录 1.函数作用 2. 函数步骤 3.code 4.函数解析 4.1 记录共视 4.2 更新局部关键帧&#xff08;mvpLocalKeyFrames&#xff09; 4.3 更新当前帧的参考关键帧&#xff0c;与自己共视程度最高的关键帧作为参考关键帧 1.函数作用 跟踪局部地图函数里&#xff0c;更新局部…