简易交通灯课程设计报告(附源代码)

简易交通灯设计

一、课程设计的目的与要求

  • 1、教学目的
  • 2、教学要求
  • 3、实验内容
    设计一交通灯,要求如下
    设计一个十字路口的交通灯,控制A,B两条交叉道理上的车辆通行,东西方向为主干道A,南北方向为副干道B;具体要求如下:
    ①每条道路设一组交通灯,每组信号灯有红,黄,绿3个灯组成,绿灯表示允许通过,红灯表示禁止通行,黄灯表示该车道上已过停车线的车辆继续通行,未过停车线的车辆停止通行。
    ②主干道通行40秒,南北通行时间为20秒。
    ③每次变换通行车道之前,要求黄灯先亮5秒,才能变换通行车道。
    二、系统设计方案
  • 2.1交通灯四种通行模式及行车方向

指示按照简单的交通路口规则,有四种模式:
南北绿灯亮 东西红灯亮
南北黄灯闪 东西红灯亮
南北红灯亮 东西绿灯亮
南北红灯亮 东西黄灯闪

  • 2.2 交通灯控制系统

实用交通灯控制系统主要CPU控制模块为了、信号灯显示模块、倒计时显示模块等组成,如下图所示:

其中控制模块是最核心的部分,控制核心采用AT89C51单片机,利用AT89C51单片机内部定时器实现交通指示灯控制的计时功能,在正常情况下产生相应的控制信息控制倒计时显示电路,信号灯显示电路的正常运行。信号灯显示模块采用四个集成交通指示灯来模拟红、黄、绿交通指示灯,用单片机的P1口控制发光二极管的亮灭状态。倒计时显示模块的接口电路有静态显示和动态显示两种方式,由于动态显示方式在仿真软件中不易于查看,所以本次采用静态显示方式,这种方式优点是易于操作,缺点是浪费单片机接口资源。为了倒计时更加准确,采用外加晶振电路方法实现其功能。

  • 2.3 复位模块
    此系统可以通过复位按键实现从新工作,电路图如图所示:
    在这里插入图片描述
  • 2.4 时钟模块
    此系统可以通过脉冲实现信号导入工作,电路图如图所示:
    在这里插入图片描述
  • 2.5设计原理框图
    在这里插入图片描述
    三、仿真过程与仿真结果
    仿真过程:使用proteus软件进行仿真测试,首先在里面进行相应的设置,在工程文件夹下面会新建-一个。DSN的文件夹,然后编写实现功能的程序和测试文件,最后保存编译执行就可以进行功能仿真了。
    仿真结果:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

结果分析与讨论:从40到0秒,主干道绿,副干道红;从3到0秒,主干道红,副干道黄;从20到0秒,副干道绿,主干道红;从5到0秒,副干道红,主干道黄

四、结论心得

通过此次课程设计,让我更加熟悉的运用PROTEUS软件来实现Verilog语言的编程实现题目的相关功能,也让我更加深刻地体会到“实践是检验真理的唯一标准”。一开始看到题目要求就写出了需要到的输入输出信号,对于该怎么构建还没有完整的思路,在检验代码时也出现了一堆的错误,但是经过自己一步一步的查找最终无错误,但在检验功能时依旧出现了很多错误,比如倒计时的设计。当遇到不明报的地方我也会与同学讨论,在同学的帮助下与自己的思考最终完成了此次实验的功能实现。

五、程序

