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

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

基于51單片機(jī)的交通燈_可調(diào)時(shí)間_夜間+緊急模式

10/09 16:41
1586
服務(wù)支持:
技術(shù)交流群

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

虛擬商品不可退

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

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
    • 1 講解視頻:
    • 2 功能要求
    • 3 仿真圖:
    • 4 原理圖+PCB
    • 5 實(shí)物圖
    • 6 程序設(shè)計(jì):
    • 7 設(shè)計(jì)報(bào)告
    • 8 資料清單(提供資料清單所有文件):
  • 相關(guān)文件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

仿真圖proteus 7.8以上

程序編譯器:keil 4/keil 5

編程語言:C語言

設(shè)計(jì)編號:J030

1 講解視頻:

包含仿真講解和實(shí)物演示

基于51單片機(jī)的交通燈proteus實(shí)物設(shè)計(jì)

2 功能要求

基于51單片機(jī)的交通燈設(shè)計(jì)

本設(shè)計(jì)基于AT89C51/52(與AT89S51/52、STC89C51/52通用,可替換其他51內(nèi)核)單片機(jī)

1.正常模式工作狀態(tài):

狀態(tài)1:東西方向綠燈通行20秒,南北方向禁止通行25秒;

狀態(tài)2:東西方向黃燈閃爍提醒5秒,南北繼續(xù)紅燈倒計(jì)時(shí);

狀態(tài)3:南北方向綠燈通行30秒,東西紅燈禁止通行35秒,分別通過數(shù)碼管倒計(jì)時(shí);

狀態(tài)4:南北方向黃燈閃爍提醒5秒,東西繼續(xù)紅燈倒計(jì)時(shí);

狀態(tài)5:執(zhí)行狀態(tài)1,反復(fù)循環(huán)。

2. 緊急模式

南北方向和東西方向紅燈常亮禁止通行。數(shù)碼管顯示00。

3. 夜間模式

南北方向和東西方向黃燈閃爍。

4. 可以通過按鍵調(diào)東西/南北方向綠燈時(shí)間。切換鍵切換方向,加減鍵調(diào)整時(shí)間。

3 仿真圖:

正常倒計(jì)時(shí)

imgimg

夜間黃燈閃爍

4 原理圖+PCB

img

img

img

img

5 實(shí)物圖

img

6 程序設(shè)計(jì):

img
代碼

#include <reg51.h>				//頭文件
#define uchar unsigned char
#define uint  unsigned int		//宏定義

uchar data buf[4];					//秒顯示的變量
uchar data sec_dx=20;  			//東西數(shù)默認(rèn)
uchar data sec_nb=30;			//南北默認(rèn)值
uchar data set_timedx=20;		//設(shè)置東西方向的時(shí)間
uchar data set_timenb=30;		//設(shè)置南北方向的時(shí)間
int n;
uchar data countt0,countt1;//定時(shí)器0中斷次數(shù)
//定義6組開關(guān)
sbit  k4=P3^7;      //切換方向
sbit  k1=P3^5;		//時(shí)間加
sbit  k2=P3^6;		//時(shí)間減
sbit  k3=P3^4;		//確認(rèn)
sbit  k5=P3^1;		//禁止
sbit  k6=P1^5;		//夜間模式
部分代碼,不完整,完全代碼在壓縮包main函數(shù)
//https://docs.qq.com/doc/DS3Zab1lNU0d2QVZt

sbit Red_nb=P2^6;		//南北紅燈標(biāo)志
sbit Yellow_nb=P2^5;	//南北黃燈標(biāo)志
sbit Green_nb=P2^4;     //南北綠燈標(biāo)志

sbit Red_dx=P2^3;		//東西紅燈標(biāo)志
sbit Yellow_dx=P2^2;	//東西黃燈標(biāo)志
sbit Green_dx=P2^1;		//東西綠燈標(biāo)志
		
bit set=0;				//調(diào)時(shí)方向切換鍵標(biāo)志 =1時(shí),南北,=0時(shí),東西
bit dx_nb=0;			//東西南北控制位
bit shansuo=0;			//閃爍標(biāo)志位
bit yejian=0;			//夜間黃燈閃爍標(biāo)志位

uchar code table[11]={	//共陰極字型碼
	0x3f,  //--0
	0x06,  //--1
	0x5b,  //--2
	0x4f,  //--3
	0x66,  //--4
	0x6d,  //--5
	0x7d,  //--6
	0x07,  //--7
	0x7f,  //--8
	0x6f,  //--9
	0x00   //--NULL
};

