找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7205|回复: 1
收起左侧

基于单片机的交通灯控制系统课程设计说明书(word格式可编辑文档下载)

[复制链接]
ID:313885 发表于 2018-4-22 18:06 | 显示全部楼层 |阅读模式

课程设计说明书

课程名称:      《单片机技术》     

设计题目:基于单片机的交通灯控制系统

学    院:  电子信息与电气工程学院

学生姓名:*      

学    号:140208*      

专业班级:14级通信工程1班   

指导教师:段*         


设计题目
基于单片机的交通灯控制系统
学生姓名
栗子娟
所在学院
电子信息与电器工程学院
专业、年级、班
14级通信1班

设计要求:

1.以单片机为核心控制器设计一个能实现来显示路口通行与禁行的交通灯系统

2.时钟电路11.0592MHz的晶体振荡器和33pf的电容来实现,且晶振电路要靠近单片机

  • 要有复位电路随时可以手动复位恢复交通灯系统的初始状态
  • 随时手动实现东西方向与南北方向的通行与禁行,且东西,南北方向的禁行与通行时间可灵活调整
  • 要有电源模块

学生应完成的工作:设计出一个红黄绿指示灯能相互转换,且能实现手动根据实际情况随时手动,实现东西与南北方向的禁行与通行,且东西、南北方向的禁行与通行时间可灵活调整的交通灯系统。


工作计划:

4月3号—4号完成原理图的设计;

4 月5号—6号进行PCB设计;

4 月6号—7号制作PCB板;

4 月10号—11号电路板安装与调试;

4月14号提交课程设计报告。



指导教师(签名):                学生(签名): 手写


基于单片机的交通灯控制系统

摘 要:

本次课题是以单片机为核心控制器来设计一个能实现交通灯红、黄、绿三个状态相互转换,及用倒计时来显示路口通行与禁行的交通灯系统。该设计以现实生活中的交通十字路口为模型,利用单片机的最小系统来实现基本的电路功能,通过I/O端口的输入和输出实现对数码管和LED灯的控制。本次设计的交通灯不仅可以实现指示灯三个状态的转换和倒计时的显示,而且可以根据实际情况随时手动,实现东西与南北方向的禁行与通行,且东西、南北方向的禁行与通行时间可灵活调整。




目录

1.设计背景

1.1开发背景

1.2发展前景

2.设计方案

2.1方案一

2.2方案二

2.3方案三

3. 方案实施

3.1设计内容

3.2 方案执行

3.3制版与调试

4. 结果与结论

5.收获与致谢

6. 参考文献

7. 附件

7.1附录1

7.2附录2

7.3 附录3




1.设计背景1.1开发背景

随着我国国民经济的迅速发展和人口的快速增加,人们对各种交通车辆的需求更是越来越大,交通工具的迅猛发展以及道路资源的局限性,给城市交通带来巨大的压力,交通拥堵问题已成为影响现代城市可持续发展的重要因素。城市交通控制系统是用于城市交通数据监测、交通信号灯控制与交通疏导的计算机综合管理系统,它是现代城市交通监控系统中最重要的组成部分。如何采用合适的控制方法,最大限度利用好耗费巨资修建的城市道路,缓解城市道路压力,越来越成为交通运输管理和城市规划部门亟待解决的主要问题。

传统的解决途径主要有两个:一是加大交通基础设施建设的投入,但资金、土地等稀缺资源的有限性又是不可回避的问题,道路基础设施是不可能无限扩展的;另一个就是限制交通流量,主要是通过法律和行政的手段实现。但是很显然,传统的方法满足不了日益增长的交通出行,因此人们就希望通过增加技术含量的方法提高现有道路的利用率,提高道路交通的安全程度和道路使用的舒适性,所以对交通灯的智能化需求越来越迫切。

