基于51单片机的交通灯设计

news2024/11/14 9:29:31

一.硬件方案

本设计能模拟基本的交通控制系统,用红绿黄灯表示禁行,通行和等待的信号发生,还能进行倒计时显示。按键可以控制禁行、深夜模式、复位、东西通行、南北通行、时间加、时间减、切换等功能。共四个二位阴极数码管,东南西北各一个显示时间,四个数码管的阴极都接到STC89C51的P1口,阳极接到74HC245芯片上,通过P0口控制74HC245芯片,起到驱动放大作用。
主要电路:51单片机+最小系统+数码管显示模块+LED指示灯模块+按键模块;

二.设计功能

(1)本设计采用四方向数码管显示时间的设计,更加符合真实的交通信号灯设计;
(2)7个按键:复位、夜间模式、紧急模式、设定时间、时间加、时间减、调试确定键;
(3)夜间模式:按下“夜间模式”按键后,四个方向的黄灯闪烁;
(4)紧急模式:当救护车、救火车等通过时,按下“紧急模式”按键,四个方向的红灯全部亮起;
(5)东西方向和南北方向的通行时间可以分开设置。就是模拟实际交通中的主干道和支干道。

三.设计原理图

(1)原理图主要采用AD软件进行设计,如图:
在这里插入图片描述
(2)Protues仿真图如下:
在这里插入图片描述

四.软件设计

主程序源码:

//主程序
void main()
{
	TMOD=0X11;	   				//定时器设置
	TH1=0X3C;		
	TL1=0XB0;
	TH0=0X3C;					//定时器0置初值 0.05S
	TL0=0XB0;
	EA=1;						//开总中断
	ET0=1;						//定时器0中断开启
	ET1=1;					   //定时器1中断开启
	TR0=1;						//启动定时0
	TR1=0;						 	//关闭定时1
    logo();						//开机初始化
	P2=0Xc3;					// 开始默认状态,东西绿灯,南北黄灯   
    sec_nb=sec_dx+5; 			//默认南北通行时间比东西多5秒
	while(1)					  //主循环
	{	 
		key(); 					//调用按键扫描程序
		display(); 				//调用显示程序
	}	
}
//函数的定义部分
void key(void)	//按键扫描子程序
{	 
	if(k1!=1)							//当K1(时间加)按下时
	{
		display();       				//调用显示,用于延时消抖
		if(k1!=1)							//如果确定按下
		{
		  	TR0=0;	       				//关定时器	
			shanruo=0;					//闪烁标志位关
			P2=0x00;					//灭显示
			TR1=0;							//启动定时1
			if(set==0)					//设置键按下
				set_timedx++;   		//南北加1S
			else
				set_timenb++;    		//东西加1S
			if(set_timenb==100)
				set_timenb=1;
			if(	set_timedx==100)
				set_timedx=1;   		//加到100置1
			sec_nb=set_timenb ; 		//设置的数值赋给东西南北
			sec_dx=set_timedx;			
		  	do
		 	{ 
				display();				 //调用显示,用于延时
			}
			while(k1!=1);			 //等待按键释放
		}
	}

	if(k2!=1)							//当K2(时间减)按键按下时
	{		
		display();       				//调用显示,用于延时消抖  
		if(k2!=1)						//如果确定按下
		{	
		 	TR0=0;         				//关定时器0	
			shanruo=0;					//闪烁标志位关
			P2=0x00;					//灭显示
			TR1=0;						//关定时器1	
			if(set==0)
				set_timedx--;  			//南北减1S
			else
				set_timenb--;  			//东西减1S
			if(set_timenb==0)
				set_timenb=99;	
			if(	set_timedx==0 )
				set_timedx=99;   		//减到1重置99
			sec_nb=set_timenb ;	 		//设置的数值赋给东西南北
			sec_dx=set_timedx;
		  	do	
		    { 
				display();       		//调用显示,用于延时
			}
			while(k2!=1);			   //等待按键释放
		}
	}

	if(k3!=1)							//当K3(确认)键按下时
	{	
		display();       				//调用显示,用于延时消抖
		if(k3!=1)						//如果确定按下
		{
			TR0=1;  						//启动定时器0
			sec_nb=set_timenb;				//从中断回复,仍显示设置过的数值
			sec_dx=set_timedx;				//显示设置过的时间
			TR1=0;							//关定时器1	
			if(set==0)						//时间倒时到0时
			{ 
				P2=0X00;					 //灭显示
				Green_dx=1;						//东西绿灯亮
				Red_nb=1;					//南北红灯亮
				sec_nb=sec_dx+5; 			//回到初值
			}
			else 
			{ 
				P2=0x00;					//南北绿灯,东西红灯
				Green_nb=1;
				Red_dx=1;
				sec_dx=sec_nb+5; 
			}
		}
	}
	 
	if(k4!=1)							//当K4(切换)键按下
    {
		display();       				//调用显示,用于延时消抖
		if(k4!=1)						//如果确定按下
		{  
		 	TR0=0;						//关定时器0	
			set=!set;					//取反set标志位,以切换调节方向
			TR1=0;						//关定时器1
			dx_nb=set;
			do
			{
				display(); 			   //调用显示,用于延时
			}				
			while(k4!=1);			  //等待按键释放
		}
	}	

	if(k5!=1)							//当K5(禁止)键按下时
	{
	   	display();       				//调用显示,用于延时消抖
	   	if(k5!=1)						//如果确定按下
	   	{ 	
	    	TR0=0;						//关定时器
			P2=0x00;					//灭显示
			Red_dx=1;
			Red_nb=1;					//全部置红灯
			TR1=0;
			sec_dx=00;					//四个方向的时间都为00
			sec_nb=00;
			do
			{
				display(); 				//调用显示,用于延时
			}	
			while(k5!=1);			//等待按键释放	
	   	}
	}
	if(k6!=1)							//当K6(夜间模式)按下 
	{
	   	display();       				//调用显示,用于延时消抖 
	   	if(k6!=1)						//如果确定按下
	   	{ 	
	    	TR0=0;						//关定时器
			P2=0x00;
			TR1=1;
			sec_dx=00;					//四个方向的时间都为00
			sec_nb=00;
			do
			{
				display(); 			  //调用显示,用于延时
			}	
			while(k6!=1);			//等待按键释放	
	   	}
	}
}

