51交通灯

一、基本原理

利用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++;
}
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

报错:C1189#error: The <experimental/filesystem> header providing 解决方案

今天开发过程中&#xff0c;需要使用文件系统experimental/filesystem&#xff0c;报错C1189#error: The &#xff1c;experimental/filesystem&#xff1e; header providing &#xff0c;通过以下解决方案&#xff0c;成功运行程序。 目录 一、打开项目下的属性 二、选择C/…

从零开始学GeoServer源码(一)(搭建开发环境Win10+IDEA23.3.5+jdk11+geoserver2.24.x)

搭建开发环境 参考资料 0、基础环境准备0.1、idea0.2、jdk0.3、源码 1、导入工程2、配置启动环境2.1、打开新增配置面板2.2、配置工作目录2.2.1、从常用配置中选择2.2.2、直接粘贴 2.3最终效果 3、调整源码3.1、添加maven引用3.2、注释无效代码3.3、删除测试代码 4、修改运行端…

C++链表相关内容温习回顾——移除链表元素

本文主要对之前学过的C链表相关内容进行温习回顾&#xff0c;并以 移除链表元素 为例&#xff0c;进行应用。 关于链表的基础理论可见&#xff1a;链表理论基础 应用示例&#xff1a;LeetCode 203 移除链表元素 https://leetcode.cn/problems/remove-linked-list-elements/ 0、…

EIQ-ABC 分析法在配送中心储位分配中的应用

配送中心运作效率的高低主要取决于仓储业务流程的作业效率&#xff0c;在配送作业流程中&#xff0c;储位分配的是否合理性成为影响配送运作效率的重要因素。为实现储位的合理分配&#xff0c;提出通过对订单信息的分析&#xff0c;并应用 EIQ-ABC 分析法&#xff0c;以此实现缩…

示例:WPF中应用DataGrid读取实体DisplayAttribute特性自动自动生成列名

一、目的&#xff1a;通过重写DataGrid的OnAutoGeneratingColumn方法实现根据定义特性自动生成列头信息功能 二、实现 <DataGrid ItemsSource"{local:GetStudents Count50}"/>实体定义如下 public class Student{[DataGridColumn("*")][Display(Na…

three.js开发3D地图记录(一)

关键代码部分&#xff1a; <template><div class"center-map-box" id"contant"></div> </template><script> import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/control…

夏季河湖防溺水新举措:EasyCVR+AI视频智能监控系统保障水域安全

近日一则新闻引起大众关注&#xff0c;有网友发布视频称&#xff0c;假期在逛西湖时&#xff0c;发现水面上“平躺”漂浮着一名游客在等待救援。在事发3分钟内&#xff0c;沿湖救生员成功将落水游客救到了岸边。 随着夏季的到来&#xff0c;雨水增多&#xff0c;各危险水域水位…

别太小看“静态免杀“

0x01 简述 免杀总体来说可分为两种&#xff0c;静态免杀/动态免杀。往往来说&#xff0c;我们更注重于在内部代码层面实现一些免杀技巧&#xff0c;但在有些时候&#xff0c;动态免杀静态免杀以"打组合拳"的方式效果往往会更出人所料。 当我们的程序生成后&#xf…

CCAA认证人员注册全国统一考试开始报名

备受瞩目的CCAA&#xff08;中国认证认可协会&#xff09;认证人员注册全国统一考试即将拉开报名序幕。 考试基本信息&#xff1a; 1&#xff09;报名网站网址&#xff1a;https://kaoshi.ccaa.org.cn/ 2&#xff09;考试报名系统自2024年6月17日12:00时起面向考生正式开通&…

Apache DolphinScheduler查看版本信息

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

【C++】模板初级

【C】模板初级 泛型编程函数模板函数模板的概念函数模板格式函数模板的原理函数模板的实例化模板参数的匹配原则 类模板类模板格式类模板的实例化 泛型编程 当我们之前了解过函数重载后可以知道&#xff0c;一个程序可以出现同名函数&#xff0c;但参数类型不同。 //整型 voi…

网络安全等级保护制度详解,一文掌握核心要点!

一、等级保护制度发展情况 等级保护制度的法律依据 《计算机信息系统安全保护条例》&#xff08;1994年General Office of the State Council第147号令&#xff09; 公安部主管全国计算机信息系统安全保护工作。 计算机信息系统实行安全等级保护&#xff0c;安全等级的划分…

Python+Selenium自动化测试环境搭建步骤(selenium环境搭建)

一、自动化简介 1.自动化测试概念&#xff1a; 是把以人为驱动的测试转化为机器执行的一种过程&#xff0c;它是一种以程序测试程序的过程 2.自动化测试分类&#xff1a; 一般IT上所说的自动化测试是指功能自动化测试&#xff0c;通过编码的方式用一段程序来测试一个软件的功…

数据预处理之基于统计的(3σ,Z分数,Boxplot箱线图)异常值检测#matlab

基于统计的异常值检测 1.异常值的含义 异常值是指在数据集中偏离大部分数据的数据&#xff0c;使人怀疑这些数据的偏离并非由随机因素产生&#xff0c;而是产生于完全不同的机制。 异常挖掘(outlier mining)问题由两个子问题构成&#xff1a;(1)如何度量异常。(2)如何有效发…

我一直看不明白:“C++会被java/python等这些语言替代”

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 有些程序&#xff0c;是既可以…

【QT5】<重点> IMX6ULL开发板运行QT

目录 1. 安装交叉编译器 2. 命令行交叉编译QT项目 3. 运行该可执行程序 4. 开发板上运行UDP程序与Ubuntu通信 1. 安装交叉编译器 第一步&#xff1a;进入正点原子论坛找到IMX6ULL开发板的资料&#xff0c;下载“开发工具”&#xff0c;将“交叉编译工具”中的fsl-imx-x11-…

Spring中的IOC

IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是Spring框架核心概念之一。它是一种设计原则&#xff0c;用来实现对象的松耦合和依赖管理。在传统的编程中&#xff0c;对象负责创建或查找其依赖对象&#xff0c;而在IOC模式下&#xff0c;这些职责被移…

el-date-picker 有效时间精确到时分秒 且给有效时间添加标记

el-date-picker实现有效日期做标记且时分秒限制选择范围 代码如下&#xff1a; // html部分 <el-date-pickerv-model"dateTime"type"datetime":picker-options"pickerOptions" > </el-date-picker>// js部分 /*** 回放有效日期开始时…

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…

文心一言 VS 讯飞星火 VS chatgpt (283)-- 算法导论21.2 1题

一、使用链表表示和加权合并启发式策略&#xff0c;写出 MAKE-SET、FIND-SET 和 UNION 操作的伪代码。并指定你在集合对象和表对象中所使用的属性。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在并查集&#xff08;Disjoint Sets&#xff09;或集合合并&…