⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 +

📁 基于单片机的智能交通灯系统的设计
💻
字号:
   	/***********************************************************
	       十字路口交通灯控制 C 程序
	***********************************************************/
	#include <reg51.h>
	#define	uchar	unsigned char
	#define	uint	unsigned int
	/*****定义控制位*******************************************/
	sbit   Time_Show_LED2=P2^5;  //Time_Show_LED2(直行时间显示)控制位
	sbit   Time_Show_LED1=P2^4;  //Time_Show_LED1(直行时间显示)控制位
	sbit   EW_LED2=P2^3;	     //EW_LED2控制位
	sbit   EW_LED1=P2^2;	     //EW_LED1控制位
	sbit   SN_LED2=P2^1;	     //SN_LED2控制位
	sbit   SN_LED1=P2^0;	     //SN_LED1控制位
	sbit   SN_Yellow=P1^6;       //SN黄灯
	sbit   EW_Yellow=P1^2;       //EW黄灯
	sbit   EW_ManGreen=P3^0;     //EW人行道绿灯
	sbit   SN_ManGreen=P3^1;     //SN人行道绿灯
	sbit   Special_LED=P2^6;     //交通特殊指示灯
	sbit   Busy_LED=P2^7;        //交通繁忙指示灯
	sbit   Nomor_Button=P3^5;    //交通正常按键
	sbit   Busy_Btton=P3^6;      //交通繁忙按键
	sbit   Special_Btton=P3^7;   //交通特殊按键  
	sbit   EW_ManRed=P3^3;       //EW人行道红灯
	sbit   SN_ManRed=P3^4;       //SN人行道红灯
	sbit   x=P1^7;
	sbit   y=P1^3;
	bit    Flag_SN_Yellow;      //SN黄灯标志位
	bit    Flag_EW_Yellow;       //EW黄灯标志位
	char   Time_EW;        //东西方向倒计时单元
	char   Time_SN;        //南北方向倒计时单元
	uchar  EW=60,SN=40,EWL=19,SNL=19;      //程序初始化赋值,正常模式
	uchar  EW1=60,SN1=40,EWL1=19,SNL1=19;  //用于存放修改值的变量
	uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  //0-9段选码
	uchar code S[8]={0x28,0x48,0x98,0x88,0x82,0x84,0x89,0x88};  
	//交通信号灯控制代码
	/**********************延时子程序**************************/
	void Delay(uchar a)
	{
		uchar	i;
		i=a;
		while(i--){;}
	}
	
	/*****************显示子函数******************************/
	void Display(void)
	{
		uchar h,l;
		h=Time_EW/10;
		l=Time_EW%10;
	  	P0=table[l];        
		EW_LED2=1;	      //点亮EW_LED2
		Delay(2);
		EW_LED2=0;        //熄灭EW_LED2
		P0=table[h];
		EW_LED1=1;        //点亮EW_LED1
		Delay(2);
		EW_LED1=0;
	
		h=Time_SN/10;
		l=Time_SN%10;
		P0=table[l];
		SN_LED2=1;        //点亮SN_LED2
		Delay(2);
		SN_LED2=0;
		P0=table[h];
		SN_LED1=1;		  //点亮SN_LED1
		Delay(2);
		SN_LED1=0;
			
		h= EW1/10;
		l= EW1%10;
		P0=table[l];
		Time_Show_LED1=1;	 //点亮Time_Show_LED1
		Delay(2);
	   Time_Show_LED1=0;
		P0=table[h];
		Time_Show_LED2=1;	//点亮Time_Show_LED2
		Delay(2);
		Time_Show_LED2=0;
	} 
	/**********************外部0中断服务程序******************/
	
	void INT0_srv(void)interrupt 0 using 1
	{
		 EX0=0;               //关中断
	
	    if(Nomor_Button==0) //测试按键是否按下,按下为正常状态
	    {
	EW1=60;
	SN1=40;
	EWL1=19;
	SNL1=19;
	Busy_LED=0;     //关繁忙信号灯
	Special_LED =0; //关特殊信号灯
	    }
	    if(Busy_Btton==0)   //测试按键是否按下,按下为繁忙状态
	    {
	EW1=45;
	SN1=30;
	EWL1=14;
	SNL1=14;
	Special_LED=0;  //关特殊信号灯
	Busy_LED=1;     //开繁忙信号灯
			
	    }
	    if(Special_Btton==0)//测试按键是否按下,按下为特殊状态
	    {
	EW1=75;
	SN1=55;
	EWL1=19;
	SNL1=19;
	Busy_LED=0;    //关繁忙信号灯
	Special_LED =1;//开特殊信号灯
	    }					
			EX0=1;         //开中断
	}
	/**********************T0中断服务程序*******************/
	void timer0(void)interrupt 1 using 1
	{
		static uchar count;
		TH0=(65536-50000)/256;
		TL0=(65536-50000)%256;
		count++;
		
		if(count==10)
		{
		    if(Flag_SN_Yellow==1)  //测试南北黄灯标志位
		        {SN_Yellow=~SN_Yellow;}
		    if(Flag_EW_Yellow==1)  //测试东西黄灯标志位
		        {EW_Yellow=~EW_Yellow;} 
		}
		if(count==20)
		{
		    Time_EW--;
		    Time_SN--;
		    if(Flag_SN_Yellow==1)  //测试南北黄灯标志位
		        {SN_Yellow=~SN_Yellow;}
		    if(Flag_EW_Yellow==1)  //测试东西黄灯标志位
		        {EW_Yellow=~EW_Yellow;}
		    count=0;
		}
	}
	/*********************主程序开始***********************/
	void	main(void)
	{ 
	Busy_LED=0;
	Special_LED=0;
	IT0=1;	   //INT0负跳变触发
	TMOD=0x01; //定时器工作于方式1
	TH0=(65536-50000)/256; //定时器赋初值
	TL0=(65536-50000)%256;
	EA=1;  //CPU开中断总允许
	ET0=1; //开定时中断
	EX0=1; //开外部INTO中断
	TR0=1; //启动定时
	
	    while(1)
	    {				
	        /*******S0状态**********/
	SN_ManRed=0;
	SN_ManGreen=1;  //SN人行道通行
	EW_ManRed=1;	//EW人行道禁止
	EW_ManGreen=0;
	Flag_EW_Yellow=0;	   //EW关黄灯显示信号
	Time_EW=EW;
	Time_SN=SN;
	while(Time_SN>=5)
			{    
			    P1=S[0];	//SN绿灯,EW红灯
			    Display();
			}
	
			/*******S1状态**********/
			P1=0x00;
			while(Time_SN>=0)
			{
	Flag_SN_Yellow=1; //SN开黄灯信号位
	P1=P1|0x08;    //保持EW红灯
	Display();
			}
	
			/*******S2状态**********/
	SN_ManRed=1;      //SN人行道禁止
	SN_ManGreen=0;
	EW_ManRed=1;	  //EW人行道禁止
	EW_ManGreen=0;
	Flag_SN_Yellow=0; //SN关黄灯显示信号
	Time_SN=SNL;
	while(Time_SN>=5)
			{
	P1=S[2];      //SN左拐绿灯亮,EW红灯
	Display();
			}
	
			/*******S3状态**********/
			P1=0x00;
			while(Time_SN>=0)
			{
	//Flag_SN_Yellow=0;	//SN开黄灯信号位
	x=1;
	P1=P1|0x08;    //保持EW红灯
	Display();
			}
	
			/***********赋值*********/
	EW=EW1;
	SN=SN1;
	EWL=EWL1;
	SNL=SNL1;
			/*******S4状态**********/
	SN_ManRed=1;      //SN人行道禁止
	SN_ManGreen=0;
	EW_ManRed=0;
	EW_ManGreen=1;	  //EW人行道通行
	Flag_SN_Yellow=0; //SN关黄灯显示信号
	Time_EW=SN;
	Time_SN=EW;
	while(Time_EW>=5)
			{
			    P1=S[4];	  //EW通行,SN红灯
				Display();
			}
	
			/*******S5状态**********/
			P1=0X00;
			while(Time_EW>=0)
			{
	Flag_EW_Yellow=1;//EW开黄灯信号位
	P1=P1|0x80;    //保持SN红灯
	Display();
			}
	
			/*******S6状态**********/
	SN_ManRed=1;     //SN人行道禁止
	SN_ManGreen=0;
	EW_ManRed=1;	 //EW人行道禁止
	EW_ManGreen=0;
	Flag_EW_Yellow=0;//EW关黄灯显示信号
	Time_EW=EWL;
	while(Time_EW>=5)
			{
	P1=S[6];     //EW左拐绿灯亮,SN红灯
	Display();
			}
	
			/*******S7状态**********/
			P1=0X00;
			while(Time_EW>=0)
			{
	//Flag_EW_Yellow=0; //EN开黄灯信号位
	y=1;
	P1=P1|0x80;    //保持SN红灯
	Display();
			}
				
			/***********赋值********/
			EW=EW1;
			SN=SN1;
			EWL=EWL1;
			SNL=SNL1;
		}
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -