加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

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

10/08 10:21
402
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
相关方案
  • 方案介绍
    • 1 讲解视频:
    • 2 功能要求
    • 3 仿真图:
    • 4 程序设计:
    • 5 设计报告
    • 6 资料清单&&下载链接:
  • 相关文件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

仿真图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

  • 设计资料获取联系方式.doc

相关推荐

电子产业图谱