加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入

基于51單片機(jī)智能交通燈電路方案設(shè)計(jì)

08/08 09:56
1367
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長(zhǎng)和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
  • 相關(guān)文件
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

仿真:proteus 7.8

程序編譯器:keil 4/keil 5

編程語言:C語言

編號(hào)J001

基本功能:

1、交通信號(hào)燈分布于東南西北,每個(gè)路口均有三個(gè)。

2、南北方向綠燈和東西方向的綠燈不能同時(shí)亮;如果同時(shí)亮,則應(yīng)自動(dòng)立即關(guān)閉信號(hào)燈系統(tǒng),并立即發(fā)出報(bào)警信號(hào)。

3、系統(tǒng)工作后,首先南北紅燈亮并維持30s;與此同時(shí),東西綠燈亮,并維持25s時(shí)間,到25s時(shí),東西綠燈熄滅。在東西綠燈熄滅時(shí),東西黃燈亮并維持5s,然后東西黃燈熄滅,東西紅燈亮,同時(shí)南北紅燈熄滅,南北綠燈亮;東西紅燈亮并維持30s;與此同時(shí),南北綠燈亮并維持15s;然后,南北綠燈熄滅南北綠燈熄滅時(shí),南北黃燈亮維持5s后熄滅;同時(shí)南北紅燈亮,東西綠燈亮。至此,結(jié)束一個(gè)工作循環(huán),如下交通信號(hào)燈變化表。

4、在交通信號(hào)燈亮和閃爍的同時(shí),路口設(shè)有兩位七段碼的顯示器倒數(shù)計(jì)時(shí),讓車輛行人能夠清楚地知道再過多久信號(hào)燈就會(huì)發(fā)生變化。以便于司機(jī)和行人能夠在有限的時(shí)間內(nèi)準(zhǔn)確的通行。

imgimg

仿真圖

img

原理圖

img

PCB圖

img

程序

img

代碼

#include <reg52.h>	         //調(diào)用單片機(jī)頭文件
#define uchar unsigned char   //宏定義"uchar"代替"unsigned char"。
#define uint  unsigned int	  //宏定義"uint"用來定義無符號(hào)整型數(shù)。


//數(shù)碼管段選定義 0     1    2    3 	  4	   5	6	 7	  8	   9	
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
//					   A	B	 C	  D	   E   F	不顯示
					 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};	 //斷碼	

uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};	
uchar smg_i = 4;    //顯示數(shù)碼管的個(gè)位數(shù)

//數(shù)碼管位選定義
sbit smg_we1 = P2^0;	    //數(shù)碼管位選定義
sbit smg_we2 = P2^1;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;


char dx_s = 0;	//東西  南北 倒計(jì)時(shí)變量
sbit dx_red    = P2^4;	    //東西紅燈
sbit dx_green  = P2^3;		//東西綠燈
sbit dx_yellow = P2^2;		//東西黃燈

sbit nb_red    = P2^7;		//南北紅燈
sbit nb_green  = P2^6;		//南北綠燈
sbit nb_yellow = P2^5;		//南北黃燈	

uchar flag_jtd_mode;  //交通燈的模式 根據(jù)時(shí)間 
bit flag_1s = 0;
bit flag_500ms;
bit flag_dx_nb;		 //東西南北模式
uchar flag_5m_value;
uchar i;
uchar flag_alarm;	//模式
uchar dx_time = 30,nb_time = 20;   //東西、南北綠燈的時(shí)間
uchar flag_jdgz ;     //交通管制


/***********************數(shù)碼位選函數(shù)*****************************/
void smg_we_switch(uchar i)
{
	switch(i)
	{
		case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
		case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
		case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
		case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
	}	
}


/********************************************************************
* 名稱 : delay_1ms()
* 功能 : 延時(shí)1ms函數(shù)
* 輸入 : q
* 輸出 : 無
***********************************************************************/
void delay_1ms(uint q)
{
	uint i,j;
	for(i=0;i<q;i++)
		for(j=0;j<110;j++);
}