1.2发展前景

         智能交通系统是将先进的信息技术、数据通讯传输技术、电子传感技术、电子控制技术及计算机处理技术等有效的集成运用于整个地面交通管理系统而建立的一种在大范围内、全方位发挥作用的实时、准确、高效的综合交通运输管理系统。对城市交通流进行智能控制,可以使道路畅通,提高交通效率。合理进行交通控制可以对交通流进行有效的引导和调度,使交通保持在一个平稳的运行状态,从而避免或缓和交通拥挤状况,大大提高交通运输的运行效率,还可以减少交通事故,增加交通安全,降低污染程度,节省能源消耗。

        交通系统作为一个时变的、具有随机性的复杂系统,越来越多研究控制理论的学者投身到交通控制的研究中,在交通信号控制领域提出了一些新方法、新思路。如静态多段配时控制、准动态多段配时控制、最优控制、大系统递阶控制、模糊控制、神经网络控制,网络路由控制等。利用模糊控制智能控制技术进行交叉口信号灯控制能取得比定时控制与感应控制更好的效果,因此模糊交通控制已经成为了交通信号控制的主流方向之一

2.设计方案2.1方案一

采用标准AT89C52单片机作为控制器;通行倒计时显示采用两位数码管;通行与禁行指示灯采用红、黄、绿发光二极管;按以上系统构架设计,单片机端口资源刚好满足要求。该系统具有电路简单、设计方便、显示亮度高、耗电较少以及可靠性高等特点。整体电路组成框图如图1所示。

图2 采用16×16点阵LED发光管设计的交通灯控制系统(见51hei附件)

2.2方案二

采用AT89C52单片机作为控制器,通行倒计时显示采用16×16点阵LED发光管,通行与禁行指示灯也采用16×16点阵双色LED发光管。该系统设计框架如图2所示。列驱动采用74LS595以实现串行端口扩展,行驱动采用4/16译码器74LS154动态扫描,译码器74LS154生成16条行选通信号线,通过驱动器驱动对应的行线。每条行线上需要较大的驱动电流,应选用大功率三极管作为驱动管。这种设计方案图案显示逼真,单片机占用端口资源少;缺点是需要大量的硬件,电路复杂,耗电量大。因此在模型制作中较少采用此方案。

2.3方案三

采用AT89S51单片机作为控制器,通行倒计时及通行与禁行指示采用单块LCD液晶点阵显示器。这种设计方案占用单片机的端口最少,硬件也少,耗电也最小,显示图案也很精美,但亮度太暗,晚上还得开背光灯,所以也较少采用。

综上所述,方案一具有综合设计优点,因此交通灯控制系统模型采用方案一设计。

3. 方案实施3.1设计内容

此次设计的交通灯系统可分为三个模块:电源模块,单片机的最小系统模块以及显示模块。

1.电源模块

电源模块是用来给单片机的工作提供电源的,此次设计的电源模块需要为单片机工作提供+5V的固定稳压直流电压,主要是用三端稳压器7805来实现的。

该模块包括三部分电路:整流电路,滤波电路,稳压电路。整流电路的目的是将不能直接给单片机提供工作电源的交流电转化成能为单片机提供电源的直流电。本电路中选用的是桥式整流,是通过KBP206G–BP整流桥来实现的。滤波电路是用来对整流电路输出的电压进行处理,整流电路输出的直流电压中脉动成分比较大,所以需要经过滤波电路的处理。本电路中选用的是电容滤波,是通过电容并联来实现的。稳压电路是指在输入电压、负载、环境温度、电路参数等发生变化时仍能保持输出电压恒定。为了保证单片机能长时间持续稳定的工作,就需要有相对稳定的可用电源。本次设计中选用固定三端稳压器7805来实现稳压电路的工作。设计完成的电源模块原理图及仿真图如

图3.电源模块仿真图

2.单片机的最小系统模块

最小系统模块包括三部分:单片机,复位电路,晶振电路。

晶振电路的作用是为系统提供基本的时钟信号。它结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,单片机的运行速度也就越快。在该设计中,我们选用的是11.0592MHz的晶振振荡器,且采用的是内部震荡的典型电路。

复位电路的第一功能是上电复位,它是一种用来使电路恢复到起始状态的电路设备,可以确保单片机系统中电路稳定可靠工作。它的优势在于一是在给电路通电时马上进行复位操作,二是在必要时可以由手动操作,三是根据程序或者电路运行的需要自动地进行。在本次设计中,我们选用的是手动按钮复位,复位电路用电阻和电容组合就可以实现了。

本次设计用到的单片机型号为AT89S51,是一个低功耗,高性能CMOS8位单片机,片内含4kB的可反复擦写1000次的Flash只读程序存储器。它有32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。

      

       图4.复位电路                           图5.引脚图

