51交通灯

news2024/12/26 22:53:02

一、基本原理

利用51单片机控制各个路口红绿灯及时间显示。

设计的重点:

1、各个路口红绿灯亮灭的规则,暂不考虑左转方向;

2、倒计时的实现,利用单片机的定时器进行计数得到秒信号;

3、时间显示:东西南北四个方向的时间一致,当东西方向为60秒绿灯通行时间,同时南北方向为60秒红灯禁止时间,因此硬件连接时可考虑东西南北方向可采用同一接法;最后相当于2个数码管动态显示。

4、按键设置(扩展要求):设置键按一次,设置主干道通信时间(即次干道禁止时间),按第二次,设置主干道禁止时间(即次干道通信时间),按第三次,可作为紧急通信键。设置时间需要确定,可通过确定键实现,也可通过延时确定,如10秒。当然也可根据需要增加相应的按键。

仿真图

注意修改每个灯的管脚,位选管脚等。

#include <REGX52.H>
#define ON 0 
#define OFF 1 
unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
short EW_Time=60,NS_Time=60,EW_SetTime=60,NS_SetTime=60;
unsigned char Time_Mode=0,Flag_Blink=0;
sbit Switch_Time1=P3^3;//数码管位选
sbit Switch_Time2=P3^2;
sbit EW_Red=P2^0;	   				//东西向红灯
sbit EW_Green=P2^3;	   				//东西向绿灯
sbit EW_Yellow=P2^2;	   		    //东西向黄灯
sbit NS_Red=P2^5;	   				//南北向红灯
sbit NS_Green=P2^7;	   				//南北向绿灯
sbit NS_Yellow=P2^6;	   			//南北向黄灯
sbit Power=P2^4;void delay_ms(unsigned int ms)//ms延时函数
{
	unsigned int i,j;
	for(i=ms;i>0;i--)
		for(j=110;j>0;j--);
 
}

void Timer_Init()//定时器初始化
{
	TMOD=0x01; //设置为定时器0工作模式1
	TL0=(65536-50000)%256;//低八位
	TH0=(65536-50000)/256;//高八位
	TR0 = 1; //定时器0开始计时
	EA=1;//开启总中断
	ET0=1;//开启定时器0中断
}

void Nixie(unsigned char Data)//数码管显示
{
		Switch_Time1=1;
		Switch_Time2=0;
		P0=tab[Data%10];//显示个位
		delay_ms(1);
		Switch_Time2=1;
		Switch_Time1=0;
		P0=tab[Data/10];//显示十位
		delay_ms(1);
}

unsigned char Scan_Key()//获取按键键码
{
	unsigned char KeyNumber=0;
	if(P1_0==0){delay_ms(10);while(P1_0==0);delay_ms(10);KeyNumber=1;}
	if(P1_1==0){delay_ms(10);while(P1_1==0);delay_ms(10);KeyNumber=2;}
	if(P1_2==0){delay_ms(10);while(P1_2==0);delay_ms(10);KeyNumber=3;}
	if(P1_3==0){delay_ms(10);while(P1_3==0);delay_ms(10);KeyNumber=4;}
	if(P1_4==0){delay_ms(10);while(P1_4==0);delay_ms(10);KeyNumber=5;}
	if(P1_5==0){delay_ms(10);while(P1_5==0);delay_ms(10);KeyNumber=6;}
	if(P1_6==0){delay_ms(10);while(P1_6==0);delay_ms(10);KeyNumber=7;}
	if(P1_7==0){delay_ms(10);while(P1_7==0);delay_ms(10);KeyNumber=8;}
	return KeyNumber;
}


