基于单片机的交通灯控制系统设计程序


```c



#include <reg52.h>	
#include <intrins.h>	

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;


//--定义使用的IO口--//
#define GPIO_DIG   P0
#define GPIO_TRAFFIC P1

sbit LSA=P2^0;
sbit LSB=P2^1;
sbit LSC=P2^2;

sbit DG   = P2^3;   //东绿灯
sbit DY = P2^4;   //东黄灯
sbit DR   = P2^5;	//东红灯
sbit NG= P2^6;		//南绿灯
sbit NY = P1^0;	   //南黄灯
sbit NR  = P1^1;	//南红灯
sbit XG = P1^2;	    //西绿灯
sbit XY  = P1^3;	//西黄灯
sbit XR= P1^4;		//西红灯
sbit BG = P1^5;		 //北绿灯
sbit BY= P1^6;		 //北黄灯
sbit BR = P1^7;		 //北红灯

sbit FW=P2^7;		   //定义复位按键
sbit YJ=P3^0;		   //定义夜间模式按键
sbit JJ=P3^1;		   //定义紧急模式按键
sbit STTime=P3^2;		   //定义设定时间按键
sbit ZTime=P3^3;		   //定义时间加按键
sbit JTime=P3^4;		   //定义时间键按键

sbit HongWai=P3^5;		   //红外线

sbit buzzer=P3^7;		   //峰鸣器


u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

u8 DisplayData[8];

char kkk=0,fk=0;
char key,key1;
char Ddjs0=30,Ndjs0=30,Xdjs0=60,Bdjs0=90,             
     Ddjs01=90,Ndjs01=30,Xdjs01=30,Bdjs01=60,        
     Ddjs02=60,Ndjs02=90,Xdjs02=30,Bdjs02=30,         
     Ddjs03=30,Ndjs03=60,Xdjs03=90,Bdjs03=30;						//以上为临时变量
 
int js=0,js0,js11=0,js12=0,js21=0,js22=0,js31=0,js32=0;
char Ddjs=30,Ndjs=30,Xdjs=60,Bdjs=90,               //东绿初始倒计时时间
     Ddjs1=90,Ndjs1=30,Xdjs1=30,Bdjs1=60,          //南绿倒计时时间
     Ddjs2=60,Ndjs2=90,Xdjs2=30,Bdjs2=30,          //西绿倒计时时间
     Ddjs3=30,Ndjs3=60,Xdjs3=90,Bdjs3=30;					//北绿倒计时时间 
/************以下为函数声明*************/
void DigDisplay();	//数码管动态扫描函数,循环扫描8个数码管显示				
void djsxs11();					
void djsxs12();						
void djsxs13();					
void djsxs14();	
void djsxs1();
void djsxs2();
void djsxs3();
void djsxs4();
void jtdfw();//复位
void Ledmei();  //将所有的灯熄灭
void jj();//紧急模式
void set_djs1();
void set_djs2();
void set_djs3();
void set_djs4();
void yj();   // 夜间模式
void jtdd();
void jtddy();
void jtdn();
void jtdny();
void jtdx();
void jtdxy();
void jtdb();
void jtdby();					     
void xuanzheng();
void diaoyong();
void baoji();  //闯红灯报警

/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

void baoji()    //闯红灯报警	
{
      if(HongWai==0)
			{
				buzzer=~buzzer;
				delay(10);
			}
			else buzzer=1;
				
}


void diaoyong() //调用函数
{
				Ddjs=Ddjs0;			
        Ndjs=Ndjs0;
        Xdjs=Xdjs0;
        Bdjs=Bdjs0;
	
				Ddjs1=Ddjs01;			
        Ndjs1=Ndjs01;
        Xdjs1=Xdjs01;
        Bdjs1=Bdjs01;
	
				Ddjs2=Ddjs02;			
        Ndjs2=Ndjs02;
        Xdjs2=Xdjs02;
        Bdjs2=Bdjs02;
	
				Ddjs3=Ddjs03;			
        Ndjs3=Ndjs03;
        Xdjs3=Xdjs03;
        Bdjs3=Bdjs03;
	
}

void xuanzheng()  //返回跳转前一状态
{
									 if(key==0)	jtdd();	    //当key==0时,回到jtdd()函数
					         if(key==1)	jtddy();	  //当key==1时,回到jtddy()函数
						       if(key==2)	jtdn();     //当key==2时,回到jtdn()函数
						       if(key==3)	jtdny();    //当key==3时,回到jtdny()函数 
  				     		 if(key==4)	jtdx();	    //当key==4时,回到jtdx()函数
					         if(key==5)	jtdxy();	  //当key==5时,回到jtdxy()函数
						       if(key==6)	jtdb();     //当key==6时,回到jtdb()函数
						       if(key==7)	jtdby();    //当key==7时,回到jtdby()函数 这样的作用是,紧急模式从哪里进入,回到哪里
}
/*****************************************************/
/*             函数名:delayms				    	 */
/*           功能:产生毫秒级延时					 */
/*****************************************************/
void delayms(int x)
{
char i;
while(x--)
 {
  for(i=150;i>0;i--); 
 }
}

/*******************************************************************************
* 函 数 名         : Timer0Init
* 函数功能		   : 定时器0初始化

*******************************************************************************/
void Timer0Init()
{
    js=0;
	  TMOD=0x01;	  	//定义定时器0工作模式	
    TH0=0x4c;			//赋初值高位
	  TL0=0x00;			//赋初值低位
    TR0=1;			//启动定时器
	  ET0=1;			//开中断
	  EA=1;				//开全局中断		
}
/*****************************************************/
/*        函数名:Timer0() interrupt 1 using 1	     */
/*             功能:定时器0中断服务函数    		 */
/*****************************************************/
void Timer0() interrupt 1 using 1	
{
	    TF0=0;
	 	TH0=0x4c;
		TL0=0x00;		  //重新赋高地位初值
		js++;
    js11++;
	  js21++;
	  js31++;
	  if(js>=0)
		{
			  js0++;
				if(js0==22) 
		  { 
				js0=0;
		    Ddjs--;
			  Ndjs--;
				Xdjs--;
			  Bdjs--;
      }
		}
		else if(js==660)
		{
					js=0;
		}	
		if(js11>=660)
		{
			  js12++;
			  if(js12==22)
				{
				   js12=0;
		       Ddjs1--;
			     Ndjs1--;
				   Xdjs1--;
			     Bdjs1--;
			  }

		}
		else if(js11==1320)
		{
					js11=0;
		}	
		if(js21>=1320)
		{
			  js22++;
			  if(js22==22)
				{
				   js22=0;
				   Ddjs2--;
			     Ndjs2--;
				   Xdjs2--;
			     Bdjs2--;
			  }
		}
		else if(js21==1980)
		{
					js21=0;
		}
		if(js31>=1980)
		{
			  js32++;
			  if(js32==22)
				{
				   js32=0;
			     Ddjs3--;
			     Ndjs3--;
				   Xdjs3--;
			     Bdjs3--;
			  }
				}
    else if(js31==2640)
		{     
			    js=0;
			    js11=0;
			    js21=0;
					js31=0;
			
		}
				

			
}

/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能		   : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void DigDisplay()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)	 //位选,选择点亮的数码管,
		{
			case(0):
				LSA=0;LSB=0;LSC=0; break;//显示第0位
			case(1):
				LSA=1;LSB=0;LSC=0; break;//显示第1位
			case(2):
				LSA=0;LSB=1;LSC=0; break;//显示第2位
			case(3):
				LSA=1;LSB=1;LSC=0; break;//显示第3位
			case(4):
				LSA=0;LSB=0;LSC=1; break;//显示第4位
			case(5):
				LSA=1;LSB=0;LSC=1; break;//显示第5位
			case(6):
				LSA=0;LSB=1;LSC=1; break;//显示第6位
			case(7):
				LSA=1;LSB=1;LSC=1; break;//显示第7位	
		}
		GPIO_DIG=DisplayData[i];//发送段码
		delayms(100);//间隔一段时间扫描	
		GPIO_DIG=0x00;//消隐
	}
}

/*****************************************************/
/*                 函数名:djsxs11()	             */
/*             功能:8个数码管动态显示      		 */
/*****************************************************/
void  djsxs11()			
{	char b1,b2,b3,b4,b5,b6,b7,b8;
 	b1=Ddjs/10;		   //将倒计时时间的高位赋予b1
	b2=Ddjs%10;		   //将倒计时时间的低位赋予b2
	b3=Ndjs/10;		 //将倒计时时间的高位赋予b3
	b4=Ndjs%10;		   //将倒计时时间的低位赋予b4
	b5=Xdjs/10;		 //将倒计时时间的高位赋予b5
	b6=Xdjs%10;		   //将倒计时时间的低位赋予b6
	b7=Bdjs/10;		 //将倒计时时间的高位赋予b7
	b8=Bdjs%10;		   //将倒计时时间的低位赋予b8
	
	DisplayData[0]=smgduan[b1];
  DisplayData[1]=smgduan[b2];
	DisplayData[2]=smgduan[b3];
	DisplayData[3]=smgduan[b4];
	DisplayData[4]=smgduan[b5];
  DisplayData[5]=smgduan[b
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值