• 基于51单片机十字路口交通灯仿真紧急+黄灯5s


    基于51单片机十字路口交通灯仿真

    紧急+黄灯5s

    仿真:proteus 7.8

    程序编译器:keil 4/keil 5

    编程语言:C语言

    设计编号:J014

    功能说明

    1,东西方向、南北方向均有红、黄、绿三种信号灯;

    2,南北方向绿灯15s,之后转黄灯5s,同时东西方向红灯20s;

    3,东西方向绿灯10s,之后转黄灯5s,同时南北方向红灯15s;

    4,带紧急制动按钮,按钮按下,所有方向亮红灯倒计时60秒后恢复示;

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

    6 ,使用51单片机的中断功能。

    仿真图

    正常运行模式

    img

    紧急情况运行模式

    img

    程序设计

    img

    程序讲解

    主要的核心点是倒计时,和LED灯亮灭控制

    倒计时的产生

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

    一般两个来源:

    1,延时

    delay(1000ms);
    
    • 1

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

    2,定时

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

    	TMOD |=0X01;
    	TH0=0X4C;
    	TL0=0X00;
    	ET0=1;
    	TR0=1;//打开定时器中断
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    	void Timer0() interrupt 1
    {
    	TH0=0XBB;
    	TL0=0X00;//重新装载定时初值
    	if(++one_sec_flag>=50){
    		one_sec_flag=0;
    		
    		if(run_flag==0){
    		//正常情况下的倒计时
    			scan_flag=1;	
    		}
    		if(urgent_run_cnt>0&& run_flag==1){
    			 urgent_run_cnt--;
    			 if(urgent_run_cnt == 0){
    				 run_flag=0;  //切回正常模式
    				 ns_road_time=0;//重现开始
    				 state=0;
    			 }
    	     }
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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

    void count_sacn(void){//倒计时扫描
    	if(scan_flag)//一秒刷新一次
    	{
    		scan_flag=0;
    		ns_road_time--; //红绿灯倒计时时间减
    		we_road_time--;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    红黄绿灯状态处理

    正常红绿灯运行分有四个模式

    1.东西方向绿灯通行,南北方向红灯

    2.东西方向黄灯通行,南北方向红灯

    3.南北方向绿灯通行,东西方向红灯

    4.南北方向黄灯通行,东西方向红灯

    5.执行第一步

    image-20220904173413785

    if(run_flag==0)//0 正常运行
        {
       	if(ns_road_time==0 || we_road_time==0)//倒数到0,切换状态。
       	//这一段程序只有倒计时为0才执行一次,执行完一次等下一次倒计时为0才再执行一次。这是核心
       	{
       	if(state == 0){
       		state=1;//下次切换到下一个模式
       		ns_road_time=ns_green_cnt;
              //南北方向直行绿灯通行时间
       	   we_road_time=ns_green_cnt+yellow_cnt;
       	    //常识:东西红灯方向通行时间  南北方向直行绿灯 +南北方向时间黄灯时间
    
       		 we_red    = ON;
       		 we_yellow = OFF;
       		 we_green  = OFF;
       		 ns_red    = OFF;
       		 ns_yellow = OFF;
       		 ns_green  = ON;
       	}else if(state == 1){
       		state=2;
       		ns_road_time = yellow_cnt;
               //南北方向直行黄灯时间
       		we_red	  = ON;
       		we_yellow = OFF;
       		we_green  = OFF;
       		ns_red	  = OFF;
       		ns_yellow = ON;
       		ns_green  = OFF;
    
    
       	}else if(state == 2){
       		state=3;
       		ns_road_time=we_green_cnt+yellow_cnt;
       		we_road_time =we_green_cnt;
       		we_red	  = OFF;
       		we_yellow = OFF;
       		we_green  = ON;
       		ns_red	  = ON;
       		ns_yellow = OFF;
       		ns_green  = OFF;
    
    
       	}else if(state==3){
    
       		state=0;
       		we_road_time=yellow_cnt;//黄灯时间
       		we_red	  = OFF;
       		we_yellow = ON;
       		we_green  = OFF;
       		ns_red	  = ON;
       		ns_yellow = OFF;
       		ns_green  = OFF;
    
       	}
    
       	}
       	seg_display();//数码管显示
    
       	
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    倒计时显示处理

    实际上倒计时显示就是显示NS_time–; WE_time–;设计函数通过数码管分别显示A方向的NS_time和B方向的WE_time即可

    					Seg_Display(NS_time/10,0);
    Seg_Display(NS_time%10,1);
    Seg_Display(WE_time/10,2);
    Seg_Display(WE_time%10,3);
    
    • 1
    • 2
    • 3
    • 4
    按键处理

    按键使用外部中断,按键按下触发外部中断

    
    void urgent_run() interrupt 2//外部中断处理函数,按下紧急按键后执行这
    {
    	run_flag=1;
    	buck_led=P2;//记录当前的LED灯状态
    	urgent_run_cnt=60; //紧急情况倒数60秒
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    资料清单

    资料下载

    img

  • 相关阅读:
    1076 Forwards on Weibo
    css实现圆形进度条
    Apache Doris 用户案例库
    浅谈Rob Pike的五条编程规范
    程序员离婚协议
    Faster R-CNN---学习笔记
    web前端全套教程,入门必备
    【LeetCode】187. 重复的DNA序列
    【结构型模型】享元模式
    stm32单片机的智能交通灯设计
  • 原文地址:https://blog.csdn.net/weixin_52733843/article/details/126696178