void traffic()//红绿灯主要逻辑
{
	
	if(Time_Mode==0)//东西南北转换
	{
		Nixie(EW_Time);
		if(EW_Time>5)
		{
			EW_Red=OFF;//东西红灯灭
			NS_Yellow=OFF;//南北黄灯灭
			NS_Green=OFF;//南北绿灯灭
			
			EW_Green=ON;//东西绿灯亮
			NS_Red=ON;//南北红灯亮
		}else if(Flag_Blink==0&&EW_Time<=5&&EW_Time>0)//闪烁
		{
			EW_Green=OFF;//东西绿灯灭
			EW_Yellow=ON;//东西黄灯亮
		}else
		{
			EW_Green=OFF;//东西绿灯灭
			EW_Yellow=OFF;//东西黄灯灭
		}
	}
	if(Time_Mode==1)//东西南北转换
	{
		Nixie(NS_Time);
		if(NS_Time>5)
		{
			
			NS_Red=OFF;//南北红灯灭
			EW_Yellow=OFF;//东西黄灯灭
			EW_Green=OFF;//东西绿灯灭
			
			EW_Red=ON;//东西红灯亮
			NS_Green=ON;//南北绿灯亮
		}else if(Flag_Blink==0&&NS_Time<=5&&NS_Time>0)//闪烁
		{
			NS_Green=OFF;//南北绿灯灭
			NS_Yellow=ON;//南北黄灯亮
		}
		else
		{
			NS_Green=OFF;//南北绿灯灭
			NS_Yellow=OFF;//南北黄灯灭
		}
	}
}

void Set_Time()
{
	char Key_Num=0,Key_Value=0,mode=1;
	while(1)
	{
		Key_Value=Scan_Key();//获取键值
		if(Key_Value!=0)Key_Num=Key_Value;
		if(Key_Num==1)
		{
			mode++;
			if(mode>3)break;
			Key_Num=0;
		}
		if(mode==1)//按下第二次显示东西通讯时间,可加减设置
		{
			Nixie(EW_SetTime);
			if(Key_Num==2){EW_SetTime++;Key_Num=0;}
			if(Key_Num==3){EW_SetTime--;Key_Num=0;}
		}
		if(mode==2)//按下第二次显示南北通讯时间,可加减设置
		{
			Nixie(NS_SetTime);
			if(Key_Num==2){NS_SetTime++;Key_Num=0;}
			if(Key_Num==3){NS_SetTime--;Key_Num=0;}
		}
		if(mode==3)//按下第三次时显示00,红灯亮,紧急通行
		{
			P2=0xFF;
			Nixie(0);
			NS_Red=ON;
			EW_Red=ON;
		}
		if(Key_Num==4)//确认键,上传主副干道通行时间
		{
			EW_Time=EW_SetTime;
			NS_Time=NS_SetTime;
			break;
		}
			
	}
}
void Yellow_Blink()//黄灯闪烁
{
	char Key_Num=0,Key_Value=0,Mode=1;
	while(1)
	{
		Key_Value=Scan_Key();//获取键值
		if(Key_Value!=0)Mode=Key_Value;
		P2=0xFF;
		Nixie(0);
		if(Flag_Blink)
		{
			EW_Yellow=ON;
			NS_Yellow=ON;		
		}else
		{
			EW_Yellow=OFF;
			NS_Yellow=OFF;	
		}
		
		if(Mode==5){break;}
	}
}

void main()
{
	char Key_Mode=0,Key_Value=0;
	
	P2=0xFF;
	Power=1;
	Timer_Init();//初始化定时器
//	NS_Green=OFF;
  while(1)	
  { 
		Key_Value=Scan_Key();
		if(Key_Value!=0)Key_Mode=Key_Value;
		switch(Key_Mode)
		{
			case 0:traffic();
				break;
			case 1:Set_Time();
						Key_Mode=0;
				break;
			case 5:Yellow_Blink();
							Key_Mode=0;
				break;
			default:
				Key_Mode=0;
		}
		
  }
}