//函數(shù)的聲明部分
void delay(int ms);			//延時(shí)子程序
void key();					//按鍵掃描子程序
void display();				//顯示子程序
void logo();   				//開機(jī)LOGO
//主程序
void main()
{
	TMOD=0X11;	   				//定時(shí)器設(shè)置
	TH1=0X3C;		
	TL1=0XB0;
	TH0=0X3C;					//定時(shí)器0置初值 0.05S
	TL0=0XB0;
	EA=1;						//開總中斷
	ET0=1;						//定時(shí)器0中斷開啟
	ET1=1;					   //定時(shí)器1中斷開啟
	TR0=1;						//啟動(dòng)定時(shí)0
	TR1=0;						 	//關(guān)閉定時(shí)1
    logo();						//開機(jī)初始化
	P2=0Xc3;					// 開始默認(rèn)狀態(tài),東西綠燈,南北黃燈   
    sec_nb=sec_dx+5; 			//默認(rèn)南北通行時(shí)間比東西多5秒
	while(1)					  //主循環(huán)
	{	 
		key(); 					//調(diào)用按鍵掃描程序
		display(); 				//調(diào)用顯示程序
	}	
}
//函數(shù)的定義部分
void key(void)	//按鍵掃描子程序
{	 
	if(k1!=1)							//當(dāng)K1(時(shí)間加)按下時(shí)
	{
		display();       				//調(diào)用顯示,用于延時(shí)消抖
		if(k1!=1)							//如果確定按下
		{
		  	TR0=0;	       				//關(guān)定時(shí)器	
			shansuo=0;					//閃爍標(biāo)志位關(guān)
			P2=0x00;					//滅顯示
			TR1=0;							//啟動(dòng)定時(shí)1
			if(set==0){//設(shè)置鍵按下
				set_timedx++;   		//南北加1S
			}else{
				set_timenb++;    		//東西加1S
			}
			if(set){
				Red_nb=1;		//南北紅燈標(biāo)志
				Yellow_nb=1;	//南北黃燈標(biāo)志
				Green_nb=1;     //南北綠燈標(biāo)志
			}else{
				Red_dx=1;		//東西紅燈標(biāo)志
				Yellow_dx=1;	//東西黃燈標(biāo)志
				Green_dx=1;     //東西綠燈標(biāo)志
			}
			if(set_timenb==100)
				set_timenb=1;
			if(	set_timedx==100)
				set_timedx=1;   		//加到100置1
			sec_nb=set_timenb ; 		//設(shè)置的數(shù)值賦給東西南北
			sec_dx=set_timedx;			
		  	do
		 	{ 
				display();				 //調(diào)用顯示,用于延時(shí)
			}
			while(k1!=1);			 //等待按鍵釋放
		}
	}

	if(k2!=1)							//當(dāng)K2(時(shí)間減)按鍵按下時(shí)
	{		
		display();       				//調(diào)用顯示,用于延時(shí)消抖  
		if(k2!=1)						//如果確定按下
		{	
		 	TR0=0;         				//關(guān)定時(shí)器0	
			shansuo=0;					//閃爍標(biāo)志位關(guān)
			P2=0x00;					//滅顯示
			TR1=0;						//關(guān)定時(shí)器1	
			if(set==0){//設(shè)置鍵按下
				set_timedx--;   		//南北減1S
			}else{
				set_timenb--;    		//東西減1S
			}
			if(set){
				Red_nb=1;		//南北紅燈標(biāo)志
				Yellow_nb=1;	//南北黃燈標(biāo)志
				Green_nb=1;     //南北綠燈標(biāo)志
			}else{
				Red_dx=1;		//東西紅燈標(biāo)志
				Yellow_dx=1;	//東西黃燈標(biāo)志
				Green_dx=1;     //東西綠燈標(biāo)志
			}
			if(set_timenb==0)
				set_timenb=99;	
			if(	set_timedx==0 )
				set_timedx=99;   		//減到1重置99
			sec_nb=set_timenb ;	 		//設(shè)置的數(shù)值賦給東西南北
			sec_dx=set_timedx;
		  	do	
		    { 
				display();       		//調(diào)用顯示,用于延時(shí)
			}
			while(k2!=1);			   //等待按鍵釋放
		}
	}

	if(k3!=1)							//當(dāng)K3(確認(rèn))鍵按下時(shí)
	{	
		display();       				//調(diào)用顯示,用于延時(shí)消抖
		if(k3!=1)						//如果確定按下
		{
			TR0=1;  						//啟動(dòng)定時(shí)器0
			sec_nb=set_timenb;				//從中斷回復(fù),仍顯示設(shè)置過的數(shù)值
			sec_dx=set_timedx;				//顯示設(shè)置過的時(shí)間
			TR1=0;							//關(guān)定時(shí)器1	
			if(set==0)						//時(shí)間倒時(shí)到0時(shí)
			{ 
				P2=0X00;					 //滅顯示
				Green_dx=1;						//東西綠燈亮
				Red_nb=1;					//南北紅燈亮
				sec_nb=sec_dx+5; 			//回到初值
			}
			else 
			{ 
				P2=0x00;					//南北綠燈,東西紅燈
				Green_nb=1;
				Red_dx=1;
				sec_dx=sec_nb+5; 
			}
		}
	}
	 
	if(k4!=1)							//當(dāng)K4(切換)鍵按下
    {
		display();       				//調(diào)用顯示,用于延時(shí)消抖
		if(k4!=1)						//如果確定按下
		{ 
			P2=0X00;					 //滅顯示
		 	TR0=0;						//關(guān)定時(shí)器0	
			set=!set;					//取反set標(biāo)志位,以切換調(diào)節(jié)方向
			TR1=0;						//關(guān)定時(shí)器1
			dx_nb=set;
			if(set){
				Red_nb=1;		//南北紅燈標(biāo)志
				Yellow_nb=1;	//南北黃燈標(biāo)志
				Green_nb=1;     //南北綠燈標(biāo)志
			}else{
				Red_dx=1;		//東西紅燈標(biāo)志
				Yellow_dx=1;	//東西黃燈標(biāo)志
				Green_dx=1;     //東西綠燈標(biāo)志
			}
			do
			{
				display(); 			   //調(diào)用顯示,用于延時(shí)
			}				
			while(k4!=1);			  //等待按鍵釋放
		}
	}	

	if(k5!=1)							//當(dāng)K5(禁止)鍵按下時(shí)
	{
	   	display();       				//調(diào)用顯示,用于延時(shí)消抖
	   	if(k5!=1)						//如果確定按下
	   	{ 	
	    	TR0=0;						//關(guān)定時(shí)器
			P2=0x00;					//滅顯示
			Red_dx=1;
			Red_nb=1;					//全部置紅燈
			TR1=0;
			sec_dx=00;					//四個(gè)方向的時(shí)間都為00
			sec_nb=00;
			do
			{
				display(); 				//調(diào)用顯示,用于延時(shí)
			}	
			while(k5!=1);			//等待按鍵釋放	
	   	}
	}
	if(k6!=1)							//當(dāng)K6(夜間模式)按下 
	{
	   	display();       				//調(diào)用顯示,用于延時(shí)消抖 
	   	if(k6!=1)						//如果確定按下
	   	{ 	
	    	TR0=0;						//關(guān)定時(shí)器
			P2=0x00;
			TR1=1;
			sec_dx=00;					//四個(gè)方向的時(shí)間都為00
			sec_nb=00;
			do
			{
				display(); 			  //調(diào)用顯示,用于延時(shí)
			}	
			while(k6!=1);			//等待按鍵釋放	
	   	}
	}
}
void display(void) //顯示子程序
{		
	buf[1]=sec_nb/10; 		//第1位 東西秒十位
	buf[2]=sec_nb%10; 		//第2位 東西秒個(gè)位
	buf[3]=sec_dx/10; 		//第3位 南北秒十位
	buf[0]=sec_dx%10; 		//第4位 南北秒個(gè)位		
	P1=0xff;          		// 初始燈為滅的
	P0=0x00;				 滅顯示
	P1=0xfe;           		//片選LED1
	P0=table[buf[1]];		//送東西時(shí)間十位的數(shù)碼管編碼			
	delay(1);				//延時(shí)
	P1=0xff;				//關(guān)顯示
	P0=0x00;				//滅顯示
						   
	P1=0xfd;             	//片選LED2
	P0=table[buf[2]];		 //送東西時(shí)間個(gè)位的數(shù)碼管編碼
	delay(1);				 //延時(shí)
	P1=0xff;				//關(guān)顯示
	P0=0x00;				//關(guān)顯示
	P1=0Xfb;		  		//片選LED3
	P0=table[buf[3]];		//送南北時(shí)間十位的數(shù)碼管編碼
	delay(1);				//延時(shí)
	P1=0xff;				 //關(guān)顯示
	P0=0x00;				 //關(guān)顯示
	P1=0Xf7;				 //片選LED4	
	P0=table[buf[0]];		//送南北時(shí)間個(gè)位的數(shù)碼管編碼
	delay(1);				//延時(shí)
}