资料链接:https://pan.baidu.com/s/1RTF58-hWut5EEv6ZgvnFiw?pwd=gkv0

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

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

相关文章

【busybox记录】【shell指令】unlink

目录 内容来源: 【GUN】【unlink】指令介绍 【busybox】【unlink】指令介绍 【linux】【unlink】指令介绍 使用示例: 删除文件 - 默认 常用组合指令: 指令不常用/组合用法还需继续挖掘: 内容来源: GUN &#x…

SpringCloud系列(31)--使用Hystrix进行服务降级

前言:在上一章节中我们创建了服务消费者模块,而本节内容则是使用Hystrix对服务进行服务降级处理。 1、首先我们先对服务提供者的服务进行服务降级处理 (1)修改cloud-provider-hystrix-payment8001子模块的PaymentServiceImpl类 注:HystrixP…

Hadoop3:MapReduce之简介、WordCount案例源码阅读、简单功能开发

一、概念 MapReduce是一个 分布式运算程序 的编程框架,是用户开发“基于 Hadoop的数据分析 应用”的核心框架。 MapReduce核心功能是将 用户编写的业务逻辑代码 和 自带默认组件 整合成一个完整的 分布式运算程序 ,并发运行在一个 Hadoop集群上。 1、M…

软件架构设计属性之一:功能性属性浅析

引言 软件架构设计属性中的功能性属性是评估软件架构是否满足其预定功能需求的关键指标。功能性属性确保软件能够执行其设计中的任务,并提供所需的服务。以下是对软件架构设计中功能性属性的浅析: 一、定义 功能性属性是指软件系统所具备的功能特性&a…

怎么将3D模型转换立面图---模大狮模型网

在建筑设计、室内设计以及产品建模等领域,经常需要将3D模型转换为立面图以进行展示、分析或交流。立面图能够清晰地呈现物体的外观和结构,是设计和施工中不可或缺的一部分。 一、导出3D模型 首先,需要将3D模型导出为CAD软件能够识别的格式。…

如何配置才能连接远程服务器上的 redis server ?

文章目录 Intro修改点 Intro 以阿里云服为例。 首先,我在我买的阿里云服务器中以下载源码、手动编译的方式安装了 redis-server,操作流程见:Ubuntu redis 下载解压配置使用及密码管理 && 包管理工具联网安装。 接着,我…