/********************************************************************
* 名稱 : display()
* 功能 : 數(shù)碼管顯示
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void display()
{
	uchar i;
	for(i=0;i<smg_i;i++)
	{		
		P0 = 0xff;	          //消隱 
		smg_we_switch(i);  	  //位選
		P0 = dis_smg[i];	  //段選	  
		delay_1ms(3);
	}
}

/*********************定時(shí)器0、定時(shí)器1初始化******************/
void time0_init()	  
{
	EA  = 1;	 	  //開總中斷
	TMOD = 0X11;	  //定時(shí)器0、定時(shí)器1工作方式1
	ET0 = 1;		  //開定時(shí)器0中斷 
	TR0 = 1;		  //允許定時(shí)器0定時(shí)
//	ET1 = 1;		  //開定時(shí)器1中斷 
//	TR1 = 1;		  //允許定時(shí)器1定時(shí)	
}

/*********************交通燈處理函數(shù)*********************************/
void jiaotongdeng_dis()
{
	if(flag_1s == 1)
	{
		flag_1s = 0;
		if(dx_s == 0)
		{
			if(flag_dx_nb == 1)
				dx_s = nb_time;	  //南北時(shí)間
			else 
				dx_s = dx_time;	  //東西時(shí)間
			flag_dx_nb = ~flag_dx_nb;
		}
		dx_s --;
	}
	dis_smg[0] = smg_du[dx_s % 10] ;
	dis_smg[1] = smg_du[dx_s / 10] ;
	dis_smg[2] = smg_du[dx_s % 10] ;
	dis_smg[3] = smg_du[dx_s / 10] ;

/***********************南北時(shí)間*********************************/
		if(flag_dx_nb == 0)  
		{
			if(dx_s > 5)
			{
				dx_red    = 1;  //滅 
				dx_green  =	0;	//亮
				dx_yellow = 1;	//滅
				nb_red    = 0;  //亮 
				nb_green  =	1;	//滅
				nb_yellow = 1;	//滅
				flag_5m_value = 0;	
			}else if(dx_s <= 5)		 //當(dāng)小于5秒時(shí)  黃燈要閃了
			{
				dx_red    = 1;    //滅
				dx_green  =	1;	  //滅
				nb_red    = 0;    //亮
				nb_green  =	1;	  //滅
				nb_yellow = 1;	  //滅
				if(flag_500ms == 0)
				{
					dx_yellow = 0;//亮	
				}
				else 
				{
					dx_yellow = 1;//滅	
				}
			}
		}
/***********************東西時(shí)間*********************************/
		if(flag_dx_nb == 1)  
		{
			if(dx_s > 5)
			{
				dx_red    = 0;     //亮
				dx_green  =	1;	   //滅
				dx_yellow = 1;	   //滅
				nb_red    = 1;     //滅
				nb_green  =	0;	   //亮
				nb_yellow = 1;	   //滅
				flag_5m_value = 0;	
			}else if(dx_s <= 5)		 //當(dāng)小于5秒時(shí)  黃燈要閃了
			{
				dx_red    = 0;     //滅
				dx_green  =	1;	   //滅
				dx_yellow = 1;	   //滅
				nb_red    = 1;     //滅
				nb_green  =	1;	   //滅
				if(flag_500ms == 0)	   //黃燈閃爍
				{
					nb_yellow = 0;	//亮	
				}
				else 
				{
					nb_yellow = 1;	//滅	
				}
			}
	}			
}

/********************獨(dú)立按鍵程序*****************/
uchar key_can;	 //按鍵值

void key()	 //獨(dú)立按鍵程序
{
	static uchar key_new;
	key_can = 20;                   //按鍵值還原
	P1 |= 0x1f;
	if((P1 & 0x1f) != 0x1f)		//按鍵按下
	{
		delay_1ms(1);	     	//按鍵消抖動(dòng)
		if(((P1 & 0x1f) != 0x1f) && (key_new == 1))
		{						//確認(rèn)是按鍵按下
			key_new = 0;
			switch(P1 & 0x1f)
			{
				case 0x1e:  key_can = 1;  break;	 //得到按鍵值
				case 0x1d:  key_can = 2;  break;	 //得到按鍵值
				case 0x1b:  key_can = 3;  break;	 //得到按鍵值
				case 0x17:  key_can = 4;  break;	 //得到按鍵值
			}
		}			
	}
	else 
		key_new = 1;	
}

uchar menu_1,flag_s;


