国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

51單片機——交通燈

這篇具有很好參考價值的文章主要介紹了51單片機——交通燈。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

原理圖

51單片機——交通燈

功能描述

??1、基本功能就是如同紅綠燈一般,不做贅述。
??2、紅燈時長和綠燈時長可通過按鍵設(shè)置,即按鍵列中的上面4個,當(dāng)這4個按鍵有一個按下后便進入時長設(shè)置功能,設(shè)置完成后按最下面兩個按鍵(緊急控制按鈕)任意一個便可退出該功能。
??3、有緊急控制功能,按下緊急控制按鈕后,便進入該功能,保持紅燈或綠燈常亮,且關(guān)閉數(shù)碼管,當(dāng)按下時長控制按鈕即最上面的4個按鈕便可退出該功能。

效果展示

51單片機——交通燈

代碼

#include <reg52.h>

//數(shù)碼管選擇位
sbit EW_1=P1^0;		   
sbit EW_2=P1^1;
sbit NS_1=P1^2;		   
sbit NS_2=P1^3;

sbit add_red_time=P1^4;		   		//加紅燈時間按鈕
sbit add_green_time=P1^5;	   		//加綠燈時間按鈕
sbit reduce_red_time=P1^6;		   	//減紅燈時間按鈕
sbit reduce_green_time=P1^7;	   	//減綠燈時間按鈕
sbit NS_led=P2^6;	   				//南北向燈緊急控制按鈕
sbit EW_led=P2^7;	   				//東西向燈緊急控制按鈕

sbit EW_red=P2^0;	   				//東西向紅燈
sbit EW_green=P2^1;	   				//東西向綠燈
sbit EW_yellow=P2^2;	   		    //東西向黃燈
sbit NS_red=P2^3;	   				//南北向紅燈
sbit NS_green=P2^4;	   				//南北向綠燈
sbit NS_yellow=P2^5;	   			//南北向黃燈


char count=0;						//計數(shù),count=20表示1s
char red_time=30;					//紅燈停留時間
char green_time=25;					//綠燈停留時間
char yellow_time=0;					//黃燈停留時間
char NS_second=0;					//南北紅綠燈秒計時
char EW_second=0;		    		//東西紅綠燈秒計時
char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};		//共陽數(shù)碼管段碼表,仿真中用的是共陰數(shù)碼管,所以使用時需對段碼取反
char display_data[4]={0};			//show_data[0]顯示南北計時十位,show_data[1]顯示南北計時個位,show_data[2]顯示東西計時十位,show_data[3]顯示東西計時個位
char temp_data[4]={0};

char NS_R_G_mode=0;					//南北紅綠燈亮模式  0  紅燈  1  綠燈  2  黃燈
char EW_R_G_mode=1;					//東西紅綠燈亮模式  0  紅燈  1  綠燈  2  黃燈

bit NS_R_G_flag=0;					//南北紅綠燈標(biāo)識位  0  紅燈  1  綠燈 
bit EW_R_G_flag=0;					//東西紅綠燈標(biāo)識位  0  紅燈  1  綠燈 

void delay(unsigned int i)			//簡單延時
{
	while(i--);
}

void Timer_init()					//定時器初始化
{
	//定時50ms
    TMOD = 0x01;					//定時器方式1
    TH0 = 0x3C;						//定時器賦初值
    TL0 = 0xB0;
    EA = 1;							//開啟總中斷
    ET0 = 1;						//開啟定時器中斷
    TR0 = 1;						//開啟定時器
}

void Init()							//系統(tǒng)初始化
{
	P0=0x00;
	P2=0x00;
	EW_1=1;		   
	EW_2=1;
	NS_1=1;
	NS_2=1;
	NS_led=1;
	EW_led=1;
	NS_second=red_time;				//默認(rèn)初始時南北向燈亮紅燈,并賦紅燈時長
	EW_second=green_time;			//默認(rèn)初始時東西向燈亮綠燈,并賦綠燈時長
	yellow_time=red_time-green_time;//黃燈時間為紅燈時間與綠燈時間差
	Timer_init();
}

