单片机案例开发——交通灯设计

#include<stcreg.h>
#define uchar unsigned char
#define uint unsigned int

sbit FMQ=P3^4;
sbit QR=P2^7;
sbit QY=P2^6;
sbit QG=P2^5;
sbit HR=P2^7;
sbit HY=P2^6;
sbit HG=P2^5;
sbit ZR=P2^4;
sbit ZY=P2^3;
sbit ZG=P2^2;
sbit YR=P2^4;
sbit YY=P2^3;
sbit YG=P2^2;
sbit SWITCH1=P1^0;
sbit SWITCH2=P1^1;
sbit SWITCH3=P1^2;
sbit SWITCH4=P1^3;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
uchar DAT1,DAT2;			   //显示时间变量
uchar DISP1[2]={0,0};		   //显示缓冲区1,南北
uchar DISP2[2]={0,0};		   //显示缓冲区2,东西
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};

void DISPCLK1(uchar i);
void DISPCLK2(uchar i);

void DEL1MS(uint z)
{
    uint x,y;
	for(x=0;x<z;x++)
	   for(y=0;y<123;y++);
}

void main()
{
     uchar i,j;
	 TCON=0x5;
	 PX1=1;
	 EX0=1;
	 EX1=1;
	 EA=1;

	 P0=0xFF;
	 P1=0xFF;
	 P2=0xFF;
	 P3=0xFF;
	 while(1)
	 {
	    P1=0xFF;
		P2=0xFF;
		DAT1=25;
		DAT2=25;
		QG=0;
		HG=0;
		ZR=0;
		YR=0;

		for(i=0;i<20;i++)
		{
		   for(j=0;j<200;j++)
		   {
		       	DISPCLK1(DAT1);
				DISPCLK2(DAT2);
				DEL1MS(25);		//延时5毫秒
		   }
		   FMQ=1;
		   DAT1=DAT1-1;
		   DAT2=DAT2-1;
		}
		P1=0xFF;
		P2=0xFF;
		ZY=0;
		YY=0;
		QY=0;
		HY=0;

		for(i = 0; i < 5; i++)
		{	
			for(j = 0; j < 200; j++)
			{
				DISPCLK1(DAT1);//显示
				DISPCLK2(DAT2);//显示
				DEL1MS(25);	//延时3毫秒
			}
			QY = ~QY;		//南北向黄灯亮
			HY = ~HY;
			ZY = ~ZY;		//东西方向黄灯亮
			YY = ~YY;  
			FMQ = ~FMQ;		//黄灯时蜂鸣器叫一声
			DAT1 = DAT1 - 1;//完成数字的减1操作,调整好的数字送显存	 
			DAT2 = DAT2 - 1;//完成数字的减1操作,调整好的数字送显存	 
		} 
	
		P1 = 0xff;
		P2 = 0xff;	 
		DAT1 = 15;			//汇编0x20
		DAT2 = 15;			//汇编0x20
		ZG = 0;				//东西方向绿灯亮
		YG = 0;
		QR = 0;				//南北方向红灯亮
		HR = 0;

		for(i = 0; i < 10; i++)//执行15秒
		{	
			for(j = 0; j < 200; j++)
			{
				DISPCLK1(DAT1);//显示
				DISPCLK2(DAT2);//显示
				DEL1MS(25);	//延时3毫秒  
			}
			FMQ = 1;		//蜂鸣器响
			DAT1 = DAT1 - 1;//完成数字的减1操作,调整好的数字送显存 
			DAT2 = DAT2 - 1;//完成数字的减1操作,调整好的数字送显存 
		}

		//最后5秒黄灯闪
		P1 = 0xff;
		P2 = 0xff;			//关所有的灯
		ZY = 0;				//黄灯亮
		YY = 0;
		QY = 0;
		HY = 0;

		for(i = 0; i < 5; i++)
		{	
			for(j = 0; j < 200; j++)
			{
				DISPCLK1(DAT1);//显示
				DISPCLK2(DAT2);//显示
				DEL1MS(25);	//延时3毫秒 		   
			}
			QY = ~QY;		//南北向黄灯亮
			HY = ~HY;
			ZY = ~ZY;		//东西方向黄灯亮
			YY = ~YY;  
			FMQ = ~FMQ;		//黄灯时蜂鸣器叫一声
			DAT1 = DAT1 - 1;//完成数字的减1操作 ,调整好的数字送显存	 
			DAT2 = DAT2 - 1;//完成数字的减1操作 ,调整好的数字送显存	 
		} 
	 }
}