AT89S51单片机有40个引脚下边简单介绍一下这40个引脚的功能。

①电源引脚2个

VCC:供电电压

GND:接地

②时钟引脚2个

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。用片内振荡器时,该脚接外部石英晶体和微调电容。外接时钟源时,该脚接外部时钟振荡器的信号。

XTAL2:来自反向振荡器的输出。当使用片内振荡器,该脚连接外部石英晶体和微调电容。当使用外部时钟源时,本脚悬空。

③控制引脚(4个并行I/O口引脚P0、P1、P2、P3,RST,ALE/PROG,PSEN,EA/VPP)

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,作输入,P1口被外部下拉为低电平时,将输出电流。在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,作为输入。并因此作为输入时,将输出电流。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容,在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流。

I/O口作为输入口时有两种工作方式:读端口,读引脚。

RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

以上就是对AT89S51单片机引脚的介绍。

3.显示模块

通过I/O端口的输入和输出实现对数码管和LED灯的控制。

3.2 方案执行

       基于以上方案原理及设计,我们用Altium Designer软件设计了原理图并生成了PCB图,用Proteus软件进行了仿真。

    Altium Designer软件实现了原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合,可以为设计者提供全新的设计解决方案。因此,在本次设计中我们也选择用该软件来进行原理图的设计。原理图如图7所示,PCB图如图8所示

   Proteus软件可完成从原理图布图、PCB设计、代码调试到单片机与外围电路的协同仿真,真正实现了从概念到产品的完整设计,是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台。Proteus软件可以支持主流单片机系统的仿真围芯片,还可以提供软件调试功能,具有全速、单步、设置断点等调试功能,同时可以观察各变量以及寄存器等的当前状态,并支持第三方编译和调试环境,因此,我们选用Proteus软件来实现本次设计的仿真。仿真图如图9  

    在完成原理图设计,转成PCB图,完成仿真之后,需要进行程序的写入。写程序用的是C语言,程序见附录,程序结构框架如图6所示

图6.程序结构框图

3.3制版与调试

   以电子线路为基础的各种电子产品在安装完成后一般都要进行调试,才能正常地进行工作。在调试过程中常常会出现各种电路故障,经过检测、排查,才能准确地排除故障。调试主要是包括调整和测试两个部分。

调整主要是对电路参数的调整。一般是对电路中可调元器件,例如电容、电感等部分进行调整,使电路功能达到预期的效果。测试主要是对电路的各项技术指标和功能进行测试和检查,并与设计要求的性能指标相比较,以确定电路是否能实现预期的功能。

调试和调测试是相互依赖、互相补充的,统称为调试。由于在实际工作中,二者是一项工作的两个方面。经测试、调整、再测试、再调整,直到实现电路要求的设计指标为止。能够采用适当的方法查找、判断和确定故障的具体部位及其原因,是故障检测的关键。

    在应用中,我们检测电子线路故障经常采用观察法。观察法又分为静态观察法和动态观察法。所谓静态观察法就是在电子线路通电前通过目视检查找出某些故障。主要检查焊点是否虚焊、导线接头是否接好、接插件是否松脱、管脚是否插错方向或折弯等。当静态观察没有发现异常时,可进一步采用动态观察法。

动态观察法又称通电观察法,即给电路通电后,通过观察电路内有无打火,冒烟现象,或是闻到电路内有无烧焦、烧糊的异味;手触摸一些器件有无发烫。发现异常立刻断开电源。由通电观察,可以确定故障原因,但大部分情况下并不能确认故障的确切位置。

4. 结果与结论

    预期的结果是该交通灯不仅可以实现指示灯三个状态的转换和倒计时的显示,而且可以根据实际情况随时手动,实现东西与南北方向的禁行与通行,且东西、南北方向的禁行与通行时间可灵活调整。按下复位键,系统可以恢复到初始状态进行工作,按下东西方向的通行键,东西方向可以通行,按下南北方向的通行键南北方向可以通行。理想和现实还是有差距的,完成焊接和调试之后,经过简单的观察和调试,并没有发现电路板上有开路和短路现象,接通电源之后,红黄绿三个状态的指示灯相互转化,复位键可以正常工作,但是数码管并没有实现倒计时计数,没有得到预期的结果。电路板成品图如图10所示

5.收获与致谢

通过这次的课程设计,我们进一步了解和掌握了单片机的应用和工作原理,同时也巩固了C语言编程,熟悉了Altium Designer软件的操作,熟悉了原理图的设计和PCB图的生成,更重要的是接触到了Proteus软件,又学到了一些新的知识,在这次的课程设计中,既巩固了原来学过的旧知识,同时也接触到了新的知识;既学到了知识,也锻炼了自己的动手能力,同时也加强了学生与学生之间的配合,融洽了师生之间的关系。同时也在告诉我们学无止境,要多多的去尝试新的知识,接受新的事物。让我们能在融洽的环境中学到知识,也不断成长。特别感谢学院和老师们能为我们提供这么好的学习条件,让我们能在融洽的环境中学到知识,也不断成长。感谢老师的指导和同学的帮助,虽然课程设计的结果不尽人意,但是从中受益无穷。

6. 参考文献

[1] 张毅刚.单片机原理及接口技术[M] .哈尔滨:哈尔滨工业大学出版社,1990.

[2] 李广弟.单片机基础[M] .北京:北京航空航天大学出版社,1992.

[3] 谭浩强.单片机课程设计[M] .北京:清华大学出版社,1989.

[4] 先锋工作室.单片机程序设计实例[M] .北京:清华大学出版社,2003.

7.   附件7.1附录1
元器件清单

元器件清单

元器件名称

型号规格

数量

价格

备注

单片机

AT89S51

1

40脚底座

1

两位数码管

4

红黄绿发光二极管

各4个

510Ω电阻

15

200Ω电阻

10

1KΩ电阻

5

10KΩ电阻

2

晶振

11.0592MHZ

1

33pf电容

4

10uf电容

3

100pf电容

2

100uf电容

2

7805

1

四角按键

4

USB母口

2

接线端子

1

KBP206G-BP整流桥

1

单排插针

2

7.3 附录3

图7.原理图

图8.PCB图

图9.仿真图

图10实物图


