【51单片机-B017】【protues仿真】 基于51单片机交通灯仿真

发布于:2025-07-18 ⋅ 阅读:(20) ⋅ 点赞:(0)

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

联系作者

一、主要功能

默认南北绿灯20S,东西红灯25S,绿灯过后南北黄灯5秒
然后切换东西绿灯30S,南北红灯35S,绿灯过后南北黄灯3秒
主要功能如下:
1、东西南北红黄绿灯控制
2、交通灯时间设置
3、数码管显示
4、突发状况交通灯控制

二、使用步骤

本项目使用Proteus8仿真
包含:程序,仿真,文档等

三、硬件资源

1、51单片机核心模块
2、按键模块
3、数码管显示模块
4、指示灯模块

四、软件设计

#include <reg52.h>	         //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义	变量范围0~255
#define uint  unsigned int	 //无符号整型 宏定义	变量范围0~65535
 
//数码管段选定义  0   1   2    3    4    5 	   6	 7	  8	   9   A	B		
uchar smg_du[]={0x40,0x75,0x0c,0x14,0x31,0x12,0x02,0x74,0x00,0x10,0x20,0x03,};	 //断码

uchar dis_smg[4] = {0};	   //数码管显示数组的缓冲区
 
//数码管位选定义
sbit smg_we1 = P2^0;	    //数码管位选IO口定义
sbit smg_we2 = P2^1;		//数码管位选IO口定义
sbit smg_we3 = P3^6;		//数码管位选IO口定义
sbit smg_we4 = P3^7;		//数码管位选IO口定义

sbit key1 = P1^0;	    //按键IO口定义
sbit key2 = P1^1;		//按键IO口定义
sbit key3 = P1^2;		//按键IO口定义
sbit key4 = P1^3;		//按键IO口定义
  
uchar menu_1;			    //设置不同参数的变量

char dx_s = 0,nb_s = 0;	//东西  南北 倒计时变量

sbit dx_red    = P2^7;	    //东西红灯IO口定义
sbit dx_green  = P2^6;		//东西绿灯IO口定义
sbit dx_yellow = P2^5;		//东西黄灯IO口定义

sbit nb_red    = P2^4;		//南北红灯IO口定义
sbit nb_green  = P2^3;		//南北绿灯IO口定义
sbit nb_yellow = P2^2;		//南北黄灯IO口定义	

bit flag_1s = 0;	  //1秒的变量
bit flag_500ms;		  //500毫秒的变量
bit flag_dx_nb = 0;   //东西南北模式
uchar dx_time = 30,nb_time = 20;   //东西、南北的时间设置的时间 
uchar flag_jdgz ;     //交通管制

/***********************数码位选函数*****************************/
void smg_we_switch(uchar i)
{
	switch(i)
	{
		case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
		case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
		case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
		case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
	}	
}
  
/********************************************************************
* 名称 : delay_1ms()
* 功能 : 延时1ms函数
* 输入 : q
* 输出 : 无
***********************************************************************/
void delay_1ms(uint q)
{
	uint i,j;
	for(i=0;i<q;i++)
		for(j=0;j<120;j++);
}

uchar i;
/********************************************************************
* 名称 : display()
* 功能 : 数码管显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void display()
{
 	for(i=0;i<4;i++)
	{		
		P0 = 0xff;	          //消隐 
		smg_we_switch(i);  	  //位选
		P0 = dis_smg[i];	  //段选	  
		delay_1ms(3);		  //延时
	}
}

/*********************定时器0初始化******************/
void time0_init()	  
{
	EA  = 1;	 	  //开总中断
	TMOD = 0X01;	  //定时器0工作方式1
	ET0 = 1;		  //开定时器0中断 
	TR0 = 1;		  //允许定时器0定时
	TH0 = 0x3c;
	TL0 = 0xb0;     //50ms
}