void NS_SMG_drive(char *buff)		//南北向數(shù)碼管驅(qū)動
{
	//顯示十位
	NS_1=0;
	NS_2=1;
	P0=~smgduan[buff[0]];           //段碼取反
	delay(5); 						//間隔一段時間掃描	
	P0=0x00;						//消隱

	//顯示個位
	NS_1=1;
	NS_2=0;
	P0=~smgduan[buff[1]];
	delay(5); 
	P0=0x00;

	//關(guān)閉南北向數(shù)碼管
	NS_1=1;
	NS_2=1;
}

void EW_SMG_drive(char *buff)		//東西向數(shù)碼管驅(qū)動
{
	//顯示十位
	EW_1=0;
	EW_2=1;
	P0=~smgduan[buff[2]];           //段碼取反
	delay(5); 						//間隔一段時間掃描	
	P0=0x00;						//消隱

	//顯示個位
	EW_1=1;
	EW_2=0;
	P0=~smgduan[buff[3]];
	delay(5); 	
	P0=0x00;

	//關(guān)閉東西向數(shù)碼管
	EW_1=1;		   
	EW_2=1;
}

void data_del(char *buff,char data1,char data2)	//數(shù)據(jù)處理
{
	buff[0]=data1/10;							//取data1的十位
	buff[1]=data1%10;							//取data1的個位
	buff[2]=data2/10;							//取data2的十位
	buff[3]=data2%10;							//取data2的個位
}

void Time_del()									//計時處理
{
	if(count>=20)								//判斷是否滿1s
	{
		NS_second--;							//南北向燈計時自減
		EW_second--;							//東北向燈計時自減
		switch(NS_R_G_mode)						//南北向燈
		{
			case 0:								//紅燈
			{
				if(NS_second<0)
				{
					NS_second=green_time;		//開始綠燈倒計時
					NS_R_G_mode=1;   			//紅燈亮完綠燈亮
				}				
			}break;
			case 1:								//綠燈
			{
				if(NS_second<0)
				{
					NS_second=yellow_time;		//開始黃燈倒計時
					NS_R_G_mode=2;   			//綠燈亮完黃燈亮					
				}		
			}break;
			case 2:								//黃燈
			{
				if(NS_second<0)
				{
					NS_second=red_time;			//開始紅燈到計時
					NS_R_G_mode=0;   			//黃燈亮完紅燈亮					
				}		
			}break;
			default:break;
		}
		switch(EW_R_G_mode)						//東西向燈
		{
			case 0:								//紅燈
			{
				if(EW_second<0)
				{
					EW_second=green_time;		//開始綠燈倒計時
					EW_R_G_mode=1;   			//紅燈亮完綠燈亮
				}				
			}break;
			case 1:								//綠燈
			{
				if(EW_second<0)
				{
					EW_second=yellow_time;		//開始黃燈倒計時
					EW_R_G_mode=2;   			//綠燈亮完黃燈亮					
				}		
			}break;
			case 2:								//黃燈
			{
				if(EW_second<0)
				{
					EW_second=red_time;			//開始紅燈倒計時
					EW_R_G_mode=0;   			//黃燈亮完紅燈亮					
				}		
			}break;
			default:break;
		}
		count=0;								//計數(shù)值清零
	}
}

void R_G_Y_led()								//紅綠燈驅(qū)動
{
	switch(NS_R_G_mode)							//南北向
	{
		case 0:									//紅燈
		{
			NS_yellow=0;						//黃燈滅
			NS_red=1;							//紅燈亮
		}break;
		case 1:									//綠燈
		{
			NS_red=0;							//紅燈滅
			NS_green=1;							//綠燈亮
		}break;
		case 2:									//黃燈
		{
			NS_green=0;							//綠燈滅
			if(count<10)						//黃燈以1hz頻率閃爍
				NS_yellow=1;
			else
				NS_yellow=0;			
		}break;
		default:break;		
	}
	switch(EW_R_G_mode)							//東西向
	{
		case 0:									//紅燈
		{
			EW_yellow=0;						//黃燈滅
			EW_red=1;							//紅燈亮
		}break;
		case 1:									//綠燈
		{
			EW_red=0;							//紅燈滅
			EW_green=1;							//綠燈亮
		}break;
		case 2:									//黃燈
		{
			EW_green=0;							//綠燈滅
			if(count<10)						//黃燈以1hz頻率閃爍
				EW_yellow=1;
			else
				EW_yellow=0;			
		}break;
		default:break;		
	}
}