单片机源程序如下:
  1. #include <reg51.h>                                              //包含MCS-51单片机头文件
  2. #define uchar unsigned char                                                   //定义宏uchar
  3. #define unit unsigned int                                                       //定义宏uint
  4. sbit  P1_0=P1^0;                                                 //定义单片机I/O端口P1.0
  5. sbit  P1_1=P1^1;                                                 //定义单片机I/O端口P1.1
  6. sbit  P1_2=P1^2;                                                 //定义单片机I/O端口P1.2
  7. sbit  P1_3=P1^3;                                                 //定义单片机I/O端口P1.3
  8. sbit ew_red=P0^0;                            //定义单片机I/O端口P0.0为东西方向红灯控制位
  9. sbit ew_yellow=P0^1;                         //定义单片机I/O端口P0.1为东西方向黄灯控制位
  10. sbit ew_green=P0^2;                          //定义单片机I/O端口P0.2为东西方向绿灯控制位
  11. sbit sn_red=P0^3;                             //定义单片机I/O端口P0.3为南北方向红灯控制位
  12. sbit sn_yellow=P0^4;                          //定义单片机I/O端口P0.4为南北方向黄灯控制位
  13. sbit sn_green=P0^5;                           //定义单片机I/O端口P0.5为南北方向绿灯控制位
  14. sbit key_earth_west=P3^2;                     //定义单片机I/O端口P3.2东西方向通行控制按键
  15. sbit key_sourth_north=P3^3;                    //定义单片机I/O端口P3.3南北方向通行控制按键
  16. sbit all_not=P3^4;                                //定义单片机I/O端口P3.4为全部禁行控制位
  17. uchar code s7_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};         //七段码显示表
  18. uchar sou_nor_time;                                                //南北通行时间变量定义
  19. uchar east_weat_time;                                              //东西通行时间变量定义
  20. uchar time_flag;                                                         //时间标志位定义
  21. uchar traffic_flag;                         //traffic_flag=0 时南北通行,traffic_flag=1 时东西通行
  22. uchar time_multiply;                                                       //定义计时变量
  23. uchar ETO              ;
  24. void delayms(uchar z)                                                         //延时子程序
  25. {
  26. uchar i,j;                                                                   //定义变量i,j
  27. for(i=z;i>0;i--)                                                      //for循环,共循环z次
  28.        for(j=110;j>0;j--);                                             //for循环,共循环j次
  29. }
  30. void display_time(uchar time)                                            //显示倒计时子程序
  31. {
  32.     P1_0 =0;                                                 //P1.T0输出低电平,位选使能
  33.     P1_1 =1;                                                           //P1.1输出高电平
  34.     P1_2 =1;                                                           //P1.2输出高电平
  35.     P1_3 =1;                                                           //P1.3输出高电平
  36.     P2=s7_table[time/10];                                          //P2端口输出显示的段码
  37.     delayms(2);                                                               //延时2ms
  38.     P2=0;                                                           //P2端口输出低电平
  39. P1_0 =1;                                                           //P1.0输出高电平
  40.   P1_1 =0;                                                  //P1.1输出低电平,位选使能
  41.     P2=s7_table[time%10];                                         //P2端口输出显示的段码
  42.     delayms(2);                                                               //延时2ms
  43.     P2=0;                                                           //P2端口输出低电平
  44. P1_1 =1;                                                           //P1.1输出高电平
  45.     P1_2 =0;                                                  //P1.2输出低电平,位选使能
  46.     P2=s7_table[time%10];                                         //P2端口输出显示的段码
  47.     delayms(2);                                                               //延时2ms
  48.     P2=0;                                                           //P2端口输出低电平
  49. P1_2 =1;                                                           //P1.2输出高电平
  50.     P1_3 =0;                                                  //P1.3输出低电平,位选使能
  51.     P2=s7_table[time%10];                                         //P2端口输出显示的段码
  52.     delayms(2);                                                               //延时2ms
  53.     P2=0;                                                           //P2端口输出低电平
  54.     P1_3 =1;                                                           //P1.3输出高电平
  55. }
  56. void south_north_allow()                                              //南北通行允许子程序
  57. {
  58.     ew_red=0;                                                          //东西方向红灯亮
  59.     ew_green=1;                                                      //东西方向绿灯熄灭
  60.     ew_yellow=1;                                                     //东西方向黄灯熄灭
  61.     sn_red=1;                                                        //南北方向红灯熄灭
  62.     sn_green=0;                                                        //南北方向绿灯亮
  63.     sn_yellow=1;                                                      //南北方向黄灯熄灭
  64. }
  65. void east_west_allow()                                                //东西通行允许子程序
  66. {
  67.     ew_red=1;                                                        //东西方向红灯熄灭
  68.     ew_green=0;                                                        //东西方向绿灯亮
  69.     ew_yellow=1;                                                    //东西方向黄灯熄灭
  70.     sn_red=0;                                                          //南北方向红灯亮
  71.     sn_green=1;                                                      //南北方向绿灯熄灭
  72.     sn_yellow=1;                                                      //南北方向黄灯熄灭
  73. }
  74. void init0_timer0()                                                  //定时器0初始化子程序
  75. {
  76.     TMOD=0X01;                                                  //定时器0设置为模式1
  77.     TH0=(65536-50000)/256;                                              //TH0装载初始值
  78.     TL0=(65536-50000)%256;                                             //TL0装载初始值
  79.     ETO=1;                                                            //开启定时器中断
  80.     EA=1;                                                               //开启CPU中断
  81.     TR0=1;                                                              //启动定时器T0
  82. }
  83. void keyscan()                                                           //键盘扫描子程序
  84. {
  85.     if(key_sourth_north==0)                                //判断南北通行控制按键是否按下
  86.     {
  87.         delayms(2);                                                           //延时2ms
  88.         if(key_sourth_north==0)                        //再次判断南北通行控制按键是否按下
  89.         {
  90.             south_north_allow();                                     //调用南北通行子程序
  91.             while(!key_sourth_north) display_time(time_flag);      //南北通行时,显示通行倒计时
  92.             TR0=0;                                         //南北通行结束,关闭定时器T0
  93.          }
  94.      }
  95.     if(key_earth_west==0)                                  //判断东西通行控制按键是否按下
  96.     {
  97.         delayms(2);                                                           //延时2ms
  98.         if(key_earth_west==0)                          //再次判断东西通行控制按键是否按下
  99.         {
  100.             east_west_allow();                                       //调用东西通行子程序
  101.             while(!key_earth_west) display_time(time_flag);        //东西通行时,显示通行倒计时
  102.             TR0=0;                                         //东西通行结束,关闭定时器T0
  103.          }
  104.      }
  105.      if(all_not==0)                                            //判断全部禁行按键是否按下
  106.     {
  107.          delayms(2);                                                          //延时2ms
  108.          if(all_not==0)                                    //再次判断全部禁行按键是否按下
  109.          {
  110.              TR0=0;                                  //进入全部禁行子程序,关闭定时器T0
  111.              ew_red=0;                                                 //东西方向红灯亮
  112.              ew_green=1;                                             //东西方向绿灯熄灭
  113.              ew_yellow=1;                                            //东西方向黄灯熄灭
  114.              sn_red=0;                                                 //南北方向红灯亮
  115.              sn_green=1;                                             //南北方向绿灯熄灭
  116.              sn_yellow=1;                                             //南北方向黄灯熄灭
  117.           }
  118.      }
  119. }
  120. void main()                                                                     //主程序
  121. {
  122.     sou_nor_time=15;                                          //初始化南北通行时间为15s
  123.     east_weat_time=6;                                           //初始化东西通行时间为6s
  124.     traffic_flag=0;                                                      //初始化,南北通行
  125.     time_flag=sou_nor_time;                                          //设置南北通行的时间
  126.     time_multiply =0;                                                    //计时变量初始化

  127.     init0_timer0();                                            //调用定时器T0初始化子程序
  128.     south_north_allow()  ;                                        //调用南北通
  129.     while(1)                                                         //while(1)无限循环
  130.     {
  131. keyscan();                                                          //调用键盘扫描子程序
  132.         display_time(time_flag);                                     //调用显示倒计时子程序
  133.      }
  134. }
  135. void int0_isr() interrupt 1                                           //定时器T0中断服务程序
  136. {
  137.     TH0=(65536-50000)/256;                                                //TH0装载初值
  138.     TL0=(65536-50000)%256;                                               //TL0装载初值
  139.     time_multiply++;                                                       //计时变量加1
  140.     if(time_multiply>=20)                                        //判断计时变量是否大于20
  141.     {
  142.         time_multiply =0;                              //计时变量大于20,则将计时变量清零
  143.         time_flag--;                                                    //倒计时的秒数减1
  144.         if(traffic_flag==0)                            //若traffic_flag为0,则进入南北通行模式
  145.         {
  146.             if(time_flag>2)                                        //南北通行倒计时进行中
  147.             {
  148.                 south_north_allow();                                 //南北通行红绿灯输出
  149.              }
  150.              else if(time_flag>0)                                          //若倒计时小于2s
  151.              {
  152.                  sn_red=1;
  153.                  sn_green=1;
  154.                  sn_yellow=0;                                         //此时南北黄灯亮2s
  155.                  ew_red=0;                                       //此时东西仍然是红灯亮
  156.                  ew_green=1;
  157.                  ew_yellow=1;
  158.               }
  159.               else
  160.               {
  161.                  traffic_flag=1;                 //此时南北通行倒计时结束,改为东西通行模式
  162.                  time_flag= east_weat_time;                         //东西通行时间变量赋值
  163.                }
  164.          }
  165.          if(traffic_flag==1)                                           //此时为东西通行模式
  166.          {
  167.              if(time_flag>2)                                           //东西通行计时结束
  168.              {
  169.                  east_west_allow();                                  //东西通行红绿灯输出
  170.               }
  171.               else if(time_flag>0)
  172.               {
  173.                   ew_red=1;                                          //此时东西黄灯亮2s
  174.                   ew_green=1;
  175.                   ew_yellow=0;
  176.                   sn_red=0;                                      //此时南北仍然是红灯亮
  177.                   sn_green=1;
  178.                   sn_yellow=1;
  179.                }
  180.                else
  181.                {
  182.                   traffic_flag=0;                //此时东西通行倒计时结束,改为南北通行模式
  183.                   time_flag= sou_nor_time;                         //南北通行时间变量赋值
  184. ……………………

  185. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整的Word格式文档51黑下载地址(可编辑):
基于单片机的交通灯控制系统.doc (628.79 KB, 下载次数: 54)
回复

使用道具 举报

ID:453162 发表于 2018-12-24 10:28 | 显示全部楼层
不错,很棒!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表