基于51单片机的交通灯远程控制系统

目录

具体实现功能

设计介绍

资料内容

全部内容

资料获取


具体实现功能

具体功能:

(1)主干道方向通行30秒,辅干道通行20秒,单独左转信号15秒,先直行信号,后左转信号;绿灯转红灯时黄灯亮5秒;

(2)具有自动、手动、特殊情况三种模式。自动模式下红绿灯自动切换;手动模式下可以根据道路车流量情况手动调节红灯绿灯相应时间;紧急情况下所有路口红灯亮,黄灯亮,以便120、110等及时通行。

(3)具有远程控制功能,串口发送"W"进入紧急模式,发送"Q"退出紧急模式。

仿真演示视频:

182-基于51单片机的交通灯远程控制系统

设计介绍

51单片机简介

51单片是一种低功耗、高性能CMOS-8位微控制器,拥有灵巧的8位CPU和可编程Flash,使得51单片机为众多嵌入式控制应用系统提供灵活、高效的解决方案。

本设计所使用的芯片可兼容以下所有的51系列单片机(包括AT系列和STC系列)。

资料内容

仿真实现(protues8.7)

本设计利用protues8.7软件实现仿真设计,具体如图。

程序(Keil5)

本设计利用KEIL5软件实现程序设计。

主函数如下:

复制代码
///////////////////////////////////////////////////
/*********************主程序开始***********************/
void	main(void)
{ 
	//IT0=1;	   //INT0负跳变触发	 设置成 低电平触发方式,IT0=1为下降沿触发
	TMOD=0X21; //定时器工作于方式1
	SCON=0X50;			//设置为工作方式1
	TH0=(65536-50000)/256; //定时器赋初值
	TL0=(65536-50000)%256;
	
	ET0=1; //开定时中断
	EX0=1; //开外部INTO中断
	TR0=1; //启动定时
	TH1=0XFD;			//9600
	TL1=0XFD;
	ES=1;						//打开接收中断
	TR1=1;					//打开计数器
	EA=1;  //CPU开中断总允许
  while(1)
  {       
    Flag_zhuanhuan=0;	//南北倒计时		
    /*******S0状态,南北直行30S倒计时**********/
		Flag_EW_Yellow=0;	   //EW关黄灯显示信号,黄灯不亮
		Time_EW=EW;//赋倒计时初值20S
		Time_SN=SN;//赋倒计时初值30S
		while(Time_SN>=0)//南北倒计时大于零则继续循环
		{    
			P1 = S[0];	//给P1口赋值,使SN绿灯,EW红灯
			Display();//调用显示函数,显示
			// 全局紧急状态检测
			if(Flag_Emergency || Special_Btton==0)
			{
				P1 = 0xCC;  // 所有红灯亮
				while(Flag_Emergency || Special_Btton==0)
				{
						Display();  // 保持显示刷新
				}
			}
			if(zj==0)			//增加按键按下
			{
				Delay(3);//延时消抖
				if(zj==0)//确认增加按键按下
				{	
					while(!zj);					//去除抖动,确认是否增加按键按下
					Time_SN=Time_SN+1;			//倒计时加一
				}
			}
			if(jx==0)		//减少按键按下							//减少按键按下
			{
				Delay(3);//延时消抖
				if(jx==0)				//确认按键按下
				{	
					while(!jx);					//去除抖动,确认是否减少按键按下
					Time_SN=Time_SN-1;			//倒计时减一
				}			
			}
		}
		
		/*******S1状态,南北左转15S绿灯**********/
		Flag_SN_Yellow=0; //SN关黄灯显示信号
		Time_SN=SNL;
		while(Time_SN>=6)//大于6S一直倒计时
		{
			P1=S[2];      //SN左拐绿灯亮,EW红灯
			Display();
			// 全局紧急状态检测
			if(Flag_Emergency || Special_Btton==0)
			{
				P1 = 0xCC;  // 所有红灯亮
				while(Flag_Emergency || Special_Btton==0)
				{
						Display();  // 保持显示刷新
				}
			}
			if(zj==0)									//增加按键按下
			{
				Delay(3);
				if(zj==0)
				{	
					while(!zj);					//去除抖动,确认是否增加按键按下
					Time_SN=Time_SN+1;
				}
			}
			if(jx==0)									//减少按键按下
			{
				Delay(3);
				if(jx==0)
				{	
					while(!jx);					//去除抖动,确认是否减少按键按下
					Time_SN=Time_SN-1;
				}
			}
		}		
		/*******S2状态,绿灯转黄灯**********/
		P1=0x00;
		while(Time_SN>=0)//倒计时6S到0S转黄灯
		{
			Flag_SN_Yellow=1; //SN开黄灯信号位
			Flag_EW_Yellow=1; //SN开黄灯信号位
			P1=P1|0x44;    //保持EW红灯
			Display();
			// 全局紧急状态检测
			if(Flag_Emergency || Special_Btton==0)
			{
				P1 = 0xCC;  // 所有红灯亮
				while(Flag_Emergency || Special_Btton==0)
				{
						Display();  // 保持显示刷新
				}
			}
			if(zj==0)									//增加按键按下
			{
				Delay(3);
				if(zj==0)
				{	
					while(!zj);					//去除抖动,确认是否增加按键按下
					Time_SN=Time_SN+1;
				}
			}
			if(jx==0)									//减少按键按下
			{
				Delay(3);
				if(jx==0)
				{	
					while(!jx);					//去除抖动,确认是否减少按键按下
					Time_SN=Time_SN-1;
				}
			}
		}
		
		Flag_zhuanhuan=1;
		/***********赋值*********/
		EW=EW1;		//重新给倒计时时间赋初始值
		SN=SN1;		//重新给倒计时时间赋初始值
		EWL=EWL1;	//重新给倒计时时间赋初始值
		SNL=SNL1;	//重新给倒计时时间赋初始值

		/*******S3状态,东西直行30S**********/
		Flag_SN_Yellow=0; //SN关黄灯显示信号
		Time_EW=EW;
		Time_SN=SN;	//倒计时时间赋值	
		while(Time_EW>=0)		//30S倒计时
		{
			P1=S[4];	  //EW通行,SN红灯
			Display();
			// 全局紧急状态检测
			if(Flag_Emergency || Special_Btton==0)
			{
				P1 = 0xCC;  // 所有红灯亮
				while(Flag_Emergency || Special_Btton==0)
				{
						Display();  // 保持显示刷新
				}
			}
			if(zj==0)									//增加按键按下
			{
				Delay(3);
				if(zj==0)
				{	
					while(!zj);					//去除抖动,确认是否增加按键按下
					Time_EW=Time_EW+1;
				}
			}
			if(jx==0)									//减少按键按下
			{
				Delay(3);
				if(jx==0)
				{	
					while(!jx);					//去除抖动,确认是否减少按键按下
					Time_EW=Time_EW-1;
				}
			}
		}
		
		/*******S4状态,东西左转15S倒计时**********/
		Flag_EW_Yellow=0;//EW关黄灯显示信号
		Time_EW=EWL;
		while(Time_EW>=6)//大于6S时一直为左转绿灯
		{
			P1=S[6];     //EW左拐绿灯亮,SN红灯
			Display();
			// 全局紧急状态检测
			if(Flag_Emergency || Special_Btton==0)
			{
				P1 = 0xCC;  // 所有红灯亮
				while(Flag_Emergency || Special_Btton==0)
				{
						Display();  // 保持显示刷新
				}
			}
			if(zj==0)
			{	
				while(!zj);					//去除抖动,确认是否增加按键按下
				Time_EW=Time_EW+1;
			}
			if(jx==0)									//减少按键按下
			{
				Delay(3);
				if(jx==0)
				{	
					while(!jx);					//去除抖动,确认是否减少按键按下
					Time_EW=Time_EW-1;
				}
			}
		}
		
		/*******S5状态**********/	
		P1=0x00;
		while(Time_EW>=0)//小于6S后为黄灯
		{
			Flag_EW_Yellow=1; //SN开黄灯信号位
			Flag_SN_Yellow=1; //SN开黄灯信号位
			P1=P1|0x44;    //保持EW红灯
			Display();
			// 全局紧急状态检测
			if(Flag_Emergency || Special_Btton==0)
			{
				P1 = 0xCC;  // 所有红灯亮
				while(Flag_Emergency || Special_Btton==0)
				{
						Display();  // 保持显示刷新
				}
			}
			if(zj==0)									//增加按键按下
			{
				Delay(3);
				if(zj==0)
				{	
					while(!zj);					//去除抖动,确认是否增加按键按下
					Time_EW=Time_EW+1;
				}
			}
			if(jx==0)									//减少按键按下
			{
				Delay(3);
				if(jx==0)
				{	
					while(!jx);					//去除抖动,确认是否减少按键按下
					Time_EW=Time_EW-1;
				}
			}
		}			
		P1=0XFF;						
	}
}

