欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用C语言编程单片机做交通灯(定时器0中断)

程序员文章站 2022-06-20 12:17:43
...
# include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
void delay(u16 i); 
void DigDisplay();
void Time01();

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

#define GPIO_DIG P0
#define GPIO_TRAFFIC P1

sbit Red10=P1^0;
sbit Green10=P1^1;
sbit Red11=P1^2;
sbit Yellow11=P1^3;
sbit Green11=P1^4;

sbit Red21=P1^5;
sbit Yellow21=P1^6;
sbit Green21=P1^7;
sbit Red30=P3^0;
sbit Green30=P3^1;

u8 code smgDuan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴

static u16 i;
u8 Second=0;
u8 SmgTime[8];

void main()
{
	Second=1;
  Time01();
	while(1)
	{
		if(Second==60)
		{
			Second=1;
		}
		if(Second<25) //路灯为25秒
		{
			SmgTime[0]=0x00;  //第一个数码管不亮
			SmgTime[1]=0x00;	//第二个数码管不亮
			SmgTime[2]=smgDuan[(25-Second)%100/10];//取出十位
			SmgTime[3]=smgDuan[(25-Second)%10];//取出个位
			
			SmgTime[4]=0x00;  //第一个数码管不亮
			SmgTime[5]=0x00;	//第二个数码管不亮
			SmgTime[6]=smgDuan[(25-Second)%100/10];//取出十位
			SmgTime[7]=smgDuan[(25-Second)%10];//取出个位
			
			DigDisplay();
			
			GPIO_TRAFFIC=0xff; //熄灭所以LED灯
			Red30=1; //D9
			Green30=1;	//D10
			
			Green11=0;
			Green10=0;
			
			Red21=0;
			Red30=0;
		}
		
		else if(Second<30)  //设置黄灯为4秒
		{
			SmgTime[0]=0x00;  //第一个数码管不亮
			SmgTime[1]=0x00;	//第二个数码管不亮
			SmgTime[2]=smgDuan[(30-Second)%100/10];//取出十位
			SmgTime[3]=smgDuan[(30-Second)%10];//取出个位
			
			SmgTime[4]=0x00;  //第一个数码管不亮
			SmgTime[5]=0x00;	//第二个数码管不亮
			SmgTime[6]=smgDuan[(30-Second)%100/10];//取出十位
			SmgTime[7]=smgDuan[(30-Second)%10];//取出个位
			
			DigDisplay();
			
			GPIO_TRAFFIC=0xff; //熄灭所以LED灯
			Red30=1; //D9
			Green30=1;	//D10
			
			Yellow11=0;
			Red10=0;
			
			Yellow21=0;
			Red30=0;
		}
		
		else if(Second<55)  //设置红灯亮的时间为25秒
		{
			SmgTime[0]=0x00;  //第一个数码管不亮
			SmgTime[1]=0x00;	//第二个数码管不亮
			SmgTime[2]=smgDuan[(55-Second)%100/10];//取出十位
			SmgTime[3]=smgDuan[(55-Second)%10];//取出个位
			
			SmgTime[4]=0x00;  //第一个数码管不亮
			SmgTime[5]=0x00;	//第二个数码管不亮
			SmgTime[6]=smgDuan[(55-Second)%100/10];//取出十位
			SmgTime[7]=smgDuan[(55-Second)%10];//取出个位
			
			DigDisplay();
			
			GPIO_TRAFFIC=0xff; //熄灭所以LED灯
			Red30=1; //D9
			Green30=1;	//D10
			
			Red11=0;
			Red10=0;
			
			Green21=0;
			Green30=0;
		}
		
		else  //设置黄灯为3秒
		{
			SmgTime[0]=0x00;  //第一个数码管不亮
			SmgTime[1]=0x00;	//第二个数码管不亮
			SmgTime[2]=smgDuan[(60-Second)%100/10];//取出十位
			SmgTime[3]=smgDuan[(60-Second)%10];//取出个位
			
			SmgTime[4]=0x00;  //第一个数码管不亮
			SmgTime[5]=0x00;	//第二个数码管不亮
			SmgTime[6]=smgDuan[(60-Second)%100/10];//取出十位
			SmgTime[7]=smgDuan[(60-Second)%10];//取出个位
			
			DigDisplay();
			
			GPIO_TRAFFIC=0xff; //熄灭所以LED灯
			Red30=1; //D9
			Green30=1;	//D10
			
			Yellow11=0;
			Red10=0;
			
			Yellow21=0;
			Red30=0;
		}
	}
}

void delay(u16 i)
{
	while(i--);
}

void DigDisplay()
{
	void delay(u16 i);
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)
		{
			case 0:LSA=0;LSB=0;LSC=0;break;
			case 1:LSA=1;LSB=0;LSC=0;break;
			case 2:LSA=0;LSB=1;LSC=0;break;
			case 3:LSA=1;LSB=1;LSC=0;break;
			case 4:LSA=0;LSB=0;LSC=1;break;
			case 5:LSA=1;LSB=0;LSC=1;break;
			case 6:LSA=0;LSB=1;LSC=1;break;
			case 7:LSA=1;LSB=1;LSC=1;break;
		}
		GPIO_DIG=SmgTime[i];
		delay(100);
		GPIO_DIG=0x00;
	}
}

void Time01()
{
	TMOD|=0x01;//选择为定时器0模式,工作方式1,仅用TR0打开启动
	
	TH0=0xfc;  //给定时器赋初值,定时1ms
	TL0=0x18;
	ET0=1;//打开定时器0中断允许
	EA=1;//开总中断
	TR0=1;//打开定时器
}

void Time01Int() interrupt 1
{
	TH0=0xfc;  //给定时器赋初值,定时1ms
	TL0=0x18;
	i++;
	if(i==1000)
	{
		i=0;
		Second++;
	}
}

接线图
用C语言编程单片机做交通灯(定时器0中断)