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

📄 单片机交通灯——共阳管.c

📁 单片机交通灯——共阳管
💻 C
字号:
/**************************************************************

*个人主页 http://591881218.qzone.qq.com/*                         
                                                                  
*初始化、开机自检                                                 *          
*第一个状态:主干道、支干道均亮红灯5S                             *
*第二个状态:主干道亮绿灯27S、支干道亮红灯                        *
*第三个状态:主干道黄灯闪烁、支干道红灯闪烁                       *
*第四个状态:主干道亮红灯、支干道亮绿灯22S                        *
*第五个状态:主干道红灯闪烁、支干道黄灯闪烁                       *
*返回到第二个状态                                                 *
*其中外部中断INTO、INT1分别控制主、支干道亮绿灯                   *
                                                                  
**************************************************************/


/* 11.0592MHz晶振 */
#include<reg51.h>//头文件
#include<intrins.h>//头文件
#define  uchar  unsigned  char//宏定义
#define  uint   unsigned   int//宏定义
sbit   RED_ZHU    =  P1^0;
sbit   YELLOW_ZHU =  P1^1;
sbit   GREEN_ZHU  =  P1^2;
sbit   RED_ZHI    =  P1^3;
sbit   YELLOW_ZHI =  P1^4;
sbit   GREEN_ZHI  =  P1^5; 
uint aa, bai,shi,ge,bb;
/*数码管显示0-9*/
uint code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/*子函数声明*/
void  delay(uint z);
void  delay0(uint z);
void  display(uint ge,uint shi);
void  xtimer0();
void  check();
void  init1();
void  init2();
void  init3();
void  init4();
void  init5();
void  xint0();
void  xint1();
void  GREEN_ZHU_ON();
void  GREEN_ZHI_ON();


/*********************************************************
   主函数
*********************************************************/
void  main()
{	
	EA=1;//开中断
	EX0=1;//允许外部中断INT0中断
	IT0=0;//定义INT0触发方式
	PX0=1;//中断优先级高
	EX1=1;//允许外部中断INT1中断
	IT1=0;//定义INT1触发方式
	PX1=1;//中断优先级高
	check();//开机自检
  	init1();//第1个状态
  	while(1)
  	{
  		init2();//第2个状态
 		init3();//第3个状态
 		init4();//第4个状态
	 	init5();//第5个状态	
  	}
}

void  init1()//第一个状态:主干道、支干道均亮红灯5S 
{
	int temp;
	temp=6;//变量赋初值
	TMOD=0x01;//定时器T0工作于方式1
	TH0=0x4c;
	TL0=0x00;//定时器赋初值
	EA=1;//开中断
	ET0=1;//开定时中断
	TR0=1;//开定时器T0
	while(1)
	{
		RED_ZHU=0;               
   		RED_ZHI=0;
		GREEN_ZHU=1;
		GREEN_ZHI=1;
		YELLOW_ZHU=1;
		YELLOW_ZHI=1;
		if(aa==20)//定时20*50MS=1S
		{
			aa=0;//定时完成一次后清0
			temp--;//变量自减
			if(temp<0)
			{
				break;
			}
			shi=temp%100/10;//显示十位
			ge=temp%10;//显示个位  	
		}
		display(ge,shi);
	}
}

void  init2()//第二个状态:主干道亮绿灯27S、支干道亮红灯
{
	int temp;
	temp=31;//变量赋初值
	TMOD=0x01;//定时器T0工作于方式1
	TH0=0x4c;
	TL0=0x00;//定时器赋初值
	EA=1;//开中断
	ET0=1;//开定时中断
	TR0=1;//开定时器T0
	while(1)
	{	 
		RED_ZHU=1;
		RED_ZHI=0;
		GREEN_ZHU=0; 
		GREEN_ZHI=1;
		YELLOW_ZHU=1;
	   	YELLOW_ZHI=1;
		if(aa==20)//定时20*50MS=1S
		{
			aa=0;//定时完成一次后清0
			temp--;//变量自减
			if(temp==3)
			{
				break;
			}
			shi=temp%100/10;//显示十位
			ge=temp%10;//显示个位
		}
		display(ge,shi);
	}
}

void  init3()//第三个状态:主干道黄灯闪烁、支干道红灯闪烁
{
	int temp;
	temp=4;//变量赋初值
	TMOD=0x01;//定时器T0工作于方式1
	TH0=0x4c;
	TL0=0x00;//定时器赋初值
	EA=1;//开中断
	ET0=1;//开定时中断
	TR0=1;//开定时器T0
	while(1)
	{
		RED_ZHU=1;
		GREEN_ZHU=1; 
		GREEN_ZHI=1;
	   	YELLOW_ZHI=1;
		if(aa==20)//定时20*50MS=1S
		{
			aa=0;//定时完成一次后清0
			temp--;//变量自减
			YELLOW_ZHU=~YELLOW_ZHU;
			RED_ZHI=~RED_ZHI;
			if(temp<0)
			{
				break;
			}
			shi=temp%100/10;//显示十位
			ge=temp%10;//显示个位  	
		}
		display(ge,shi);;
	}
}