程序运行结果如图:

全部内容

全部资料包括程序(keil5)、protues仿真(protues8.7)、设计说明、答辩PPT、开发资料、资料使用介绍、仿真视频、最小系统介绍视频等。

资料获取

https://docs.qq.com/doc/DT0d4WmZybmdoa0Nw

相关推荐
国科安芯2 小时前
低轨卫星边缘计算节点的抗辐照MCU选型分析
人工智能·单片机·嵌入式硬件·架构·边缘计算·安全威胁分析·安全性测试
youcans_2 小时前
【STM32-MBD】(9)Simulink 模型开发之上位机显示波形
stm32·单片机·嵌入式硬件·上位机·simulink
无垠的广袤2 小时前
【FPB-RA6E2 开发板】Zephyr 物联网温湿度计
单片机·嵌入式硬件·物联网·瑞萨·传感器·dht11
lemoncat82 小时前
开源小工具推荐:立创3D模型快速下载
嵌入式硬件·pcb设计·pcb
兆龙电子单片机设计2 小时前
【STM32项目开源】STM32单片机智能家居语音控制系统
stm32·单片机·物联网·开源·毕业设计·智能家居
d111111111d2 小时前
STM32的ADC是什么,其转换精度通常有那些选项?
笔记·stm32·单片机·嵌入式硬件·学习
小刘爱玩单片机3 小时前
【stm32简单外设篇】- 红外避障 / 红外循迹模块
c语言·stm32·单片机·嵌入式硬件
恒锐丰小吕3 小时前
屹晶微 EG2130 带关断控制的高压半桥栅极驱动芯片技术解析
嵌入式硬件·硬件工程
森旺电子3 小时前
STM32内核中断和外设中断
stm32·单片机·嵌入式硬件·freertos