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

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

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

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

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

虛擬商品不可退

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

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

仿真圖proteus 7.8以上

程序編譯器:keil 4/keil 5

編程語言:C語言

設(shè)計編號:J030

1 講解視頻:

包含仿真講解和實物演示

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

2 功能要求

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

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

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

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

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

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

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

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

2. 緊急模式

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

3. 夜間模式

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

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

3 仿真圖:

正常倒計時

imgimg

夜間黃燈閃爍

4 原理圖+PCB

img

img

img

img

5 實物圖

img

6 程序設(shè)計:

img
代碼

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

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

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

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

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

	if(k2!=1)							//當K2(時間減)按鍵按下時
	{		
		display();       				//調(diào)用顯示,用于延時消抖  
		if(k2!=1)						//如果確定按下
		{	
		 	TR0=0;         				//關(guān)定時器0	
			shansuo=0;					//閃爍標志位關(guān)
			P2=0x00;					//滅顯示
			TR1=0;						//關(guān)定時器1	
			if(set==0){//設(shè)置鍵按下
				set_timedx--;   		//南北減1S
			}else{
				set_timenb--;    		//東西減1S
			}
			if(set){
				Red_nb=1;		//南北紅燈標志
				Yellow_nb=1;	//南北黃燈標志
				Green_nb=1;     //南北綠燈標志
			}else{
				Red_dx=1;		//東西紅燈標志
				Yellow_dx=1;	//東西黃燈標志
				Green_dx=1;     //東西綠燈標志
			}
			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)用顯示,用于延時
			}
			while(k2!=1);			   //等待按鍵釋放
		}
	}

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

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

void time0(void) interrupt 1 using 1  	//定時中斷子程序
{
	TH0=0X3C;							//重賦初值
	TL0=0XB0;							//12m晶振50ms//重賦初值
	TR0=1;								//重新啟動定時器
	countt0++;							//軟件計數(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ù)=20時(即1秒時)
	{	countt0=0;						//清零計數(shù)器
		sec_dx--;						//東西時間減1
		sec_nb--;						//南北時間減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) 		//當東西倒計時到0時,重置5秒,用于黃燈閃爍時間   
		{
			sec_dx=5;
			shansuo=1;
		}
		if(sec_nb==0&&sec_dx==5)		//當南北倒計時到0時,重置5秒,用于黃燈閃爍時間   
		{
			sec_nb=5;
			shansuo=1;
		}
		if(dx_nb==0&&sec_nb==0)			//當黃燈閃爍時間倒計時到0時,
		{
			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)			//當黃燈閃爍時間到
		{
			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è)計報告

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

img

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

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

img

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

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

相關(guān)推薦

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