【51单片机开发】十字交叉口红绿灯(仿真+源码+调时+左转)

1.设计思路

        模拟十字路口的交通灯控制系统就是使用单片机来控制一些LED灯和数码管,模拟真实交通灯的功能。本方案所设计的功能主要包括:

       ①南北向直行和左转计时,东西向直行和左转计时

       ②红绿灯不变期间,在七段数码管上显示每秒倒计时;

       ③绿灯计时结束后,同方向的黄灯闪烁三秒;

       ④期间人行道通行情况随道路的通行状况而改变;

       ⑤设置紧急模式:全部路口保持红灯,模拟道路遭遇突发状况全部禁行;

       ⑥设置夜间模式:全部路口保持黄灯闪烁,模拟夜间缓慢通过路口

       ⑦设置时间调试:当前通行的方向绿灯时间可调。

2.方案设计

        用AT89C51单片机完成交通信号灯控制器的设计。该交通灯控制系统由一条南北向的道路和一条东西向的道路汇合成十字路口,针对每个入口配置左转和直行两个方向的控制,每个方向设置红、绿、黄三色信号灯,数码管显示剩余时间。人行横道两侧设置红、绿、黄三色信号灯,其控制方案与对应的直行信号灯一致,因此时间可直接从。通行信号灯红灯亮禁止通行,绿灯亮允许通行,黄灯闪烁则给行驶中的车辆有时间停在禁行线外。用红、绿、黄发光二极管连结而成的Traffic Light元件作信号灯,4个共阴极二位数码管显示剩余时间。

根据设计功能及要求,我们可得系统的原理框图如下所示: 

7f747fc28cede047d86951ef97ada58a.png

  3.硬件电路设计

3.1 AT89C51单片机

        AT89C51是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-52指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。

        AT89C51有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C51可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。

3.2 晶振电路设计

        时钟电路用于产生MCS-51单片机工作时所必须的时钟控制信号。其内部电路在时钟信号控制下,严格地按时序执行指令进行工作。在执行指令时,CPU首先要到程序存储器中取出需要执行的指令操作码,然后译码,并由时序电路产生一系列控制信号去完成指令所规定操作。

        本设计采用12MHz晶振和两个电容,他们构成一个稳定的自激振荡器。该电容的大小影响振荡器频率的高低、振荡器的稳定性和起振的快速性。为单片机提供标准时钟。

3.3 复位电路设计

        复位电路是一种用来使电路恢复到起始状态的电路设备,它的操作原理与计算器有着异曲同工之妙,只是启动原理和手段有所不同。复位电路,就是利用它把电路恢复到起始状态。就像计算器的清零按钮的作用一样,以便回到原始状态,重新进行计算。当按下复位按键时,RST端产生高电平,使专单片机复位。复位后,其片内各寄存器状态改变,片内RAM内容不变。

3.4 按键控制电路设计

        为了实现对十字路口交通信号灯的实时控制,该方案设置了四种按键控制。当遇到紧急情况的时候,通过按键来实现六种情况的转换,当按下key1按键时,此时通行的方向的绿灯时间延长5s;当按下key2按键时,此时通行的方向的绿灯时间缩短5s;当按下key3按键时,所有信号灯亮红灯,道路禁止通行,再次按下,道路恢复正常通行;当按下key4按键时,所有信号灯不断闪烁黄灯,道路呈警示状态,松开恢复原来的通行情况。当遇到某一方向的车流量较大时,通过按键来调整交通信号灯的具体情况,不仅能够有效疏通道路,减少道路拥挤,还更能有效的为救护车、消防车等紧急车辆疏通道路。

3.5 红绿灯电路设计

        为了效果更加直观,采用Proteus自身提供的Traffic Light元件作为交通灯来使用。其中红绿灯分为三部分:路人红绿灯,主干道红绿灯,左转方向红绿灯。在十字路口的8组红、黄、绿三色交通灯中,每个方向路口的红绿灯连接在一起,路人红绿灯连接在一起。单片机与交通灯电路的具体连接方式为:单片机通过P2口控制南北方向的直行左转共4组灯;通过P3口控制东西方向的直行左转共4组灯,人行道上的信号灯灯显示情况与对应的直行道上的信号显示情况一致,直接与之并联即可。

        在倒计时显示上,该交通灯控制系统在正常情况下,每100s循环一次,为方便提示路上行人及车辆交通灯转换的剩余时间,专门为控制系统设计了一个倒计时显示装置。该显示装置选用七段数码管来显示交通灯转换的剩余时间,根据控制要求,每个路口需要一个两位数码管,这样四个路口就要求四个两位数码管。为了简化电路设计,本方案采用了共阳型数码管。