void time0(void) interrupt 1 using 1  	//定時(shí)中斷子程序
{
	TH0=0X3C;							//重賦初值
	TL0=0XB0;							//12m晶振50ms//重賦初值
	TR0=1;								//重新啟動(dòng)定時(shí)器
	countt0++;							//軟件計(jì)數(shù)加1
	if(countt0==10)						//加到10也就是半秒
	{
		if((sec_nb<=5)&&(dx_nb==0)&&(shansuo==1))  		//東西黃燈閃		
        {
			Green_dx=0;
			Yellow_dx=0;
		}		   				
	    if((sec_dx<=5)&&(dx_nb==1)&&(shansuo==1))  		//南北黃燈閃		
        {  
			Green_nb=0;
			Yellow_nb=0;
		}	
	}
		
	if(countt0==20)	                  	// 定時(shí)器中斷次數(shù)=20時(shí)(即1秒時(shí))
	{	countt0=0;						//清零計(jì)數(shù)器
		sec_dx--;						//東西時(shí)間減1
		sec_nb--;						//南北時(shí)間減1

		if((sec_nb<=5)&&(dx_nb==0)&&(shansuo==1))  		//東西黃燈閃		
        {
			Green_dx=0;
			Yellow_dx=1;
		}		   				
	    if((sec_dx<=5)&&(dx_nb==1)&&(shansuo==1))  		//南北黃燈閃		
        {  
			Green_nb=0;
			Yellow_nb=1;
		}		 						
		if(sec_dx==0&&sec_nb==5) 		//當(dāng)東西倒計(jì)時(shí)到0時(shí),重置5秒,用于黃燈閃爍時(shí)間   
		{
			sec_dx=5;
			shansuo=1;
		}
		if(sec_nb==0&&sec_dx==5)		//當(dāng)南北倒計(jì)時(shí)到0時(shí),重置5秒,用于黃燈閃爍時(shí)間   
		{
			sec_nb=5;
			shansuo=1;
		}
		if(dx_nb==0&&sec_nb==0)			//當(dāng)黃燈閃爍時(shí)間倒計(jì)時(shí)到0時(shí),
		{
			P2=0x00;					//重置東西南背方向的紅綠燈
			Green_nb=1;
			Red_dx=1;
			dx_nb=!dx_nb;
			shansuo=0;
			sec_nb=set_timenb;			//重賦南北方向的起始值
			sec_dx=set_timenb+5;		//重賦東西方向的起始值
		}		
		if(dx_nb==1&&sec_dx==0)			//當(dāng)黃燈閃爍時(shí)間到
		{
			P2=0X00;					//重置東西南北的紅綠燈狀態(tài)
			Green_dx=1;					 //東西綠燈亮
			Red_nb=1;					 //南北紅燈亮
			dx_nb=!dx_nb;				 //取反
			shansuo=0;					//閃爍
			sec_dx=set_timedx;			//重賦東西方向的起始值
			sec_nb=set_timedx+5;		//重賦南北方向的起始值
		}
	}	
}

