基于51单片机的十字路口交通灯_5s黄灯倒计时闪烁

基于51单片机十字路口交通灯_5s黄灯闪烁

(程序+仿真+仿真视频)

仿真:proteus 7.8

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:J006

功能要求

交通灯运行状态:

(1)模式1:东西向红灯与南北向绿灯亮5s;

(2)模式2:南北向绿灯灭,黄灯闪烁5s(5次);

(3)模式3:东西向绿灯与南北向红灯各5s;

(4)模式4:东西向绿灯灭,黄灯闪烁5s(5次);

(5)具体秒数可在程序改数字实现。

仿真图

南北通行image-20220831004850875

东西通行

image-20220831004910205

程序

image-20220831005300678

主要程序代码

#include<reg52.h>
#include<intrins.h>//数据类型定义
typedef unsigned char uchar;
typedef unsigned int  uint;void led_sacn();
void delay_ms(ms);
void seg_disp(uchar number,uchar wei);#define ON   1    //LED给告电平亮灯
#define OFF  0    //LED给低电平灭灯//通用IO引脚分配
sbit W0=P3^4;
sbit W1=P3^5;
sbit W2=P3^6;
sbit W3=P3^7;sbit NS_G = P2^0;
sbit NS_Y = P2^1;
sbit NS_R = P2^2;
sbit WE_R = P2^3;
sbit WE_Y = P2^4;
sbit WE_G = P2^5;bit flag1s;
bit half_1sflag;
uchar one_sec_flag,main_road_time,secondary_road_time,half_sec_flag;
//1秒定时标志位 南北方向显示时间 东西方向显示时间
uchar state=0;//正常模式不同状态
uchar code seg_du[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};uchar main_green_straight_cnt=5,yellow_cnt =5,2sec_green_straight_cnt =5; 
//南北方向直行绿灯时间            _黄灯时间      _东西方向绿灯时间void main()
{EA=1;	//开总中断TMOD=0X01;//T0的工作模式为模式1TH0=0X4C;TL0=0X00;//11.0592M晶振 50ms定时初值ET0=1; //允许定时器1中断TR0=1;//启动定时器0  
//	state=2;	while(1){	led_sacn();				  		//LED和数码管显示,时刻刷新if(flag1s)						//一秒刷新一次{flag1s=0;main_road_time--;			//红绿灯倒计时时间减secondary_road_time--;}if (half_1sflag){half_1sflag = 0;if(state == 0){//黄灯闪烁WE_Y =~WE_Y;}else if(state == 2){NS_Y =~NS_Y;}}}
}void led_sacn()
{if(main_road_time==0 || secondary_road_time==0)//当南北方向或者东西方向倒数到0,切换状态。//这一段程序只有倒计时为0才执行一次,执行完一次等下一次倒计时为0才再执行一次{switch(state)//改变红绿灯的状态{case 0:{state=1;//下次切换到下一个模式main_road_time=main_green_straight_cnt+yellow_cnt;//南北方向直行绿灯通行时间secondary_road_time=sec_green_straight_cnt;//东西方向红灯时间NS_G = ON;NS_Y = OFF;NS_R = OFF;WE_R = ON;WE_Y = OFF;WE_G = OFF;}break;case 1:{state=2;
//					main_road_time = yellow_cnt;//南北方向直行黄灯时间secondary_road_time =yellow_cnt;NS_G = OFF;NS_Y = ON;NS_R = OFF;WE_R = ON;WE_Y = OFF;WE_G = OFF;	}break;case 2:{state=3;main_road_time=sec_green_straight_cnt;secondary_road_time=sec_green_straight_cnt+yellow_cnt;NS_G = OFF;NS_Y = OFF;NS_R = ON;WE_R = OFF;WE_Y = OFF;WE_G = ON;}break;case 3:{state=0;
//					secondary_road_time=yellow_cnt;//黄灯时间main_road_time=yellow_cnt;NS_G = OFF;NS_Y = OFF;NS_R = ON;WE_R = OFF;WE_Y = ON;WE_G = OFF;}break;default:break;}}seg_disp(main_road_time/10,0);//显示W0控制的数码管 时刻刷新seg_disp(main_road_time%10,1);//显示W1控制的数码管seg_disp(secondary_road_time/10,2);//显示W2控制的数码管seg_disp(secondary_road_time%10,3);//显示W3控制的数码管}void seg_disp(uchar number,uchar wei)	//数码管动态显示程序 wei代表数码管W0 W1 W2 W3的位选
{P0=0XFF;//清零,防止重影if(wei == 0){//显示第一位W0=0;W1=1;W2=1;W3=1;	P0=seg_du[number];delay_ms(2);W0=1;}if(wei == 1){//显示第二位W0=1;W1=0;W2=1;W3=1;	P0=seg_du[number];delay_ms(2);W1=1;}if(wei == 2){//显示第三位W0=1;W1=1;W2=0;W3=1;	P0=seg_du[number];delay_ms(2);W2=1;}if(wei == 3){//显示第四位W0=1;W1=1;W2=1;W3=0;	P0=seg_du[number];delay_ms(2);W3=1;}
}

程序讲解

主要的核心点是倒计时,主干道直行绿灯时间+黄灯时间=次干道红灯时间,

在次干道红灯的过程中,主干道完成了绿灯倒计时+黄灯倒计时两个步骤。

倒计时的产生

记住这个点就可以设计软件了。首先要有时间基础,倒计时从哪来呢?

一般两个来源:

1,延时

delay(1000ms);

通过死循环卡主软件的运行来达到延时效果,程序执行效率极低,不可取。

2,定时

通过定时器产生时基。软件设置50ms产生一次定时中断,在中断执行函数中做计数。

	EA=1;	//开总中断TMOD=0X01;//T0的工作模式为模式1TH0=0X4C;TL0=0X00;//11.0592M晶振 50ms定时初值ET0=1; //允许定时器1中断TR0=1;//启动定时器0  

50ms执行一次中断函数,通过one_sec_flag累加到20判断时间过去了一秒。设置一秒标志位flag1s置一。

void Timer0() interrupt 1
{TH0=0X4C;TL0=0X00;//11.0592M晶振 50ms定时初值if(++half_sec_flag>10){half_1sflag = 1;half_sec_flag = 0;}if(++one_sec_flag<20){return;//提前结束函数}one_sec_flag=0;flag1s=1;	
}

在主函数while循环里判断标志位,如果是1,则倒计时计数值减一,即完成了倒计时的软件设计思路

    if(flag1s)						//一秒刷新一次{flag1s=0;main_road_time--;			//红绿灯倒计时时间减secondary_road_time--;}
红黄绿灯状态处理

image-20220829214546328

交通灯状态实际上分为四个状态:

1.主干道绿灯通行,次干道红灯

2.主干道黄灯通行,次干道红灯

3.主干道红灯,次干道绿灯通行

4.主干道红灯,次干道黄灯通行

做一个状态机,设置四个状态,在四个状态的变化中,设置红绿黄灯的亮和灭实现基础交通灯运行逻辑

if(main_road_time==0 || secondary_road_time==0)//当南北方向或者东西方向倒数到0,切换状态。//这一段程序只有倒计时为0才执行一次,执行完一次等下一次倒计时为0才再执行一次{switch(state)//改变红绿灯的状态{case 0:{state=1;//下次切换到下一个模式main_road_time=main_green_straight_cnt+yellow_cnt;//南北方向直行绿灯通行时间secondary_road_time=sec_green_straight_cnt;//东西方向红灯时间NS_G = ON;NS_Y = OFF;NS_R = OFF;WE_R = ON;WE_Y = OFF;WE_G = OFF;}break;case 1:{state=2;
//					main_road_time = yellow_cnt;//南北方向直行黄灯时间secondary_road_time =yellow_cnt;NS_G = OFF;NS_Y = ON;NS_R = OFF;WE_R = ON;WE_Y = OFF;WE_G = OFF;	}break;case 2:{state=3;main_road_time=sec_green_straight_cnt;secondary_road_time=sec_green_straight_cnt+yellow_cnt;NS_G = OFF;NS_Y = OFF;NS_R = ON;WE_R = OFF;WE_Y = OFF;WE_G = ON;}break;case 3:{state=0;
//					secondary_road_time=yellow_cnt;//黄灯时间main_road_time=yellow_cnt;NS_G = OFF;NS_Y = OFF;NS_R = ON;WE_R = OFF;WE_Y = ON;WE_G = OFF;}break;default:break;}}seg_disp(main_road_time/10,0);//显示W0控制的数码管 时刻刷新seg_disp(main_road_time%10,1);//显示W1控制的数码管seg_disp(secondary_road_time/10,2);//显示W2控制的数码管seg_disp(secondary_road_time%10,3);//显示W3控制的数码管
倒计时显示处理

实际上倒计时显示就是显示main_road_time–; secondary_road_time–;设计函数通过数码管分别显示主干道的main_road_time和次干道的secondary_road_time即可

		seg_disp(main_road_time/10,0);//显示W0控制的数码管seg_disp(main_road_time%10,1);//显示W1控制的数码管seg_disp(secondary_road_time/10,2);//显示W2控制的数码管seg_disp(secondary_road_time%10,3);//显示W3控制的数码管

资料清单

资料下载链接

image-20220903203349509

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

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

相关文章

硬件基础:二极管

基本定义 二极管的内部其实就是一个PN结。 把PN结封装起来&#xff0c;两边加上两个电极&#xff0c;就组成了半导体二极管。简称二极管&#xff08;Diode&#xff09; 二极管和PN结一样&#xff0c;具有单向导通性&#xff1a; 外观和正负极 常见芯片封装如下&#xff1a; 一般…

java 工具类: CompareUtils(比较对象字段值变化)

一、前言 我们在工作中&#xff0c;可能会在日志中记录数据的变化情况或者在公共处理的数据增加一个日志页面&#xff0c;记录每次修改的变化。我们可以根据CompareUtils工具类比较数据前后发生了怎样的变化, 这样我们就可以知道数据做了哪些改变. 二、条件限制 在写这个通用…

ImportError: cannot import name ‘metadata‘ from ‘importlib‘

yolov8 编译问题 ImportError: cannot import name ‘metadata’ from ‘importlib’ 将 from importlib import metadata 更改为 import importlib_metadata as metadata

【WinForm.NET开发】创建 Windows 窗体应用

本文内容 创建项目创建应用程序运行应用程序 本文演示创建一个具有基于 Windows 的用户界面 (UI) 的简单 C# 应用程序。 1、创建项目 首先&#xff0c;创建 C# 应用程序项目。 项目类型随附了所需的全部模板文件&#xff0c;无需添加任何内容。 打开 Visual Studio。在“开…

vs 安装 qt qt扩展

1 安装qt 社区版 免费 Download Qt OSS: Get Qt Online Installer 2 vs安装 qt vs tools 3 vs添加 qt添加 bin/cmake.exe 路径 3.1 扩展 -> qt versions 3.2

【设计模式-4.1】行为型——观察者模式

说明&#xff1a;本文介绍设计模式中行为型设计模式中的&#xff0c;观察者模式&#xff1b; 商家与顾客 观察者模式属于行为型设计模式&#xff0c;关注对象的行为。以商家与顾客为例&#xff0c;商家有商品&#xff0c;顾客来购买商品&#xff0c;如果商家商品卖完了&#…

Vue+ElementUI+C#前后端分离:监控长耗时任务的实践

想象一下&#xff0c;我们正在构建一个Web应用&#xff0c;需要实现一个数据报告的导出功能。这听起来很简单&#xff0c;不是吗&#xff1f;但是&#xff0c;随着深入开发&#xff0c;我们意识到导出过程比预期的要复杂和耗时得多。由于报告的数据量巨大&#xff0c;后端需要花…

PostgreSQL有意思的现象:支持不带列的表

1、前言 以前从没有试过建一张表&#xff0c;不带任何列。在PG中却支持这种语法。这是个什么鬼? 最近&#xff0c;把PG源码扒了下&#xff0c;简单浏览了下最近的一些merge。其中有一个fix&#xff1a; eeb0ebad79 ("Fix the initial sync tables with no columns.&qu…

〖大前端 - 基础入门三大核心之JS篇㊺〗- 定时器和延时器

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

3D场景建模工具

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 1. 什么是3D场景建模&#xff1f; 3D场景建模是一种通过计算机图形学技术&#xff0c;将现实世…

【Matlab】如何快速入门一项新技能-以Matlab/Simulink入门为例

目录 1. 引言 2. 背景 3. 快速学习并完成开发 3.1 了解需求&#xff0c;知道要干什么 3.2 了解Matlab/Simulink基本功能 第一步&#xff0c;查看Matlab的中文网站中文网站https://www.ilovematlab.cn/resources/对Matlab/Simulink有了一个初步认识。 3.3 实现一个最简单…

PyQt6 QDialogButtonBox组合按钮控件

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计34条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

【开源威胁情报挖掘1】引言 + 开源威胁情报挖掘框架 + 开源威胁情报采集与识别提取

基于开源信息平台的威胁情报挖掘综述 写在最前面摘要1 引言近年来的一些新型网络安全威胁类型挖掘网络威胁的情报信息威胁情报分类&#xff1a;内、外部威胁情报国内外开源威胁情报挖掘分析工作主要贡献研究范围和方法 2 开源威胁情报挖掘框架1. 开源威胁情报采集与识别2. 开源…

软件生命周期四个阶段SDLC

软件产品生命周期&#xff1a;指软件产品研发全部过程、活动和任务的结构框架。 产品的生命周期一般包括四个阶段&#xff1a;引入期、成长期、成熟期和衰退期&#xff0c;在不同的阶段中&#xff0c;市场对产品的反应不同&#xff0c;其销售特点不同&#xff0c;因而产品管理的…

mysql数据库的配置文件在哪里

可以搜索my.ini、或者my.cnf&#xff0c;看看在哪个地方。 例如&#xff0c;我在windows系统装的mysql 8.2版本&#xff0c;my.ini文件不在安装目录下&#xff0c;而在另外一个目录下。 我的安装目录是F:\Program Files\MySQL\MySQL Server 8.2&#xff0c;但my.ini文件在C:\Pr…

【Leetcode题单】(01 数组篇)刷题关键点总结01【数组的遍历】

【Leetcode题单】&#xff08;01 数组篇&#xff09;刷题关键点总结01【数组的遍历】&#xff08;4题&#xff09; Easy数组的遍历485. 最大连续 1 的个数 Easy495. 提莫攻击 Easy414. 第三大的数 Easy628. 三个数的最大乘积 Easy 大家好&#xff0c;这里是新开的LeetCode刷题系…

JavaScript学习-1

01 基础用法 //index.html <body><!-- 行内JS --><button type"button" onclick"alert(hello)">按钮</button><!--内部JS--><script type"text/javascript">alert("你好");</script><…

vscode问题:此扩展在此工作区中被禁用,因为其被定义为在远程扩展主机中运行

mac按shiftcommandp windows按ctrlshiftP&#xff1a; 将当前项目文件夹添加进去就ok了。

Elk-filebeat

前言 Elk&#xff1a;filebeat搜集日志工具和logstash相同 Filebeat是一个轻量级的日志收集工具&#xff0c;所使用的资源比logstash部署和启动时使用的资源更小 Filebeat可以运行在非Java环境&#xff0c;他可以代理logstash在非Java环境上收集日志 Filebeat无法实现数据的…

【带头学C++】----- 九、类和对象 ---- 9.1 类和对象的基本概念----(9.1.4---9.1.6)

目录 9.1.4 设计立方体类 ​编辑 9.1.5 成员函数在类的外部实现 9.1.6 类在其他源文件的实现步骤&#xff08;实现类在不同文件的实现&#xff0c;后续引出构造函数&#xff09; 注意:类定义在同文件testclass.h中&#xff0c;而testclass.cpp是用来实现&#xff08;声明&…