keil5程序:
#include<reg51.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int  uint;
sbit k1=P1^6;
sbit k2=P1^7;
sbit k3=P2^7;
sbit k4=P3^0;
sbit yellowled_nb=P1^4;	//Äϱ±»ÆµÆ
sbit yellowled_dx=P1^1;	//¶«Î÷»ÆµÆ
uchar code table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar data dig;	//λѡ
uchar data led;	//Æ«ÒÆÁ¿
uchar data buf[4];
uchar data sec_dx=39;//¶«Î÷ÊýÂëָʾֵ
uchar data sec_nb=39;//Äϱ±ÊýÂëָʾֵ
uchar data set_timedx=39;
uchar data set_timenb=39;//µ¹¼ÆʱÉèÖõļüÖµ±£´æ
uchar data b;//¶¨Ê±Æ÷ÖжϴÎÊý
bit time;//µÆ״̬ѭ»·±êÖ¾
bit int0_time;//ÖжÏÇ¿ÐбêÖ¾
bit set;//µ÷ʱ·½ÏòÇл»¼ü±êÖ¾
void delay(int ms)
{
	uint j,k;
	for(j=0;j<ms;j++)
		for(k=0;k<124;k++);
}
void key_to1()
{
	TR0=0;	 //¹Ø¶¨Ê±Æ÷
	if(set==0)
		sec_nb++; //Äϱ±¼Ó1S
	else
		sec_dx++;//¶«Î÷¼Ó1S
	if(sec_nb==100)
		sec_nb=1;
	if(sec_dx==100)
		sec_dx=1;//¼Óµ½100ÖÃ1	
}
void key_to2()
{
	TR0=0;//¹Ø¶¨Ê±Æ÷
	if(set==0)
		sec_nb--;  //Äϱ±¼õ1S
	else
		sec_dx--;  //¶«Î÷¼õ1S
	if(sec_nb==0)
		sec_nb=99;	
	if(	sec_dx==0 )
		sec_dx=99;//¼õµ½1ÖØÖÃ99	
}
void key()	//°´¼üɨÃè×Ó³ÌÐò
{
	if(k1!=1)
	{
		delay(10);
		if(k1!=1)
		{
			while(k1!=1);
			key_to1();
		}
	}
	if(k2!=1)
	{
		delay(10);
		if(k2!=1)
		{
			while(k2!=1);
			key_to2();
		}
	}
	if(k4!=1)
	{
		delay(10);
		if(k4!=1)
		{
			while(k4!=1);
			set=!set;
		}
	}
	if(k3!=1&&int0_time==1)
	{	
		TR0=1;   //Æô¶¯¶¨Ê±Æ÷
		sec_nb=59;
		sec_dx=59;
		int0_time=0;//Çå±êÖ¾
	} 	
	else if(k3!=1&&int0_time==0)
	{
		TR0=1;
		set_timenb=sec_nb;
		set_timedx=sec_dx; //ÉèÖõļüÖµ·µ»Ø±£´æ
	}
}
void display()
{
	buf[1]=sec_dx/10; //µÚ1λ ¶«Î÷Ãëʮλ
	buf[2]=sec_dx%10; //µÚ2λ ¶«Î÷Ãë¸öλ
	buf[3]=sec_nb/10; //µÚ3λ Äϱ±Ãëʮλ
	buf[0]=sec_nb%10; //µÚ4λ Äϱ±Ãë¸öλ
	P0=table[buf[led]];
	delay(2);	//ÏÈÑÓʱ£¬ÌáÇ°ÏÔʾһλÁË
	P2=dig;
	dig=_crol_(dig,1);
	led++;
	if(led==4)
	{
		led=0;
		dig=0xfe;
	}
}
void main()
{
	TMOD=0x01;	
	TH0=0x3C;
	TL0=0xB0;
	EA=1;
	ET0=1;
	TR0=1;
	EX0=1;
	EX1=1;
	P1=0Xf3;// ¶«Î÷ͨÐÐ
	while(1)
	{
		key(); //µ÷Óð´¼üɨÃè³ÌÐò
		display(); //µ÷ÓÃÏÔʾ³ÌÐò
	}	
}
void t0() interrupt 1 using 1  //¶¨Ê±ÖжÏ×Ó³ÌÐò
{
	b++;
	if(b==10)	  // ¶¨Ê±Æ÷ÖжϴÎÊý¡£
	{
		b=0;
		sec_dx--;
		sec_nb--;
		//Äϱ±»ÆµÆÉÁ˸ÅжÏ		
		if(sec_nb==3&&time==0)
		{
			yellowled_nb=1;//Äϱ±»ÆµÆÁÁ
			delay(300);
			yellowled_nb=0;
		}
		if(sec_nb==2&&time==0)
		{
			yellowled_nb=1;//Äϱ±»ÆµÆÁÁ
			delay(300);
			yellowled_nb=0;
		}
		if(sec_nb==1&&time==0)
		{
			yellowled_nb=1;
			delay(300);
			yellowled_nb=0;
		}		 
		//¶«Î÷»ÆµÆÉÁÅжÏ	    
		if(sec_dx==3&&time==1)
		{
			yellowled_dx=1;//Äϱ±»ÆµÆÁÁ
			delay(300);
			yellowled_dx=0;
		}	 	
		if(sec_dx==2&&time==1)
		{
			yellowled_dx=1;//Äϱ±»ÆµÆÁÁ
			delay(300);
			yellowled_dx=0;
		}
		if(sec_dx==1&&time==1)
		{
			yellowled_dx=1;
			delay(300);
			yellowled_dx=0;
		}			
		if(sec_dx==0||sec_nb==0) //¶«Î÷»òÄϱ±Ïȵ½´ï1Sʱ¼´¿ªÊ¼ÖØмÆʱ
		{ 
			sec_dx=set_timedx;
			sec_nb=set_timenb; //µÚÒ»´ÎÑ­»·½áÊøÖØÖÃ
			if(time==1)
			{
				P1=0xF3;  //¶«Î÷ͨÐÐ
			}
			else
			{
				P1=0xde; //Äϱ±Í¨ÐÐ
			}
			time=!time;   //È¡·´
		}
	}
}
void wb0() interrupt 0 using 1	 //¶«Î÷Ç¿ÐÐ
{
	TR0=0;
	P1=0xF3;
	sec_dx=88;
	sec_nb=88;
	int0_time=1;
}
void wb1() interrupt 2 using 1	  //Äϱ±Ç¿ÐÐ
{
	TR0=0;
	P1=0xDE;
	sec_nb=88;
	sec_dx=88;
	int0_time=1;
}

需要源代码可点击https://download.csdn.net/download/qq_45175681/13792077

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白舟的博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值