/********************設(shè)置函數(shù)*****************/
void key_with()
{
	if(key_can == 4)   //交通管制按鍵
	{
		flag_jdgz ++;
		if(flag_jdgz > 5)
			flag_jdgz = 0;	
		if(flag_jdgz == 1)	 //  全部亮紅燈 
		{
			dx_red    = 0;  //亮 
			dx_green  =	1;	//滅
			dx_yellow = 1;	//滅
			nb_red    = 0;  //亮 
			nb_green  =	1;	//滅
			nb_yellow = 1;	//滅			
		}
		if(flag_jdgz == 2)	 //  東西紅燈  南北綠燈
		{
			dx_red    = 0;  //亮 
			dx_green  =	1;	//滅
			dx_yellow = 1;	//滅
			nb_red    = 1;  //滅 
			nb_green  =	0;	//亮
			nb_yellow = 1;	//滅			
		}
		if(flag_jdgz == 3)	 //  南北紅燈  東西綠燈
		{
			dx_red    = 1;  //滅 
			dx_green  =	0;	//亮
			dx_yellow = 1;	//滅
			nb_red    = 0;  //亮 
			nb_green  =	1;	//滅
			nb_yellow = 1;	//滅			
		}
		if(flag_jdgz == 4)	 //  南北綠燈  東西綠燈
		{
			dx_red    = 1;  //滅 
			dx_green  =	0;	//亮
			dx_yellow = 1;	//滅
			nb_red    = 1;  //滅 
			nb_green  =	0;	//亮
			nb_yellow = 1;	//滅			
		}
		if(flag_jdgz == 5)	 //  南北黃燈  東西黃燈
		{
			dx_red    = 1;  //滅 
			dx_green  =	1;	//滅
			dx_yellow = 0;	//亮
			nb_red    = 1;  //滅 
			nb_green  =	1;	//滅
			nb_yellow = 0;	//亮			
		}
	}
	if(key_can == 1)	  //設(shè)置鍵
	{
		menu_1 ++;
		if(menu_1 >= 3)
		{
			menu_1  = 0;
		}
	}

	if(menu_1 == 1)	   //設(shè)置東西的時(shí)間
	{
		if(key_can == 2)
		{
			dx_time ++ ;		//加1
			if(dx_time > 99)
				dx_time = 99;
		}
		if(key_can == 3)
		{
			dx_time -- ;		//減1
			if(dx_time <= 10)
				dx_time = 10;
		}
		dis_smg[0] = smg_du[10] ;	//顯示為A
		dis_smg[1] = smg_du[10] ;	//顯示為A
		dis_smg[2] = smg_du[dx_time % 10] ;		//顯示東西設(shè)置的時(shí)候
		dis_smg[3] = smg_du[dx_time / 10] ;	
	}	
	if(menu_1 == 2)	   //設(shè)置南北的時(shí)間
	{
		if(key_can == 2)
		{
			nb_time ++ ;		//加1
			if(nb_time > 99)
				nb_time = 99;
		}
		if(key_can == 3)
		{
			nb_time -- ;		//減1
			if(nb_time <= 10)
				nb_time = 10;
		}
		dis_smg[0] = smg_du[11] ;	//顯示為B
		dis_smg[1] = smg_du[11] ;	//顯示為B
		dis_smg[2] = smg_du[nb_time % 10] ;		//顯示東西設(shè)置的時(shí)候
		dis_smg[3] = smg_du[nb_time / 10] ;	
	}
}


/********************************************************************
* 名稱 : main()
* 功能 : 實(shí)現(xiàn)燈的閃爍
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void main()
{
	time0_init();
	dx_s = nb_time;	  //東西時(shí)間
	while(1)
	{
		key();
		if(key_can < 20)
			key_with();
//		menu_dis();
		if((menu_1 == 0) && (flag_jdgz == 0))
			jiaotongdeng_dis();
		display();	
	}
}  

器件清單

img

資料清單

img

資料下載

  • 設(shè)計(jì)資料獲取聯(lián)系方式.doc

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
DSPIC33EP512MU814-I/PH 1 Microchip Technology Inc 16-BIT, FLASH, 60 MHz, MICROCONTROLLER, PQFP144, 16 X 16 MM, 1 MM HEIGHT, LEAD FREE, PLASTIC, TQFP-144

ECAD模型

下載ECAD模型
$13.09 查看
FT2232HL-REEL 1 FTDI Chip USB Bus Controller, CMOS, PQFP64, LEAD FREE, LQFP-64

ECAD模型

下載ECAD模型
$6.27 查看
ATXMEGA128A3U-MH 1 Atmel Corporation RISC Microcontroller, 16-Bit, FLASH, AVR RISC CPU, 32MHz, CMOS, 9 X 9 MM, 1 MM HEIGHT, 0.50 MM PITCH, GREEN, MO-220VMMD, MLF-64
$6.98 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