void  init4()//第四个状态:主干道亮红灯、支干道亮绿灯22S 
{
	int temp;
	temp=26;//变量赋初值
	TMOD=0x01;//定时器T0工作于方式1
	TH0=0x4c;
	TL0=0x00;//定时器赋初值
	EA=1;//开中断
	ET0=1;//开定时中断
	TR0=1;//开定时器T0
	while(1)
	{	
		RED_ZHU=0;
		RED_ZHI=1;
		GREEN_ZHU=1; 
		GREEN_ZHI=0;
		YELLOW_ZHU=1;
	   	YELLOW_ZHI=1;
		if(aa==20)//定时20*50MS=1S
		{
			aa=0;//定时完成一次后清0
			temp--;//变量自减
			if(temp==3)
			{
				break;
			}
			shi=temp%100/10;//显示十位
			ge=temp%10;//显示个位  	
		}
		display(ge,shi);
	}
}

void  init5()//第五个状态:主干道红灯闪烁、支干道黄灯闪烁
{
	int temp;
	temp=4;//变量赋初值
	TMOD=0x01;//定时器T0工作于方式1
	TH0=0x4c;
	TL0=0x00;//定时器赋初值
	EA=1;//开中断
	ET0=1;//开定时中断
	TR0=1;//开定时器T0
	while(1)
	{
		RED_ZHI=1;
		GREEN_ZHU=1; 
		GREEN_ZHI=1;
		YELLOW_ZHU=1;
		if(aa==20)//定时20*50MS=1S
		{
			aa=0;//定时完成一次后清0
			temp--;//变量自减
			YELLOW_ZHI=~YELLOW_ZHI;
			RED_ZHU=~RED_ZHU;
			if(temp<0)
			{
				break;
			}
			shi=temp%100/10;//显示十位
			ge=temp%10;//显示个位  	
		}
		display(ge,shi);
	}
}
		
/*显示子函数*/
void  display(uint ge,uint shi)
{
	P0=0xfe;
	P2=table[shi];//显示十位
	delay0(5);
	P2=0xff;//消隐
	P0=0xfd;
	P2=table[ge];//显示个位
	delay0(5);
	P2=0xff;//消隐
}

void  xint0()  interrupt  0 //外部中断INT0
{
	GREEN_ZHU_ON();
}

void  xint1()  interrupt  2 //外部中断INT1
{
	GREEN_ZHI_ON();
}

void  GREEN_ZHU_ON()//外部中断INT0显示子程序
{
	RED_ZHI=0;
	RED_ZHU=1;
	GREEN_ZHI=1;
	GREEN_ZHU=0;
    	YELLOW_ZHI=1;
	YELLOW_ZHU=1;
	P0=0xff;
	P2=0X00;
	delay0(1000);
	return;
}

void  GREEN_ZHI_ON()//外部中断INT1显示子程序
{
	RED_ZHI=1;
	RED_ZHU=0;
	GREEN_ZHI=0;
	GREEN_ZHU=1;
    	YELLOW_ZHI=1;
	YELLOW_ZHU=1;
	P0=0xff;
	P2=0x00;
	delay0(1000);
	return;
}

void  check()//开机自检子程序
{
	RED_ZHI=0;
	RED_ZHU=0;
	GREEN_ZHI=0;
	GREEN_ZHU=0;
    	YELLOW_ZHI=0;
	YELLOW_ZHU=0;
	P0=0xff;
	P2=0X00;
	delay(2);
	RED_ZHI=1;
	RED_ZHU=1;
	GREEN_ZHI=1;
	GREEN_ZHU=1;
    	YELLOW_ZHI=1;
	YELLOW_ZHU=1;
	P0=0x00;
	P2=0xff;
}

/*定时中断子函数*/
void  xtimer0()  interrupt 1
{
	TH0=0x4c;
	TL0=0x00;
	aa++;
}

/*延时子函数*/
void  delay0(uint z)
{
	uint i,j;
	for(i=0;i<z;i++)
		for(j=0;j<110;j++);
}

/*********************************************************
   500ms延时函数
   晶振:11.0592MHz
*********************************************************/
void  delay(uchar j) 
{ 
	uchar k;
   	uint i;
   	for(;j>0;j--)
   	{
   		for(i=1250;i>0;i--) 
   		{
        		for(k=180;k>0;k--);
        	}
   	}
} 

⌨️ 快捷键说明

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