基於51單片機的交通燈設計

給大家分享一下前段時間做的基於51單片機的交通燈設計,用於大家學習交流,希望能給大家帶來一點點幫助。

所需元器件如下:
STC89C52RC芯片 *1
10K電阻 *1
330Ω電阻 *22
10uF 電解電容 *1
22pF 瓷片電容 *2
12MHz晶振 *1
按鍵 *1
8550 *8
單位7段數碼管 *8
黃色LED *4
紅色LED *4
綠色LED *4

程序代碼如下:

#include"reg51.h"

#define LEDSS1 0     //定義數碼管對應存儲數組下標號
#define LEDSS2 1     //定義數碼管對應存儲數組下標號
#define LEDSN1 2     //定義數碼管對應存儲數組下標號
#define LEDSN2 3     //定義數碼管對應存儲數組下標號
#define LEDSW1 4     //定義數碼管對應存儲數組下標號
#define LEDSW2 5     //定義數碼管對應存儲數組下標號
#define LEDSE1 6     //定義數碼管對應存儲數組下標號
#define LEDSE2 7     //定義數碼管對應存儲數組下標號

sbit NSG=P3^0;       //定義南北方向綠燈
sbit NSY=P3^1;       //定義南北方向黃燈
sbit NSR=P3^2;       //定義南北方向紅燈
sbit WEG=P3^3;       //定義東西方向綠燈
sbit WEY=P3^4;       //定義東西方向黃燈
sbit WER=P3^5;       //定義東西方向紅燈

unsigned char code LED[12]=   //定義數碼管顯示數組
	{
	0XC0,0XF9,0XA4,0XB0,0X99,0X92,
	0X82,0XF8,0X80,0X90,0XFF,0XF6
	};
	
unsigned char code dispbit[8]=  //定義數碼管位選
	{
	0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F
	};
	
unsigned char dat[9]={0,0,0,0,0,0,0,0}; //可調用數碼管顯示數組

void delay(unsigned int x)
{
	unsigned char i;
	while(x--)
	{
		for(i=0;i<100;i++);
	}
}
void save_dat(unsigned char second)
{
	
	dat[LEDSS1]=second/10;   //北方向秒十位存儲
	dat[LEDSS2]=second%10;   //北方向秒個位存儲
	dat[LEDSN1]=second/10;   //南方向秒十位存儲
	dat[LEDSN2]=second%10;   //南方向秒個位存儲
	dat[LEDSW1]=second/10;   //西方向秒十位存儲
	dat[LEDSW2]=second%10;   //西方向秒個位存儲
	dat[LEDSE1]=second/10;   //東方向秒十位存儲
	dat[LEDSE2]=second%10;   //東方向秒個位存儲
}
void main(void)
{
	unsigned char ledcount=0;
	unsigned int circle_count=0;
	unsigned	char second=25;
	unsigned char jtd_status=1;
	unsigned char flash_count=3;

	NSG=1;
	NSY=1;
	NSR=0;
	WEG=1;		
	WEY=1;		
	WER=0;
	save_dat(second);

		while(1)
		{
			switch(jtd_status)
			{
				case 1:
					if(circle_count%200==0)
					{
						NSR=1;
						WER=0;						
						NSG=0;
						WEY=1;
						save_dat(second);
						second--;
						
					}
					if(circle_count>3200)
					{
						circle_count=0;
						jtd_status=2;
					}
				break;
				case 2:
					if(circle_count>200)
					{
						NSG=1;
						circle_count=0;
						save_dat(second);
						second--;
						flash_count--;
						if(flash_count>0)
							jtd_status=3;
						else
							jtd_status=4;
					}
				break;
				case 3:
					if(circle_count>200)
					{
						NSG=0;
						circle_count=0;
						save_dat(second);
						second--;
						jtd_status=2;
						
					}
				break;
				case 4:
					if(circle_count>200)
					{
						NSY=0;
						circle_count=0;
						save_dat(second);
						second--;												
									
						if(second==0)
						{
							jtd_status=5;
							second=25;
						}
					}
				break;
				case 5:
					if(circle_count%200==0)
					{
						NSG=1;
						NSY=1;
						NSR=0;
						WER=1;
						WEY=1;
						WEG=0;
						save_dat(second);
						second--;						
					}
					if(circle_count>3200)
					{
						circle_count=0;
						jtd_status=6;
						flash_count=3;
					}
				break;
				case 6:
					if(circle_count>200)
					{						
						WEG=1;
						circle_count=0;
						save_dat(second);
						second--;
						flash_count--;
						if(flash_count>0)
							jtd_status=7;
						else
							jtd_status=8;
					}
				break;
				case 7:
					if(circle_count>200)
					{
						WEG=0;
						circle_count=0;
						save_dat(second);
						second--;
						jtd_status=6;
						
					}
				break;
				case 8:
					if(circle_count>200)
					{
						circle_count=0;
						WEY=0;
						WEG=1;
						save_dat(second);
						second--;																
						if(second==0)
						{
							jtd_status=1;
							second=25;
							flash_count=3;
						}
					}
				break;
				default:break;
			}
			P2=0xff;
			P0=LED[dat[ledcount]];
			P2=dispbit[ledcount];
			ledcount++;
			if(ledcount>7)
			ledcount=0;
			delay(5);
			circle_count++;
		}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章