《单片机实践项目》之《电子DIY》之基于51单片机的简易交通灯设计(简化版)

程序:


#include "reg51.h"
typedef unsigned char uchar;
typedef unsigned int  uint;

void delay_ms(uint x)
{
    
    
	uint i,j;
	for(i=x;i>0;i--)
		for(j=118;j>0;j--);		
}

#define    RED_EW_ON()	P0 &= ~0x01			//东西方向指示灯开
#define YELLOW_EW_ON()	P0 &= ~0x02
#define  GREEN_EW_ON()	P0 &= ~0x04

#define    RED_EW_OFF()	P0 |=  0x01			//东西方向指示灯关
#define YELLOW_EW_OFF()	P0 |=  0x02
#define  GREEN_EW_OFF()	P0 |=  0x04

#define  RED_SN_ON()	P0 &= ~0x08			//南北方向指示灯开  
#define YELLOW_SN_ON()	P0 &= ~0x10
#define GREEN_SN_ON()	P0 &= ~0x20

#define  RED_SN_OFF()	P0 |=  0x08			//南北方向指示灯关
#define YELLOW_SN_OFF()	P0 |=  0x10
#define GREEN_SN_OFF()	P0 |=  0x20		

#define YELLOW_EW_BLINK() P0 ^= 0x02			//东西方向黄灯闪烁
#define YELLOW_SN_BLINK() P0 ^= 0x10			//南北方向黄灯闪烁

uchar count = 0;
uchar type=1;	


int main(void)
{
    
    
	while(1) 
	{
    
    
		switch (type)
		{
    
    
			case 1://东西方向绿灯与南北方向红灯亮
					RED_EW_OFF(); YELLOW_EW_OFF(); GREEN_EW_ON();
				    RED_SN_ON(); YELLOW_SN_OFF(); GREEN_SN_OFF();
					delay_ms(2000);								//延时
					type = 2;							//下一个操作
					break;
	
			case 2://东西方向黄灯开始闪烁,绿灯关闭
					delay_ms(120);
					YELLOW_EW_BLINK();
					GREEN_EW_OFF();
					//闪烁5次
					if(++count!=10) 
						break;
					count = 0;
					type = 3;							//下一个操作
					break;
	
			case 3://东西方向红灯与南北方向绿灯亮
					RED_EW_ON();  YELLOW_EW_OFF(); GREEN_EW_OFF();
					RED_SN_OFF(); YELLOW_SN_OFF(); GREEN_SN_ON();
				   //南北方向绿灯亮若干秒后切换
				   delay_ms(2000);
				   type=4;							//下一个操作
				   break;
	
			case 4://南北方向红灯开始闪烁
				   delay_ms(120);
				   YELLOW_SN_BLINK();
				   GREEN_SN_OFF();
				   //闪烁5次
				   if(++count!= 10) 
				   		break;
				   count = 0;
				   type = 1;							//回到第一种操作
				   break;
		}		
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/liuxianfei0810/article/details/107297912