单片机 ------交通灯-------55

#ifndef Traffic_Ser
#define Traffic_Ser

extern u8 xdata Traffic_500ms; //0.5秒递减的时间变量
extern void Traffic_Alter_Data_Ser(); //交通灯修改状态
extern u8 xdata Traffic_Read_Buffer[25]; //输出24个字节数据

#endif
/
#include <all.h>
#define LED_LD 5 //LED亮度,任意值都行。
u8 xdata ESWN=1; //状态机
u8 xdata Traffic_500ms=0;
u8 xdata Traffic_Read_Buffer[25];

绿灯和红灯直接亮,K和J分别控制两个车道的灯
void Traffic_Direct_G_R(u8 k,u8 j,u8 t)//绿灯,红灯同时亮
{
u8 i;
for(i=1;i<25;i++,i++,i++)
{
Traffic_Read_Buffer[i]=LED_LD;
Traffic_Read_Buffer[i+1]=0;
Traffic_Read_Buffer[i+2]=0;

}                     //八个灯都亮红色
Traffic_Read_Buffer[k]=0;
Traffic_Read_Buffer[j]=0;
Traffic_Read_Buffer[k+1]=LED_LD;
Traffic_Read_Buffer[j+1]=LED_LD;
Traffic_500ms=t*2;   //定时器
ESWN++;

}

void Traffic_Direct_Y3S(u8 k,u8 j) //亮黄灯3秒钟绿色红色混合成黄色
{
Traffic_Read_Buffer[k]=LED_LD;
Traffic_Read_Buffer[k+1]=LED_LD;

Traffic_Read_Buffer[j]=LED_LD;
Traffic_Read_Buffer[j+1]=LED_LD;
Traffic_500ms=7;
ESWN++;

}
void Traffic_Twinkle_G(u8 k,u8 j) //最后3秒钟绿灯闪烁,K和j分别控制两个车道的灯
{
switch(Traffic_500ms)
{
case 7:
case 5:
case 3:
case 1:
Traffic_Read_Buffer[k]=0;
Traffic_Read_Buffer[j]=0;
break;
case 6:
case 4:
case 2:
Traffic_Read_Buffer[k]=LED_LD;
Traffic_Read_Buffer[j]=LED_LD;
break;
case 0:ESWN++;break;
}

}
void Traffic_Alter_Data_Ser()//交通灯状态机修改函数
{
static xdata u8 count=0;
if(count>200)
{
count=0;
if(Traffic_500ms==0)
{
switch(ESWN)
{
case 1:Traffic_Direct_G_R(1,4,24);break; //亮绿灯
case 4:Traffic_Direct_G_R(4,16,24);break;
case 7:Traffic_Direct_G_R(13,16,24);break;

			case 10:Traffic_Direct_G_R(7,10,24);break; 
			case 13:Traffic_Direct_G_R(10,22,24);break;
			case 16:Traffic_Direct_G_R(19,22,24);break;
			
			case 3:Traffic_Direct_Y3S(1,1);break;
			case 6:Traffic_Direct_Y3S(4,4);break;
			case 9:Traffic_Direct_Y3S(13,16);break;
			
			case 12:Traffic_Direct_Y3S(7,7);break;
			case 15:Traffic_Direct_Y3S(10,10);break;
			case 18:Traffic_Direct_Y3S(19,22);ESWN=1;break;
			
			
		}
	}
	if(ESWN%3==2)
	{
		switch(ESWN)
		{
			case 2:Traffic_Twinkle_G(2,2);break;
			case 5:Traffic_Twinkle_G(5,5);break;
			case 8:Traffic_Twinkle_G(14,17);break;
			
			case 11:Traffic_Twinkle_G(8,8);break;
			case 14:Traffic_Twinkle_G(11,11);break;
			case 17:Traffic_Twinkle_G(20,23);break;
			
		}
	}
}

count++;

}

/
#ifndef BUZ_Drive
#define BUZ_Drive
sbit Buz_GPIO=P5^1;
extern void Buz_Init();
extern void Buz_Drive();
extern bit idata Buz_Write_GO;

#endif
/
#include <all.h>
u16 xdata Buz_count=0;
bit idata Buz_Flag=0; //标志位
bit idata Buz_Write_GO=0; //相当于蜂鸣器开关
u16 INT4_Timer=0;

void Timer4_Init()
{

T4T3M&=0x0f;  //0000 1111
T4T3M|=0x80;  //1000 0000
T4H=0xFE;	//1111 1110
T4L=0xD6;   //1101 0110    系统自动配置好的初值
IE2|=0x40; //100 0000

}

void Buz_Init() //蜂鸣器初始化函数
{
P5M1&=0xFD; //1111 1101
P5M0|=0x02; //0000 0010
Buz_GPIO=1;
Timer4_Init(); //定时器初始化函数
}

void Timer4_Routine() interrupt 20 //119微妙中断一次
{
if(Buz_Flag)
{
Buz_GPIO=~Buz_GPIO;
}
else
{
Buz_GPIO=1;
}

Buz_count++;
INT4_Timer++;
if(INT4_Timer>=4200)
{
	INT4_Timer=0;
	if(Traffic_500ms==0)
	{
		Traffic_500ms=0;
	}
	else
	{
		Traffic_500ms--;  //交通灯程序中定义的
	
	}
	
	
}

}

void Buz_Drive() //蜂鸣响一会中断一会
{
if(Buz_Write_GO==1)
{
switch(Buz_count/500)
{
case 0:
case 2:
case 4:
case 6:Buz_Flag=1;break;

		case 1:
		case 3:
		case 5:
		case 7:Buz_Flag=0;break;
		case 16:Buz_count=0;break;
	}
}
else
{

	Buz_GPIO=1;
}

}

///
main.c

void SMG_Allot()
{

 SMG_Write_Buffer[0]=15;   
 SMG_Write_Buffer[1]=Ray_Read_Buffer[2]/16;
 SMG_Write_Buffer[2]=15; 
 
 SMG_Write_Buffer[3]=ADC_Read_Byte/100;
 SMG_Write_Buffer[4]=ADC_Read_Byte%100/10;   //整数
 SMG_Write_Buffer[5]=ADC_Read_Byte%100%10;
	
 SMG_Write_Buffer[6]=Traffic_500ms/20;	
 SMG_Write_Buffer[7]=Traffic_500ms%20/2;

SMG_Display_Ser();

}

void Traffic_Allot()
{

Traffic_Alter_Data_Ser();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_49327613

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值