基于51单片机的交通灯_可调时间_夜间+紧急模式


51单片机简易交通灯_可调时间_夜间+紧急

仿真+代码+原理图PCB+报告+讲解

仿真图proteus 7.8以上

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:J030

1 讲解视频:

包含仿真讲解和实物演示

基于51单片机的交通灯proteus实物设计

2 功能要求

基于51单片机的交通灯设计

本设计基于AT89C51/52(与AT89S51/52、STC89C51/52通用,可替换其他51内核)单片机

1.正常模式工作状态:

状态1:东西方向绿灯通行20秒,南北方向禁止通行25秒;

状态2:东西方向黄灯闪烁提醒5秒,南北继续红灯倒计时;

状态3:南北方向绿灯通行30秒,东西红灯禁止通行35秒,分别通过数码管倒计时;

状态4:南北方向黄灯闪烁提醒5秒,东西继续红灯倒计时;

状态5:执行状态1,反复循环。

\2. 紧急模式

南北方向和东西方向红灯常亮禁止通行。数码管显示00。

\3. 夜间模式

南北方向和东西方向黄灯闪烁。

\4. 可以通过按键调东西/南北方向绿灯时间。切换键切换方向,加减键调整时间。

3 仿真图:

正常倒计时

imgimg

夜间黄灯闪烁

4 原理图+PCB

img

img

img

img

5 实物图

img

6 程序设计:

img
代码

#include <reg51.h>				//头文件
#define uchar unsigned char
#define uint  unsigned int		//宏定义

uchar data buf[4];					//秒显示的变量
uchar data sec_dx=20;  			//东西数默认
uchar data sec_nb=30;			//南北默认值
uchar data set_timedx=20;		//设置东西方向的时间
uchar data set_timenb=30;		//设置南北方向的时间
int n;
uchar data countt0,countt1;//定时器0中断次数
//定义6组开关
sbit  k4=P3^7;      //切换方向
sbit  k1=P3^5;		//时间加
sbit  k2=P3^6;		//时间减
sbit  k3=P3^4;		//确认
sbit  k5=P3^1;		//禁止
sbit  k6=P1^5;		//夜间模式
部分代码,不完整,完全代码在压缩包main函数
//https://docs.qq.com/doc/DS3Zab1lNU0d2QVZt

sbit Red_nb=P2^6;		//南北红灯标志
sbit Yellow_nb=P2^5;	//南北黄灯标志
sbit Green_nb=P2^4;     //南北绿灯标志

sbit Red_dx=P2^3;		//东西红灯标志
sbit Yellow_dx=P2^2;	//东西黄灯标志
sbit Green_dx=P2^1;		//东西绿灯标志
		
bit set=0;				//调时方向切换键标志 =1时,南北,=0时,东西
bit dx_nb=0;			//东西南北控制位
bit shansuo=0;			//闪烁标志位
bit yejian=0;			//夜间黄灯闪烁标志位

uchar code table[11]={
    
    	//共阴极字型码
	0x3f,  //--0
	0x06,  //--1
	0x5b,  //--2
	0x4f,  //--3
	0x66,  //--4
	0x6d,  //--5
	0x7d,  //--6
	0x07,  //--7
	0x7f,  //--8
	0x6f,  //--9
	0x00   //--NULL
};

