基于51单片机交通灯夜间模式+紧急模式_易懂版_(仿真+代码_报告_讲解)

J029 51单片机交通灯_易懂版__夜间+紧急(仿真+代码_报告_讲解)

仿真图proteus 7.8以上

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:J029

1 讲解视频:

基于51单片机的交通灯

2 功能要求

1.正常模式工作状态:

状态1:南北方向绿灯通行12秒,东西红灯禁止通行15秒,分别倒计时;

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

状态3:东西方向绿灯通行9秒,南北方向禁止通行12秒;

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

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

\2. 紧急模式

南北方向和东西方向红灯常亮。

\3. 夜间模式

南北方向和东西方向黄灯常亮。

3 仿真图:

img

4 程序设计:

img

程序主要代码

void main()
{
    
    
	EA=1;	//开总中断
	EX0=1;//外部中断0
	EX1=1;//外部中断1
	IT0=1;//设置下降沿触发中断0
	IT1=1;//设置下降沿触发中断1
	
	TMOD|= 0X01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;//12M晶振 50ms定时初值
	ET0=1; //允许定时器0中断
	TR0=1;//启动定时器0  
	state=0;
	while(1)
	{
    
    	
		led_sacn();				  		//LED和数码管显示,时刻刷新
		if(flag1s)//一秒执行一次
		{
    
    
			flag1s=0;
			main_road_time--;			//红绿灯倒计时时间减
			secondary_road_time--;
		}
		if(half_flag1s){
    
    
			half_flag1s = 0;
			if(state ==2){
    
    
				ns_yellow =~ns_yellow;
			}else if(state ==0){
    
    
				we_yellow =~we_yellow;
			}

		}
		
	}
}

void led_sacn()
{
    
    
	 if(run_mode==0)			 //0 正常运行
	 {
    
    
		if(main_road_time==0 || secondary_road_time==0)//当主干道或者次干道倒数到0,切换状态。
		//这一段程序只有倒计时为0才执行一次,执行完一次等下一次倒计时为0才再执行一次
		{
    
    
			switch(state)//改变红绿灯的状态
			{
    
    
				case 0:
				{
    
    
					state=1;//下次切换到下一个模式
					main_road_time=ns_green_cnt;//主干道绿灯通行时间
					secondary_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;
				}break;
				case 1:
				{
    
    
					state=2;
					main_road_time = yellow_cnt;//主干道直行黄灯时间
					we_red	  = ON;
					we_yellow = OFF;
					we_green  = OFF;
					ns_red	  = OFF;
					ns_yellow = ON;
					ns_green  = OFF;	
				}break;
				case 2:
				{
    
    
					state=3;
					main_road_time=we_green_cnt+yellow_cnt;
					secondary_road_time = we_green_cnt;
					we_red	  = OFF;
					we_yellow = OFF;
					we_green  = ON;
					ns_red	  = ON;
					ns_yellow = OFF;
					ns_green  = OFF;	
				}break;
				case 3:
				{
    
    
					state=0;
					secondary_road_time = yellow_cnt;
					we_red	  = OFF;
					we_yellow = ON;
					we_green  = OFF;
					ns_red	  = ON;
					ns_yellow = OFF;
					ns_green  = 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控制的数码管
		
	}else if(run_mode==1)
	{
    
    
		we_red	  = ON;
		we_yellow = OFF;
		we_green  = OFF;
		ns_red	  = ON;
		ns_yellow = OFF;
		ns_green  = OFF;
	}
	else if(run_mode==2)//夜间模式 黄灯14 0001 0010 0x12
	{
    
    
		we_red	  = OFF;
		we_yellow = ON;
		we_green  = OFF;
		ns_red	  = OFF;
		ns_yellow = ON;
		ns_green  = OFF;
	}
}

void seg_disp(uchar number,uchar wei)	//数码管动态显示程序 wei代表数码管W0 W1 W2 W3的位选
{
    
    
#if LEDSEG_CC	
	P0=0;//清零,防止重影
	W0=W1=W2=W3=0;
	if(wei == 0){
    
    //显示第一位
		W0=1;
		P0=seg_du[number];
		delay_ms(2);
		W0=0;
	}
	if(wei == 1){
    
    //显示第二位
		W1=1;
		P0=seg_du[number];
		delay_ms(2);
		W1=0;
	}
	if(wei == 2){
    
    //显示第三位
		W2=1;
		P0=seg_du[number];
		delay_ms(2);
		W2=0;
	}
	if(wei == 3){
    
    //显示第四位
		W3=1;	
		P0=seg_du[number];
		delay_ms(2);
		W3=0;
	}
#else
	P0=0;//清零,防止重影
	W0=W1=W2=W3=1;
	if(wei == 0){
    
    //显示第一位
		W0=0;
		P0=seg_du[number];
		delay_ms(2);
		W0=1;
	}
	if(wei == 1){
    
    //显示第二位
		W1=0;
		P0=seg_du[number];
		delay_ms(2);
		W1=1;
	}
	if(wei == 2){
    
    //显示第三位
		W2=0;
		P0=seg_du[number];
		delay_ms(2);
		W2=1;
	}
	if(wei == 3){
    
    //显示第四位
		W3=0;	
		P0=seg_du[number];
		delay_ms(2);
		W3=1;
	}
#endif

}

void delay_ms(ms)	  //演示函数,大概精度
{
    
    
	uchar value=ms,i;
	while(value--) 
	for(i=0;i<110;i++);
}
void Timer0() interrupt 1
{
    
    
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;//12M晶振 50ms定时初值

	if(++half_sec_flag>10){
    
    
		half_sec_flag=0;
		half_flag1s=1;

	}
	if(++one_sec_flag<20){
    
    
		return;//提前结束函数
		}
	
	one_sec_flag=0;
	if(run_mode==0){
    
    //不是正常运行时,不红绿灯数值不减一 
		flag1s=1;	
	}
}

*程序流程框图*

img

*系统硬件框图*

img

5 设计报告

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

img

6 资料清单&&下载链接:

0.常见使用问题及解决方法–必读!!!!
1.源程序
2.仿真
3.设计报告
4.系统框图
5.讲解视频
Altium Designer 安装破解
filename.bat
KEIL+proteus 单片机仿真设计教程
KEIL安装破解
Proteus元器件查找
Proteus安装
Proteus简易使用教程
单片机学习资料
目录清单.txt
相关数据手册
答辩技巧
设计报告常用描述
鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url
img

资料下载链接(可点击):

猜你喜欢

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