【51单片机】路口红黄绿交通灯设计(附代码)

实践任务

1.1  实践目的

分析路口红黄绿交通灯的设计要求,设计路口红黄绿交通灯的原理图,并完成路口红黄绿交通灯线路的搭建与调试,培养学生电子电路图的分析、设计、搭建与调试能力,培养团队协作能力与创新意识,增强学生的劳动观念和社会责任感。

1.2  实验内容

 分析根据路口红黄绿交通灯的设计要求,设计路口红黄绿交通灯的原理图,并进行功能分析;

运用单片机、电阻、二极管、7段LED、导线等材料,并进行路口红黄绿交通灯电子电路的搭建与焊接;

完成路口红黄绿交通灯的电路的调试;

对路口红黄绿交通灯电路调试结果的分析与总结,并提出改进建议。

1.3 实现目标

东西向红灯33秒,南北向绿灯27秒,绿灯闪烁3秒(占空比50%),黄灯3秒;南北向红灯33秒,东西向绿灯27秒,绿灯闪烁3秒(占空比50%),黄灯3秒;循环动作。能在7段码上显示时间;

硬件设计

d61ae80bfa574d498ccc3fdcb53e9235.png

图1.1    Proteus仿真电路图

  1. 东西南北四方向LED红绿灯采用共阳极接法,单片机接口P1.0-P1.2控制东西向红黄绿LED,单片机接口P1.3-P1.5控制南北方向红黄绿LED
  2. 四位七段码数码管使用P2.0-P2.3作为控制位,P3接口作为段选位。
  3. 元器件清单:STC89c52RC单片机*1、LED灯若干、杜邦线若干、9012三极管*4、10K电阻*4、4位七段码数码管*1、510Ω电阻*8等元件。

软件设计

3.1  程序流程图

51532d41fc5f471ebe9e04e9344bec94.png

 3.2  软件代码:

#include "REGX52.H"
#include "smg.h"
#include "delay.h"
#include "Timer0.h"
int Time_SMG = 0, Timer0Count = 0, blink = 0, Timer0Count2 = 0;
int flag = 1;
// 定义IO口连接
sbit RedEastWest    = P1 ^ 0; // 东西向红灯
sbit YellowEastWest = P1 ^ 1; // 东西向黄灯
sbit GreenEastWest  = P1 ^ 2; // 东西向绿灯
sbit RedNorthSouth    = P1 ^ 3; // 南北向红灯
sbit YellowNorthSouth = P1 ^ 4; // 南北向黄灯
sbit GreenNorthSouth  = P1 ^ 5; // 南北向绿灯
// 主函数
void main()
{
    Timer0Init();
    P3_7 = 0;

    while (1) {
        // 过程:东西红灯33秒,南北绿灯27秒,绿灯以占空比50闪烁3秒,黄灯三秒;
        if (flag == 0) {
            RedEastWest    = 0;
            GreenEastWest  = 1;
            YellowEastWest = 1;
            if (Time_SMG < 27) {
                GreenNorthSouth  = 0;
                RedNorthSouth    = 1;
                YellowNorthSouth = 1;
            } else if (Time_SMG >= 27 && Time_SMG <= 30) {
                blink = 1; // 绿灯闪烁
            } else if (Time_SMG > 30) {
                blink            = 0;
                GreenNorthSouth  = 1;
                YellowNorthSouth = 0;
                RedNorthSouth    = 1;
            }

        } else if (flag == 1) {
            RedNorthSouth    = 0;
            GreenNorthSouth  = 1;
            YellowNorthSouth = 1;
            if (Time_SMG < 27) {
                GreenEastWest  = 0;
                YellowEastWest = 1;
                RedEastWest    = 1;
            } else if (Time_SMG >= 27 && Time_SMG <= 30) {
                blink = 1; // 绿灯闪烁
            } else if (Time_SMG > 30) {
                blink          = 0;
                GreenEastWest  = 1;
                YellowEastWest = 0;
                RedEastWest    = 1;
            }
        }

        smg(1, Time_SMG % 10);
        smg(2, Time_SMG / 10);
    }
}
void Timer0Routine() interrupt 1 // 中断
{
    TL0 = 0x66;    // 设置定时初值
    TH0 = 0xFC;    // 设置定时初值【注意:这里的定时初值要与函数Timer0Init内的初值一样】10ms
    Timer0Count++; // 每1ms打断一次,计数器加1
    Timer0Count2++;

    if (Timer0Count >= 1000) // 当计数器到1000,即经过1秒
    {
        Time_SMG++;
        Timer0Count = 0;
    }
    if (Time_SMG > 33) {
        Time_SMG = 0;
        flag     = !flag;
    }

    if (Timer0Count2 >= 500) // 当计数器到100,即经过0.1秒
    {
        Timer0Count2 = 0;
        if (blink == 1) {
            if (flag == 0) {
                GreenNorthSouth = !GreenNorthSouth;
            } else if (flag == 1) {
                GreenEastWest = !GreenEastWest;
            }
        }
    }
}






