红绿灯

交通灯控制系统

一、实验目的

掌握单片机的综合应用设计。

二、实验仪器、材料

PC机、keil软件、proteus软件

三、实验内容及要求

完成以下任务:十字路口的交通灯控制系统,四组灯(红黄绿)对应十字路口的四个方
向,用两位的数码管显示剩余的时间。其它功能自行完善,根据设计方案的完善程度给
定成绩。

四、实验原理

上下28秒红灯亮禁止通行的时候,左右亮绿灯23秒通行加3秒黄灯等待;反过来,左右
28秒红灯亮禁止通行的时候,上下亮绿灯23秒通行加3秒黄灯等待。数码管右下角1是高
电平显示左边数字,也就是十位,2是高电平,显示右边数字也就是个位,所以要交替
显示,显示时间足够短就会同时亮。利用定时器,判断每一种情况,按照红绿黄依次改
变。

五、原理图和程序代码

原理图

在这里插入图片描述

		四个数码管的段选端口是连接在一起的(AG,DP端口是小数点的显示);1、2、
	3、4是位选信号。如果我们将段选信号输入到端口,那么所有的数码管显示的数字是
	一样的,这不是我们想要的效果,所以就需要用到位选信号1~4,每次只让一个位选信
	号使能,其他三个就禁止。可是这样你会觉得,每次只有一个数码管显示啊,对的,
	每个时刻确实只有一个数码管显示,但是下一时刻我们就切换要显示的数字,然后换
	一个数码管显示,这样的效果就是看到四个数码管轮流显示,每次显示的数字不一
	样,还不是我们想要的效果。那如果我们将每个数码管切换的时间间隔缩小呢,比
	如,10ms,这个间隔肉眼是无法分辨出来的,这就是数码管动态显示的原理!

关于7SEG-MPX2CA数码管知识可以看看这个链接: https://blog.csdn.net/weixin_39665379/article/details/112140960
.

代码

这段分别代表绿色黄色红色显示倒计时时长的十位和个位
红灯时长+1(红色00)=绿色时长+1(绿色00)+黄色时长+1(黄色00)

//绿黄红各个十位和个位的数字,因为有00差一秒所以红灯得公式计算
#define G_S 2
#define G_G 9
#define Y_S 0
#define Y_G 9
#define R_S (G_S*10+G_G+Y_S*10+Y_G+1)/10
#define R_G (G_S*10+G_G+Y_S*10+Y_G+1)%10

完整代码

 #include<reg52.h>

typedef unsigned char u8;
typedef unsigned int u16;
sbit ledr1=P1^0;
sbit ledy1=P1^1;
sbit ledg1=P1^2;
sbit ledr2=P1^3;
sbit ledy2=P1^4;
sbit ledg2=P1^5;
sbit lcd1s=P1^6;
sbit lcd1g=P1^7;
char distab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};	//共阴极

//绿黄红各个十位和个位的数字,因为有00差一秒所以红灯得公式计算
#define G_S 2
#define G_G 9
#define Y_S 0
#define Y_G 9
#define R_S (G_S*10+G_G+Y_S*10+Y_G+1)/10
#define R_G (G_S*10+G_G+Y_S*10+Y_G+1)%10

int sxs=G_S,sxg=G_G;
int zys=R_S,zyg=R_G;

void Time0Init()
{
	TMOD|=0x01;		//TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能
	TH0=0xFC;
	TL0=0x18;		//定时一毫秒 初值=65535-1000+1(因为实际上计数器计数到65536才溢出)=64536=FC18H
	//设置定时中断0 
	ET0=1;
	EA=1;
	TR0=1; 
 } 

void Time0() interrupt 1
{
	static u16 i;
	TH0=0xFC;
	TL0=0x18;		
	i++;

	
	if(i==1000)
	{	i=0;
		sxg--;
		zyg--;
		if(sxg==-1)
		{	sxs--;	
			if(sxs==-1&&sxg==-1)
				{	if(ledy2==0)
					{	ledr2=0;ledy2=1;ledg2=1;
						sxs=R_S;sxg=R_G;
					}
					else if(ledr2==0)
					{	ledr2=1;ledy2=1;ledg2=0;
						sxs=G_S;sxg=G_G;
					}
					else if(ledg2==0)
					{	ledr2=1;ledy2=0;ledg2=1;
						sxs=Y_S;sxg=Y_G;
					}
				}
			else   sxg=9;
		}

		if(zyg==-1)
		{	zys--;	
			if(zys==-1&&zyg==-1)
				{	if(ledy1==0)
					{	ledr1=0;ledy1=1;ledg1=1;
						zys=R_S;zyg=R_G;
					}
					else if(ledr1==0)
					{	ledr1=1;ledy1=1;ledg1=0;
						zys=G_S;zyg=G_G;
					}
					else if(ledg1==0)
					{	ledr1=1;ledy1=0;ledg1=1;
						zys=Y_S;zyg=Y_G;
					}
				}
			else   zyg=9;
		}
	}
	
}


 void delayms(unsigned int n)
 {
 	unsigned int m,j;
	for(m=0;m<n;m++)
	    for(j=0;j<113;j++ );
 }
 void main()
 {
 	lcd1s=1;
	lcd1g=0;
	ledr1=0;ledy1=1;ledg1=1;
	ledr2=1;ledy2=1;ledg2=0;
 	Time0Init();

	  while(1)
	 	{
			
			if(lcd1s)
			{	lcd1s=~lcd1s;
				lcd1g=~lcd1g;
				P0=~distab[sxg];
				P2=~distab[zyg];
			}
			else
			{	lcd1g=~lcd1g;
				lcd1s=~lcd1s;
		  		P0=~distab[sxs];
				P2=~distab[zys];
			}
			delayms(10);
			
		}
	 
 }

六、程序运行结果

在这里插入图片描述

(个人能力有限希望能帮到大家)

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
PLC十字路口红绿灯课程设计是为了教育学生掌握PLC编程技能和相关知识,以便他们能够了解智能交通系统十字路口红绿灯控制的工作原理和实现方式。课程设计将重点围绕PLC编程基础知识、十字路口红绿灯工作原理、实际案例分析和实验操作展开。 首先,学生将学习PLC编程的基础知识,包括PLC的工作原理、常用指令和编程语言。他们将通过理论讲解和实际操作来掌握PLC编程的基本技能。 其次,课程将介绍十字路口红绿灯的工作原理,包括信号的控制逻辑、车辆感知和优化信号配时等方面的知识。学生将了解到红绿灯控制系统的复杂性以及其在交通管理中的重要性。 接着,课程会通过实际案例分析来展示不同十字路口红绿灯控制方案的设计思路和实现方法。学生将学习到如何根据交通流量和道路条件来制定合理的红绿灯控制策略,并通过案例分析进行实际应用。 最后,学生将进行实验操作,利用PLC编程技能来模拟十字路口红绿灯控制系统,包括设计控制逻辑、调试程序和验证性能。通过实际操作,学生将加深对PLC编程和红绿灯控制原理的理解,为今后从事相关领域的工作打下坚实的基础。 通过这样的课程设计,学生将能够全面理解PLC编程和十字路口红绿灯控制的相关知识,为他们将来成为智能交通领域的专业人才奠定坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值