//函数的声明部分
void delay(int ms);			//延时子程序
void key();					//按键扫描子程序
void display();				//显示子程序
void logo();   				//开机LOGO
//主程序
void main()
{
    
    
	TMOD=0X11;	   				//定时器设置
	TH1=0X3C;		
	TL1=0XB0;
	TH0=0X3C;					//定时器0置初值 0.05S
	TL0=0XB0;
	EA=1;						//开总中断
	ET0=1;						//定时器0中断开启
	ET1=1;					   //定时器1中断开启
	TR0=1;						//启动定时0
	TR1=0;						 	//关闭定时1
    logo();						//开机初始化
	P2=0Xc3;					// 开始默认状态,东西绿灯,南北黄灯   
    sec_nb=sec_dx+5; 			//默认南北通行时间比东西多5秒
	while(1)					  //主循环
	{
    
    	 
		key(); 					//调用按键扫描程序
		display(); 				//调用显示程序
	}	
}
//函数的定义部分
void key(void)	//按键扫描子程序
{
    
    	 
	if(k1!=1)							//当K1(时间加)按下时
	{
    
    
		display();       				//调用显示,用于延时消抖
		if(k1!=1)							//如果确定按下
		{
    
    
		  	TR0=0;	       				//关定时器	
			shansuo=0;					//闪烁标志位关
			P2=0x00;					//灭显示
			TR1=0;							//启动定时1
			if(set==0){
    
    //设置键按下
				set_timedx++;   		//南北加1S
			}else{
    
    
				set_timenb++;    		//东西加1S
			}
			if(set){
    
    
				Red_nb=1;		//南北红灯标志
				Yellow_nb=1;	//南北黄灯标志
				Green_nb=1;     //南北绿灯标志
			}else{
    
    
				Red_dx=1;		//东西红灯标志
				Yellow_dx=1;	//东西黄灯标志
				Green_dx=1;     //东西绿灯标志
			}
			if(set_timenb==100)
				set_timenb=1;
			if(	set_timedx==100)
				set_timedx=1;   		//加到100置1
			sec_nb=set_timenb ; 		//设置的数值赋给东西南北
			sec_dx=set_timedx;			
		  	do
		 	{
    
     
				display();				 //调用显示,用于延时
			}
			while(k1!=1);			 //等待按键释放
		}
	}

	if(k2!=1)							//当K2(时间减)按键按下时
	{
    
    		
		display();       				//调用显示,用于延时消抖  
		if(k2!=1)						//如果确定按下
		{
    
    	
		 	TR0=0;         				//关定时器0	
			shansuo=0;					//闪烁标志位关
			P2=0x00;					//灭显示
			TR1=0;						//关定时器1	
			if(set==0){
    
    //设置键按下
				set_timedx--;   		//南北减1S
			}else{
    
    
				set_timenb--;    		//东西减1S
			}
			if(set){
    
    
				Red_nb=1;		//南北红灯标志
				Yellow_nb=1;	//南北黄灯标志
				Green_nb=1;     //南北绿灯标志
			}else{
    
    
				Red_dx=1;		//东西红灯标志
				Yellow_dx=1;	//东西黄灯标志
				Green_dx=1;     //东西绿灯标志
			}
			if(set_timenb==0)
				set_timenb=99;	
			if(	set_timedx==0 )
				set_timedx=99;   		//减到1重置99
			sec_nb=set_timenb ;	 		//设置的数值赋给东西南北
			sec_dx=set_timedx;
		  	do	
		    {
    
     
				display();       		//调用显示,用于延时
			}
			while(k2!=1);			   //等待按键释放
		}
	}

	if(k3!=1)							//当K3(确认)键按下时
	{
    
    	
		display();       				//调用显示,用于延时消抖
		if(k3!=1)						//如果确定按下
		{
    
    
			TR0=1;  						//启动定时器0
			sec_nb=set_timenb;				//从中断回复,仍显示设置过的数值
			sec_dx=set_timedx;				//显示设置过的时间
			TR1=0;							//关定时器1	
			if(set==0)						//时间倒时到0时
			{
    
     
				P2=0X00;					 //灭显示
				Green_dx=1;						//东西绿灯亮
				Red_nb=1;					//南北红灯亮
				sec_nb=sec_dx+5; 			//回到初值
			}
			else 
			{
    
     
				P2=0x00;					//南北绿灯,东西红灯
				Green_nb=1;
				Red_dx=1;
				sec_dx=sec_nb+5; 
			}
		}
	}
	 
	if(k4!=1)							//当K4(切换)键按下
    {
    
    
		display();       				//调用显示,用于延时消抖
		if(k4!=1)						//如果确定按下
		{
    
     
			P2=0X00;					 //灭显示
		 	TR0=0;						//关定时器0	
			set=!set;					//取反set标志位,以切换调节方向
			TR1=0;						//关定时器1
			dx_nb=set;
			if(set){
    
    
				Red_nb=1;		//南北红灯标志
				Yellow_nb=1;	//南北黄灯标志
				Green_nb=1;     //南北绿灯标志
			}else{
    
    
				Red_dx=1;		//东西红灯标志
				Yellow_dx=1;	//东西黄灯标志
				Green_dx=1;     //东西绿灯标志
			}
			do
			{
    
    
				display(); 			   //调用显示,用于延时
			}				
			while(k4!=1);			  //等待按键释放
		}
	}	

	if(k5!=1)							//当K5(禁止)键按下时
	{
    
    
	   	display();       				//调用显示,用于延时消抖
	   	if(k5!=1)						//如果确定按下
	   	{
    
     	
	    	TR0=0;						//关定时器
			P2=0x00;					//灭显示
			Red_dx=1;
			Red_nb=1;					//全部置红灯
			TR1=0;
			sec_dx=00;					//四个方向的时间都为00
			sec_nb=00;
			do
			{
    
    
				display(); 				//调用显示,用于延时
			}	
			while(k5!=1);			//等待按键释放	
	   	}
	}
	if(k6!=1)							//当K6(夜间模式)按下 
	{
    
    
	   	display();       				//调用显示,用于延时消抖 
	   	if(k6!=1)						//如果确定按下
	   	{
    
     	
	    	TR0=0;						//关定时器
			P2=0x00;
			TR1=1;
			sec_dx=00;					//四个方向的时间都为00
			sec_nb=00;
			do
			{
    
    
				display(); 			  //调用显示,用于延时
			}	
			while(k6!=1);			//等待按键释放	
	   	}
	}
}
void display(void) //显示子程序
{
    
    		
	buf[1]=sec_nb/10; 		//第1位 东西秒十位
	buf[2]=sec_nb%10; 		//第2位 东西秒个位
	buf[3]=sec_dx/10; 		//第3位 南北秒十位
	buf[0]=sec_dx%10; 		//第4位 南北秒个位		
	P1=0xff;          		// 初始灯为灭的
	P0=0x00;				 灭显示
	P1=0xfe;           		//片选LED1
	P0=table[buf[1]];		//送东西时间十位的数码管编码			
	delay(1);				//延时
	P1=0xff;				//关显示
	P0=0x00;				//灭显示
						   
	P1=0xfd;             	//片选LED2
	P0=table[buf[2]];		 //送东西时间个位的数码管编码
	delay(1);				 //延时
	P1=0xff;				//关显示
	P0=0x00;				//关显示
	P1=0Xfb;		  		//片选LED3
	P0=table[buf[3]];		//送南北时间十位的数码管编码
	delay(1);				//延时
	P1=0xff;				 //关显示
	P0=0x00;				 //关显示
	P1=0Xf7;				 //片选LED4	
	P0=table[buf[0]];		//送南北时间个位的数码管编码
	delay(1);				//延时
}