void D_X() interrupt 0 using 0
{
    uchar i,j,temp0,temp1,temp2,temp3;
	EA=0;
	P3_2=1;
	while(!P3_2);
	temp0=DAT1;
	temp1=DAT2;
	temp2=P1;
	temp3=P2;

	DAT1=60;
	DAT2=60;		
	P1=0xff;
	P2=0xff;
	ZG=0;
	YG=0;
	QR=0;
	HR=0;

	for(i=0;i<60;i++)
	{
	    for(j=0;j<200;j++)
		{
		    DISPCLK1(DAT1);
			DISPCLK2(DAT2);
			DEL1MS(25);
		}
		DAT1=DAT1-1;
		DAT2=DAT2-1;
	}
	DAT1=temp0;
	DAT2=temp1;
	P1=temp2;
	P2=temp3;

	EA=1;
}

void N_B() interrupt 2 using 0
{
    uchar i,j,temp0,temp1,temp2,temp3;
	EA=0;
	P3_3=1;
	while(!P3_3);
	temp0=DAT1;
	temp1=DAT2;
	temp2=P1;
	temp3=P2;

	DAT1=60;
	DAT2=60;
	P1=0xff;
	P2=0xff;
	ZR=0;
	YR=0;
	QG=0;
	HG=0;
	for(i=0;i<60;i++)
	{
	    for(j=0;j<200;j++)
		{
		    DISPCLK1(DAT1);
			DISPCLK2(DAT2);
			DEL1MS(25);
		}
		DAT1=DAT1-1;
		DAT2=DAT2-1;
	}
	DAT1=temp0;
	DAT2=temp1;
	P1=temp2;
	P2=temp3;

	EA=1;
}

void DISPCLK1(uchar i)
{
    DISP1[0]=i%10;
	DISP1[1]=i/10;
	P0=table[DISP1[0]];
	SWITCH2=0;
	DEL1MS(2);
	SWITCH2=1;

	P0=table[DISP1[1]];
	SWITCH1=0;
	DEL1MS(2);
	SWITCH1=1;
}

void DISPCLK2(uchar i)
{
    DISP2[0]=i%10;
	DISP2[1]=i/10;
	P0=table[DISP2[0]];
	SWITCH4=0;
	DEL1MS(2);
	SWITCH4=1;

	P0=table[DISP2[1]];
	SWITCH3=0;
	DEL1MS(2);
	SWITCH3=1;
}
微机原理及接口技术课程设计交通灯 序言 十字道口的红绿灯是交通法规的无声命令,是司机和行人的行为准则。十字道口的交通红绿灯控制是保证交通安全和道路畅通的关键。当前,国内大多数城市正在采用“自动”红绿交通灯,它具有固定的“红灯—绿灯”转换间隔,并自动切换。它们一般由“通行与禁止时间控制显示、红黄绿三色信号灯和方向指示灯”三部分组成。在交通灯的通行与禁止时间控制显示中,通常要么东西、南北两方向各50秒;要么根据交通规律,东西方向60秒,南北方向40秒,时间控制都是固定的。交通灯的时间控制显示,以固定时间值预先“固化”在单片机中,每次只是以一定周期交替变化。但是,实际上不同时刻的车辆流通状况是十分复杂的,是高度非线性的、随机的,还经常受认为因素的影响。采用定时控制经常造成道路有效应用时间的浪费,出现绿灯方向车辆较少,红灯方向车辆积压。它不顾当前道路上交通车辆数的实际情况变化,其最大的缺陷就在于当路况发生变化时,不能满足司机与路人的实际需要,轻者造成时间上的浪费,重者直接导致交通堵塞,导致城市交通效率的下降。 目前,有一种使用“模糊控制”技术控制交通灯的方法。能够根据十字路口两个方向上车辆动态状况,自动判断红绿灯时间间隔,以保证最大车流量,减少道口的交通堵塞。但是却不像定时控制,能用数字显示器显示当前灯色剩余时间,以便于驾驶员随时掌握自己的驾驶动作,及
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值