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

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

基于AT89C51的十字路口交通灯紧急+夜间

08/14 10:17
806
服务支持:
技术交流群

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

虚拟商品不可退

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

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
相关方案
  • 方案介绍
  • 相关文件
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

仿真图proteus 7.8

程序编译器:keil 4/keil 5

编程语言:C语言

编号J015

功能要求

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

2)带紧急制动按钮,按钮按下,所有方向亮红灯;再次按下,恢复正常显示;

3)夜间模式按钮按下,所有方向显示黄灯闪烁;

4)实时提醒绿灯亮的剩余时间。

仿真图

正常运行模式

正常红绿灯运行分有四个状态

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

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

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

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

img

紧急模式

东西和南北方向红灯,显示EE

img

正常运行模式

img

程序

img

程序讲解

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

倒计时的产生

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

一般两个来源:

1,延时

delay(1000ms);

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

2,定时

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

	EA=1;//开总中断
	EX0=1;//外部中断0
	EX1=1;//外部中断1
	IT0=1;//设置下降沿触发中断0
	IT1=1;//设置下降沿触发中断1

	TMOD=0X01;//定时器0的工作模式为模式1
	TH0=0X4C;
	TL0=0X00;//11.0592M晶振 50ms定时初值
	ET0=1; //允许定时器1中断
	TR0=1;//启动定时器0 

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

	TH0=0XBB;
	TL0=0X00;//重新装载定时初值
	if(++one_sec_flag>=50){
		one_sec_flag=0;
		
	if(run_flag==0)//正常情况下才倒计时
		scan_flag=1;
	}

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

	while(1)
	{	
		led_sacn();	//LED和数码管显示,时刻刷新
		count_sacn();//倒计时扫描
	}
红黄绿灯状态处理

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

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

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

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

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

5.执行第一步

img

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();//数码管显示	
   }
倒计时显示处理

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

/*
调用该函数显示4位数码管
*/
void seg_display(void){
		seg_disp(ns_road_time/10,0);
		seg_disp(ns_road_time%10,1);
		seg_disp(we_road_time/10,2);
		seg_disp(we_road_time%10,3);
}
/*
数码管动态显示程序
wei代表数码管SEG0 1 2 3的位选
选择位选,赋值给P0,数字就显示在选中的SEG位置上
*/
void seg_disp(uchar number,uchar wei)	
{
	P0=0XFF;//清零,防止重影
	W0=W1=W2=W3=0;//清除位选	
	if(wei == 0){//显示SEGA
		W0=1;
		P0=seg_du[number];
		delay_ms(2);
	}
	if(wei == 1){//显示SEGB
		W1=1;
		P0=seg_du[number];
		delay_ms(2);
	}
	if(wei == 2){//显示SEGC
		W2=1;
		P0=seg_du[number];
		delay_ms(2);
	}
	if(wei == 3){//显示SEGD
		W3=1;	
		P0=seg_du[number];
		delay_ms(2);
	}
}
按键处理

按键中断处理函数,按下夜间模式按键后执行night_run()函数,按下紧急按键后执行urgent_run();

void night_run() interrupt 0
{
	if(run_flag==0)//如果是正常模式
	{
		run_flag=2; //夜间模式
	}else if(run_flag == 2){//如果是夜间模式
		run_flag=0;  //切回正常模式
		ns_road_time=0;//重现开始
		state=0;

	}

}

void urgent_run() interrupt 2//外部中断处理函数,按下紧急按键后执行这
{
	if(run_flag==0){//如果是正常模式
		run_flag=1;
		buck_led=P2;//记录当前的LED灯状态

	}else if(run_flag==1){//如果已经是夜间模式
		run_flag=0;//切回到正常模式
		P2=buck_led;

	}
}

资料清单

资料下载

img

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

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
ECS-.327-12.5-34R-C-TR 1 ECS International Inc Parallel - Fundamental Quartz Crystal, 0.032768MHz Nom, SMD, 2 PIN
$0.98 查看
EPCQ128ASI16N 1 Intel Corporation Memory Circuit, 16MX8, CMOS, PDSO16, SOIC-16

ECAD模型

下载ECAD模型
$36 查看
MCT62SD 1 onsemi 8-Pin DIP Dual-Channel Phototransistor Output Optocoupler, 1000-REEL

ECAD模型

下载ECAD模型
$1.33 查看

相关推荐

电子产业图谱