单片机交通灯控制系统设计与实现

一、实验目的

掌握单片机的综合应用设计。

二、实验仪器、材料

Keil软件、proteus软件

三、实验内容及要求

完成以下任务:十字路口的交通灯控制系统,四组灯对应十字路口的四个方向,用两位的数码管显示剩余的时间。

四、实验原理

五、实验过程及原始记录(包括原理图程序代码)

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar shuzi[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  
//p0控制LED灯是否亮
sbit ew_red=P0^0;        //东西红灯,低电平亮
sbit ew_yellow=P0^1;   
sbit ew_green=P0^2;
sbit sn_red=P0^3;
sbit sn_yellow=P0^4;
sbit sn_green=P0^5;
//p2口控制段码
sbit P2_0=P2^0;  
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7; 
//控制数码管位码
sbit P1_0=P1^0; 
sbit P1_1=P1^1;	//p1_0,p1_1控制东西灯位码
sbit P1_2=P1^2; 
sbit P1_3=P1^3;	//p1_2,p1_3控制南北灯位码
//按键控制
sbit P3_3=P3^3; //南北通行按键
sbit P3_4=P3^4; //全部禁止按键
//定义变量
int s=0,n=0;

void time(void) interrupt 1 //中断,产生1s
{
     TH0=(65536-50000)/256;		//0.05s=50ms
	 TL0=(65536-50000)%256;
	 n++;
	 if(n==20)	//设置频率,即倒计时速率
	 {n=0;
	 s++;}
	 if(s==60)	 //设置交通灯循环一次的时间
	 s=0;
}

void ew_allow()		   //东西绿灯,南北红灯
{
	 ew_red=1;
	 ew_yellow=1;
	 ew_green=0;  //低电平亮
	 sn_red=0;
	 sn_yellow=1;
	 sn_green=1;
}
void ew_wait()		   //东西黄灯,南北红灯
{
	 ew_red=1;
	 ew_yellow=0;
	 ew_green=1;
	 sn_red=0;
	 sn_yellow=1;
	 sn_green=1;
}
void sn_allow()		   //东西红灯,南北绿灯
{
	 ew_red=0;
	 ew_yellow=1;
	 ew_green=1;
	 sn_red=1;
	 sn_yellow=1;
	 sn_green=0;
}
void sn_wait()			//东西红灯,南北黄灯
{
	 ew_red=0;  //低电平亮
	 ew_yellow=1;
	 ew_green=1;
	 sn_red=1;
	 sn_yellow=0;
	 sn_green=1;
}

void delay()
{	 int i;
     int j;
	 for(i=0;i<100;i++)
	    for(j=0;j<10;j++);
}
void chushi()			 //P1初始化
{
	 P1_0=0;
	 P1_1=0;
	 P1_2=0;
	 P1_3=0;
}
   
void jinzhi()			 //按下禁止按钮后四个方向都禁止(都为红灯),且时间显示为99
{
     chushi();
     P2=shuzi[9]; 
     P1_0=1;
     P1_2=1; 
	 delay();
	 chushi();
     P1_1=1;  
     P1_3=1;
	 ew_red=0;
	 ew_yellow=1;
	 ew_green=1;
	 sn_red=0;
	 sn_yellow=1;
	 sn_green=1;
	 delay();
}

void display_led()		  //LED灯显示
{
	 if(s<=27)	 //东西方向与南北方向时间间隔3s(即黄灯时间)
	 ew_allow();  //东西绿灯,南北红灯
	 else if(s<=30)   
	 ew_wait();		   //东西黄灯,南北红灯
	 else if(s<=57)	   //3s
	 sn_allow();	 //东西红灯,南北绿灯
	 else if(s<=60) 
	 sn_wait();
	 else
	  jinzhi();
}
void display_shuzi1()	   //绿灯以及黄灯的倒计时显示
{
    if(s<=27)
	{
	   chushi();
	   P2=shuzi[(27-s)/10];  
	   P1_1=0;
	   P1_0=1;
	   delay();
	   chushi();
	   P2=shuzi[(27-s)%10]; 
	   P1_1=1; //个位
	   P1_0=0; //十位
	   delay();
	 }
	 else if(s<=30)
	{
	   chushi();
	   P2=shuzi[(30-s)/10];
	   P1_1=0;
	   P1_0=1;
	   delay();
	   chushi();
	   P2=shuzi[(30-s)%10];
	   P1_1=1;
	   P1_0=0;
	   delay();
	 }
	 else if(s<=57)
	{
	   chushi();
	   P2=shuzi[(57-s)/10];
	   P1_3=0;
	   P1_2=1;
	   delay();
	   chushi();
	   P2=shuzi[(57-s)%10];
	   P1_3=1;
	   P1_2=0;
	   delay();
	 }
	 else if(s<=60)
	{
	   chushi();
	   P2=shuzi[(60-s)/10];
	   P1_3=0;
	   P1_2=1;
	   delay();
	   chushi();
	   P2=shuzi[(60-s)%10];
	   P1_3=1;
	   P1_2=0;
	   delay();
	 }
	 else
	   jinzhi();
}

void display_shuzi2()		//红灯的倒计时显示
{ 
	  if(s<=30)
	  {
	   chushi();
	   P2=shuzi[(30-s)/10];
	   P1_3=0;	  //个位
	   P1_2=1;	 //十位
	   chushi();
	   P2=shuzi[(30-s)%10];
	   P1_3=1;
	   P1_2=0;
	   delay();
	  }	   
	  else if(s<=60)
	  {
	   chushi();
	   P2=shuzi[(60-s)/10];
	   P1_1=0;
	   P1_0=1;
	   delay();
	   chushi();
	   P2=shuzi[(60-s)%10];
	   P1_1=1;
	   P1_0=0;
	   delay();
	 }
	 else
	  jinzhi();
}

void display_shuzi3()
{
	if(s<=60)
	{
	  chushi();
	  P2=0;
 	  delay();
	  chushi();
	  P2=0;
	  delay();
	}
	if(s==61)
	jinzhi();
}
  
void panduan()			       	//按键的判断
{
	  if(P3_3==0)				//按下时切换到南北绿灯刚亮起的时间段
	  s=31;
	  if(P3_4==0)				//按下时实现全部禁止(按下南北通行解除禁止)
	  s=61;
}

void main()
{
     TMOD=0x01;
	 TH0=(65536-50000)/256;	  //高8位
	 TL0=(65536-50000)%256;	  //低8位
	 EA=1;
	 ET0=1;
	 TR0=1;
	 while(1)
	 {		  
		  display_led();	 
		  display_shuzi1();
		  display_shuzi2();
		  display_shuzi3();
		  panduan();
	 }
}     

六、实验结果及分析(程序仿真分析)

 

物联沃分享整理
物联沃-IOTWORD物联网 » 单片机交通灯控制系统设计与实现

发表评论