精华内容
下载资源
问答
  • 单片机课程设计交通灯
  • 电路图 源代码 设计报告 单片机课程设计 交通灯
  • 完整系统连接图 完整程序 完整课程设计要求 单片机 课程设计 交通灯控制系统
  • 单片机课程设计交通灯。数码管显示,LED灯指示,按键调节红绿灯时间。源代码,proteus仿真,全面的学习资料源文件都有。可以用来学习
  • 单片机课程设计交通灯(源代码)

    千次阅读 2020-06-16 13:42:58
    本此课程设计交通灯系统利用单片机AT89C51作为核心元件,实现了通过信号灯对路面状况的智能控制。系统具有结构简单、可靠性高、成本低、实时性好、安装维护方便等优点,有广泛的应用前景。 交通灯控制器设计主要功能...

    简介

    本此课程设计交通灯系统利用单片机AT89C51作为核心元件,实现了通过信号灯对路面状况的智能控制。系统具有结构简单、可靠性高、成本低、实时性好、安装维护方便等优点,有广泛的应用前景。
    交通灯控制器设计主要功能是用单片机控制LED灯模拟指示。模拟东西南北方向的十字路口交通灯信号控制情况。本模拟系统由单片机硬/软件系统,用keil和proteus软件来实现两位8段数码管和LED灯显示系统,较好的模拟了交通路面的控制。
    用到的元器件: 51单片机、button、三种led灯、8255A芯片、RESPACK-8、74LS04、两位数码管等

    基本功能

    1.主干道计时60秒,次干道计时45秒,左转计时15秒,时间到则切换红绿灯;
    2.红绿灯不变期间,在七段数码管上显示每秒倒计时;
    3.绿灯计时结束后,同方向的黄灯闪烁三秒直至计时到0。
    4.期间人行道通行情况随道路的通行状况而改变
    5.设置紧急模式:模式一道路全部禁行;模式二道路允许缓慢通行;模式三只允许南北直行;模式四只允许东西直行;模式五只允许南北左转;模式六只允许东西左转。
    功能详解
    当南北主干道通车时绿灯亮,而东西次干道干道红灯亮,此时南北人行道绿灯亮,东西红灯亮;当60s通车时间到后,主干道绿灯熄灭,黄灯闪烁三秒,3s之后南北左转的绿灯亮起,人行道及东西方向全部红灯;15s后切换为东西次干道通车。此时主干道左转绿灯熄灭,红灯亮,而次干道红灯熄灭,绿灯亮,次干道开始通车;45s通车时间到后,次干道绿灯熄灭,黄灯闪烁三秒,3s之后东西次干道左转绿灯亮起,人行道及东西方向全部红灯;15s后切换为南北主干道通车。此时次干道左转绿灯熄灭,红灯亮,而主干道红灯熄灭,绿灯亮。按照上述如此不断循环。

    方案设计

    电路模块分布
    在这里插入图片描述
    基本功能程序图
    在这里插入图片描述

    源程序

    #include<reg51.h>
    #include<intrins.h>
    #include<absacc.h>
    #define uint unsigned int
    #define uchar unsigned char
    
    #define PA	 XBYTE[0x7F00]   //PA端口地址
    #define PB	 XBYTE[0x7F01]		
    #define PC	 XBYTE[0x7F02]
    #define COM	 XBYTE[0x7F03]
    
    	uchar temp,aa,nn;
    	
    	sbit shi=P3^0;
    	sbit ge=P3^1;	/*对要使用的单片机各个口进行定义*/
    	bit flag=0;
       sbit key1=P2^0;
    	sbit key2=P2^1;
    	sbit key3=P2^2;
       sbit key4=P2^3;
       sbit key5=P2^4;
       sbit key6=P3^3;
    	uchar code table[]={
    	0x3f,0x06,0x5b,0x4f,
    	0x66,0x6d,0x7d,0x07,
    	0x7f,0x6f,0x77,0x7c,
    	0x39,0x5e,0x79,0x71};         /*将数字0123456789的16进制数定义成数组用以显示*/
       //定义所有函数
    	void delay(uint z);
    	void disp(uint n);
    	void  xint0();
    	void  xint1();
    	void timer0();
    	void nb_flash(void);
    	void dx_flash(void);
    	void nanbei();
    	void dongxi();                 
       void nanbeizuo();
    	void dongxizuo();
       void dongxizuogreen();
    	void nanbeizuogreen();
    	void  dongxigreen();
    	void  nanbeigreen();
    	void allred();
    	void allyellow();
    	//主函数
    	void main()        
    	{
    		uint num;
    		num=0;
    		aa=0;
    		COM =0x82;        //PA口输出,PB口输入,PC口输出
    		TMOD=0x01;        //定时器工作方式1
    		TH0=(65536-50000)/256;
    		TL0=(65536-50000)%256;
    		EA=1;            //开启总中断
    		ET0=1;           //开启定时器中断
    		TR0=1;           //开启定时器0
    		EX0=1;           //外部中断0允许标志
    		IT0=0;           //外部中断0电平触发
    		EX1=1;           //外部中断1允许标志
    		IT1=0; 		     //外部中断1电平触发
    		
    		while(1){
    			 nanbei();
    			 nb_flash();
    			 nanbeizuo();
    			 dongxi();
    			 dx_flash();
    			 dongxizuo();
    	  }
    		
      }
    
    	void delay(uint z)                    //延时函数
    	{
    		uint x,y;
    		for(x=z;x>0;x--)
    			for(y=110;y>0;y--);
    	}
    
    	void timer0() interrupt 1            //定时器0中断
    	{
    		TH0=(65536-50000)/256;
    		TL0=(65536-50000)%256;
    		aa++;
    		if(aa==18)
    		{
    			aa=0;
    			flag=1;
    		}	
    		
    	}
    	void disp(uint n)                    //数码管显示函数
    	{
    	  while(!flag)
    	  {
    		  ge=0;
    		  PC=table[n%10];
    		  delay(50);
    		  shi=1;ge=1;
    		  shi=0;
    		  PC=table[n/10];
    		  delay(50);
    		  shi=1;ge=1;
    	   }
    	  if(flag==1)
    	     flag=0;
    	}
    	void nanbei()                    //南北绿灯东西红灯及数码管显示
    	{		//南北通行
    		uint num;
    			num=60;
    			disp(num);
    		   
    			while(num<=60&&num>0)
    			{	PA=0xd8;
    				num--;
    			   P1=0xe1;
    				disp(num);			
    			}			
    	}
    	void nanbeizuo()                    //南北方向左转及数码管显示
    	{		uint num;
    			num=15;
    		   
    			disp(num);
    			while(num<=15&&num>0)
    			{	P1=0xe4; 	
    				num--;
    			     PA=0xe9;
    			   disp(num);			
    			}
    	}
    	void dongxizuo()                     //东西方向左转及数码管显示
    	{		uint num;			
    	 		num=15; 
    		   
    			while(num<=15&&num>0)
    			{	P1=0xe4;
    				PA=0xea;	  
    				disp(num);
    				num--;
    			}
    	}
    	void dongxi()                     //东西绿灯南北红灯及数码管显示
    	{		uint num;
            
    	 		num=45;
    		   disp(num);
    			while(num<=45&&num>0)
    			{	
                PA=0xe4;	
    				P1=0xcc;	  
    				disp(num);
    				num--;
    			}
    	}
    	void nb_flash(void)              //南北方向黄灯闪烁及数码管显示
    	{
    		uint a;
    		
    		for(a=3;a>0;a--)
    		{	PA=0xd8;
    			disp(a);
    			P1=0xe2;
    	 		
    	 		delay(100);
    			P1=0xe0;
    			
    		}
    	}
    	void dx_flash(void)                //东西方向黄灯闪烁及数码管显示
    	{
    		uint a;
    		
    		for(a=3;a>0;a--)
    		{	 PA=0xe4;
    			 disp(a);
    			 P1=0xd4;
    			 delay(100);
    			 P1=0xa4;
    			 
    		}
    	}
    void  xint0()  interrupt 0               //外部中断0
    {	
    	TH0=(65536-50000)/256;
    	TL0=(65536-50000)%256;
       if(key1==0){
    		if(key1==0)
    		{
    			delay(20);
    			allred();
    			
    		}
    	}	
    	if(key2==0){
    		if(key2==0)
    		{
    			
    			delay(20);
    			allyellow();
    			
    		}		
    	}
    	if(key3==0){
    		if(key3==0)
    		{
    			delay(20);
    			nanbeigreen();
    		}		
    	}
    	if(key4==0){
    		if(key4==0)
    		{
    			delay(20);
    			dongxigreen();
    		}		
    	}
    	if(key5==0){
    		if(key5==0)
    		{
    			delay(20);
    			nanbeizuogreen();
    		}		
    	}
    	
    } 
    void  allred()                         //南北东西方向全部红灯   
    {			
    	      
    			P1=0xe4;
    	      PC=0x00;
             PA=0xe8;  			
    			return;
    }
    void  allyellow()                       //南北东西方向全部黄灯   
    {		
    	      
    		   P1=0xd2;
    	      PC=0x00;
             PA=0x00;  			
    			return;
    }
    
    void  nanbeizuogreen()                    //南北方向左转绿灯  
    {			
    			P1=0xe4;
    	      PC=0x00;
             PA=0xe9;  			
    			return;
    }
    void  dongxizuogreen()                    //东西方向左转绿灯  
    {			
    			P1=0xe4;
    	      PC=0x00;
             PA=0xea;  			
    			return;
    }
    
    void  nanbeigreen()                       //南北方向绿灯  
    {			
    			P1=0xe1;
    	      PC=0x00;
             PA=0xe8;  
    			return;
    }
    void  dongxigreen()                       //东西方向绿灯  
    {			
    			P1=0xcc;
    	      PC=0x00;
             PA=0xe8;  	
    			return;
    }
    void  xint1()  interrupt 2                     //外部中断1
    {	
    	TH0=(65536-50000)/256;
    	TL0=(65536-50000)%256;
      	dongxizuogreen();
    }
    

    运行结果:
    在这里插入图片描述
    在这里插入图片描述
    源代码+Proteus仿真图+实验报告:https://download.csdn.net/download/weixin_43889532/12505623

    有问题请在评论区留言!

    展开全文
  • /******************************************************************************* 交通灯 *******************************************************************...
    /******************************************************************************* 交通灯 ***********************************************************************************/ #include <reg51.h> #include <intrins.h> sbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制 sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制 sbit LS138C = P2^4; //定义138译码器的输入脚C由P2.4控制 sbit BEEP = P1^5; char ch; bit read_flag= 0 ; //红绿灯 sbit L0_1 = P1^0; sbit L0_2 = P1^1; sbit L1_1 = P1^2; sbit L1_2 = P1^3; sbit L2_1 = P1^4; sbit L2_2 = P1^5; sbit L3_1 = P1^6; sbit L3_2 = P1^7; void delay(unsigned int i); //延时 void InitTimer(); //初始化定时器设置 void InitSerialInt(); //初始化中断 void SetStartTime(int pos, int time_1, int time_2); //设置各个数码管的倒计时开始时间 void SetLights(int time, int group); //亮灯设置 char DelayCNT = 0; int SecondCounts = 0; //每秒自增1,到100时重新回到0 int counter = 0; //辅助定时器实现 int start_time_1[4] = {99, 99, 99, 99}; //各个数码管的倒计时开始时间 int start_time_2[4] = {99, 99, 99, 99}; unsigned char timer_1[4] = {99, 99, 99, 99}; unsigned char timer_2[4] = {99, 99, 99, 99}; unsigned char show_1[4] = {99, 99, 99, 99}; unsigned char show_2[4] = {99, 99, 99, 99}; //此表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //标记灯的颜色 unsigned char color[4] = {0, 1, 0, 1}; char WillShine[4] = {0, 0, 0, 0}; //是否需要闪烁 char ShineCounter[4] = {0, 0, 0, 0};//闪烁计数器 /************主函数**********************/ main() { static int last = -1; unsigned int i, LedNumVal/*led要显示的两位数值*/ = 0; unsigned int LedOut[10]; int starttime = 0; //设置数码管计数初值 SetStartTime(0, 7, 8); SetStartTime(1, 8, 7); SetStartTime(2, 7, 8); SetStartTime(3, 8, 7); InitSerialInt(); InitTimer(); while(1) //进入循环状态 { if (RI) //RI接受中断标志 { RI=0; //清除RI接受中断标志 delay(10000); } LedNumVal = color[0] ? show_1[0] : show_2[0]; LedOut[0]=Disp_Tab[LedNumVal / 10]; LedOut[1]=Disp_Tab[LedNumVal % 10]|0x80; SetLights(LedNumVal, 0); LedNumVal = color[1] ? show_1[1] : show_2[1]; LedOut[2]=Disp_Tab[LedNumVal / 10]; LedOut[3]=Disp_Tab[LedNumVal % 10]|0x80; SetLights(LedNumVal, 1); LedNumVal = color[2] ? show_1[2] : show_2[2]; LedOut[4]=Disp_Tab[LedNumVal / 10]; LedOut[5]=Disp_Tab[LedNumVal % 10]|0x80; SetLights(LedNumVal, 2); LedNumVal = color[3] ? show_1[3] : show_2[3]; LedOut[6]=Disp_Tab[LedNumVal / 10]; LedOut[7]=Disp_Tab[LedNumVal % 10]|0x80; SetLights(LedNumVal, 3); for( i=0; i<9; i++) //实现8位动态扫描循环 { P0 = LedOut[i]; //将字模送到P0口显示 switch(i) //使用switch 语句控制位选 { case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0; LS138C=1; break; case 5:LS138A=1; LS138B=0; LS138C=1; break; case 6:LS138A=0; LS138B=1; LS138C=1; break; case 7:LS138A=1; LS138B=1; LS138C=1; break; } delay(5); } } } /*************************************************************************** * * * 延时程序 * ****************************************************************************/ void delay(unsigned int i) { char j; for(i; i > 0; i--) for(j = 200; j > 0; j--); } //初始化定时器0设置 void InitTimer() { //TMOD|=0x01;//定时器设置 16位 TMOD|= 0x21; TH0 = (65536 - 50000) / 256; TL0 = (65536 - 50000) % 256; ET0=1; TR0=1; EA=1; } //定时器的中断响应 //每秒 SecondCounts 自增1,最大到10 void Timer() interrupt 1 using 1 { int n = 0; TH0 = (65536 - 50000) / 256; TL0 = (65536 - 50000) % 256; //计算各数码管的值 if(++counter == 20) { counter = 0; SecondCounts++; if(SecondCounts == 100) SecondCounts = 0; for(; n < 4; n++) { if(color[n]) { timer_1[n]--; if(timer_1[n] == -1) color[n] = !color[n]; timer_2[n] = start_time_2[n]; show_2[n] = timer_2[n]; if(timer_1[n] > 3) show_1[n] = timer_1[n] - 3; else show_1[n] = timer_1[n]; } else { timer_2[n]--; show_2[n] = timer_2[n]; if(timer_2[n] == -1) color[n] = !color[n]; timer_1[n] = start_time_1[n]; show_1[n] = timer_1[n] - 3; } } } for(n = 0; n < 4; n++) { if(timer_1[n] < 4) { switch(n) { case 0: L0_1 = !L0_1; L0_2 = !L0_2; break; case 1: L1_1 = !L1_1; L1_2 = !L1_2; break; case 2: L2_1 = !L2_1; L2_2 = !L2_2; break; case 3: L3_1 = !L3_1; L3_2 = !L3_2; break; } } } } //设置各个数码管的倒计时开始时间 void SetStartTime(int pos, int time_1, int time_2) { start_time_1[pos] = time_1; timer_1[pos] = time_1; show_1[pos] = time_1 - 3; start_time_2[pos] = time_2; timer_2[pos] = time_2; show_2[pos] = time_2; } //亮灯设置 void SetLights(int time, int group) { switch(group) { case 0: L0_1 = color[group]; L0_2 = !color[group]; break; case 1: L1_1 = color[group]; L1_2 = !color[group]; break; case 2: L2_1 = color[group]; L2_2 = !color[group]; break; case 3: L3_1 = color[group]; L3_2 = !color[group]; break; } } //初始化中断 void InitSerialInt() { SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr //UART为模式1,8位数据,允许接收 TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload //定时器1为模式2,8位自动重装 PCON |= 0x80 ; //SMOD=1; TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M) IE |= 0x90 ; //Enable Serial Interrupt TR1 = 1 ; // timer 1 run TI=1; } /**************************************************** 串口中断程序 ******************************************************/ void ser_int (void) interrupt 4 using 1 { static int n = 0; int i = 0; if (RI) { RI = 0 ; ch=SBUF; switch(n) { case 0: start_time_1[0] = ch;break; case 1: start_time_1[0] = start_time_1[0]*10 + ch;break; case 2: start_time_1[1] = ch;break; case 3: { start_time_1[1] = start_time_1[1]*10 + ch; start_time_1[2] = start_time_1[0]; start_time_1[3] = start_time_1[1]; start_time_2[0] = start_time_2[2] = start_time_1[1]; start_time_2[1] = start_time_2[3] = start_time_1[0]; for(; i < 4; i++) { timer_1[i] = start_time_1[i]; timer_2[i] = start_time_2[i]; show_1[i] = start_time_1[i]; show_2[i] = start_time_2[i]; WillShine[i] = 0; ShineCounter[i] = 0; } color[0] = color[2] = 0; color[1] = color[3] = 1; } n = -1; break; } n++; read_flag= 1 ; //就置位取数标志 } }

    转载于:https://www.cnblogs.com/johnpher/archive/2011/11/23/2570600.html

    展开全文
  • 本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。系统包括人行道、左 转、右转、以及基本的交通灯的功能。系统除基本交通灯功能外,还具有倒计时、时间设置、 紧急情况处理、分时段调整信号灯的点亮时间...
  • ORG 0000H AJMP START ORG 000BH ;T0中断入口地址 AJMP INT0 ;中断服务程序 ORG 0030H START: MOV SP,#60H ;置堆栈顶指针
  • 一)基本要求:设计一个交通灯控制系统,能实现以下功能: 1、正常时信号灯控制 (1)初始状态东西南北全为红灯,点亮5S; (2)东西红灯、南北绿灯(5-10S); (3)东西红灯、南北绿灯转黄灯闪烁5次(黄灯0.5S...
  • 单片机课程设计——交通灯一、课程设计主要内容1.1 题目1.2摘要1.3关键词二、设计要求三、设计方案四、参考电路设计4.1.1数码管的设计4.1.2对应程序4.2.1独立按键的设计4.2.2对应程序4.2.3 使用逻辑4.3.1LED模块的...

    一、课程设计主要内容

    1.1 题目

    交通灯设计

    1.2摘要

    近年来,随着我国国民经济的快速发展,我国机动车辆发展迅速。而城镇道路建设由于历史等各方面因素相对滞后,交通拥挤和堵塞想想时常发生。如何利用当今计算机和自动控制技术,有效地疏导交通提高城镇交通路口的通行能力,减少交通事故是很值得的研究课题。目前,国内的交通灯一般设计在十字路口,在醒目位置用红绿黄三种颜色的指示灯再加上一个倒计时的显示计时器来控制行车。

    1.3关键词

    交通灯、51单片机、延时程序

    二、设计要求

    1、分析单片机实验板原理图,明确每个部件的用途。
    2、学会单片机地址分配的方法及实现电路。
    3、调试硬件电路系统。
    3、要求编写一套软件,实现用4个按键设定交通灯显示、切换功能。
    4、写出至少3000字的课程设计总结报告及提供程序清单。

    三、设计方案

    该交通灯是采用STC89C52RC芯片作为主控芯片,我们购买了普中的开发板。用到了开发板上面的数码管模块、用户定义按键模块、I/O口外接等几部分完成了交通灯的基本逻辑设计。按键可以设置交通灯的模式和数码管的倒计时时间。

    在这里插入图片描述

    四、参考电路设计

    4.1.1数码管的设计

    根据商家提供的原理图,可知P0口是数码管的段选,P22、P23、P24连接三八译码器来实现数码管的位选,再通过Keil5编写程序控制,就可以实践对每一个数码管显示数字的控制。

    在这里插入图片描述

    4.1.2对应程序

    
    
    /*******************P0口控制段选信号*************************/
    
    #define duan P0		
    
    /*****************3-8译码器控制位选信号**********************/
    
    sbit LSA=P2^2;
    sbit LSB=P2^3;
    sbit LSC=P2^4;
    
    /*****************通用共阳!!!!!!数码管0-F编码**********************/
    u8 code wei1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};	
    /***********************数码管显示函数,显示的是miao************************/
    void display(u8 a,u8 b)
    {
    	
    	duan=wei1[b];
    	LSA=0;LSB=0;LSC=0;	//0-1
    	Delay(30);
    	LSA=0;LSB=0;LSC=0;
    	
    	duan=wei1[a];		//数组里面是编号的0-F数码管编码
        LSA=1;LSB=0;LSC=0;	//1-2
    	Delay(30);
        LSA=1;LSB=0;LSC=0;//3--8译码器位选
    	
    	duan=wei1[b];
        LSA=0;LSB=1;LSC=0;	//2-3
    	Delay(30);
        LSA=0;LSB=1;LSC=0;
    
    	duan=wei1[a];
    	LSA=1;LSB=1;LSC=0;	//3-4
    	Delay(30);
    	LSA=1;LSB=1;LSC=0;
    	
    	duan=wei1[b];
    	LSA=0;LSB=0;LSC=1;//4-5
    	Delay(30);
    	LSA=0;LSB=0;LSC=1;
    	
    	duan=wei1[a];
    	LSA=1;LSB=0;LSC=1;//5-6
    	Delay(30);
    	LSA=1;LSB=0;LSC=1;
    
    	duan=wei1[b];
    	LSA=0;LSB=1;LSC=1;	//6-7
    	Delay(30);
    	LSA=0;LSB=1;LSC=1;
    
    	duan=wei1[a];
     LSA=1;LSB=1;LSC=1;	//7-8
    	Delay(30);
        LSA=1;LSB=1;LSC=1;
    }
    

    在这里插入图片描述

    4.2.1独立按键的设计

    开发板上面有四个独立按键可以供用户自定义,我定义的是:

    sbit key_j=P3^0;		//紧急模式按键定义----板子上第二个按键
    sbit key_set=P3^1;		//设置按键----板子上第一个按键
    sbit key_jia=P3^2;		//加值按键
    sbit key_jian=P3^3;		//减值按键
    

    在这里插入图片描述

    图2 独立按键模块

    4.2.2对应程序

    
    /*********************按键检测处理**************************/
    
    void scan()
    {	
    	//紧急按键按键
    	if(key_j==0)		   
    	{
    		delayms(7);	//延时等待
    		   if(key_j==0)	    //再次判断按键按下
    		{
    			set_f=0;	 //设置标记变量set_f=0;	防止和其他显示情况有冲突set_f=1/2 
    			j_f=~j_f;	 //切换紧急模式和正常模式0-1取反,定义变量时j_f=0
    			c++;
    			miao=miao1+miao2;	    //关系到设置按键模式1,如果倒计时到40时按下按键,倒计时会程序变成60
    		}
    		while(!key_j);
    		delayms(7);	//延时等待
    		while(!key_j);
    	}		 //等待按键松开
    
    	//设置按键按下
    	if(key_set==0)			 
    	{
    		delayms(7);				//延时消抖
    		if(key_set==0)	     //再次判断按键按下
    		{                    //退出紧急模式显示的0000 0000j_f=0;		
    			j_f=0;			//如果在紧急模式,退出紧急模式,免得显示冲突
    			if(set_f==0)	 //进入设置,紧急按键按下set_f=0,定义变量时set_f=0,设置按键会清set_f=0
    				{TR0=0;}	 //关闭定时器,定时器停止定时,数码管停在那里,显示的数字不变,但是我们看不见,因为set_f很快会切换显示模式
    			set_f++;			  //只要按下设置按键,设置变量+1
    			c++;		 
    			if(set_f==3)     //设置完成,退出设置,定时器重新开倒计时,数码管开始动
    			{
    				set_f=0;	 //返回模式1,显示miao的情况
    				             //if(y_f==0&&j_f==0) 如果非紧急y_f==0是恒成立的!!!
    				//if(j_f==0)	
    					TR0=1;   //开启定时器,数码管继续停止前的数计时,28停止了就从28开始
    			}	
    		}
    		while(!key_set);	 //等待按键松开
    		delayms(7);		
    		while(!key_set);
    	}
    	//加值键
    	if(key_jia==0&&set_f!=0)	//必须显示miao1或者miao2
    	{
    		delayms(7);
    		if(key_jia==0)
    		{
    			if(set_f==1)     //设置东西通行时间,miao1++
    			{
    			led1=0;	 //南北直行绿灯,所有的灯都点亮
                led2=0;	 //南北黄灯
                led3=0;	 //南北转弯绿灯
                led4=0;	 //南北红灯
                led5=0;	 //东西直行绿灯
                led6=0;	 //东西黄灯
                led7=0;	 //东西转弯绿灯
                led8=0;	 //东西红灯
    				if(miao1<99) //最大值可设置15S
    				{miao1++; }//东西通行时间+1S,数码管变化,miao1=20
    					miao=miao1+miao2;		//miao=60,miao1=20,miao2=40
    				if(num21<569)//LED交通灯闪烁也要变化
    				{num21=num21+20;}
    			       num2=num21;			
    			}
    			if(set_f==2)     //设置东西通行时间,miao2++
    			{
    				led1=0;	 //南北直行绿灯
    				led2=0;	 //南北黄灯
    				led3=0;	 //南北转弯绿灯
    				led4=0;	 //南北红灯
    				led5=0;	 //东西直行绿灯
    				led6=0;	 //东西黄灯
    				led7=0;	 //东西转弯绿灯
    				led8=0;	 //东西红灯
    					if(miao1<99) //最大可设置15S
    					{miao2++;} //东西通行时间+1S,miao2=40
    					miao=miao1+miao2;	//数码管显示miao,miao=60,miao1=20,miao2=40
    					if(num41<968)
    					{num41=num41+20;}
    					num4=num41;		
    			}
    		}	
    		while(!key_jia);
    		delayms(7);
    		while(!key_jia);//消抖
    	}
    
    	//减值键
    	if(key_jian==0&&set_f!=0)
    	{
    		delayms(7);
    		if(key_jian==0)
    		{
    			if(set_f==1)	//设置东西通行时间,miao1--
    			{
    			led1=0;	 //南北直行绿灯,灯全亮
                led2=0;	 //南北黄灯
                led3=0;	 //南北转弯绿灯
                led4=0;	 //南北红灯
                led5=0;	 //东西直行绿灯
                led6=0;	 //东西黄灯
                led7=0;	 //东西转弯绿灯
                led8=0;	 //东西红灯
    			if(miao1>0)	//最小值可设置0S
    			{miao1--;}//东西通行时间-1S
                miao=miao1+miao2;
    			if(num21>0)
    		    {num21=num21+20;}
    			num2=num21;		
    			}
    		   	if(set_f==2)     //设置东西通行时间,miao2--
    			{
    			led1=0;	 //南北直行绿灯
                led2=0;	 //南北黄灯
                led3=0;	 //南北转弯绿灯
                led4=0;	 //南北红灯
                led5=0;	 //东西直行绿灯
                led6=0;	 //东西黄灯
                led7=0;	 //东西转弯绿灯
                led8=0;	 //东西红灯
    			if(miao2>0) //最大可设置15S
    			{miao2--; }//东西通行时间+1S
    			miao=miao1+miao2;
    			if(num41>0)
    			{num41=num41+20;}
    			num4=num41;
    			}
    		}
    		while(!key_jian);
    		delayms(7);
    		while(!key_jian);//消抖
    	}	
    }
    

    4.2.3 使用逻辑

    1.按下紧急按键,数码管显示0000 0000,LED灯红灯点亮,表示禁止通行
    2.如果像调节交通灯的时间,就要先按设置按键,再去按加值按键和减值按键,才可以实现数码管倒计时和LED显示时间的变化,这一点在程序上面已经有体现了。

    4.3.1LED模块的设置

    LED灯接P1口,并且每个LED都串联了一个1K的限流电阻,确定电流不会超过20mA,保护LED灯

    4.3.2 LED实物图

    在这里插入图片描述

    4.3.3 LED显示程序

    里面那些数字我们没有用中断,因为红绿黄灯亮的时间不一样,并且还要闪烁,数码管倒计时变了的话,灯亮的时间还要做对应修改,所以我们直接选着一个个调那些数字,所以LED点亮时间这里并不精确

    /****************LED显示函数*******************/
    void m_1()
    {	
    	if(R2>0) 
    	{
    		if(R0>0)//R0=num4=668
    		{
    		R0-=1;
    		led5=0;	//东西直行绿灯亮
    		}
    		else
    		{
    			if(d==0)
    			{
    				led5=1;//东西直行绿灯灭
    				d++;
    			} 				   
    			else
    			{ 
    				if(R1!=0||R3!=0)	    //R1=9
    				R1-=1;		//东西直行绿灯熄灭后再执行0.5s延迟
    				else 			     
    				{
    					if(sign==0)	  //sign = 0
    					{
    						if(a<num1)
    						{
    							led5=~led5;		//东西直行绿灯闪烁		 
    							a++;			                                 
    							R1=9;
    						} 
    						if(a==num1&&b<7)
    						{
    							led5=1;		东西直行绿灯熄灭
    							led6=~led6;	//东西黄灯闪烁
    							b++;
    							R1=9;
    					    } 		
    						if(b==7)
    						{	
    							if(e==0)
    							{
    								led6=1;	//东西黄灯灭
    								led7=~led7;		//东西转弯绿灯闪烁
    								e++;
    								R1=num2;
    							}
    							else 
    							{
    								led7=1;			//东西转弯绿灯灭
    								sign=1;
    								a=0;
    								b=0;
    								R1=9;
    							}					
    						} 
    					}
    					if(sign==1)
    					{
    						if(R1!=0)
    				        R1-=1;
    						else 
    						{
    							if(a<num3)
    							{
    								led7=~led7;			//东西转弯绿灯闪烁 
    								a++;			                                 
    								R1=9;			                    
    							}
    							if(a==num3)
    							{
    								sign=2;
    								b=0;
    								led7=1;				//东西转弯绿灯灭
    								R1=9;
    							}
    						}	
    					}
    					if(sign==2)
    					{
    						if(b<7)
    						{
    							led6=~led6;				//东西黄灯闪烁
    							b++;
    							R1=9;
    						}
    						if(b==7)
    						{
    							sign=3;
    							led6=1;					//东西黄灯灭
    						}	
    					}
    					if(sign==3) 
    					{
    						R2=0;
    						sign=0;
    						d=0;
    						a=0;
    						b=0;
    						e=0;
    						R0=num4+1;
    						R1=9;
    					}
    				}
    			}
    		}
    }
    	else
    	{				 
    		if(c!=0)
    		{
    		led_Init();  //LED初始化就用了这一次
    		c=0;
    		}							//执行完红黄绿灯后,所有灯熄灭			
    		else
    		{
    			led4=1;				//南北红灯灭
    			led8=0;				//东西红灯亮
    			if(R0>0)
    			{
    				R0-=1;
    				led1=0;			//南北直行绿灯亮
    			}	//执行33.5秒延时
    			else
    			{
    				if(d==0)
    				{
    					led1=1;		//南北直行绿灯灭
    					d++;
    				} 				   
    				else
    				{ 
    					if(R1!=0)	          //R1=9
    					R1-=1;		      //直行绿灯熄灭后再执行0.5s延迟
    					else 			     
    					{
    						if(sign==0)	  //sign = 0
    						{
    							if(a<num1)
    							{
    								led1=~led1;				//南北直行绿灯闪烁 
    								a++;			                                 
    								R1=9;
    							} 
    							if(a==num1&&b<7)
    							{
    								led1=1;
    								led2=~led2;				//南北黄灯闪烁
    								b++;
    								R1=9;
    						    } 		
    							if(b==7)
    							{	
    								if(e==0)
    								{
    									led2=1;				//南北黄灯灭
    									led3=~led3;			//南北转向绿灯闪烁
    									e++;
    									R1=num2;
    								}
    								else 
    								{
    									led3=1;				//南北转向绿灯灭
    									sign=1;
    									a=0;
    									b=0;
    									R1=9;
    								}					
    							} 
    						}
    						if(sign==1)
    						{
    							if(R1!=0)
    					        R1-=1;
    							else 
    							{
    								if(a<7)
    								{
    									led3=~led3;			//南北转向绿灯闪烁	 
    									a++;			                                 
    									R1=9;			                    
    								}
    								if(a==7)
    								{
    									sign=2;
    									b=0;
    									led3=1;				//南北转向绿灯灭
    									R1=9;
    								}
    							}	
    						}
    						if(sign==2)
    						{
    							if(b<7)
    							{
    							led2=~led2;					//南北黄灯闪烁
    							b++;
    							R1=9;
    							}
    							if(b==7)
    							{
    							sign=3;
    							led2=1;						//南北黄灯灭
    							}	
    						}
    						if(sign==3) 
    						{
    							led4=0;						//南北红灯亮
    							led8=1;						//东西红灯灭
    							R2=1;
    							sign=0;
    							d=0;
    							a=0;
    							b=0;
    							e=0;
    							R0=num4+1;
    							R1=9;
    						}
    					}
    				}		
    			}
    		}
    	}
    }
    

    五、调试要点

    5.1 单片机最小系统

    要想使用单片机,第一个要搭建的电路就是单片机的最小系统,有了这个最小系统单片机就可以去正常的工作,即使没有其他的外围电路(显示器啥的),也可以对单片机进行程序的编写,程序也可以在单片机里面正常的运行。其包括MCS-51系列芯片一块,(51初步认识)电源电路,时钟电路,复位电路。
    将单片机连接到+5V直流稳压电源上,使用万用表直流档测试40脚是否为高电平,20脚是否为低电平,99脚是否为低电平;使用示波器测试单片机第30脚是否有方波输出吗8、19脚是否有方波信号输出。若40脚为高电平,20脚为低电平,9脚位低电平,且有方波输出正常时,可视为单片机正常工作。

    5.2 数码管模块

    可以通过程序测试,看看数码管是否按照所给程序点亮

    5.3 LED模块

    首先用万用表检查LED有无虚焊和焊接反,确认无误后用单片机点灯。

    5.4 独立按键

    给I/O口制高电平,当按键按下去时测量电压是否为低电平,是的话则按键按下
    5.5其他
    把各个单元电路互相连接起来,进行系统通调。
    调试结果:各部分正常工作

    六、总结

    最终结果符合预期,各部分正常工作,数码管显示和数码管显示是这个交通灯控制系统的核心,单片机最小系统正常工作是系统运行的前提,所以除了接线以外要仔细检查这两部分是否正常工作。
    感想
    要做好一个课程设计,就必须做到:在设计程序之前,对所用交通灯的内部结构有一个系统的了解,知道该交通灯内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序和连接电路时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。设计过程,好比是我们的成长的历程,常有一些不如意,难免会遇到各种各样的问题。
    我觉得作为一名电气专业的学生,单片机电路的课程设计是很有意义的。更重要的是如何把自己平时所学的东西应用到实际中。虽然自己对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着这一个多礼拜的“学习”,在小组同学的协助下,自己开始主动学习并逐从基础慢慢开始弄懂它我认为这个收获应该说是相当大的。觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。小组人员的配合、相处,以及自身的动脑和努力,都是以后工作中需要的。

    七、成品图

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

    完整程序

    
    #include <REGX52.H>    //此文件中定义了单片机的一些特殊功能寄存器
    		 
    /*************************变量定义************************/
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    //bit j_f=0,y_f=0;		紧急模式,位定义 bit j_f=0,y_f=0,0是非紧急
    bit j_f=0;
    u8 set_f=0;			//设置标记变量
    u16 num21=269;
    u16 num41=669;
    u16 R0,R1,R2,R3,a,b,c=1,d,e,f,g;	//变量unsigned int
    char sign=0;
    unsigned char i=0,j=0,miao=60,miao1=20,miao2=40; 
    unsigned int num1=7,num2=269,num3=7,num4=668;
    
    
    /*******************P0口控制段选信号*************************/
    
    #define duan P0		
    
    /*****************3-8译码器控制位选信号**********************/
    
    sbit LSA=P2^2;
    sbit LSB=P2^3;
    sbit LSC=P2^4;
    
    /*****************通用共阳!!!!!!数码管0-F编码**********************/
    u8 code wei1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};	
    
    
    /*************************按键定义************************/
    
    sbit key_j=P3^0;		//紧急模式按键定义----板子上第二个按键
    sbit key_set=P3^1;		//设置按键----板子上第一个按键
    sbit key_jia=P3^2;		//加值按键
    sbit key_jian=P3^3;		//减值按键
    
    
    /***********************LED交通灯定义 0-亮  1-不亮**********************/
    
    sbit led1=P1^0;	 //南北直行绿灯
    sbit led2=P1^1;	 //南北黄灯
    sbit led3=P1^2;	 //南北转弯绿灯
    sbit led4=P1^3;	 //南北红灯    
    sbit led5=P1^4;	 //东西直行绿灯
    sbit led6=P1^5;	 //东西黄灯
    sbit led7=P1^6;	 //东西转弯绿灯
    sbit led8=P1^7;	 //东西红灯
    
    
    /***********************函数声明***************************/
    
    //void Init(void);初始化函数,就没有用到
    void m_1();			//LED显示函数
    void display(u8 a,u8 b);//显示函数
    void scan();			//按键检测处理
    void delayms(u8 ms);	//毫秒延时函数
    void Timer0Init();		//定时器0初始化函数
    void Delay(unsigned int num);  //微秒延时函数
    void led_Init();   //初始化LED
    
    
    /*************************主函数***************************/
    void main()
    {	
        Timer0Init();  //定时器0初始化
    	while(1)	   //一直执行这个函数
    	{
    		scan();	   //按键检测处理
    		
    		
    		if(j_f==1)		//是紧急按键,只有按下紧急按键,j_f才会有取反操作
    			display(0,0);	//显示0000 0000
    		
    		
    		if(set_f==0&j_f==0)//设置按键模式1,紧急按键按下set_f=0,定义变量时set_f=0,设置按键会清set_f=0
    		{ 							//设置按键按下,j_f=0,紧急按键按下j_f取反
    			display(miao/10,miao%10);//miao的个位,十位
    			 if(miao==0) 
    				 {  miao=miao1+miao2;  }  //重新装入显示值
    		}
    		
    		
    		if(set_f==1)
    				//设置按键模式2  显示miao1  miao1=20此时定时器停止
    			display(miao1/10,miao1%10);
    						
    		if(set_f==2)			//设置按键模式3,此时定时器停止,,miao2=40
    		
    			display(miao2/10,miao2%10);
    
    	}	
    }
    
    
    /*********************按键检测处理**************************/
    
    void scan()
    {	
    	//紧急按键按键
    	if(key_j==0)		   
    	{
    		delayms(7);	//延时等待
    		   if(key_j==0)	    //再次判断按键按下
    		{
    			set_f=0;	 //设置标记变量set_f=0;	防止和其他显示情况有冲突set_f=1/2 
    			j_f=~j_f;	 //切换紧急模式和正常模式0-1取反,定义变量时j_f=0
    			c++;
    			miao=miao1+miao2;	    //关系到设置按键模式1,如果倒计时到40时按下按键,倒计时会程序变成60
    		}
    		while(!key_j);
    		delayms(7);	//延时等待
    		while(!key_j);
    	}		 //等待按键松开
    
    	//设置按键按下
    	if(key_set==0)			 
    	{
    		delayms(7);				//延时消抖
    		if(key_set==0)	     //再次判断按键按下
    		{                    //退出紧急模式显示的0000 0000j_f=0;		
    			j_f=0;			//如果在紧急模式,退出紧急模式,免得显示冲突
    			if(set_f==0)	 //进入设置,紧急按键按下set_f=0,定义变量时set_f=0,设置按键会清set_f=0
    				{TR0=0;}	 //关闭定时器,定时器停止定时,数码管停在那里,显示的数字不变,但是我们看不见,因为set_f很快会切换显示模式
    			set_f++;			  //只要按下设置按键,设置变量+1
    			c++;		 
    			if(set_f==3)     //设置完成,退出设置,定时器重新开倒计时,数码管开始动
    			{
    				set_f=0;	 //返回模式1,显示miao的情况
    				             //if(y_f==0&&j_f==0) 如果非紧急y_f==0是恒成立的!!!
    				//if(j_f==0)	
    					TR0=1;   //开启定时器,数码管继续停止前的数计时,28停止了就从28开始
    			}	
    		}
    		while(!key_set);	 //等待按键松开
    		delayms(7);		
    		while(!key_set);
    	}
    	//加值键
    	if(key_jia==0&&set_f!=0)	//必须显示miao1或者miao2
    	{
    		delayms(7);
    		if(key_jia==0)
    		{
    			if(set_f==1)     //设置东西通行时间,miao1++
    			{
    			led1=0;	 //南北直行绿灯,所有的灯都点亮
                led2=0;	 //南北黄灯
                led3=0;	 //南北转弯绿灯
                led4=0;	 //南北红灯
                led5=0;	 //东西直行绿灯
                led6=0;	 //东西黄灯
                led7=0;	 //东西转弯绿灯
                led8=0;	 //东西红灯
    				if(miao1<99) //最大值可设置15S
    				{miao1++; }//东西通行时间+1S,数码管变化,miao1=20
    					miao=miao1+miao2;		//miao=60,miao1=20,miao2=40
    				if(num21<569)//LED交通灯闪烁也要变化
    				{num21=num21+20;}
    			       num2=num21;			
    			}
    			if(set_f==2)     //设置东西通行时间,miao2++
    			{
    				led1=0;	 //南北直行绿灯
    				led2=0;	 //南北黄灯
    				led3=0;	 //南北转弯绿灯
    				led4=0;	 //南北红灯
    				led5=0;	 //东西直行绿灯
    				led6=0;	 //东西黄灯
    				led7=0;	 //东西转弯绿灯
    				led8=0;	 //东西红灯
    					if(miao1<99) //最大可设置15S
    					{miao2++;} //东西通行时间+1S,miao2=40
    					miao=miao1+miao2;	//数码管显示miao,miao=60,miao1=20,miao2=40
    					if(num41<968)
    					{num41=num41+20;}
    					num4=num41;		
    			}
    		}	
    		while(!key_jia);
    		delayms(7);
    		while(!key_jia);//消抖
    	}
    
    	//减值键
    	if(key_jian==0&&set_f!=0)
    	{
    		delayms(7);
    		if(key_jian==0)
    		{
    			if(set_f==1)	//设置东西通行时间,miao1--
    			{
    			led1=0;	 //南北直行绿灯,灯全亮
                led2=0;	 //南北黄灯
                led3=0;	 //南北转弯绿灯
                led4=0;	 //南北红灯
                led5=0;	 //东西直行绿灯
                led6=0;	 //东西黄灯
                led7=0;	 //东西转弯绿灯
                led8=0;	 //东西红灯
    			if(miao1>0)	//最小值可设置0S
    			{miao1--;}//东西通行时间-1S
                miao=miao1+miao2;
    			if(num21>0)
    		    {num21=num21+20;}
    			num2=num21;		
    			}
    		   	if(set_f==2)     //设置东西通行时间,miao2--
    			{
    			led1=0;	 //南北直行绿灯
                led2=0;	 //南北黄灯
                led3=0;	 //南北转弯绿灯
                led4=0;	 //南北红灯
                led5=0;	 //东西直行绿灯
                led6=0;	 //东西黄灯
                led7=0;	 //东西转弯绿灯
                led8=0;	 //东西红灯
    			if(miao2>0) //最大可设置15S
    			{miao2--; }//东西通行时间+1S
    			miao=miao1+miao2;
    			if(num41>0)
    			{num41=num41+20;}
    			num4=num41;
    			}
    		}
    		while(!key_jian);
    		delayms(7);
    		while(!key_jian);//消抖
    	}	
    }
    
    /***********************毫秒延时函数***************************/
    void delayms(u8 ms)
    {
    	unsigned char i=100,j;
    	for(;ms>0;ms--)
    	{
    		while(--i)
    		{
    			j=10;
    			while(--j);
    		}
    	}
    }
    
    /*************************微秒延时函数************************/
    void Delay(unsigned int num)
    {
      while( --num ) ;
    }
    
    /***********************数码管显示函数,显示的是miao************************/
    void display(u8 a,u8 b)
    {
    	
    	duan=wei1[b];
    	LSA=0;LSB=0;LSC=0;	//0-1
    	Delay(30);
    	LSA=0;LSB=0;LSC=0;
    	
    	duan=wei1[a];		//数组里面是编号的0-F数码管编码
        LSA=1;LSB=0;LSC=0;	//1-2
    	Delay(30);
        LSA=1;LSB=0;LSC=0;//3--8译码器位选
    	
    	duan=wei1[b];
        LSA=0;LSB=1;LSC=0;	//2-3
    	Delay(30);
        LSA=0;LSB=1;LSC=0;
    
    	duan=wei1[a];
    	LSA=1;LSB=1;LSC=0;	//3-4
    	Delay(30);
    	LSA=1;LSB=1;LSC=0;
    	
    	duan=wei1[b];
    	LSA=0;LSB=0;LSC=1;//4-5
    	Delay(30);
    	LSA=0;LSB=0;LSC=1;
    	
    	duan=wei1[a];
    	LSA=1;LSB=0;LSC=1;//5-6
    	Delay(30);
    	LSA=1;LSB=0;LSC=1;
    
    	duan=wei1[b];
    	LSA=0;LSB=1;LSC=1;	//6-7
    	Delay(30);
    	LSA=0;LSB=1;LSC=1;
    
    	duan=wei1[a];
        LSA=1;LSB=1;LSC=1;	//7-8
    	Delay(30);
        LSA=1;LSB=1;LSC=1;
    
    	
    }
    
    /*******************led初始化函数*********************/
    void led_Init()          
    {
    	R0=num4; //num4=668
    	led1=0;//南北直行绿灯亮
    	led2=led3=led4=led5=led6=led7=led8=1;//其他的灯灭 
    	R1=9;
    	R2=R3=a=b=d=e=f=g=0;
    }
    
    /****************LED显示函数*******************/
    void m_1()
    {	
    	if(R2>0) 
    	{
    		if(R0>0)//R0=num4=668
    		{
    		R0-=1;
    		led5=0;	//东西直行绿灯亮
    		}
    		else
    		{
    			if(d==0)
    			{
    				led5=1;//东西直行绿灯灭
    				d++;
    			} 				   
    			else
    			{ 
    				if(R1!=0||R3!=0)	    //R1=9
    				R1-=1;		//东西直行绿灯熄灭后再执行0.5s延迟
    				else 			     
    				{
    					if(sign==0)	  //sign = 0
    					{
    						if(a<num1)
    						{
    							led5=~led5;		//东西直行绿灯闪烁		 
    							a++;			                                 
    							R1=9;
    						} 
    						if(a==num1&&b<7)
    						{
    							led5=1;		东西直行绿灯熄灭
    							led6=~led6;	//东西黄灯闪烁
    							b++;
    							R1=9;
    					    } 		
    						if(b==7)
    						{	
    							if(e==0)
    							{
    								led6=1;	//东西黄灯灭
    								led7=~led7;		//东西转弯绿灯闪烁
    								e++;
    								R1=num2;
    							}
    							else 
    							{
    								led7=1;			//东西转弯绿灯灭
    								sign=1;
    								a=0;
    								b=0;
    								R1=9;
    							}					
    						} 
    					}
    					if(sign==1)
    					{
    						if(R1!=0)
    				        R1-=1;
    						else 
    						{
    							if(a<num3)
    							{
    								led7=~led7;			//东西转弯绿灯闪烁 
    								a++;			                                 
    								R1=9;			                    
    							}
    							if(a==num3)
    							{
    								sign=2;
    								b=0;
    								led7=1;				//东西转弯绿灯灭
    								R1=9;
    							}
    						}	
    					}
    					if(sign==2)
    					{
    						if(b<7)
    						{
    							led6=~led6;				//东西黄灯闪烁
    							b++;
    							R1=9;
    						}
    						if(b==7)
    						{
    							sign=3;
    							led6=1;					//东西黄灯灭
    						}	
    					}
    					if(sign==3) 
    					{
    						R2=0;
    						sign=0;
    						d=0;
    						a=0;
    						b=0;
    						e=0;
    						R0=num4+1;
    						R1=9;
    					}
    				}
    			}
    		}
    }
    	else
    	{				 
    		if(c!=0)
    		{
    		led_Init();  //LED初始化就用了这一次
    		c=0;
    		}							//执行完红黄绿灯后,所有灯熄灭			
    		else
    		{
    			led4=1;				//南北红灯灭
    			led8=0;				//东西红灯亮
    			if(R0>0)
    			{
    				R0-=1;
    				led1=0;			//南北直行绿灯亮
    			}	//执行33.5秒延时
    			else
    			{
    				if(d==0)
    				{
    					led1=1;		//南北直行绿灯灭
    					d++;
    				} 				   
    				else
    				{ 
    					if(R1!=0)	          //R1=9
    					R1-=1;		      //直行绿灯熄灭后再执行0.5s延迟
    					else 			     
    					{
    						if(sign==0)	  //sign = 0
    						{
    							if(a<num1)
    							{
    								led1=~led1;				//南北直行绿灯闪烁 
    								a++;			                                 
    								R1=9;
    							} 
    							if(a==num1&&b<7)
    							{
    								led1=1;
    								led2=~led2;				//南北黄灯闪烁
    								b++;
    								R1=9;
    						    } 		
    							if(b==7)
    							{	
    								if(e==0)
    								{
    									led2=1;				//南北黄灯灭
    									led3=~led3;			//南北转向绿灯闪烁
    									e++;
    									R1=num2;
    								}
    								else 
    								{
    									led3=1;				//南北转向绿灯灭
    									sign=1;
    									a=0;
    									b=0;
    									R1=9;
    								}					
    							} 
    						}
    						if(sign==1)
    						{
    							if(R1!=0)
    					        R1-=1;
    							else 
    							{
    								if(a<7)
    								{
    									led3=~led3;			//南北转向绿灯闪烁	 
    									a++;			                                 
    									R1=9;			                    
    								}
    								if(a==7)
    								{
    									sign=2;
    									b=0;
    									led3=1;				//南北转向绿灯灭
    									R1=9;
    								}
    							}	
    						}
    						if(sign==2)
    						{
    							if(b<7)
    							{
    							led2=~led2;					//南北黄灯闪烁
    							b++;
    							R1=9;
    							}
    							if(b==7)
    							{
    							sign=3;
    							led2=1;						//南北黄灯灭
    							}	
    						}
    						if(sign==3) 
    						{
    							led4=0;						//南北红灯亮
    							led8=1;						//东西红灯灭
    							R2=1;
    							sign=0;
    							d=0;
    							a=0;
    							b=0;
    							e=0;
    							R0=num4+1;
    							R1=9;
    						}
    					}
    				}		
    			}
    		}
    	}
    }
    
    
    
    /******************定时器0初始化函数************************/
    
    void Timer0Init()
    {
    	TMOD=0X01;//选择为定时器0模式,工作方式1——16位,仅用TR0打开启动。
    	TH0=0X3C;	//初值,定时50ms(65536-500000)/256
    	TL0=0XB0;	//(65536-500000)%256
    	EA=1;//打开总中断
    	ET0=1;//打开定时器0中断允许
    	TR0=1;//打开定时器				
    }
    
    /*************************定时器中断0,50ms进一次************************/
    void Timer0() interrupt 1
    {
    	TH0=0X3C;	//重新给定时器赋初值,定时50ms
    	TL0=0XB0;
    	if(j_f==0&&set_f==0)	//紧急按键按下set_f=0,定义变量时set_f=0,设置按键会清set_f=0
    	{
    		m_1();		//LED显示函数
    	}
    	if(j_f==1)   //是紧急按键里面,按下紧急按键,LED是怎么显示的
    	{
    		led1=1;	 //南北直行绿灯,亮绿灯led1=0
    		led2=1;	 //南北黄灯led2=1
    		led3=1;	 //南北转弯绿灯led3=0
    		led4=0;	 //南北红灯led4=1
    		led5=1;	 //东西直行绿灯led5=0
    		led6=1;	 //东西黄灯led6=1
    		led7=1;	 //东西转弯绿灯led7=0
    		led8=0;	 //东西红灯led8=1
    
    	}
    
    		j++;
    	if(j==20) //进20次中断——————1s
    	 {  
    		 j=0; 
    		 miao--; 		//关系到数码管显示的改变
    	 } 
    
    }
    
    

    原文转自:
    在这里插入图片描述
    原文所在:布尔青年
    欢迎来到:布尔青年

    展开全文
  • 大学单片机课程设计,编程实现控制交通灯的亮灭。
  • 单片机课程设计——交通灯控制完整版,论文格式。
  • 单片机交通灯课程设计单片机交通灯课程设计单片机交通灯课程设计单片机交通灯课程设计
  • 单片机课程设计-基于单片机的交通灯控制系统设计
  • 十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现这井然秩序呢?靠的就是交通信号的自动...交通信号控制方式很多,在学习了单片机的有关知识之后,运用相关知识来设计完成交通信号
  • 单片机课程设计——交通灯控制系统!程序,硬件图全都在里面!完整的论文
  • 单片机课程设计交通信号单片机课程设计交通信号

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 280
精华内容 112
关键字:

单片机课程设计交通灯