void Set_time()									//設(shè)置紅綠燈亮的時長
{
	if((add_red_time==0)||(add_green_time==0)||(reduce_red_time==0)||(reduce_green_time==0))//設(shè)置紅綠燈時長時任一設(shè)置按鈕都可觸發(fā)
	{
		TR0 = 0;								//關(guān)閉定時器
		P2=0x00;								//清零P2寄存器
		EW_led=1;								//EW_led、NS_led引腳也在P2寄存器內(nèi),但是后面需要這兩個按鈕結(jié)束設(shè)置紅綠燈時長任務(wù),故而這兩個引腳要拉高
		NS_led=1;
		while(1)
		{
			data_del(temp_data,red_time,green_time);//顯示當(dāng)前紅綠燈時長
			NS_SMG_drive(temp_data);
			EW_SMG_drive(temp_data);
			if(add_red_time==0)					//判斷加紅燈時間按鈕是否按下
			{
				delay(5);						//消抖
				if(add_red_time==0)
				{
					red_time++;					//紅燈時間自加
					if(red_time>99)				//限制紅燈時間最大值為99
						red_time=99;
					data_del(temp_data,red_time,red_time);//南北向數(shù)碼管顯示紅燈時長
					NS_SMG_drive(temp_data);
				}while(!add_red_time);			//等待加紅燈時間按鈕彈起
			}
			if(add_green_time==0)				//判斷加綠燈時間按鈕是否按下
			{
				delay(5);
				if(add_green_time==0)
				{
					green_time++;				//綠燈時間自加
					if(green_time>95)			//限制綠燈時間最大值95
						green_time=95;
					data_del(temp_data,green_time,green_time);//東西向數(shù)碼管顯示綠燈時長
					EW_SMG_drive(temp_data);
				}while(!add_green_time);		//等待加綠燈時間按鈕彈起
			}
			if(reduce_red_time==0)				//判斷減紅燈時間按鈕是否按下
			{
				delay(5);
				if(reduce_red_time==0)
				{
					red_time--;					//紅燈時間自減
					if(red_time<10)				//限制紅燈時間最小值10
						red_time=10;
					data_del(temp_data,red_time,red_time);
					NS_SMG_drive(temp_data);
				}while(!reduce_red_time);		//等待減紅燈時間按鈕彈起
			}
			if(reduce_green_time==0)			//判斷減綠燈時間按鈕是否按下
			{
				delay(5);
				if(reduce_green_time==0)
				{
					green_time--;				//綠燈時間自減
					if(green_time<5)			//限制綠燈時間最小值5
						green_time=5;
					data_del(temp_data,green_time,green_time);
					EW_SMG_drive(temp_data);
				}while(!reduce_green_time);		//等待減綠燈時間按鈕彈起
			}
			if((NS_led==0)||(EW_led==0))		//任一緊急控制按鈕按下則結(jié)束設(shè)置紅路燈時長任務(wù)
			{
				break;
			}
		}while((!NS_led)||(!EW_led));			//等待緊急控制按鈕彈起
		TR0 = 1;								//開啟定時器
		yellow_time=red_time-green_time;		//更新黃燈時間
	}
}

void Urgent()									//紅綠燈緊急控制
{
	if((NS_led==0)||(EW_led==0))				//任一緊急控制按鈕按下觸發(fā)
	{
		TR0 = 0;								//關(guān)閉定時器
		P2=0x00;
		EW_led=1;
		NS_led=1;

		EW_1=1;									//關(guān)閉所有數(shù)碼管
		EW_2=1;
		NS_1=1;
		NS_2=1;
		while((!NS_led)||(!EW_led));			//判斷緊急控制按鈕按是否彈起
		while(1)
		{
			if(NS_R_G_flag)						//根據(jù)NS_R_G_flag狀態(tài)交替亮紅燈或者綠燈
			{
				NS_green=1;	
				NS_red=0;					
			}	
			else
			{
				NS_red=1;	
				NS_green=0;				
			}
			if(EW_R_G_flag)						//根據(jù)EW_R_G_flag狀態(tài)交替亮紅燈或者綠燈
			{
				EW_green=1;	
				EW_red=0;									
			}
			else
			{
				EW_red=1;
				EW_green=0;						
			}	
			if(NS_led==0)						//判斷南北向緊急控制按鈕是否按下
			{
				delay(5);
				if(NS_led==0)
				{
					NS_R_G_flag=!NS_R_G_flag;	//NS_R_G_flag狀態(tài)取反				
				}while(!NS_led);				//等待南北向緊急控制按鈕彈起
			}
			if(EW_led==0)						//判斷東西向緊急控制按鈕是否按下
			{
				delay(5);
				if(EW_led==0)
				{
					EW_R_G_flag=!EW_R_G_flag;	//EW_R_G_flag狀態(tài)取反						
				}while(!EW_led);				//等待東西向緊急控制按鈕彈起
			}	
			if((add_red_time==0)||(add_green_time==0)||(reduce_red_time==0)||(reduce_green_time==0))//任一紅綠燈設(shè)置時長按鈕按下結(jié)束緊急控制人物
			{
				TR0 = 1;						//開啟定時器
				break;
			}
		}while((!add_red_time)||(!add_green_time)||(!reduce_red_time)||(!reduce_green_time));//等待紅綠燈時間設(shè)置按鈕彈起	
		P2=0x00;
		EW_led=1;
		NS_led=1;
	}
}