4.程序设计思路

fa88cf742515f534fcf8b5c62bee7f07

5.系统实现

5.1 Proteus仿真

        打开Proteus软件,创建名为信号灯控制系统的工程文件,打开原理图绘制界面,选择相应的元件按照设计的方案进行构图和连线。大致分为以下几步完成:

    ①先绘制基本功能元件,将设计的信号灯系统绘制上去:

c718bd5f8214febe89aa128bc36efd9a

    ②根据主要的功能设计,将主控制电路绘制出来,并且运用Proteus的LBL功能完成编号连线,提升整体美感度:

30a2bb249a7a7359a35d18cd916b9ee8

    ③完善路网设置,形成整体硬件设置布局:

4fdf4d0b3bbdda8a48939a53b878a70c

5.2 演示效果

运行效果

5.3 作品链接

https://pan.baidu.com/s/1W1NZ0qo1_ezGKoCX--lIgA

解压密码:cstt

  • 28
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于C51单片机十字路口红绿灯C语言程序,它使用了定时器和外部中断来控制红绿灯的亮灭,模拟了十字路口的交通信号控制。 ``` #include <reg52.h> // 定义端口地址 #define PORT_LIGHT P0 #define PORT_BTN P3 // 定义端口位掩码 #define RED 0x01 #define YELLOW 0x02 #define GREEN 0x04 // 定义定时器初值和重载值 #define TIMER_INIT 65536-10000 // 10ms #define TIMER_RELOAD 65536-10000 // 10ms // 定义中断向量 #define INT_VECTOR_T0 1 // 定义延时函数 void delay(int time) { int i, j; for (i = 0; i < time; i++) { for (j = 0; j < 50; j++); } } // 定义定时器中断处理函数 void timer0_isr(void) interrupt INT_VECTOR_T0 { static unsigned char cnt = 0; cnt++; if (cnt == 50) { // 500ms cnt = 0; // 红绿灯状态切换 if (PORT_LIGHT == RED) { PORT_LIGHT = GREEN; } else if (PORT_LIGHT == GREEN) { PORT_LIGHT = YELLOW; } else if (PORT_LIGHT == YELLOW) { PORT_LIGHT = RED; } } TH0 = TIMER_INIT / 256; TL0 = TIMER_INIT % 256; } // 定义外部中断处理函数 void int0_isr(void) interrupt 0 { // 检测按钮是否按下 if (PORT_BTN == 0) { // 切换红绿灯状态 if (PORT_LIGHT == RED) { PORT_LIGHT = GREEN; } else if (PORT_LIGHT == GREEN) { PORT_LIGHT = YELLOW; } else if (PORT_LIGHT == YELLOW) { PORT_LIGHT = RED; } } delay(20); // 消除按键抖动 while (PORT_BTN == 0); } // 程序入口 void main() { // 初始化定时器 TMOD = 0x01; // 定时器0,模式1 TH0 = TIMER_INIT / 256; TL0 = TIMER_INIT % 256; TR0 = 1; // 启动定时器 ET0 = 1; // 允许定时器中断 // 初始化外部中断 IT0 = 1; // 下降沿触发 EX0 = 1; // 允许外部中断 // 初始化端口 PORT_LIGHT = RED; PORT_BTN = 0xff; // 上拉 // 无限循环 while (1); } ``` 上述程序使用了定时器和外部中断来控制红绿灯的亮灭,模拟了十字路口的交通信号控制定时器中断处理函数timer0_isr每500ms切换一次红绿灯状态,外部中断处理函数int0_isr检测到按钮按下后切换红绿灯状态,并使用延时函数消除按键抖动。程序入口是main函数,初始化定时器、外部中断和端口后,进入无限循环等待中断事件的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值