项目16—用51单片机实现十字路口红绿灯

仿真图如下:

 要写的程序:

 main.c

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar cp,cp1,sec,flash;
uchar seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
#include<display.c>			   
#include<key.c>
#include<time.c>
void timer0_isr(void) interrupt 1
{
	TH0 = (65536 - 2000) / 256;
	TL0 = (65536 - 2000) % 256;
	cp++;
	if(cp >= 250){cp1++;cp = 0;}
	if(cp1 >= 2){cp1 = 0;sec--;}
	if(sec <= 0)sec=11;
	time();	
//	display();
	
}

void timer0_init()
{
	TMOD = 0x01;
	TH0 = (65536 - 2000) / 256;
	TL0 = (65536 - 2000) % 256;
	EA = 1;
	TR0 = 1;
	ET0 = 1;
}

void main()
{
	timer0_init();                                                                                                                                                         
	while(1)
	{
		display();
		key();
	}
}

display.c

sbit RED_A=P3^5;
sbit YELLOW_A=P3^6;
sbit GREEN_A=P3^7;
sbit RED_B=P1^2;
sbit YELLOW_B=P1^3;
sbit GREEN_B=P1^4;
uchar flash_count = 0;//闪硕次数
Oreration_Type = 1;
void delay(uint x)
{   
	uchar t;
	while(x--)
	{
		for(t=120;t>0;t--);
	}
}				   
void display()
{
	switch(Oreration_Type)
	{
		case 1:
			RED_A=1;YELLOW_A=0;GREEN_A=0;
		    RED_B=0;YELLOW_B=0;GREEN_B=1;
			if(sec==3)
			{
				Oreration_Type = 2;
				sec=3;
			}
			break;
		case 2:
			delay(500);
			YELLOW_A=~YELLOW_A;
			if(++flash_count !=6)
				 return;
			flash_count=0;	
			Oreration_Type = 3;
			break;
		case 3:
			RED_A=0;YELLOW_A=0;GREEN_A=1;
		    RED_B=1;YELLOW_B=0;GREEN_B=0;
			if(sec==3)
			{
				Oreration_Type = 4;
				sec=3;
			}
			break;
		case 4:
			delay(500);
			YELLOW_B=~YELLOW_B;
			if(++flash_count !=6)
				return;
			flash_count=0;
			Oreration_Type = 1;
			break;
		case 5:
			RED_A=0;YELLOW_A=1;GREEN_A=0;
		    RED_B=0;YELLOW_B=1;GREEN_B=0;
		//	delay(2000);
		//	Oreration_Type = 1;
			break;

	}
}

key.c

unsigned char key_i;
sbit k1=P3^1;
sbit k2=P3^2;
sbit k3=P3^3;
sbit k4=P3^4;
void key()
{
	if(k1 == 0)
	{
		delay(100);
		if(k1 == 0)
		{
			key_i++;
			if(key_i >= 3)key_i = 0;
		}
		while(k1 == 0);
	}
	if(k2 == 0)
	{
		delay(100);
		if(k2 == 0)
		{
			if(key_i == 1){sec++;if(sec >= 10)sec = 9;}
		}
		while(k2 == 0);
	}
	if(k3 == 0)
	{
		delay(100);
		if(k3 == 0)
		{
			if(key_i == 2){sec--;if(sec <= 0)sec = 0;}
		
		}
		while(k3 == 0);
	}
	if(k4 == 0)
	{
		delay(100);
		if(k4 == 0)Oreration_Type = 5;
		while(k4 == 0);
	}	
}

time.c

void time ()
{
	
	uchar i;
	P0 = 0xff;
	switch(i)
	{
 			
			case 0:P2=0x08;P0=seven_seg[sec / 10];break;
			case 1:P2=0x10;P0=seven_seg[sec % 10];break;
	}i++;if(i >= 2)i = 0;
	
}	

运行结果:

每次11秒倒计时。

  • 10
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单旦羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值