(函数)颠倒字符串顺序(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <string.h>//声明颠倒函数; void reverse(char a[]) {//初始化变量值&#xff1b;int i, j;char t;//循环颠倒&#xff1b;for (i 0, j strl…

Iphone自动化指令每隔固定天数打开闹钟关闭闹钟(二)

1.首先在搜索和操作里搜索“查找日期日程" 1.1.然后过滤条件开始日期选择”是今天“ 1.2.增加过滤条件&#xff0c;日历是这里选择”工作“ 1.3.增加过滤条件&#xff0c;选择标题&#xff0c;是这里选择”workDay“ 1.4选中限制&#xff0c;日历日程只要一个&#xff0c;…

Vue3实战笔记(51)—Vue 3封装带均线的k线图

文章目录 前言带均线的k线图总结 前言 继续封装一个封装带均线的k线图 带均线的k线图 EChartsCandlestickSh.vue&#xff1a; <template><div ref"chartContainer" style"width: 100%; height: 500px"></div></template><scr…

专业的力量-在成为专家的道路上前进

专业的力量-在成为专家的道路上前进 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 现在稀缺的已不再是信息资源&#xff0c;而是运用信息的能力。过去…

C#多线程同步lock、Mutex

C#使用多线程可以通过System.Threading命名空间下的Thread类来实现 lock和Mutex用于实现线程同步的机制&#xff1a; 上代码&#xff1a; class People{public People(int idd){id idd;}public int id;public int age;}class TestHelper{public TestHelper() { }List<Peo…

AVB协议分析(一) FQTSS协议介绍

FQTSS协议介绍 一、AVB整体架构二、概述三、协议作用及作用对象四、协议的实现五、参考文献&#xff1a; 一、AVB整体架构 可见FQTSS位于MAC层的上面&#xff0c;代码看不懂&#xff0c;咱们就从最底层开始&#xff0c;逐层分析协议&#xff0c;逐个击破&#xff0c;慢就是快。…

11.RedHat认证-Linux文件系统(中)

11.RedHat认证-Linux文件系统(中) Linux的文件系统 格式化分区(1道题) #对于Linux分区来说&#xff0c;只有格式化之后才能使用&#xff0c;不格式化是无法使用的。 #Linux分区格式化之后就会变成文件系统&#xff0c;格式化的过程相当于对分区做了一个文件系统。 #Linux常见…

【简单介绍下idm有那些优势】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

SQL刷题笔记day6-1

1从不订购的客户 分析&#xff1a;从不订购&#xff0c;就是购买订单没有记录&#xff0c;not in 我的代码&#xff1a; select c.name as Customers from Customers c where c.id not in (select o.customerId from Orders o) 2 部门工资最高的员工 分析&#xff1a;每个部…

三十三、openlayers官网示例Drawing Features Style——在地图上绘制图形,并修改绘制过程中的颜色

这篇讲的是使用Draw绘制图形时根据绘制形状设置不同颜色。 根据下拉框中的值在styles对象中取对应的颜色对象&#xff0c;new Draw的时候将其设置为style参数。 const styles {Point: {"circle-radius": 5,"circle-fill-color": "red",},LineS…

代码随想录算法训练营Day22|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

二叉搜索树的最近公共祖先 不考虑二叉搜索树这一条件的话&#xff0c;普通的二叉搜索树搜索最近的公共祖先就是昨日的做法&#xff0c;这种做法也能解决二叉搜索树的最近公共祖先。 class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, Tr…

基于Visual Studio版本的AI编程助手

Visual Studio 是一个出色的 IDE,可用于构建适用于 Windows、Mac、Linux、iOS 和 Android 的丰富、精美的跨平台应用程序。 使用一系列技术(例如 WinForms、WPF、WinUI、MAUI 或 Xamarin)构建丰富。 1、安装 点击上方工具栏拓展选项,选择管理拓展选项 接着在联机页面中搜索&q…

基于transformers框架实践Bert系列6-完形填空

本系列用于Bert模型实践实际场景&#xff0c;分别包括分类器、命名实体识别、选择题、文本摘要等等。&#xff08;关于Bert的结构和详细这里就不做讲解&#xff0c;但了解Bert的基本结构是做实践的基础&#xff0c;因此看本系列之前&#xff0c;最好了解一下transformers和Bert…

网络故障与排除

一、Router-ID冲突导致OSPF路由环路 路由器收到相同Router-ID的两台设备发送的LSA&#xff0c;所以查看路由表看到的OSPF缺省路由信息就会不断变动。而当C1的缺省路由从C2中学到&#xff0c;C2的缺省路由又从C1中学到时&#xff0c;就形成了路由环路&#xff0c;因此出现路由不…