/*********************交通灯处理函数*********************************/
void jiaotongdeng_dis()
{
	if(flag_1s == 1)	   //1秒执行一次里面的程序  
	{
		flag_1s = 0;
		if(flag_dx_nb == 0)	   //南北绿灯时间
		{
			dx_s --;		   //东西倒计时时间减1 
			nb_s --;		   //南北倒计时时间减1 
			if(dx_s == 5)
				nb_s = 5;
		}
		if(flag_dx_nb == 1)	   //东西绿灯时间
		{
			dx_s --;		   //南北倒计时时间减1
			nb_s --;		   //东西倒计时时间减1 
			if(nb_s == 5)
				dx_s = 5;
		}
		if(dx_s <= 0)		  //倒计时时间为0切换东西 南北绿灯时间 
		{
			flag_dx_nb = ~flag_dx_nb;
			if(flag_dx_nb == 1)	 //东西时间
			{
				dx_s = dx_time;	  
				nb_s = dx_time + 5;
			}
			else 				 //南北时间
			{
				dx_s = nb_time + 5;	
				nb_s = nb_time;	  
			}
		}
	}
	dis_smg[0] = smg_du[dx_s % 10] ;	//显示东西倒计时 时间
	dis_smg[1] = smg_du[dx_s / 10] ;
	dis_smg[2] = smg_du[nb_s % 10] ;	//显示南北倒计时 时间  
	dis_smg[3] = smg_du[nb_s / 10] ;

/***********************南北时间绿灯时间*********************************/
	if(flag_dx_nb == 0)  
	{
		if(dx_s > 5)
		{
			dx_red    = 0;     //东西红灯亮
			dx_green  =	1;	   //东西绿灯灭
			dx_yellow = 1;	   //东西黄灯灭
			nb_red    = 1;     //南北红灯灭
			nb_green  =	0;	   //南北绿灯亮
			nb_yellow = 1;	   //南北黄灯灭

		}else if(dx_s <= 5)		 //当小于5秒时  黄灯要闪了
		{
			dx_red    = 0;     //东西红灯灭
			dx_green  =	1;	   //东西绿灯灭
			dx_yellow = 1;	   //东西黄灯灭
			nb_red    = 1;     //南北红灯灭
			nb_green  =	1;	   //南北绿灯灭
			if(flag_500ms == 0)	   //黄灯闪烁
			{
				nb_yellow = 0;	//亮	
			}
			else 
			{
				nb_yellow = 1;	//灭	
			}
		}
	}
/***********************东西时间绿灯时间*********************************/
	if(flag_dx_nb == 1)  
	{
		if(nb_s > 5)
		{
			dx_red    = 1;  //东西红灯灭 
			dx_green  =	0;	//东西绿灯亮
			dx_yellow = 1;	//东西黄灯灭
			nb_red    = 0;  //南北红灯亮 
			nb_green  =	1;	//南北绿灯灭
			nb_yellow = 1;	//南北黄灯灭
		}else if(nb_s <= 5)		 //当小于5秒时  黄灯要闪了
		{
			dx_red    = 1;    //东西红灯灭
			dx_green  =	1;	  //东西绿灯灭
			nb_red    = 0;    //南北红灯亮
			nb_green  =	1;	  //南北绿灯灭
			nb_yellow = 1;	  //南北黄灯灭
			if(flag_500ms == 0)	 //黄灯闪烁
			{
				dx_yellow = 0;//东西黄灯亮	
			}
			else 
			{
				dx_yellow = 1;//东西黄灯灭	
			}

		}
	}			
}

五、实验现象

B站演示视频:
【51单片机-B017】【protues仿真】 基于51单片机交通灯仿真_哔哩哔哩_bilibili本项目使用Proteus8仿真 基于51单片机交通灯包含:程序,仿真,文档等主要功能如下:默认南北绿灯20S,东西红灯25S,绿灯过后南北黄灯5秒然后切换东西绿灯30S,南北红灯35S,绿灯过后南北黄灯3秒主要功能如下:1、东西南北红黄绿灯控制2、交通灯时间设置3、数码管显示4、突发状况交通灯控制, 视频播放量 0、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 1, 视频作者 无忧电子设计, 作者简介 Q:215138327 V:Kinpar 承接51,32单片机设计定做,51,32单片机protues仿真,实物,程序等。,相关视频:【51单片机-B010】【protues仿真】基于51单片机宠物投食器仿真,【51单片机-B008】【protues仿真】基于51单片机水位监测控制系统仿真,【51单片机-B009】【protues仿真】基于51单片机冰箱仿真,【51单片机-B006】【protues仿真】基于51单片机温度烟雾控制系统仿真,【51单片机-B007】【protues仿真】基于51单片机16键电子琴音乐盒仿真,【51单片机-B012】【protues仿真】基于51单片机数码管温度报警器仿真,【51单片机-B015】【protues仿真】基于51单片机点阵屏仿真,【51单片机-B011】【protues仿真】 基于51单片机储物箱仿真,【51单片机-B018】【protues仿真】 基于51单片机叫号系统,【51单片机-B014】【protues仿真】 基于51单片机出租车计价器仿真https://www.bilibili.com/video/BV17ZutzSEVz/

联系作者

作者B站链接:https://space.bilibili.com/3493294220773802

专注于51单片机、STM32、Proteus、物联网软件开发,PCB设计。


网站公告

今日签到

点亮在社区的每一天
去签到