系統(tǒng)硬件框圖

img

7 設(shè)計(jì)報(bào)告

13017字設(shè)計(jì)報(bào)告,內(nèi)容包括硬件設(shè)計(jì)、軟件設(shè)計(jì)、軟硬件框圖、調(diào)試、結(jié)論等

img

8 資料清單(提供資料清單所有文件):

0、常見使用問題及解決方法–必讀?。。?!
10、講解視頻
1、仿真圖
2、程序源碼
3、功能要求
4、原理圖PCB
5、開題報(bào)告
6、元器件清單
7、設(shè)計(jì)報(bào)告
8、軟硬件流程框圖
9、實(shí)物圖片和說明
Altium Designer 安裝破解
KEIL+proteus 單片機(jī)仿真設(shè)計(jì)教程
KEIL安裝破解
Proteus元器件查找
Proteus安裝
Proteus簡易使用教程
單片機(jī)學(xué)習(xí)資料
相關(guān)數(shù)據(jù)手冊
答辯技巧
設(shè)計(jì)報(bào)告常用描述
鼠標(biāo)雙擊打開查找嘉盛單片機(jī)51 STM32單片機(jī)課程畢業(yè)設(shè)計(jì).url

img

設(shè)計(jì)資料下載鏈接:

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

相關(guān)推薦

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