void Timer0() interrupt 1
{
	static unsigned char count=0,count1=0;
	TL0=(65536-50000)%256;//低八位
	TH0=(65536-50000)/256;//高八位
	if(count>=10)
	{
		count=0;
		if(Time_Mode==0)//东西时间减
		{
			EW_Time--;
			if(EW_Time<0){EW_Time=EW_SetTime;Time_Mode=!Time_Mode;}
		}
		if(Time_Mode==1)//南北时间减
		{
			NS_Time--;
			if(NS_Time<0){NS_Time=NS_SetTime;Time_Mode=!Time_Mode;}
		}
		
	}
	if(count1>=5)//闪烁标志位
	{
		count1=0;
		Flag_Blink=!Flag_Blink;
	}
	count++;
	count1++;
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1831520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【每日刷题】Day67

【每日刷题】Day67 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 23. 合并 K 个升序链表 - 力扣&#xff08;LeetCode&#xff09; 2. 1189. “气球” 的最大数量 - …

一篇搞定Spring,IOC容器,Bean管理,3.AOP底层原理和实现(收下吧,真的很详细)

1.Spring容器的概念 Spring是一个轻量级的框架&#xff0c;可以解决企业开发的复杂性&#xff0c;让开发效率提升&#xff0c;他核心的两个点是&#xff1a; 1.IOC IOC&#xff1a;在java中&#xff0c;我们程序员一般是去创建一个对象&#xff0c;那么有个问题就是耦合性太…

Apache DolphinScheduler查看版本信息

我找了半天&#xff0c;没有看到版本在哪里。然后我看配置&#xff0c;他要连接数据库&#xff0c;我去他存储数据库的表里面&#xff0c;看到了相关的版本信息。 cd /home/dolphinscheduler/dolphinscheduler/bin/env dolphinscheduler找到了里面的密码 版本是3.1.3

VMware挂载NAS存储异常处理

问题概述 由于非法关机或恢复&#xff0c;NFS存储可能会出现以下问题&#xff1a; 数据存储处于挂起状态或无法正常识别。虚拟机的配置文件或虚拟磁盘仍然注册在异常数据存储上。系统误认为有虚拟机在使用该数据存储。 问题对策 下面是详细的排查步骤和解决对策&#xff1a…

JS 实现Date日期格式的本地化

为了更好的更新多语言日期的显示&#xff0c;所以希望实现日期的本地化格式显示要求&#xff0c;常规的特殊字符型格式化无法满足显示要求&#xff0c;这里整理了几种我思考实现的本地化实现功能。 通过多方查找&#xff0c;总结了实现的思路主要有如下三个方向&#xff1a; 官…

ThinkPHP 的老漏洞仍然被攻击者钟情

研究人员发现安全领域出现了令人不安的趋势&#xff1a;攻击者不仅对新披露的漏洞十分感兴趣&#xff0c;对已知的漏洞也丝毫不放过&#xff0c;尽管有些漏洞已经存在了好些年头&#xff0c;攻击者仍然能够通过老漏洞成功完成攻击。 典型的例子就是 ThinkPHP 远程代码执行漏洞…

同三维T80004EHL-W-4K30 4K HDMI编码器,支持WEBRTC协议

输入&#xff1a;1路HDMI1路3.5音频&#xff0c;1路HDMI环出1路3.5音频解嵌输出 4K30超高清,支持U盘/移动硬盘/TF卡录制&#xff0c;支持WEBRTC协议&#xff0c;超低延时&#xff0c;支持3个点外网访问 1个主流1个副流输出&#xff0c;可定制选配POE供电模块&#xff0c;WEBR…

白酒:茅台镇白酒的文化内涵与传承意义

茅台镇白酒&#xff0c;作为中国的酒文化的代表之一&#xff0c;具有丰富的文化内涵和传承意义。而云仓酒庄豪迈白酒作为茅台镇的品牌之一&#xff0c;更是承载了深厚的文化底蕴和历史积淀。 首先&#xff0c;茅台镇白酒是中国的酒文化的重要组成部分。白酒在中国有着悠久的历史…

SRAM和DRAM

1.SRAM&#xff08;静态RAM&#xff09; 把存放一个二进制位的物理器件称为存储元&#xff0c;它是存储器最基本的构件。 地址码相同的多个存储元构成一个存储单元。 存储单元的集合构成存储体。 静态RAM的存储元是用双稳态触发器&#xff08;六晶体管MOS&#xff09;来记忆…

MyBatis查询两个字段,返回Map,一个字段作为key,一个字段作为value的实现

项目场景&#xff1a; 在使用MyBatis&#xff0c;我们经常会遇到这种情况&#xff1a;SELECT两个字段&#xff0c;需要返回一个Map&#xff0c;其中第一个字段作为key&#xff0c;第二个字段作为value。MyBatis的MapKey虽然很实用&#xff0c;但并不能解决这种场景。 问题描述 …

vue分类

先看效果 再看代码 <category-tab v-model"params.area" name"地区" :list"areaList" /><category-tab v-model"params.type" name"类型" :list"typeList" /><category-tab v-model"params.…

WPF/C#:如何将数据分组显示

WPF Samples中的示例 在WPF Samples中有一个关于Grouping的Demo。 该Demo结构如下&#xff1a; MainWindow.xaml如下&#xff1a; <Window x:Class"Grouping.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x&q…

【面试 - 页面优化举例】页面跳转卡顿问题解决 - 页面跳转速度优化

目录 为何要优化如何优化优化1 - 懒加载优化2 - el-tree 子节点默认不展开 为何要优化 页面A跳转到也页面B时&#xff0c;页面出现卡顿情况&#xff1a; 【问题】页面A → 页面B时&#xff0c;页面B进入到了 created 钩子后过了六七秒才进入到 mounted 钩子&#xff1b;【分析经…

vue分页

先看效果 再看代码 <!-- 分页 --><div v-if"pageParams.pageCount > 1" class"flex justify-end mt-6"><n-paginationv-model:page"pageParams.page" v-model:page-size"pageParams.pageSize" :page-count"pa…

生产 的mybatisplus 日志输入到日志文件

默认是输出到控制台.不输出到日志文件 输出到日志文件.需要修改配置 第一步. logging:config: classpath:logback-wshoto.xml第二步 mybatis-plus:configuration:cache-enabled: truedefault-executor-type: reuselog-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl第三步…

标准立项 | 膜曝气生物膜反应器(MABR)平板曝气膜

立项单位&#xff1a;天津市华宇膜技术有限公司、中国市政工程中南设计研究总院有限公司、中建生态环境集团有限公司、富朗世水务技术(江苏)有限公司、常州宣清环境科技有限公司 膜组件开发 膜腔内部支撑结构-一在膜腔内部设置支撑结构以防止膜腔在水压下压实&#xff0c;同时…

CRMEB多门店的门店后台首页路由

如何在输入 http://localhost:8080/、http://localhost:8080/store/、http://localhost:8080/custom-store/ 这三个中任意一个链接都能正确跳转到 http://localhost:8080/store/home/index 。要实这个要求&#xff0c;有两种方式&#xff1a; 重定向 const router new VueRo…

WPF/C#:更改界面的样式

项目结构&#xff1a; 先来看看BlueSkin.xaml与YellowSkin.xaml。 BlueSkin.xaml&#xff1a; <ResourceDictionaryxmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:l…

SVN代码无法提交(报错lock)

SVN无法commit(可以导出可以update)报错画面如下&#xff1a; 报错&#xff1a;If you want to break the lock, use the check For Modifcations dialoo or the repository browser. 前提&#xff1a;使用解锁和clean up无效 解决办法&#xff1a;导出报错仓库数据到本地&am…

9种编程语言的对比分析

在当今的软件开发领域&#xff0c;编程语言扮演着至关重要的角色。不同的编程语言各有其特点和适用场景&#xff0c;选择合适的编程语言能够提高开发效率和软件质量。本文将对十种常见的编程语言进行对比分析&#xff0c;帮助读者了解它们的优缺点和适用场景。 Java 特点&…