当前位置: 首页 > news >正文

基于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.lryc.cn/news/251820.html

相关文章:

  • JavaWeb | JSP内置对象
  • 如何保持高能量
  • Oracle研学-基础操作
  • jmeter下载地址
  • C语言,求取数组的序亏:已知一个整数数组,求出个数组中每个元素在整个 数组的排序。
  • 信息流广告行为兴趣定向底层逻辑算法
  • Selenium——isDisplayed()、isEnabled()、isSelected()
  • unity UGUI中获取点击位置处的URL链接
  • 【Arduino库之:FastLED库】
  • 两道面试题秒杀你的C++基础!
  • 回归预测 | MATLAB实现SMA+WOA+BOA-LSSVM基于黏菌算法+鲸鱼算法+蝴蝶算法优化LSSVM回归预测
  • 柔性数组(Flexible Array Members)在C语言中的应用
  • 华为手环配置技巧
  • 2023全球数字贸易大赛--什么是 DID 身份,中青校园APP,全球碳交易=树根格致,多元空间=购物时代的web3.0,超喵Overview
  • 有序表常见题型
  • 【开源】基于JAVA语言的桃花峪滑雪场租赁系统
  • 【开源】基于Vue.js的图书管理系统
  • python跑ncnn(验证模型是否转换成功)
  • FL Studio 21.2.1.3859中文破解激活版2024免费下载安装图文教程
  • 人工智能发展史
  • 【面试经典 150 | 二分查找】搜索插入位置
  • DAPP开发【06】nodejs安装与npm路径更换
  • 数据结构奇妙旅程之顺序表和链表
  • vitepress的使用
  • Discuz论坛自动采集发布软件
  • B树在数据库的应用
  • Android 源码编译
  • 信而泰 SSL测试方法介绍
  • Redis--15--缓存穿透 击穿 雪崩
  • excel表格在线编辑(开源版)