基于AT89C51的交通灯系统的仿真实现正常交通且紧急按钮

1.设计要求

交通灯系统整体设计构想:系统南北绿灯通行时间都为10秒,包含南北黄灯闪烁5秒,东西绿灯通行10秒,东西黄灯闪烁5秒。这样一直循环。另外还有一个紧急按钮,按下四个方向红灯亮起。

2.模块组成

①本设计单片机最小系统:晶振电路、复位电路、单片机组成。
②红绿灯电路
③数码管电路

3.仿真全图

在这里插入图片描述
在这里插入图片描述

4.程序主要代码

char time1=10;  //初值南北10秒
char time2=15;  //初值东西15秒
char huang=5;  //黄灯时间
char time11=15,time22=10;

uchar time1_2,temp=0,p=0,tab;
uchar shi1,ge1,shi2,ge2,q;
uchar status,key,flag;
uchar zhuangtai_flag=0;


//共阴极数字显示编码
uchar code table[]={0x3f,0x06,0x5b,0x4f,
	               0x66,0x6d,0x7d,0x07,
	               0x7f,0x6f};
uchar code wei[]={0xfd,0xfe,0xf7,0xfb,
				  0xdf,0xef,0x7f,0xbf}; //位选
 
void delay(uint x)
{
		uint i,j;
		for(i=x;i>0;i--)			//定时x毫秒
			for(j=110;j>0;j--);
}
void display(uint ge1,uint shi1,uint ge2,uint shi2)	//数码管显示
{
	//显示北
	wela=1; //打开位选锁存器
	P0=wei[0];	//送入位选码(北个位)
	wela=0; //关闭位选锁存器
	P0=0;  //消影
	dula=1; //打开段选锁存器
	P0=table[ge1]; //送入段选
	dula=0;	//关闭段选锁存器
	delay(1);

	wela=1; //打开位选锁存器
	P0=wei[1];	//送入位选码(北十位)
	wela=0; //关闭位选锁存器
	P0=0;
	dula=1; //打开段选锁存器
	P0=table[shi1]; //送入段选
	dula=0;	//关闭段选锁存器
	delay(1);

	//显示东西
	wela=1; //打开位选锁存器
	P0=wei[2];	//送入位选码(东个位)
	wela=0; //关闭位选锁存器
	P0=0;
	dula=1; //打开段选锁存器
	P0=table[ge2];
	dula=0;	//关闭段选锁存器
	delay(1);

	wela=1; //打开位选锁存器
	P0=wei[3];	//送入位选码(东十位)
	wela=0; //关闭位选锁存器
	P0=0;	
	dula=1; //打开段选锁存器
	P0=table[shi2];
	dula=0;	//关闭段选锁存器
	delay(1);
}
void key1_6()
{
	
	
		if(key==7)    //红灯全亮
	{
		time1=0;
		time2=0;
		temp=0;	 //计数值清零
		p=0;
		TR0=0;
		P1=0x09;
	}

}

void dis()
{
	wela=1;
	P0=0xff;
	wela=0;
}	 

void zhuangtai1()
{
		P1=0x0c;  //刚开始南北通,东西禁行
		if(time1<0)
		{
			time1=huang;
			time2=huang;
			zhuangtai_flag=1;
		}
}

void zhuangtai2()
{
	P1=0x0a;
	
					q=!q;
			if(q!=0)
				SN=1;   //全黄
			else
				SN=0;
	if(time1<0)
	{
			time1=time11;
			time2=time22;
			zhuangtai_flag=2;
	}
}

void zhuangtai3()
{
	P1=0x21;
		if(time1<0)
	{
			time1=huang;
			time2=huang;
			zhuangtai_flag=3;
	}
	
}

void zhuangtai4()
{
	P1=0x11;
				q=!q;
			if(q!=0)
				EW=1;   //全黄
			else
				EW=0;
			
			if(time1<0)
	{
			time1=time11;
			time2=time22;
			zhuangtai_flag=0;
	}
}

void main()
{
	P1=0x0c;  //刚开始南北通,东西禁行
	TMOD=0x01;
	TH0=(65535-10000)/256;
	TL0=(65535-10000)%256;   //初值
	
	while(1)
	{
		if(flag)
		{
			switch(status)	  	 //判断按键
			{
				
				case 0xf8:key=7;break;
			}
			key1_6();   //按键程序
			flag=0;
		}	
		if(!p)
		{
			shi1=time1/10;	//南北十位
			ge1=time1%10;	//南北个位
			shi2=time2/10;	//东西十位
			ge2=time2%10;	//东西个位	
			display(ge1,shi1,ge2,shi2); //显示函数
		}
    
		
	}  
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值