void time0(void) interrupt 1 using 1  	//定时中断子程序
{
    
    
	TH0=0X3C;							//重赋初值
	TL0=0XB0;							//12m晶振50ms//重赋初值
	TR0=1;								//重新启动定时器
	countt0++;							//软件计数加1
	if(countt0==10)						//加到10也就是半秒
	{
    
    
		if((sec_nb<=5)&&(dx_nb==0)&&(shansuo==1))  		//东西黄灯闪		
        {
    
    
			Green_dx=0;
			Yellow_dx=0;
		}		   				
	    if((sec_dx<=5)&&(dx_nb==1)&&(shansuo==1))  		//南北黄灯闪		
        {
    
      
			Green_nb=0;
			Yellow_nb=0;
		}	
	}
		
	if(countt0==20)	                  	// 定时器中断次数=20时(即1秒时)
	{
    
    	countt0=0;						//清零计数器
		sec_dx--;						//东西时间减1
		sec_nb--;						//南北时间减1

		if((sec_nb<=5)&&(dx_nb==0)&&(shansuo==1))  		//东西黄灯闪		
        {
    
    
			Green_dx=0;
			Yellow_dx=1;
		}		   				
	    if((sec_dx<=5)&&(dx_nb==1)&&(shansuo==1))  		//南北黄灯闪		
        {
    
      
			Green_nb=0;
			Yellow_nb=1;
		}		 						
		if(sec_dx==0&&sec_nb==5) 		//当东西倒计时到0时,重置5秒,用于黄灯闪烁时间   
		{
    
    
			sec_dx=5;
			shansuo=1;
		}
		if(sec_nb==0&&sec_dx==5)		//当南北倒计时到0时,重置5秒,用于黄灯闪烁时间   
		{
    
    
			sec_nb=5;
			shansuo=1;
		}
		if(dx_nb==0&&sec_nb==0)			//当黄灯闪烁时间倒计时到0时,
		{
    
    
			P2=0x00;					//重置东西南背方向的红绿灯
			Green_nb=1;
			Red_dx=1;
			dx_nb=!dx_nb;
			shansuo=0;
			sec_nb=set_timenb;			//重赋南北方向的起始值
			sec_dx=set_timenb+5;		//重赋东西方向的起始值
		}		
		if(dx_nb==1&&sec_dx==0)			//当黄灯闪烁时间到
		{
    
    
			P2=0X00;					//重置东西南北的红绿灯状态
			Green_dx=1;					 //东西绿灯亮
			Red_nb=1;					 //南北红灯亮
			dx_nb=!dx_nb;				 //取反
			shansuo=0;					//闪烁
			sec_dx=set_timedx;			//重赋东西方向的起始值
			sec_nb=set_timedx+5;		//重赋南北方向的起始值
		}
	}	
}

系统硬件框图

img

7 设计报告

13017字设计报告,内容包括硬件设计、软件设计、软硬件框图、调试、结论等

img

8 资料清单(提供资料清单所有文件):

0、常见使用问题及解决方法–必读!!!!
10、讲解视频
1、仿真图
2、程序源码
3、功能要求
4、原理图和PCB
5、开题报告
6、元器件清单
7、设计报告
8、软硬件流程框图
9、实物图片和说明
Altium Designer 安装破解
KEIL+proteus 单片机仿真设计教程
KEIL安装破解
Proteus元器件查找
Proteus安装
Proteus简易使用教程
单片机学习资料
相关数据手册
答辩技巧
设计报告常用描述
鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url

img

设计资料下载链接:

猜你喜欢

转载自blog.csdn.net/weixin_52733843/article/details/134749848