void main()
{
	Init();
	while(1)
	{
		Time_del();								//時間處理
		data_del(display_data,NS_second,EW_second);//數(shù)據(jù)處理
		NS_SMG_drive(display_data);				//南北向數(shù)碼管驅(qū)動
		EW_SMG_drive(display_data);				//東西向數(shù)碼管驅(qū)動
		R_G_Y_led();							//紅綠燈驅(qū)動
		Set_time();								//紅綠燈時長設(shè)置
		Urgent();								//緊急控制
	}
}

void Timer0(void) interrupt 1					//定時器中斷
{
    TH0 = 0x3C;
    TL0 = 0xB0;
	count++;									//觸發(fā)中斷后計數(shù)值自加,定時器中斷每50ms觸發(fā)一次
}


工程下載

鏈接:https://pan.baidu.com/s/1P0Gj6PmNfffJdsEe5j6JGA
提取碼:0yzj

由于后續(xù)發(fā)現(xiàn)了些小問題,程序有所修改,網(wǎng)盤中的代碼由于一些原因暫時不能更新,以本篇博客為準(zhǔn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-504288.html

到了這里,關(guān)于51單片機——交通燈的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 基于51單片機的簡易交通燈仿真代碼講解

    基于51單片機的簡易交通燈仿真代碼講解

    J028 51單片機簡易交通燈易懂版_仿真+代碼+報告講解 仿真圖proteus 7.8 程序編譯器:keil 4/keil 5 編程語言:C語言 51單片機簡易交通燈易懂版仿真代碼講解 狀態(tài)1:南北方向綠燈通行12秒,東西紅燈禁止通行15秒,分別倒計時; 狀態(tài)2:南北方向黃燈提醒3秒,東西繼續(xù)紅燈倒計時;

    2024年02月02日
    瀏覽(25)
  • 基于AT89C51單片機的交通燈設(shè)計

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

    點擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/87779238?spm=1001.2014.3001.5503 源碼獲取 主要內(nèi)容: 在日常生活中,交通燈是一項必不可少的公共設(shè)施,可 以維護道路的暢通和交通的秩序。如若交通燈發(fā)生故障,那 么后果可想而知。因此,交通燈

    2024年02月08日
    瀏覽(25)
  • 基于51單片機十字路口紅綠燈交通燈+緊急模式

    基于51單片機十字路口紅綠燈交通燈+緊急模式

    +無黃燈+緊急 仿真:proteus 7.8 程序編譯器:keil 4/keil 5 編程語言:C語言 設(shè)計編號:J010 十字路口交通燈由紅、綠兩色LED顯示器組成,LED顯示器顯示切換倒計時,以秒為單位,每秒更新一次;為確保安全,綠LED計數(shù)到0轉(zhuǎn)紅,經(jīng)5秒延時(顯示紅色0)后,另一道開始綠色倒計時。

    2024年02月04日
    瀏覽(82)
  • 75、基于51單片機交通燈+人行道+左轉(zhuǎn)系統(tǒng)設(shè)計(程序+原理圖+Proteus仿真+參考論文+開題報告+任務(wù)書+元器件清單等)

    75、基于51單片機交通燈+人行道+左轉(zhuǎn)系統(tǒng)設(shè)計(程序+原理圖+Proteus仿真+參考論文+開題報告+任務(wù)書+元器件清單等)

    近 年來隨著科技的飛速發(fā)展,單片機的應(yīng)用正在不斷深入,同時帶動傳統(tǒng)控制檢測技術(shù)日益更新。在實時檢測和自動控制的單片機應(yīng)用系統(tǒng)中,單片機往往作為一個核心部件來使用,僅單片機方面知識是不夠的,還應(yīng)根據(jù)具體硬件結(jié)構(gòu)軟硬件結(jié)合,加以完善。 十字路口車輛

    2024年02月11日
    瀏覽(22)
  • 基于51單片機簡易十字路口交通燈_5s全黃閃爍

    基于51單片機簡易十字路口交通燈_5s全黃閃爍

    (程序+仿真+參考報告) 仿真:proteus 7.8 程序編譯器:keil 4/keil 5 編程語言:C語言 設(shè)計編號:J007 交通燈運行狀態(tài): (1)模式1:東西向紅燈與南北向綠燈亮5s; (2)模式2:東西南北方向均黃燈閃爍5s(5次); (3)模式3:東西向綠燈與南北向紅燈各5s; (4)模式4:東西南

    2024年02月07日
    瀏覽(91)
  • 基于AT89C51單片機的交通燈設(shè)計與仿真

    基于AT89C51單片機的交通燈設(shè)計與仿真

    點擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/87763760?spm=1001.2014.3001.5503 源碼獲取 主要內(nèi)容: 設(shè)計一個能夠控制十二盞交通信號燈的模擬系統(tǒng),:利用單片機的定時器定時,令十字路口的紅綠燈交替點亮和熄滅,并用LED燈顯示倒計時間。 基本要

    2024年02月08日
    瀏覽(18)
  • 基于AT89C51單片機的十字路口交通燈設(shè)計

    基于AT89C51單片機的十字路口交通燈設(shè)計

    點擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/87849986?spm=1001.2014.3001.5503 源碼獲取 主要內(nèi)容: 本項目中采用單片機 AT89C51為中心器件來設(shè)計交通信號燈控制器, 系統(tǒng)實用性強、操作簡單、擴展性強。本設(shè)計系統(tǒng)就是由單片機最小系統(tǒng)、交通燈

    2024年02月09日
    瀏覽(95)
  • 基于51單片機交通燈控制器(東西通行_南北通行_按鍵啟動)

    基于51單片機交通燈控制器(東西通行_南北通行_按鍵啟動)

    管制+啟動+黃燈閃爍 仿真:proteus 7.8 程序編譯器:keil 4/keil 5 編程語言:C語言 設(shè)計編號:J012 LED燈的定時控制;數(shù)碼管的顯示及閃爍;獨立按鍵的讀取與判斷;定時器的設(shè)置與應(yīng)用。 單片機控制東西、南北這兩組交通燈LED,同時在數(shù)碼管上顯示剩余時間,當(dāng)剩余時間少于5s時

    2024年02月04日
    瀏覽(17)
  • 基于51單片機十字路交通燈仿真_黃燈閃爍_正常模式+夜間模式+緊急模式

    基于51單片機十字路交通燈仿真_黃燈閃爍_正常模式+夜間模式+緊急模式

    (程序+仿真+仿真視頻) 仿真:proteus 7.8 程序編譯器:keil 4/keil 5 編程語言:C語言 設(shè)計編號:J002 51單片機十字路交通燈仿真_黃燈閃爍+夜間+緊急 通過單片機模擬交通燈,東西方向黃綠紅,南北方向黃綠紅的工作方式。 1、顯示時間倒計時; 2、夜晚能夠進行所有黃燈閃爍;

    2024年02月10日
    瀏覽(14)
  • 15-基于單片機的交通燈系統(tǒng)設(shè)計(原理圖+仿真+說明書)

    15-基于單片機的交通燈系統(tǒng)設(shè)計(原理圖+仿真+說明書)

    資料包含:設(shè)計全套資料(精品) 原理圖工程文件 原理圖截圖 仿真模型工程文件 仿真截圖 說明書19236字 英文文獻及翻譯 答辯PPT visio流程圖工程 資料鏈接 本設(shè)計是基于單片機的交通燈控制系統(tǒng)設(shè)計,通過對路口設(shè)置的交通指示燈和時間顯示裝置的控制,給行人和車輛的通

    2024年02月10日
    瀏覽(62)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包