基于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++;
		}
}

发布了6 篇原创文章 · 获赞 6 · 访问量 295

猜你喜欢

转载自blog.csdn.net/qq_45385706/article/details/104911827