数码管函数:
unsigned char smgText[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void smg(unsigned char location,number)
{
	switch(location)                                                              
		{
			case 1:P2_0=0;P2_1=1;P2_2=1;P2_3=1;break;
			case 2:P2_0=1;P2_1=0;P2_2=1;P2_3=1;break;
			case 3:P2_0=1;P2_1=1;P2_2=0;P2_3=1;break;
			case 4:P2_0=1;P2_1=1;P2_2=1;P2_3=0;break;
		}
		P3=smgText[number];		
		Delay(10);
		P3=0x00;
	}

4  系统调试与结论

首先,通过proteus搭建仿真电路,确定使用的元件和对应的接口。之后按照实现目标进行程序编写,结合proteus仿真在编程的过程中不断调试,以达到想要的实验结果。

e1bdfeae9c6945789599900e9ac749a1.png
LED单数表示南北方向,双数为东西方向。上电后先由南北向通行,27秒绿灯,27-30秒绿灯闪烁,30-33秒亮黄灯,之后切换为南北向通行。

上图为实际硬件,如图所示(a)(b)图表示在27秒时绿灯是闪烁状态。图(c)表示在30-33秒黄灯亮的效果。图(d)表示在换向之后的工作状态。

我的开发环境是vscode+eide
src文件夹里面是代码
自己需要自己移植到keil环境

  • 1
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
单片机课程设计 题 目:十字路口交通灯设计 班 级: 姓 名: 学 号: 指导教师: 设计时间: "评语: " " " " " " " " " " " " " " " " " "成绩 " 目 录 摘 要 - 1 - 1.引 言 - 2 - 1.1 课程设计背景 - 2 - 1.2 本文设计任务 - 2 - 1.3 本课程设计目的 - 2 - 2.系统方案设计与原理 - 3 - 2.1 设计思路 - 3 - 2.2 设计系统的运行过程 - 3 - 3.硬件设计 - 5 - 3.1十字路口交通灯控制系统的硬件电路设计图 - 5 - 3.2 硬件的功能分析 - 6 - 4.软件设计 - 7 - 4.1 主流程图 - 7 - 4.2 倒计时显示流程图 - 8 - 4.3 状态地址分配 - 9 - 4.4 LED的字形代码表 - 9 - 4.5 程序清单 - 10 - 5.运行与调试 - 13 - 6.心得体会 - 15 - 参考文献 - 17 - 摘 要 随着社会经济的发展,城市交通问题越来越引起人们的关注。人、车、路三者关系的协 调,已成为交通管理部门需要解决的重要问题之一。城市交通控制系统是用于城市交通 数据监测、交通信号灯控制与交通疏导的计算机综合管理系统,它是现代城市交通监控 指挥系统中最重要的组成部分。探究城市交通发展中存在问题的原因,无论是从宏观上 还是从微观上分析,其根本原因在于城市交通系统的管理机制不适应。城市交通控制系 统是现代城市智能交通系统的组成之一,主要用于城市道路交通的控制与管理。 当今时代是一个自动化时代,交通灯控制等很多行业的设备都与计算机密切相关。因 此,一个好的交通灯控制系统,将给道路拥挤、违章控制等方面给予技术革新。十字路 口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现这井然秩 序呢?靠的是交通信号灯的自动指挥系统,信号灯的出现,使交通得以有效管制,对于 疏导交通流量、提高道路通行能力减少交通事故有明显效果。传统的交通信号灯控制电 路一般由数字电路构成, 电路复杂、体积大、成本高。采用单片机控制交通信号,可以简化电路结构、降低成本、 减小体积, 现在有许多方法可以实现交通信号灯控制,本文采用AT89C51单片机为中心器件来设计交 通灯控制系统。各种交通控制方案,最终都要由路口信号控制器来实现。 交通信号灯控制方式很多,我们可由AT89C51单片机的定时器每秒钟通过P0口输送交 通信号信息,在我们的系统中我们采用的是共阳极发光二极管,所以当P0口的各引脚输 出为低电平时,显示红、绿、黄灯的燃亮情况,由Pl、P2口用LED显示每个灯的燃亮的倒 计时时间。通过AT89C51单片机的RESET位来控制系统是工作或设置初值,当复位信号为 1时就对系统进行初始化,系统就开始工作。 关键词:AT89C51;LED显示;交通灯 1.引 言 1.1 课程设计背景    随着世界范围内城市化和机动化进程的加快,城市交通越来越成为一个全球化的问题。 城市交通基础设施供给滞后于高速机动化增长需求,道路堵塞日趋加重,交通事故频繁 ,环境污染加剧等问题普遍存在。目前,全国大中城市普遍存在着道路拥挤、车辆堵塞 、交通秩序混乱的现象,交通事故频发,这给人民的生命财产安全带来了极大的损失。 如何解决城市交通问题已成为全社会关注的焦点和大众的迫切呼声。为了确保十字路口 的行人和车辆顺利、畅通地通过,往往采用电子控制的交通信号来进行指挥。 1.2 本文设计任务 设计一个能够控制十二盏交通信号灯的模拟系统。利用单片机的定时器定时,令十 字路口红绿灯交替点亮和熄灭,并用LED灯显示倒计时间。 假设一个十字路口为东南西北走向。初始状态0为东西南北都红灯亮。然后转状态1 南北绿灯通车,东西红灯亮。过一段时间后,转状态2,南北绿灯灭,黄灯闪几下,东西 还是红灯。再转状态3,南北红灯亮,东西绿灯通车。过一段时间后转状态4,东西绿灯 灭,闪几个黄灯,南北还是为红灯亮,一段时间后,又循环至状态1。 通过对发光二极管的控制,来模拟交通信号灯的管理。每延时一段时间,灯的显示情况 都会按交通灯的显示规律进行状态转换,并增添其倒计时间的显示功能。 1.3 本课程设计目的 (1)掌握十字路口交通灯控制的设计原理,并能够运用VHDL编程语言编写出实验程 序,进一步对所学的知识进行掌握与实际应用。 (2)学会在MAX+plus 软件环境中仿真,熟悉软件的基本操作和运行环境。 (3)锻炼自己获取信息的能力,以及能够独立自主的思考和解决问题的能力。 2.系统方案设计与原理 2.1 设计思路 在交通灯控制系统中,东西南北四个方向各有红黄绿三种颜色的指示灯各一盏,共 计12盏指示灯,用以来指挥车辆和行人安全通行。当红色指示灯亮的时候表示禁止该方 向的
好的,下面是一个基于51单片机的十字路口交通灯设计的Keil代码,供参考: ```C #include<reg51.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit red1=P1^0; //第一个路口的红灯 sbit yellow1=P1^1; //第一个路口的黄灯 sbit green1=P1^2; //第一个路口的绿灯 sbit red2=P1^3; //第二个路口的红灯 sbit yellow2=P1^4; //第二个路口的黄灯 sbit green2=P1^5; //第二个路口的绿灯 void delay(uint xms) //延时函数 { uint i,j; for(i=xms;i>0;i--) for(j=112;j>0;j--); } void main() { while(1) { red1=0; //第一个路口红灯亮 yellow1=0; //第一个路口黄灯灭 green1=1; //第一个路口绿灯灭 red2=1; //第二个路口红灯灭 yellow2=0; //第二个路口黄灯灭 green2=0; //第二个路口绿灯亮 delay(30000); //第一个路口绿灯亮30秒 yellow1=1; //第一个路口黄灯亮 green1=0; //第一个路口绿灯灭 delay(5000); //第一个路口黄灯亮5秒 red1=1; //第一个路口红灯灭 yellow1=0; //第一个路口黄灯灭 green1=0; //第一个路口绿灯灭 red2=0; //第二个路口红灯亮 yellow2=0; //第二个路口黄灯灭 green2=1; //第二个路口绿灯灭 delay(60000); //第二个路口绿灯亮60秒 yellow2=1; //第二个路口黄灯亮 green2=0; //第二个路口绿灯灭 delay(5000); //第二个路口黄灯亮5秒 red2=1; //第二个路口红灯灭 yellow2=0; //第二个路口黄灯灭 green2=0; //第二个路口绿灯灭 } } ``` 以上代码仅供参考,具体实现还需要根据具体的硬件设计和需求进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Collin Lee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值