加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

基于51单片机的交通灯【紧急,放行,调时】(仿真)

12小时前
360
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
  • 方案介绍
  • 相关文件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

AT89C52单片机控制一个交通信号灯系统,晶振采用12MHz。设A车道与B车道交叉组成十字路口,A是主道,B是支道。设计要求如下所示:

(1)用发光二极管模拟交通信号灯,用按键开关模拟车辆检测信号。

(2)正常情况下,A、B两车道轮流放行,A车道放行50s,其中5s用于警告,B车道放行30s,其中5s用于警告。

(3)在交替繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥挤状况。在B车道放行期间,若A车道有车而B车道无车,按下开关K1使A车道放行15s;在A车道放行期间,若B车道有车而A车道无车,按下开关使B车道放行15s。

(4)有紧急车辆通行时,按下开关A3,使A、B车道均为红灯,禁行20s。

it k1=P3^2;//设置按钮
sbit k2=P3^3;
sbit k3=P3^4;
sbit k4=P3^5;//通行控制
sbit k5=P3^6;
sbit k6=P3^7;

sbit red1	=P1^0;	  //南北方向
sbit yellow1=P1^1;
sbit green1	=P1^2;
sbit red2	=P1^3;	  //东西方向
sbit yellow2=P1^4;
sbit green2	=P1^5;

sbit smg1=P2^0;//数码管引脚
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;

uchar code tabel[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar sec=0,miao=0;	  //定时
uchar nan=0,dong=0;//东西南北时间
uchar mode=0;		  //路灯工作顺序
uchar nan_lim=50,dong_lim=30;//自由调整时主次干道绿灯时间
uchar moshi=0;

void delay(uint i)//延时
{
	while(i--);
}

void control()//控制路灯
{
	switch(mode)
		{
			case 0:red1=0;yellow1=1;green1=1;red2=1;yellow2=1;green2=0;//南北红灯亮
				nan=dong_lim+7;dong=dong_lim+1;//设置初始时间
				break;
			case 1:red1=0;yellow1=1;green1=1;red2=1;yellow2=0;green2=1;//东西黄灯亮
				dong=6;nan=6;
				break;
			case 2:red1=1;yellow1=1;green1=0;red2=0;yellow2=1;green2=1;//东西红灯亮
				nan=nan_lim+1;dong=nan_lim+7;//设置初始时间
				break;
			case 3:red1=1;yellow1=0;green1=1;red2=0;yellow2=1;green2=1;//南北黄灯亮
				nan=6;dong=6;
		}
}

void display() //显示各路口时间
{
	P0=tabel[nan/10];//南北
	smg1=1;
	delay(100);
	smg1=0;
	P0=tabel[nan%10];
	smg2=1;
	delay(100);
	smg2=0;
	P0=tabel[dong/10];//东西
	smg3=1;
	delay(100);
	smg3=0;
	P0=tabel[dong%10];
	smg4=1;
	delay(100);
	smg4=0;
}

void main()//主函数
{
	uchar k=0;
	TMOD=0x01;//定时器设置
	TH0=0x3c; //50ms
	TL0=0xb0;
	ET0=1;	  //开中断
	EA=1;
	TR0=1;	 //启动定时器
	control();
	nan=dong_lim+6;dong=dong_lim;//设置初始时间
	while(1)
	{
		if(moshi==0)
			display();//显示
		if(!k1 &&(k!=1))
		{				 //模式切换
			if(moshi<2)
				moshi++;
			else
				moshi=0;
			k=1;
		}
		if(moshi==1)//调节南北时间
		{
			if(!k2 &&(k!=2))
			{
				if(nan_lim<99)
					nan_lim++;
					k=2;
			}
			if(!k3 &&(k!=3))
			{
				if(nan_lim>1)
					nan_lim--;
				k=3;
			}
			P0=tabel[nan_lim/10];//南北
			smg1=1;
			delay(100);
			smg1=0;
			P0=tabel[nan_lim%10];
			smg2=1;
			delay(100);
			smg2=0;
		}
		if(moshi==2)//调节东西时间
		{
			if(!k2 &&(k!=2))
			{
				if(dong_lim<99)
					dong_lim++;
				k=2;
			}
			if(!k3 &&(k!=3))
			{
				if(dong_lim>1)
					dong_lim--;
				k=3;
			}
			P0=tabel[dong_lim/10];//东西
			smg3=1;
			delay(100);
			smg3=0;
			P0=tabel[dong_lim%10];
			smg4=1;
			delay(100);
			smg4=0;
		}
		//繁忙
		if(!k4 &&(k!=4))//A放行15s
		{
			k=4;
			if(mode==0)
			{
				mode=2;
  • 有需要资料的可了解一下.docx

相关推荐

电子产业图谱