基于51单片机的十字红绿黄交通灯Proteus仿真设计 按键+串口

Posted Sandra_C

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于51单片机的十字红绿黄交通灯Proteus仿真设计 按键+串口相关的知识,希望对你有一定的参考价值。

程序源码PCB参考设计 +QQ2142686503
功能说明:
1.南北绿灯时间11秒 黄灯 3秒 东西红灯时间 14秒;
东西绿灯时间9秒 黄灯3秒 南北红灯时间12秒;
红灯时间 = 另外方向的绿灯时间 + 黄灯时间。

2.设计中有三个按键 分别是正常运行 南北管控 东西管控;
上电正常倒计时,数码管显示当前灯的倒计时。
按下南北管控 无论什么状态下都会进入南北方向绿灯,东西方向红灯。数码管显示00,同时通过串口发射报文NS_ONLY给串口助手。
按下东西管控 无论什么状态下都会进入东西方向绿灯,南北方向红灯。数码管显示00,同时通过串口发射报文WE_ONLY给串口助手。
按下正常运行 无论什么状态下都会进入正常运行情况。数码管显示和灯显示恢复到进入管控模式前的运行情况。

3.串口控制
串口助手发送0执行正常运行状态;
串口助手发送1执行南北管控状态;
串口助手发送2执行东西管控状态。

void main()
{

	EA=1;						  		//开总中断
	InintTimer0();				  		//初始化定时器0
	init_uart();// 初始化串口
	NS_gtime_count=11,WE_rtime_count=14,NS_rtime_count=12,WE_gtime_count =9;//设置时间 
	//南北绿灯时间   东西红灯时间     南北红灯时间     东西绿灯时间  黄灯时间默认=红灯时间-绿灯时间
	while(1)
	{	
		LEDScan();				  		//数码管即LED扫描
		KeyDriver();			  		//键盘驱动扫描
		if(flag1s)//1S执行一次
		{
			flag1s=0;
			NS_time--;			  		//红绿灯倒计时时间减
			WE_time--;
		}	
		
		if((index == 1)&&(NS_time<5)&&(StaSysterm==NormalRun)){//绿灯闪烁,红灯不变
				if(FilteFlag){//绿灯闪烁 L0闪烁 L3常亮 其他灭 P2 :0000 1001(0x09) 或 0000 1000(0x08)
					P2=0x09;
				}else{
					P2=0x08;
				}
			}else if((index == 3)&&((WE_time<5))&&(StaSysterm==NormalRun)){//绿灯闪烁 L5闪烁 L2常亮 其他灭 P2 :0010 0100(0x24) 或 0000 0100(0x04)
				if(FilteFlag){
					P2=0x24;	
				}else{
					P2=0x04;	
				}			
			}
	}
}
void InintTimer0()
{
	TMOD |=0X01;
	TH0=0X4C;
	TL0=0X00;
	ET0=1;
	TR0=1;//打开定时器中断
}
void init_uart(void)
{
	SCON = 0x50;		        // SCON: 方式 1, 8-bit, 允许接收数据 
	TMOD |= 0x20;               // TMOD: 设置定时器1工作在方式2, 8-bit 自动重装
	TH1 = 0xFD;               // TH1:  初始值为0xFD  波特率:9600 晶振频率:11.0592MHz  
	TL1 = 0x0;
	TR1 = 1;                  // TR1:  开启定时器1                         
	ES  = 1;                  //打开串口中断
} 

void Timer0() interrupt 1
{
	TH0=0XBB;
	TL0=0X00;
	KeyScan();
	if(++count500ms<25){
	
	}else{
	  count500ms = 0;
		if(FilteFlag){//闪烁标志位
			FilteFlag = 0;
		}else{
			FilteFlag =1;
		}
	} 
	if(++count1s<50)	return;
	count1s=0;
	if(StaSysterm==NormalRun) flag1s=1;	 //非正常运行时,不红绿灯数值不减一	
	all_mode_flag1s =1;
}

// 串口中断处理函数 (串口接收到数据,发送数据完毕都可以引起串口中断)
void uart_interrupt(void) interrupt 4 		//也叫串行中断服务程序
{
  uchar recv_data;// 用来存放接收到的数据
	uchar send_data[] = "I received.\\n";// 要发送的信息
	uchar send_normal_data[] = "NORMAL\\n";//要发送的信息
  uchar send_ns_data[] = "NS_ONLY\\n";// 
  uchar send_we_data[] = "WE_ONLY\\n";// 
	if(RI) //接收数据(1字节)完毕,RI会被硬件置1
	{
		RI = 0;            		// 将 接收中断标志位 清零(让串口可以继续接收数据)
		recv_data = SBUF;           	//读取接收到的数据,并存放到data
	
	switch(recv_data)			  //文本模式 9600
	{
		case '0':
		    StaSysterm=NormalRun;
	    	uart_send_str(send_normal_data); //收到数据之后,发送字符串给对方		
				  break;  //接收到0,正常        
		case '1':
			   StaSysterm=NSRun;
			   uart_send_str(send_ns_data);
				  break;  //接收到1,南北   
		case '2':
			    StaSysterm=WERun;
		      uart_send_str(send_we_data);
				  break;  //接收到2,东西       
		default:break;
    
	}		
  
	 
	}
	if(TI)// 发送数据(1字节)完毕
	{
		TI = 0;// 将 发送中断标志位 清零(让串口可以继续发送数据)
	}
	
	
} 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以上是关于基于51单片机的十字红绿黄交通灯Proteus仿真设计 按键+串口的主要内容,如果未能解决你的问题,请参考以下文章

基于51单片机的十字路交通灯Proteus仿真_带紧急开关(仿真+源码)

基于51单片机交通灯设计时间可设置仿真红绿灯十字路口

基于51单片机交通灯设计时间可设置仿真红绿灯十字路口

基于51单片机交通灯设计时间可设置仿真红绿灯十字路口

基于51单片机交通灯设计时间可设置仿真红绿灯十字路口

基于51单片机的交通灯Proteus仿真设计_带紧急开关+可调时间(源码+仿真+报告)