精华内容
下载资源
问答
  • 按键功能,调时间,两种模式,黄灯闪烁,对应的proteus的仿真已经上传
  • 资料包含源程序、原理图、仿真、论文等
  • 基于AT89C51单片机交通灯,带数码管倒计时功能;带Proteus仿真图。代码内有详细注释,适合新手学习。
  • 包含交通灯仿真图与仿真程序,pcb封装,元件清单,设计论文,实物图,制作详解,芯片资料等等
  • 51单片机交通灯

    2016-12-07 11:06:29
    包括proteus文件和c语言程序的交通灯
  • 51单片机交通灯程序

    2015-03-22 23:09:52
    51单片机交通灯程序,控制数码管、定时器的使用。
  • 51单片机 交通灯

    2018-04-11 20:04:56
    学校实训项目,51单片控制交通灯,有需要的可以下载下来参考。
  • 基于51单片机设计的一个红绿灯控制系统,有Proteus仿真电路,C源码,以及设计报告。需要的朋友赶紧下载吧!(声明:此文档中所有内容仅供学习,请勿做他用,如违反导致损失的本人不承担任何责任!)
  • 51单片机-交通灯-红绿灯
  • 该程序是实现了单片机正常的交通灯红绿黄灯亮的时间,闪烁的的功能,另外还添加了,按键操作,改变灯亮的时间
  • 51单片机交通灯实训

    2020-10-19 14:48:40
    基于51单片机的实训代码,已经经过测试可以直接使用,如果有需要硬件电路以及对代码有疑问可留言或联系博主
  • 模拟十字路口交通灯,设有紧急按钮,当有紧急情况能改变红绿灯状态。(如救护车需优先通过时)
  • 51单片机交通灯.zip

    2019-12-04 19:25:01
    这是51单片机做的仿真交通灯,总共16个灯,每一个方向4个灯,分别为红灯绿灯黄灯和转向灯。代码简易逻辑清晰,供初学者参考。有什么问题评论区评论,共同进步,共同学习。
  • 基于51单片机交通灯,在基本的十字路口交通灯的基础下,加了一些功能
  • 功能强大,可调时,白天黑夜模式,闪烁,数码管显示,按键 注意!这是 proteus的仿真,对应的程序,已经上传。
  • 51单片机交通灯(十字路口演示)

    万次阅读 多人点赞 2020-06-28 18:20:31
    51单片机交通灯(十字路口演示),包括紧急情况 本项目中采用单片机 AT89C52为中心器件来设计交通信号灯控制器, 系统实用性强、操作简单、扩展性强。本设计系统就是由单片机最小系统、交通灯状态显示系统、 LED...

    51单片机交通灯(十字路口演示),包括紧急情况

    系统仿真图:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    本项目中采用单片机 AT89C52为中心器件来设计交通信号灯控制器, 系统实用性强、操作简单、扩展性强。本设计系统就是由单片机最小系统、交通灯状态显示系统、 LED数码显示系统、复位电路和按键操作电路等几大部分组成。系统除具有基本的交通信号灯功能外,还具有倒计时和紧急情况处理功能,较好的模拟实现了十字路口可能出现的状况。软件上采用 KEIL C 编程,主要编写了主程序, LED数码管显示程序,中断程序,延时程序等。经过整机调试,实现了对十字路口交通灯的模拟。
    组合完成效果图:
    在这里插入图片描述
    系统硬件框图:
    在这里插入图片描述
    在这里插入图片描述
    主程序框图:
    在这里插入图片描述
    程序代码:

    #include<reg52.h> 
    #define uchar unsigned char 
    #define uint unsigned int 
    #define ON 0 
    #define OFF 1 
    sbit NS_G=P2^5; // 南北绿灯 
    sbit NS_Y=P2^4; // 南北黄灯 
    sbit NS_R=P2^3; // 南北红灯
    
    sbit EW_G=P2^2; // 东西绿灯 
    sbit EW_Y=P2^1; // 东西黄灯 
    sbit EW_R=P2^0; // 东西红灯
    
    sbit LED_D1=P3^7; // 南北方向数码管位控制 
    sbit LED_C1=P3^6; // 南北方向数码管位控制
    
    sbit LED_B1=P3^1; // 东西方向数码管为控制 
    sbit LED_A1=P3^0; // 东西方向数码管位控制
    
    sbit key1=P3^2;				//开关位定义
    sbit key2=P3^3;
    
    /********* 倒计时赋初值 *************/ 
    uchar EWF=30,NSF=25,X=30,Y=25,Z=30,SHU=30;
    uchar count; 
    void keyscan1()		//南北紧急制动按键函数
    {
    	if(!key1)
    	{
    		while(!key1);		//松手检测
    	}
    }
    void keyscan2()		//东西紧急制动按键函数
    {
    	if(!key2)
    	{
    		while(!key2);		//松手检测
    	}
    }
    void init(void) 
    	{ 
    	TMOD=0x01; 
    	TH0=(65536-40000)/256; 
    	TL0=(65536-40000)%256; 
    	EA=1; 
    	ET0=1; 
    	TR0=1;	
    	} 
    void timer1(void) interrupt 1 
    	{ 
    	TMOD=0x01; 
    	TH0=(65536-40000)/256; 
    	TL0=(65536-40000)%256; 
    	EA=1; 
    	ET0=1; 
    	TR0=1; 
    	count++; 
    	if(count>29) 
    			{ 
    			EWF--; 
    			NSF--; 
    			X--; 
    			Y--; 
    			Z--; 
    			SHU--; 
    			count=0; 
    			} 
    
    	}
     
    /****************** 延时 **********************/ 
    void delay(uchar z) 
    		{ 
    		uchar x,y; 
    		for(x=z;x>0;x--) 
    		for(y=110;y>0;y--); 
    		}
    
    /******************led 控制 *******************/ 
    unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 共阴极数码管赋值
    void display1(uchar num1,uchar num2) //控制东西方向 led 显示 
    { 
    	P0=table[num1]; 
    	LED_A1=ON; 
    	delay(1); 
    	LED_A1=OFF; 
    
    	P0=table[num2]; 
    	LED_B1=ON; 
    	delay(1); 
    	LED_B1=OFF;
    
    	if(!key1)//南北紧急制动
    	{
    	   while(1)
    		{
    			P0=0x00;
    			EW_G=EW_Y=OFF;
    			NS_G=NS_Y=OFF;
    			EW_R=NS_R=ON;			
    			keyscan1();
    				EW_R=NS_R=OFF;
    				EW_Y=NS_Y=OFF;
     				NS_G=ON;
    				EW_R=ON;
    			break;
    		}
    	} 
    } 
    void display2(uchar num3,uchar num4) // 控制南北方向 led 显示
    { 
    	P0=table[num3]; 
    	LED_C1=ON; 
    	delay(1); 
    	LED_C1=OFF; 
    
    	P0=table[num4]; 
    	LED_D1=ON; 
    	delay(1); 
    	LED_D1=OFF;
    if(!key2)//东西紧急制动
    	{
    	   while(1)
    		{
    			P0=0x00;
    			EW_G=EW_Y=OFF;
    			NS_G=NS_Y=OFF;
    			EW_R=NS_R=ON;			
    			keyscan2();
    				EW_R=NS_R=OFF;
    				EW_Y=NS_Y=OFF;
     				EW_G=ON;
    				NS_R=ON;
    			break;
    		}
    	} 
    } 
    
    void main() 
    { 
    	int i;
    /************ 初始状态东西南北禁止通行 ************/ 
    	NS_R=ON; //南北方向红灯打开 
    	EW_R=ON; //东西方向红灯打开
    	for(i=0;i<210;i++) 
    		{ 
    		delay(10); 
    		} 
    	NS_R=OFF;// 南北方向红灯关闭 
    	EW_R=OFF;// 东西方向红灯关闭	
    	
    while(1)
    {
    		/************** 状态 1:东西红灯 (30s), 南北绿灯 (25s)************/ 
    		/**************** 状态 2:东西红灯 (30s), 南北黄灯 (5s)***************/
    			while(1) 
    			{ 
    				init(); // 初始化计时器 
    		
    				NS_G=ON; // 南北方向的绿灯打开 
    				EW_R=ON; // 东西方向的红灯打开
    				while(EWF!=0) 
    				{ 
    					display1(EWF/10,EWF%10);// 东西方向红灯 (25s) 
    					display2(NSF/10,NSF%10);// 南北方向绿灯 (30s) 
    					while(EWF==5) 
    					{ 
    						while(X!=0) 
    						{ 
    						display1(EWF/10,EWF%10);// 东西方向红灯 (5s) 
    						display2(X/10,X%10);// 南北方向黄灯 (5s) 
    						NS_G=OFF; // 南北方向的绿灯关闭 
    						NS_Y=ON; // 南北方向的黄灯打开 
    						} 
    					} 
    				 }	 
    			EW_R=OFF; // 东西方向的红灯关闭 
    			NS_G=OFF; // 南北方向的绿灯关闭 
    			NS_Y=OFF; // 南北方向的黄灯打开 		
    		   EWF=30,NSF=25,X=30,Y=25,Z=30,SHU=30;// 重新赋值
    /**************** 状态 3:东西绿灯 (25s), 南北红灯 (30s)**************/ 
    /*************** 状态 4:东西黄灯 (5s) , 南北红灯 (30s)****************/ 
    			while(1)
    			{
    				init(); // 初始化计时器 
    		
    			   NS_R=ON;// 南北方向的红灯打开 
    				EW_G=ON;// 东西方向的绿灯打开
    				while(Z!=0) 
    				{ 
    					display2(Z/10,Z%10);// 南北方向红灯 (25s) 
    					display1(Y/10,Y%10);// 东西方向绿灯 (30s) 
    					while(Z==5) 
    					{ 
    						while(SHU!=0) 
    						{ 
    						display1(Z/10,Z%10);// 东西红灯 (5s) 
    						display2(SHU/10,SHU%10);// 南北绿灯 (5s) 
    						EW_G=OFF; // 东西方向的绿灯关闭 
    						EW_Y=ON; // 东西方向的黄灯打开
    						} 
    					} 
    				 }
    			NS_R=OFF; // 南北方向的红灯关闭 
    			EW_G=OFF; // 东西方向的绿灯关闭 
    			EW_Y=OFF; // 东西方向的黄灯关闭
    			EWF=30,NSF=25,X=30,Y=25,Z=30,SHU=30;// 重新赋值
    			break;
    			}
    		}	
    	 }
    }
    

    个人小结:
    这次是我认为最有意义的一次课程设计,从原理图设计到软件仿真,我从中收获
    了许多。刚开始设计时,我就在校门口仔细观察交通灯的转换,经过研究思考最终得
    到了上述的交通灯状态转换表。
    对于交通灯这个题目,由于刚学了 PLC实现交通信号灯的控制实验,所以就想通
    过不同的核心器件来实现同样的功能,来加深自己在这个题目上的深入研究,在确定
    题目之后,查阅了大量的资料,初步完成了电路设计方案。
    在程序编写上,我选择了用 KEIL C 语言进行编程,。在整个程序的编写过程中,采用模块化,编一个子程序仿真一个, 通过 Keil 和 proteus 两个软件来实现的。Keil帮助检查程序是否存在语法错误之类的问题,同时可以生成 hex 文件,供 proteus 软件仿真使用。通过一周的课程设计,使我更深入的学习了 AT89C52单片机,尤其是在中断程序的编写上学到了好多。

    参考文献: [1] 张毅坤 . 单片微型计算机原理及应用,西安电子科技大学出版社 1998 [2] 夏继强 . 单片机实验与实践教程
    . 北京:北京航空航天大学出版社 , 2001 [3] 彭伟. 单片机 C语言程序设计 100 例. 北京:电子工业出版社 , 2009
    [5] 雷丽文 . 微机原理与接口技术 . 北京:电子工业出版社 , 2001 [6] 于永. 51单片机 C语言常用模块与综合系统设计
    . 北京:电子工业出版社 , 2007 14 [7] 谭浩强 . C 语言程序设计 . 北京:清华大学出版社 , 2005 [8]
    于永. 51单片机 C语言常用模块与综合系统设计 . 北京:电子工业出版社 , 2007

    展开全文
  • 红灯亮6s,黄灯亮3s,绿灯亮9s,每个指示均配备数码管,进行倒计时。... 整个系统以51单片机为基础搭建而成。里面有好几套作品,程序都一样。就是PROteus布局不同。适合更改,数码管的位置和数量不同
  • 1.可指定LED2、LED3代表红灯,设置保持时间; 2.可指定LED5、LED6代表黄灯,设置保持时间; 3.可指定LED8、LED9代表绿灯,设置保持时间; 4.交通灯显示刷新;
  • 51单片机交通灯全套资料,内容都有,含原理图,程序
  • 一个简易模拟十字路口交通灯的程序,首先a道方向绿灯亮,b到方向红灯亮,同时开始计时60s,在段数码管上显示时间60秒倒数。当时间少于10s倒计时A道方向切换黄灯,B道依然为红灯。当60s倒计时结束后,A道方向黄灯开始...
  • 基于51单片机交通灯程序设计与仿真

    万次阅读 多人点赞 2020-05-10 17:57:15
    采用STC89C51芯片作为中心期间来设计交通灯来控制电路,结合七段共阴极数码管显示时间的模块、交通灯显示模块、按键电路、IO口扩展电路等组成,通过程序设计和软件仿真来实现红、黄、绿、蓝燃亮时间以及双位数码管...
    基于51单片机交通灯程序设计与仿真
    摘要

    交通信号灯是城市交通安全、有序、快速运行的重要保障。本文提出一种基于单片机的交通信号灯控制系统的设计方案。该系统模拟现实中十字路口的通行指示,倒计时、紧急车辆通行、强制东西/南北通行、夜间模式灯、转向等功能。并结合交通灯,设计了人行道灯。采用STC89C51芯片作为中心期间来设计交通灯来控制电路,结合七段共阴极数码管显示时间的模块、交通灯显示模块、按键电路、IO口扩展电路等组成,通过程序设计和软件仿真来实现红、黄、绿、蓝燃亮时间以及双位数码管显示倒计时。

    关键字:交通信号灯、人行道灯、STC89C51单片机、紧急通行、转向功能

    51单片机交通灯Proteus仿真

    一、工程介绍

    1.1、实现要求

    1. 控制交通灯实现车辆东西通行后,南北通行功能
    2. 控制转向灯实现交通灯东西通行后左转,南北通行后左转功能
    3. 控制人行道灯实现交通灯东西通行的同时,同时南北人行道开启,同理南北通行亦如此
    4. 可以控制按钮实现东西时间的调整、夜间模式、紧急模式、强制东西/南北模式、查看时间

    二、仿真电路设计

    2.1环境介绍

    2.2、电路设计

    2.2.1、最小系统的实现

    关于51单片机最小系统可以查看我以前博客,2.2.1、最小系统实现参考链接
    src="51%E5%8D%95%E7%89%87%E6%9C%BA%E8%BD%A6%E6%B5%81%E9%87%8F%E4%BA%A4%E9%80%9A%E7%81%AF+%E4%BA%BA%E8%A1%8C%E9%81%93%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E4%B8%8E%E4%BB%BF%E7%9C%9F.assets/%E5%8E%9F%E4%BB%B6%E9%80%89%E6%8B%A9.png" align = "left" style="width:500px;height:300px" />
    从Proteus中选取元件有:74HC595芯片、74HC245芯片、AT89C51单片机、BUTTON开关、BUZZER蜂鸣器、CAP电容、CAP-ELEC电解电容、CRYSTAL晶振、LED-BLUE蓝色LED、LED-GREEN绿色LED、LED-RED红色LED、LED-YELLOW黄色LED、PNP三极管、RES电阻、RESPACK-8排阻、TRAFFICLIGHTS交通灯、7SEG-MPX2-CC两位八段共阴极数码管

    最小系统如下:

    2.2.2、数码管的使用

    数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、3位、4位、5位、6位、7位等数码管。按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

    一位数码管内部原图如图所示:

    在实际电路中数码管是要加驱动芯片的,因为单靠51单片机管脚输出电流是不够的,这里通过添加74HC245驱动芯片驱动各个数码管,用51单片机P0口传送数据给数码管,一定要加上拉电阻,并通过八同相三态总线收发器74HC245直接连接数码管的八个LED。

    74HC245芯片内部结构如下:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    由于单片机或CPU的数据地址控制总线端口都有一定的负载能力,如果负载超过其负载能力,一般应加驱动器。主要应用于大屏显示,以及其它的消费类电子产品中增加驱动。

    仿真电路图如下:

    在这里插入图片描述
    在这里插入图片描述

    2.2.3、交通灯、人行灯及转向灯

    通过Proteus绘制路线以及人行道,可以画出如下电路图:

    2.2.4、74HC595芯片的使用

    74HC595是串口转并口芯片,可输出三种状态:高电平、低电平和高组态。一片74HC595芯片可实现3根口线扩展为8根口线.也可采用多片74HC595进行级联的方式扩展输出口线。控制可以采取如下控制:

    仿真电路图如下:

    2.2.6、蜂鸣器电路的设计

    当IO输出低电平时,三极管导通,蜂鸣器发出声音。

    2.2.7、按键电路的设计

    2.3、总体仿真电路图

    三、程序设计

    3.1、环境介绍

    3.2、定时器的使用

    89C51单片机内部有两个16位的定时/计数器,即定时器T0和定时器T1,这次仿真是要控制数码管每隔1S变化一次,所以应把两个定时器配置50MS的中断,响应10次即完成0.5S,响应20次完成1S。由于51单片机1个机器周期=12个时钟周期,系统时钟频率为12MHZ,则一个机器周期为1US,$ Sysclk = \frac{12MHZ}{12}=1MHZ$。下面是涉及定时器的相关寄存器:

    工作模式寄存器TMOD是用于控制定时器0/1的工作模式,通过对TMOD进行赋值,则可以改变定时器的工作模式具体各位的定义如下:

    定时器T0/T1有四种工作模式:模式0(13位定时器/计数器),模式1(16位定时器/计数器模式),模式2(8位自动重重装载模式),模式3(两个8位定时器/计数器)。T1除模式3外,其他工作模式与定时器/计数器0相同,T1载模式3无效,停止计数。

    定时器的控制寄存器TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求中断源等,格式如下:

    配置T0和T1定时器程序如下:

    void TIMER_init(void)     // 定时器初始化配置
    {
    	TMOD=0X11;            // 设置T0和T1为模式1(16位定时器)
    	TH1=0X3C;		     // 定时器1置初值 0.05S
    	TL1=0XB0;
    	TH0=0X3C;		     // 定时器0置初值 0.05S
    	TL0=0XB0;
    	EA=1;				 // 开总中断
    	ET0=1;				 // 定时器0中断开启
    	ET1=1;				 // 定时器1中断开启
    	TR0=1;				 // 启动定时0
    	TR1=0;				 // 关闭定时1
    }
    

    定时器T0实现交通灯和转向灯程序流程:

    T0开始计时
    当东西/南北倒计时到0重置5秒
    开启黄灯闪烁和蜂鸣器
    黄灯闪烁完开启转向灯10秒
    当东西/南北转向灯倒计时为5S开启闪烁

    黄灯和转向灯闪烁程序如下:

    void Yellow_Flicker(void)
    {
    	if (countt0 == 10)						                    // 加到10也就是半秒
    	{
    		if ((sec_nb <= 5) && (dx_nb == 0) && (shanruo == 1))  	// 东西黄灯闪		
    		{
    			Green_dx = 0;
    			Yellow_dx = 0;
    			if (DX_LL == 1)
    				SendTo595(0XF7);
    			Buzz = 0;						                        // 蜂鸣器关
    		}
    		if ((sec_dx <= 5) && (dx_nb == 1) && (shanruo == 1)) // 南北黄灯闪		
    		{
    			Green_nb = 0;
    			Yellow_nb = 0;
    			if (NB_LL == 1)
    				SendTo595(0XFB);
    			Buzz = 0;					                          // 蜂鸣器关
    		}
    	}
    	if (countt0 == 20)	      // 定时器中断次数=20时(即1秒时)
    	{
    		if ((sec_nb <= 5) && (dx_nb == 0) && (shanruo == 1))  	// 打开交通灯		
    		{
    			Green_dx = 0;
    			Buzz = 1;						                        // 蜂鸣器关
    			if (DX_LL == 1)
    				SendTo595(DX_L);
    			else
    				Yellow_dx = 1;
    		}
    		if ((sec_dx <= 5) && (dx_nb == 1) && (shanruo == 1))  // 南北黄灯闪		
    		{
    			Green_nb = 0;
    			Buzz = 1;						                       // 蜂鸣器关
    			if (NB_LL == 1)
    				SendTo595(NB_L);
    			else
    				Yellow_nb = 1;
    		}
    	}
    }
    

    定时器0中断程序如下:

    void time0(void) interrupt 1 using 1  	 // 定时中断子程序
    {
    	TH0=0X3C;							                 // 重赋初值
    	TL0=0XB0;							                 // 12m晶振50ms//重赋初值
    	TR0=1;								                 // 重新启动定时器
    	countt0++;							               // 软件计数加1
    	Yellow_Flicker();
    		
    	if(countt0==20)	      // 定时器中断次数=20时(即1秒时)
    	{	countt0=0;					// 清零计数器
    		sec_dx--;						// 东西时间减1
    		sec_nb--;						// 南北时间减1
    				
    		if(sec_dx==0&&sec_nb==5) 		//当东西倒计时到0时,重置5秒,用于黄灯闪烁时间   
    		{
    			sec_dx=5;
    			shanruo=1;
    		}
    		if(sec_nb==0&&sec_dx==5)		//当南北倒计时到0时,重置5秒,用于黄灯闪烁时间   
    		{
    			sec_nb=5;
    			shanruo=1;
    		}
    		if(dx_nb==0&&sec_nb==0&&DX_LL==0)			//当东西通行时间完毕,开始东西左转
    		{
    			sec_nb = 10;
    			sec_dx = 10;
    			SendTo595(DX_L);		
    			DX_LL=1;
    			Yellow_dx = 0;
    		}
    		if(dx_nb==0&&sec_nb==0&&DX_LL==1)			//当黄灯闪烁时间倒计时到0时,
    		{
     	    	Buzz=1;						//蜂鸣器开
    			P2 &=0x81;					//重置东西南背方向的红绿灯
    			Green_nb=1;
    			Red_dx=1;
    			dx_nb=!dx_nb;
    			shanruo=0;
    			if(num_che_nb>set_timenb/2)//如果此时南北通行的车辆数大于预设通行量
    				set_timenb=set_timenb+5;	
    			if(num_che_nb==0)//如果南北方向无车辆通行,每次递减5秒
    				set_timenb=set_timenb-5;
    			if(set_timenb<=15)
    				set_timenb=15;
    			sec_nb=set_timenb;			//重赋南北方向的起始值
    			sec_dx=set_timenb+5;		//重赋东西方向的起始值
    			num_che_nb=0;//清零
    		  SendTo595(NB_R);	
          DX_LL=0;	
    		}	
    		if(dx_nb==1&&sec_dx==0&&NB_LL==0)			//当南北通行时间完毕,开始南北左转
    		{
    			sec_nb = 10;
    			sec_dx = 10;
    			SendTo595(NB_L);		
    			NB_LL=1;
    			Yellow_nb = 0;	
    		}
    		if(dx_nb==1&&sec_dx==0&&NB_LL==1)			//当黄灯闪烁时间到
    		{
    			P2&=0X81;						//重置东西南北的红绿灯状态
    			Green_dx=1;					 //东西绿灯亮
    			Red_nb=1;					 //南北红灯亮
    			dx_nb=!dx_nb;				 //取反
    			shanruo=0;					//闪烁
    			if(num_che_dx>set_timedx/2)//如果此时南北通行的车辆数大于预设通行量
    				set_timedx=set_timedx+5;	
    			if(num_che_dx==0)//如果东西方向无车辆通行,每次递减5秒
    				set_timedx=set_timedx-5;
    			if(set_timedx<=15)
    				set_timedx=15;
    			sec_dx=set_timedx;			//重赋东西方向的起始值
    			sec_nb=set_timedx+5;		//重赋南北方向的起始值
    			num_che_dx=0;//清零
    			SendTo595(DX_R);		
    			NB_LL=0;
    		}
    
    	}	
    }
    

    3.3、外部中断的使用

    程序使用两个外部中断实现东西/南北强制转换,分别使用了外部中断0和外部中断1,且中断结构如下。

    通过结构图可以看出使用外部中断步骤如下:

    1. 设置电平触发方式
    2. 开启EX0/1
    3. 开启总中断

    初始化外部中断程序如下:

    	IT0 = 1;//设置为下降沿触发
    	EX0 = 1;//使能外部中断
    	IT1 = 1;
    	EX1 = 1;
    

    两个外部中断具体使用的功能:

    //外部中断0
    void int0(void) interrupt 0 using 1	   //只允许东西通行
    {
    	TR0=0;								//关定时器0
    	TR1=0;								//关定时器1
    	P2=0x00;							//灭显示
    	Green_dx=1;							//东西方向置绿灯
    	Red_nb=1;							//南北方向为红灯
    	sec_dx=00;							//四个方向的时间都为00
    	sec_nb=00;	
    	SendTo595(null);	
    }
    //外部中断1
    void int1(void) interrupt 2 using 1	  	 //只允许南北通行 
    {
    	TR0=0;								//关定时器0
    	TR1=0;							   //关定时器1
    	P2=0x00;							//灭显示
    	Green_nb=1;							//置南北方向为绿灯
    	Red_dx=1;							//东西方向为红灯
    	sec_nb=00;							//四个方向的时间都为00
    	sec_dx=00;
    	SendTo595(null);	
    }
    

    3.4、控制595芯片

    我们都知道通信从大的方面有两种:串行和并行。串行的最大优点是占用总线少,但是传输速率低;并行恰恰相反,占用总线多,传输速率高。市面上有很多这样的芯片,有串入并出的(通俗讲就是 一个一个进,最后一块出来),有并入串出的(相对前者而言)。具体用哪种类型要根据我们得实际情况。比如利用单片机显示数码管单纯的显示一个数码管如果仅仅是为了显示 那么动用单片机一个端口(如P0或P1/P2/P3)那没有什么,当然这里我说的数码管是8段的(如果利用BCD类型 16进制数码管那么只需四个即可)就拿51类型的单片机来说,总共32个I/O口,一般如果不是做太大的工程是完全够用的,但有些时候你会恨单片机怎么不多长几条“腿”,怎么省还是不够用。这个时候就需要用到并转串或者串转并芯片来进行IO口的扩展,74HC595就是一种串行转并行的芯片。参考链接

    程序如下:

    #define NB_L 0XFE
    #define DX_L 0XFD
    #define NB_G 0XF7
    #define NB_R 0XF7
    #define DX_G 5
    #define DX_R 0XFB
    #define null 0XF3
    sbit DS = P2^0;
    sbit SH_CP = P2^7;
    sbit ST_CP = P1^4;
    void SendTo595(uchar Data)//发送一个字节数据给595再并行输出
    {
       char i=0;
    	ST_CP = 0;
       for(i;i<8;i++)
       {
          SH_CP = 0;  
          DS=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0 
          Data=_crol_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010
          SH_CP = 1;           //上升沿让串行输入时钟变成高电平 并延时一个时钟周期
          _nop_(); 
       }    
                                /*位移寄存器完毕,转移到存储寄存器*/
       ST_CP = 1;               //上升沿,存储寄存器变为高电平 延迟两个时钟周期
       _nop_();
       _nop_();
     }
    

    3.5、数码管程序设计

    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 display(void) //显示子程序
    {	
    
    	if(xianshi_fx==0)//正常显示
    	{
    	buf[1]=sec_nb/10; 		//第1位 东西显示秒十位
    	buf[2]=sec_nb%10; 		//第2位 东西显示秒个位
    	buf[3]=sec_dx/10; 		//第3位 南北显示秒十位
    	buf[0]=sec_dx%10; 		//第4位 南北显示秒个位	
    	}
    	if(xianshi_fx==1)//查看通行时间
    	{
    	buf[1]=set_timenb/10; 		//第1位 东西通行秒十位
    	buf[2]=set_timenb%10; 		//第2位 东西通行秒个位
    	buf[3]=set_timedx/10; 		//第3位 南北通行秒十位
    	buf[0]=set_timedx%10; 		//第4位 南北通行秒个位	
    	}
    
    	if(xianshi_fx==2)//查看红外计数值
    	{
    	buf[1]=num_che_nb/10; 		//第1位 东西红外计数值十位
    	buf[2]=num_che_nb%10; 		//第2位 东西红外计数值个位
    	buf[3]=num_che_dx/10; 		//第3位 南北红外计数值十位
    	buf[0]=num_che_dx%10; 		//第4位 南北红外计数值个位	
    	}
    	s1 = 1;s2 = 1;s3 = 1;s4 = 1;
    	P0=0x00;				 灭显示
    	s1 = 0;s2 = 1;s3 = 1;s4 = 1;
    	P0=table[buf[1]];		//送东西时间十位的数码管编码			
    	delay(1);				//延时
    	s1 = 1;s2 = 1;s3 = 1;s4 = 1;
    	P0=0x00;				//灭显示						   
    	s1 = 1;s2 = 0;s3 = 1;s4 = 1;
    	P0=table[buf[2]];		 //送东西时间个位的数码管编码
    	delay(1);				 //延时
    	s1 = 1;s2 = 1;s3 = 1;s4 = 1;
    	P0=0x00;				//关显示
    	s1 = 1;s2 = 1;s3 = 0;s4 = 1;
    	P0=table[buf[3]];		//送南北时间十位的数码管编码
    	delay(1);				//延时
    	s1 = 1;s2 = 1;s3 = 1;s4 = 1;	
    	P0=0x00;				 //关显示
    	s1 = 1;s2 = 1;s3 = 1;s4 = 0;	
    	P0=table[buf[0]];		//送南北时间个位的数码管编码
    	delay(1);				//延时
    }
    

    五、结果分析与改进

    1. 问题:仿真结果表明,当增加时间或者减小时间那么东西和南北的倒计时会同时增加
    2. 解决:通过设置独立按键把东西/南北倒计时时间分开即可解决

    参考资料:

    1. 51单片机 74hc595使用用法(利用proteus仿真)
    2. 74HC245 内部结构及作用
    展开全文
  • 利用单片机的中断系统,控制P口的8个LED灯,将8个LED等自定义成交通灯的模式,东西向绿灯亮5s后,绿灯闪烁,闪烁5次亮红灯,红灯亮后,南北向由红灯变成绿灯,5s后南北向绿灯闪烁, 闪烁5次后亮红灯,东西向绿灯亮,...
  • 基于51单片机交通灯的系统设计,包括论文,原理图,源代码都有。
  • 设计介绍 单片机介绍 51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超...

    具体实现功能

    具体实现功能:

    (1)南北绿灯,东西红灯60S倒计时;

    (2)60S将结束时,南北绿灯闪烁两次,转换为黄灯,南北黄灯与东西黄灯持续2S;

    (3)南北红灯,东西绿灯30S倒计时。

    设计介绍

    单片机介绍

    51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。

    设计思路

    文献研究法:搜集整理相关单片机智能手环系统相关研究资料,认真阅读文献,为研究做准备;

    调查研究法:通过调查、分析、具体试用等方法,发现单片机智能手环系统的现状、存在问题和解决办法;

    比较分析法:比较不同单片机智能手环系统的具体原理,以及同一类传感器性能的区别,分析单片机智能手环系统的研究现状与发展前景;

    软硬件设计法:通过软硬件设计实现具体硬件实物,最后测试各项功能是否满足要求。

    仿真实现

    本设计利用protues8.7软件实现仿真设计,具体如图。

    Protues也是在单片机仿真设计中常用的设计软件之一,通过设计出硬件电路图,及写入驱动程序,就能在不实现硬件的情况进行电路调试。另外,protues还能实现PCB的设计,在仿真中也可以与KEIL实现联调,便于程序的调试,且支持多种平台,使用简单便捷。

    汇编程序

    本设计由汇编语言编写,主代码具体如下:

             ORG 0000H       LJMP  MAIN      ;转向主程序        ORG 0003H       LJMP INTT0    ;转向紧急车辆中断服务程序         ORG 0013H       LJMP INTT1      ;转向有车车道中断服务程序       ORG   0200H  MAIN:MOV   SP,#30H        SETB  PX0           ;置外部中断0为高优先级中断                    MOV   TCON,#00H      ;置外部中断0、1为电平触发          MOV   TMOD,#10H     ;置定时器1为方式1          MOV   IE,#85H      ;开CPU中断,开外中断0、1中断     LOOP:  MOV  P1,#0F3H      ;A道绿灯放行,B道红灯禁止            MOV  R1,#90      ;置0.5秒循环次数(0.5×90=45S)      DIP1:  ACALL  DELAY       ;调用0.5秒延时子程序        DJNZ   R1,DIP1      ;45秒不到继续循环     MOV    R1,#06      ;置A绿灯闪烁循环次数     WAN1: CPL    P1.2      ;A绿灯闪烁            ACALL  DELAY         DJNZ   R1,WAN1      ;闪烁次数未到继续循环         MOV    P1,#0F5H    ;A黄灯警告,B红灯禁止         MOV    R1,#04H   ;置0.5秒循环次数(0.5×4=2S)    YL1:ACALL  DELAY      DJNZ   R1,YL1     ;2秒未到继续循环      MOV    P1,#0DEH   ;A红灯,B绿灯      MOV    R1,#32H    ;置0.5秒循环次数(0.5×50=25S)   DIP2:  ACALL  DELAY    DJNZ   R1,DIP2    ;25秒未到继续循环        MOV    R1,#06H  WAN2:  CPL    P1.5      ;B绿灯闪烁              ACALL  DELAY     DJNZ   R1,WAN2            MOV     P1,#0EEH ;A红灯,B黄灯          MOV     R1,#04H YL2:      ACALL   DELAY     DJNZ     R1,YL2          AJMP    LOOP      ;循环执行主程序  INTT0:PUSH    P1       ;P1口数据压栈保护           PUSH   ACC      ;ACC寄存器压栈保护          PUSH   TH1       ;TH1压栈保护           PUSH     TL1      ;TL1压栈保护           MOV    P1,#0F6H  ;A、B道均为红灯        MOV    R2,#40    ;置0.5秒循环初值(20S)      DEY0:     ACALL  DELAY     DJNZ   R2,DEY0   ;15秒未到继续循环         POP     TL1      ;弹栈恢复现场            POP     TH1           POP    ACC     POP     P1     RETI              ;返回主程序        INTT1: CLR    EA      ;关中断            PUSH   P1      ;压栈保护现场             PUSH   ACC       PUSH   TH1       PUSH   TL1       SETB   EA      ;开中断             JB    P3.0,BOP ;A道无车转向B道           MOV    P1,#0F3H ;A道绿灯,B道红灯                  SJMP   DEL1      ;转向15秒延时           BOP:  JB    P3.1,EXIT  ;B道无车退出中断           MOV    P1,#0DEH  ;A红灯,B绿灯             DEL1:  MOV    R5,#30    ;置0.5秒循环初值(15S)             NEXT:  ACALL  DELAY            DJNZ   R5,NEXT    ;15秒未到继续循环             EXIT:   CLR    EA       POP    TL1        ;弹栈恢复现场                  POP   TH1             POP   ACC        POP   P1        SETB  EA        RETI     DELAY:   MOV   R3,#0AH   ;0.5秒子程序(50ms×10=0.5s)            MOV   TH1,#3CH  ;置50ms初值X=3CB0H          MOV   TL1,#0B0H        SETB  TR1       ;启动T1          LP1: JBC   TF1,LP2    ;查询计数溢出        SJMP  LP1        LP2:MOV   TH1,#3CH    ;置50ms初值X=3CB0H          MOV   TL1,#0B0H        DJNZ  R3,LP1        RET        END

    更多资料欢迎关注“电子工程师成长日记

    展开全文
  • 基于51单片机交通灯(汇编语言)

    千次阅读 多人点赞 2020-12-17 20:35:48
    基于51单片机交通灯(汇编语言) 设计要求:     设计交通灯控制系统。模拟交通信号灯控制:一般情况下正常显示,东西-南北交替放行,各方向通行时间为30秒。有救护车或警车到达时,两个方向...

    基于51单片机交通灯(汇编语言)

    设计要求:

        设计交通灯控制系统。模拟交通信号灯控制:一般情况下正常显示,东西-南北交替放行,各方向通行时间为30秒。有救护车或警车到达时,两个方向交通信号灯全为红色,以便让急救车或警车通过,设通行时间为10秒,之后交通恢复正常。用单次脉冲模拟急救车或警车申请外部中断。
    proteus仿真图:
    在这里插入图片描述
    单片机晶振为22.114MHz
    代码:

    		ORG 0000H
    		AJMP MAIN
    		ORG 0003H
    		AJMP INTV1
    		ORG 000BH
    		AJMP EXT0
    		
    		ORG 0100H
    MAIN:	
    		SETB P3.2		
    		MOV P1,#00H	
    		SETB TR0
    		SETB IT0
    		SETB EX0
    		SETB ET0
    		SETB PT0	;设置T0优先级最高
    		SETB EA
    		MOV TMOD,#01H	;定时器0工作方式1
    LOOP:	MOV TH0,#184
    		MOV R4,#100
    		MOV TL0 , #0		
    		SETB TR0
    		MOV SP,#60H		;栈
    		
    START:	MOV R7,#30		;交通灯正常运行开始
    LOOP1:					;南北绿灯,东西红灯,25s
    		LCALL WAIT_1S
    		MOV P1,#11H
    		DEC R7
    		CJNE R7,#5,LOOP1
    LOOP2:					;南北绿灯,东西红灯,东西南北黄灯5s
    		LCALL WAIT_1S
    		MOV P1,#35H
    		DEC R7
    		CJNE R7,#0,LOOP2
    		
    		MOV R7,#30
    		
    LOOP3:					;南北红灯,东西绿灯,25s
    		LCALL WAIT_1S
    		MOV P1,#0AH
    		DEC R7
    		CJNE R7,#5,LOOP3
    
    LOOP4:					;南北红灯,东西绿灯,东西南北黄灯5s
    		LCALL WAIT_1S
    		MOV P1,#2EH
    		DEC R7
    		CJNE R7,#0,LOOP4
    		SJMP START
    	
    WAIT_1S:				;等待1s
    		JNB 20H.0,$
    		CLR 20H.0
    		LCALL DISPLAY
    		RET
    		
    EXT0: 					;1s中断拉高20H.0	
    		MOV TH0 , #184
    		MOV TL0 , #0	
    		DJNZ R4,T0END;1S
    		MOV R4,#100		
    		SETB 20H.0	
    T0END:	RETI
    
    TAB:DB 3FH,06H,5BH,4FH,66H
    	DB 6DH,7DH,07H,7FH,6FH//00
    		
    
    DISPLAY:				;数码管显示
    		MOV A,R7
    		DEC A
    		MOV B,#10
    		DIV AB
    		MOV DPTR,#TAB
    		MOVC A,@A+DPTR
    		MOV P2,A
    		XCH A,B
    		MOVC A,@A+DPTR
    		MOV P0,A
    		RET
    		
    INTV1:					;外部中断0
    		MOV P1,#09H
    		PUSH ACC		;入栈保存工作状态
    		PUSH B
    		PUSH PSW
    		SETB RS0		;更换工作区
    		MOV R7,#10		;10s倒计时
    ;		LCALL DISPLAY
    L1:		
    		LCALL WAIT_1S
    		DEC R7
    		CJNE R7,#0,L1		
    		POP PSW			;恢复工作状态
    		LCALL DISPLAY
    		POP B
    		POP ACC
    		RETI
    		
    END		
    
    

    参考代码:: https://wenku.baidu.com/view/90866b22ee06eff9aef80750.html.

    展开全文
  • 交通灯,实现路人,车辆通行的控制,proteus
  • 51单片机交通灯实验

    千次阅读 2018-12-20 19:14:01
    org 0000h Start: MOV P2,#11110101B LCALL DELAY1 LCALL Y_GREEN_SHAN MOV P2,#11110011B LCALL DELAY3 MOV P2,#11101110B LCALL DELAY1 LCALL X_GREEN_SHAN MOV P2,#11011110B ...SJMP STA...
  • AB两路 红绿灯10s 黄灯3s 数码管倒计时动态显示时间 两个外部中断 1是紧急情况让AB两路同时亮红灯 2是放行红灯有车的一路

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,741
精华内容 696
关键字:

51单片机交通灯