基于AT89C51的心形LED流水灯设计

目录
摘要 1
前言 5
第一章 概述 6
1.1什么是单片机 6
1.2单片机的发展 7
1.3 单片机的应用 7
第二章 硬件设计 9
2.1 单片机流水灯电路原理图及工作原理 9
2.2 MCS-51单片机的硬件结构 10
2.4 发光二极管 12
2.5晶体震荡器 13
第三章 软件软件 14
3.1 单片机应用系统的软件设计 14
3.2 单片机流水灯的软件编程 14
第四章 制板与安装 10
4.1 焊接的基本常识 10
4.3 元器件的安装 10
第五章 仿真调试 10
5.1 软件仿真 11
结论 12
致谢 13

第二章 硬件设计
2.1 单片机流水灯电路原理图及工作原理
按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz工作频率,使用AT89C51单片机时无须外扩存储器。因此,本流水灯实际上就是一个带有32个发光二极管的单片机最小应用系统,即为由AT89C51单片机、电阻、发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。其具体的电路原理图组成如下所示:
在这里插入图片描述

                  单片机流水灯的电路原理图

从原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,其他LED的点亮和熄灭的方法同LED1。因此,要实现流水灯功能,我们只要将发光二极管依次点亮、熄灭。本文转载自http://www.biyezuopin.vip/onews.asp?id=14763在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管灯亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。

#include <REGX52.H>
#define	uint	unsigned int
#define	uchar	unsigned char
uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED从低位往高位移
uchar code table1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED从高位往低位移
uchar code table2[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//LED从1个亮到8个都点亮(从低位往高位)
uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//LED从1个亮到8个都点亮(从高位往低位)
uchar code table4[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//LED从8个全亮到一个都不亮(从低位往高位)
uchar code table5[]={0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//LED从8个全亮到一个都不亮(从高位往低位)
uchar code table6[]={0xfe,0xfc,0xfa,0xf6,0xee,0xde,0xbe,0x7e};//LED从低位往高位移(最低位始终为0)
uchar code table7[]={0x7f,0x3f,0x5f,0x6f,0x77,0x7b,0x7d,0x7e};//LED从高位往低位移(最高位始终为0)
uchar i,j;		//定义循环变量
uint tt=70;		//定义时间指数
void delay(uint time)	//延时函数
{
	uint x,y;
	for(x=time;x>0;x--)
	for(y=110;y>0;y--);
}

void disp0()			//状态0 所有LED闪烁3次
{
	for(i=0;i<3;i++)
	{
		P0=~0x00; P2=~0x00; P3=~0x00; P1=~0x00;
		delay(300);
		P0=~0xff; P2=~0xff; P3=~0xff; P1=~0xff;
		delay(300);
	}
}

void disp1()			//状态1 LED顺时针转一圈
{
	for(i=0;i<8;i++)
	{
		P2=~table1[i];
		delay(65);
	}
	P2=~0xff;
	for(i=0;i<8;i++)
	{
		P3=~table1[i];
		delay(65);
	}
	P3=~0xff;
	for(i=0;i<8;i++)
	{
		P1=~table1[i];        
		delay(65);
	}
	P1=~0xff;
	for(i=0;i<8;i++)
	{
		P0=~table0[i];
		delay(65);
	}
	P0=~0xff;
}

void disp2()			//状态2 LED逆时针转一圈
{
	for(i=0;i<8;i++)
	{
		P0=~table1[i];
		delay(65);
	}
	P0=~0xff;
	for(i=0;i<8;i++)
	{
		P1=~table0[i];
		delay(65);
	}
	P1=~0xff;
	for(i=0;i<8;i++)
	{
		P3=~table0[i];
		delay(65);
	}
	P3=~0xff;
	for(i=0;i<8;i++)
	{
		P2=~table0[i];
		delay(65);
	}
	P2=~0xff;
}

void disp3()			//状态3 4个LED同时顺时、逆时针移动1/4圈
{
	for(i=0;i<8;i++)
	{
		P0=~table1[i];
		P1=~table1[i];
		P2=~table1[i];
		P3=~table0[i];
		delay(65);
	}
	for(i=0;i<8;i++)
	{
		P0=~table0[i];
		P1=~table0[i];
		P2=~table0[i];
		P3=~table1[i];
		delay(65);
	}
	P3=~0xff; P0=~0xff; 
}

void disp4()			//状态4  2个LED同时顺时针移动半圈
{
	for(i=0;i<8;i++)
	{
		P2=~table1[i];
		P1=~table1[i];
		delay(65);
	}
	P2=~0xff; P1=~0xff;
	for(i=0;i<8;i++)
	{
		P3=~table1[i];
		P0=~table0[i];
		delay(65);
	}
	P3=~0xff; P0=~0xff;
}

void disp5()			//状态5  2个LED同时逆时针移动半圈
{
	for(i=0;i<8;i++)
	{
		P0=~table1[i];
		P3=~table0[i];
		delay(65);
	}
	P0=~0xff; P3=~0xff;
	for(i=0;i<8;i++)
	{
		P1=~table0[i];
		P2=~table0[i];
		delay(65);
	}
	P1=~0xff; P2=~0xff;
}

void disp6()			//状态6 LED自上而下逐渐点亮(一半点亮一半不亮)
{
	for(i=0;i<8;i++)
	{
		P0=~table3[i];
		P2=~table3[i];
		delay(65);
	}
	P0=~0xff; P2=~0xff;
	for(i=0;i<8;i++)
	{
		P1=~table2[i];
		P3=~table3[i];
		delay(65);
	}
	P1=~0xff; P3=~0xff;
}

void disp7()			//状态7 LED自下而上逐渐点亮(直到全部点亮)
{
	for(i=0;i<8;i++)
	{
		P1=~table3[i];
		P3=~table2[i];
		delay(65);
	}
	for(i=0;i<8;i++)
	{
		P0=~table2[i];
		P2=~table2[i];
		delay(65);
	}
}

void disp8()			//状态8 间断8格的4个LED亮并逆时针旋转
{
	for(j=0;j<2;j++)
	{
		for(i=0;i<8;i++)
		{
			P0=~table1[i];
			P2=~table0[i];
			P1=~table0[i];
			P3=~table0[i];
			delay(65);
		}
		P0=~0xff; P2=~0xff; P1=~0xff; P3=~0xff;
		for(i=0;i<8;i++)
		{
			P0=~table1[i];
			P2=~table0[i];
			P1=~table0[i];
			P3=~table0[i];
			delay(65);
		}
		P0=~0xff; P2=~0xff; P1=~0xff; P3=~0xff;
	}
}

void disp9()			//状态9 间断8格的4个LED亮,然后逆时针逐渐点亮(直到全部点亮)
{
	for(i=0;i<8;i++)
	{
		P0=~table3[i];
		P2=~table2[i];
		P1=~table2[i];
		P3=~table2[i];
		delay(65);
	}
	delay(500);	
}

void disp10()			//状态10 从LED全部亮到全不亮(间断8格的4个LED开始逆时针熄灭)
{
	for(i=0;i<9;i++)
	{
		P0=~table5[i];
		P2=~table4[i];
		P1=~table4[i];
		P3=~table4[i];
		delay(65);
	}
	delay(300);
}

void disp11()			//状态11 间断8格的4个LED亮并顺时针旋转
{
	for(j=0;j<2;j++)
	{
		for(i=0;i<8;i++)
		{
			P0=~table0[i];
			P2=~table1[i];
			P1=~table1[i];
			P3=~table1[i];
			delay(65);
		}
		P0=~0xff; P2=~0xff; P1=~0xff; P3=~0xff;
		for(i=0;i<8;i++)
		{
			P0=~table0[i];
			P2=~table1[i];
			P1=~table1[i];
			P3=~table1[i];
			delay(65);
		}
		P0=~0xff; P2=~0xff; P1=~0xff; P3=~0xff;
	}
}

void disp12()			//间断8格的4个LED亮,然后顺时针逐渐点亮(直到全部点亮)
{
	for(i=0;i<8;i++)
	{
		P0=~table2[i];
		P2=~table3[i];
		P1=~table3[i];
		P3=~table3[i];
		delay(65);
	}
	delay(750);
}

void disp13()			//状态13 从LED全部亮到全不亮(间断8格的4个LED开始顺时针熄灭)
{
	for(i=0;i<9;i++)
	{
		P0=~table4[i];
		P2=~table5[i];
		P1=~table5[i];
		P3=~table5[i];
		delay(65);
	}
	delay(300);
}

void disp14()			//状态14 从LED不亮到全亮(从P0.0、P1.0、P2.0、P3.7开始逐步点亮)
{
	for(i=0;i<8;i++)
	{
		P0=~table2[i];
		P1=~table2[i];
		P2=~table2[i];
		P3=~table3[i];
		delay(65);
	}
}

void disp15()			//状态15 从LED全亮到全不亮(从P0.7、P1.7、P2.7、P3.0开始逐步熄灭)
{
	for(i=0;i<9;i++)
	{
		P0=~table5[i];
		P1=~table5[i];
		P2=~table5[i];
		P3=~table4[i];
		delay(65);
	}
	delay(300);
}

void disp16()			//状态16 LED灯交替闪烁(频率有慢变快)
{
	for(i=0;i<5;i++)
	{
		P0=0xaa; P1=0xaa; P2=0xaa; P3=0xaa;
		delay(65);
		P0=~P0; P1=~P1; P2=~P2; P3=~P3;
		delay(65);
	}
	for(i=0;i<5;i++)
	{
		P0=0xaa; P1=0xaa; P2=0xaa; P3=0xaa;
		delay(200);
		P0=~P0; P1=~P1; P2=~P2; P3=~P3;
		delay(200);
	}
	for(i=0;i<5;i++)
	{
		P0=0xaa; P1=0xaa; P2=0xaa; P3=0xaa;
		delay(300);
		P0=~P0; P1=~P1; P2=~P2; P3=~P3;
		delay(300);
	}
	P0=0x00; P2=0x00; P1=0x00; P3=0x00;
	delay(300);
}


void disp17()			//状态17 LED从P0.7开始逆时针逐步点亮,(循环2次)并且速度会逐步提高
{

	for(i=0;i<8;i++)
	{
		P0=~table3[i];
		delay(65);
	}
	for(i=0;i<8;i++)
	{
		P1=~table2[i];
		delay(65);
	}	
	for(i=0;i<8;i++)
	{
		P3=~table2[i];
		delay(65);
	}	
	for(i=0;i<8;i++)
	{
		P2=~table2[i];
		delay(65);
	}
	P0=~0xff; P1=~0xff; P3=~0xff; P2=~0xff;
/*******************************/
	for(i=0;i<8;i++)
	{
		P0=~table3[i];
		delay(50);
	}
	for(i=0;i<8;i++)
	{
		P1=~table2[i];
		delay(50);
	}	
	for(i=0;i<8;i++)
	{
		P3=~table2[i];
		delay(50);
	}	
	for(i=0;i<8;i++)
	{
		P2=~table2[i];
		delay(50);
	}
	P0=~0xff; P1=~0xff; P3=~0xff; P2=~0xff;	
}

void disp18()			//状态18 LED从P0.7开始逆时针逐步点亮(每亮8位后就熄灭)
{
	for(i=0;i<8;i++)
	{
		P0=~table3[i];
		delay(65);
	}
	P0=~0xff;
	for(i=0;i<8;i++)
	{
		P1=~table2[i];
		delay(65);
	}	
	P1=~0xff;
	for(i=0;i<8;i++)
	{
		P3=~table2[i];
		delay(65);
	}
	P3=~0xff;	
	for(i=0;i<8;i++)
	{
		P2=~table2[i];
		delay(65);
	}
	P2=~0xff;	
}

void disp19()			//状态19 LED从P2.7开始顺时针逐步点亮,(循环2次)并且速度会逐步提高
{
	for(i=0;i<8;i++)
	{
		P2=~table3[i];
		delay(65);
	}
	for(i=0;i<8;i++)
	{
		P3=~table3[i];
		delay(65);
	}	
	for(i=0;i<8;i++)
	{
		P1=~table3[i];
		delay(65);
	}	
	for(i=0;i<8;i++)
	{
		P0=~table2[i];
		delay(65);
	}
	P0=~0xff; P1=~0xff; P3=~0xff; P2=~0xff;
/*******************************/
	for(i=0;i<8;i++)
	{
		P2=~table3[i];
		delay(50);
	}
	for(i=0;i<8;i++)
	{
		P3=~table3[i];
		delay(50);
	}	
	for(i=0;i<8;i++)
	{
		P1=~table3[i];
		delay(50);
	}	
	for(i=0;i<8;i++)
	{
		P0=~table2[i];
		delay(50);
	}
	P0=~0xff; P1=~0xff; P3=~0xff; P2=~0xff;	
}

void disp20()			//状态20 LED从P2.7开始顺时针逐步点亮(每亮8位后就熄灭)
{
	for(i=0;i<8;i++)
	{
		P2=~table3[i];
		delay(65);
	}
	P2=~0xff;
	for(i=0;i<8;i++)
	{
		P3=~table3[i];
		delay(65);
	}	
	P3=~0xff;
	for(i=0;i<8;i++)
	{
		P1=~table3[i];
		delay(65);
	}
	P1=~0xff;	
	for(i=0;i<8;i++)
	{
		P0=~table2[i];
		delay(65);
	}
	P0=~0xff;		
}

void disp21()			//状态21 2个LED开始上下移动半圈
{
	for(i=0;i<8;i++)
	{
		P0=~table1[i];
		P2=~table1[i];
		delay(65);
	}
	P0=~0xff; P2=~0xff;
	for(i=0;i<8;i++)
	{
		P1=~table0[i];
		P3=~table1[i];
		delay(65);
	}
	
	for(i=0;i<8;i++)
	{
		P1=~table1[i];
		P3=~table0[i];
		delay(65);
	}
	P1=~0xff; P3=~0xff;
	for(i=0;i<8;i++)
	{
		P0=~table0[i];
		P2=~table0[i];
		delay(65);
	}
}

void disp22()			//装态22 2个LED自上而下移动(循环5次,且频率渐快,到最快时持续循环16次,然后循环5次频率再逐渐降低)
{	
	for(j=0;j<5;j++)
	{
		for(i=0;i<8;i++)
		{
			P0=~table1[i];
			P2=~table1[i];
			delay(tt);
		}
		P0=~0xff; P2=~0xff;
		for(i=0;i<8;i++)
		{
			P1=~table0[i];
			P3=~table1[i];
			delay(tt);
		}
		P1=~0xff; P3=~0xff;
		tt=tt-10;
	}

	for(j=0;j<16;j++)
	{
		for(i=0;i<8;i++)
		{
			P0=~table1[i];
			P2=~table1[i];
			delay(20);
		}
		P0=~0xff; P2=~0xff;
		for(i=0;i<8;i++)
		{
			P1=~table0[i];
			P3=~table1[i];
			delay(20);
		}
		P1=~0xff; P3=~0xff;
	}
	tt=20;
	for(j=0;j<5;j++)
	{
		for(i=0;i<8;i++)
		{
			P0=~table1[i];
			P2=~table1[i];
			delay(tt);
		}
		P0=~0xff; P2=~0xff;
		for(i=0;i<8;i++)
		{
			P1=~table0[i];
			P3=~table1[i];
			delay(tt);
		}
		P1=~0xff; P3=~0xff;
		tt=tt+10;
	}
	tt=70;	
		
}

void disp23()			//状态23 LED上下交替闪烁
{

	for(i=0;i<2;i++)
	{
		P0=~0x00; P2=~0x00;
		delay(750);
		P0=~0xff; P2=~0xff;
		P1=~0x00; P3=~0x00;
		delay(750);
		P1=~0xff; P3=~0xff;
	}
}

void disp24()			//状态24 LED左右交替闪烁
{
	P1=~0xff; P3=~0xff; P0=~0xff; P2=~0xff;
	for(i=0;i<2;i++)
	{
		P0=~0x00; P1=~0x00;
		delay(750);
		P0=~0xff; P1=~0xff;
		P2=~0x00; P3=~0x00; 
		delay(750);
		P2=~0xff; P3=~0xff;
	}
}

void disp25()			//状态25 LED交替闪烁
{
	for(i=0;i<5;i++)
	{
		P0=0xaa; P1=0xaa; P2=0xaa; P3=0xaa;
		delay(750);
		P0=~P0; P1=~P1; P2=~P2; P3=~P3;
		delay(750);		
	}
}

void disp26()			//状态26 2个LED开始上下移动半圈(LED不亮流水)
{
	P0=~0x00;P1=~0x00;P2=~0x00;P3=~0x00;
	for(i=0;i<8;i++)
	{
		P0=table1[i];
		P2=table1[i];
		delay(200);
	}
	P0=~0x00; P2=~0x00;
	for(i=0;i<8;i++)
	{
		P1=table0[i];
		P3=table1[i];
		delay(200);
	}
	
	for(i=0;i<8;i++)
	{
		P1=table1[i];
		P3=table0[i];
		delay(200);
	}
	P1=~0x00; P3=~0x00;
	for(i=0;i<8;i++)
	{
		P0=table0[i];
		P2=table0[i];
		delay(200);
	}
}

void disp27()			//状态27 逐步顺时针点亮P2、P1的LED,熄灭后,再顺时针点亮P0、P3的LED
{
	P0=~0xff; P1=~0xff; P2=~0xff; P3=~0xff;
	for(j=0;j<2;j++)
	{
		for(i=0;i<8;i++)
		{
			P2=~table3[i];
			P1=~table3[i];
			delay(65);
		}
		P2=~0xff; P1=~0xff;
		for(i=0;i<8;i++)
		{
			P0=~table2[i];
			P3=~table3[i];
			delay(65);
		}
		P0=~0xff; P3=~0xff;
	}
}
			
void disp28()			//状态28 P1、P2和P0、P3交替闪烁
{	
	for(i=0;i<2;i++)
	{
		P1=~0x00; P2=~0x00; P0=~0xff; P3=~0xff; 
		delay(750);
		P1=~0xff; P2=~0xff; P0=~0x00; P3=~0x00; 
		delay(750);
	}
	P1=~0xff; P2=~0xff; P0=~0xff; P3=~0xff; 
}

void disp29()			//状态29 逐步顺时针点亮P2、P1的LED,再顺时熄灭后,再顺时针点亮P0、P3的LED,再顺时熄灭
{	

	P0=~0xff; P1=~0xff; P2=~0xff; P3=~0xff;
	for(j=0;j<2;j++)
	{
		for(i=0;i<8;i++)
		{
			P2=~table3[i];
			P1=~table3[i];
			delay(65);
		}
		for(i=0;i<9;i++)
		{
			P2=~table5[i];
			P1=~table5[i];
			delay(65);
		}
		for(i=0;i<8;i++)
		{
			P0=~table2[i];
			P3=~table3[i];
			delay(65);
		}
		for(i=0;i<9;i++)
		{
			P0=~table4[i];
			P3=~table5[i];
			delay(65);
		}
	}
	delay(200);	
}

void disp30()			//状态30 逐步逆时针点亮P2、P1的LED,熄灭后,再逆时针点亮P0、P3的LED
{
	P0=~0xff; P1=~0xff; P2=~0xff; P3=~0xff;
	for(j=0;j<2;j++)
	{
		for(i=0;i<8;i++)
		{
			P2=~table2[i];
			P1=~table2[i];
			delay(65);
		}
		P2=~0xff; P1=~0xff;
		for(i=0;i<8;i++)
		{
			P0=~table3[i];
			P3=~table2[i];
			delay(65);
		}
		P0=~0xff; P3=~0xff;
	}
}

void disp31()			//状态31 逐步逆时针点亮P2、P1的LED,再逆时熄灭后,再逆时针点亮P0、P3的LED,再逆时熄灭
{
	P0=~0xff; P1=~0xff; P2=~0xff; P3=~0xff;
	for(j=0;j<2;j++)
	{
		for(i=0;i<8;i++)
		{
			P2=~table2[i];
			P1=~table2[i];
			delay(65);
		}
		for(i=0;i<9;i++)
		{
			P2=~table4[i];
			P1=~table4[i];
			delay(65);
		}
		for(i=0;i<8;i++)
		{
			P0=~table3[i];
			P3=~table2[i];
			delay(65);
		}
		for(i=0;i<9;i++)
		{
			P0=~table5[i];
			P3=~table4[i];
			delay(65);
		}
	}
	delay(200);	
}

void disp32()			//状态32 LED自上而下逐步点亮,然后从下往上逐步熄灭
{
	for(i=0;i<8;i++)
	{
		P0=~table3[i];
		P2=~table3[i];
		delay(65);
	}
	for(i=0;i<8;i++)
	{
		P1=~table2[i];
		P3=~table3[i];
		delay(65);
	}
	for(i=0;i<9;i++)
	{
		P1=~table5[i];
		P3=~table4[i];
		delay(65);
	}
	for(i=0;i<9;i++)
	{
		P0=~table4[i];
		P2=~table4[i];
		delay(65);
	}
}

void disp33()			//状态33 LED从左往右开始点亮(直到全亮),然后从左右两边开始熄灭(直到全部熄灭)
{
	for(i=0;i<8;i++)
	{
		P0=~table2[i];
		P1=~table2[i];
		delay(65);
	}
	for(i=0;i<8;i++)
	{
		P2=~table3[i];
		P3=~table2[i];
		delay(65);
	}
	delay(500);
	for(i=0;i<9;i++)
	{
		P2=~table4[i];
		P3=~table5[i];
		P1=~table4[i];
		P0=~table4[i];
		delay(65);
	}
	delay(300);
}

void disp34()			//状态34 LED从左往右开始点亮(直到全亮),然后从中间往左右边熄灭
{
	for(i=0;i<8;i++)
	{
		P2=~table2[i];
		P3=~table3[i];
		delay(65);
	}
	for(i=0;i<8;i++)
	{
		P0=~table3[i];
		P1=~table3[i];
		delay(65);
	}
	delay(500);
	for(i=0;i<9;i++)
	{
		P2=~table5[i];
		P3=~table4[i];
		P1=~table5[i];
		P0=~table5[i];
		delay(65);
	}
	delay(300);	
}

void disp35()			//状态35  从P2.7、P1.7开始同时顺时针旋转,直到LED全亮
{
	for(i=0;i<8;i++)
	{
		P2=~table3[i];
		P1=~table3[i];
		delay(65);
	}
	for(i=0;i<8;i++)
	{
		P3=~table3[i];
		P0=~table2[i];
		delay(65);
	}
}

void disp36()			//状态36  从P0.7、P3.1开始同时逆时针旋转,直到LED全亮
{
	for(i=0;i<8;i++)
	{
		P0=~table3[i];
		P3=~table2[i];
		delay(65);
	}
	for(i=0;i<8;i++)
	{
		P1=~table2[i];
		P2=~table2[i];
		delay(65);
	}
}

void disp37()			//状态37 2个LED自上而下移动,并点亮最下2个LED,然后2个LED再自下而上回去,同时4个LED(上下各2个LED)再来回移动一次
{
	for(i=0;i<8;i++)
	{
		P0=~table1[i];
		P2=~table1[i];
		delay(65);
	}
	P0=~0xff; P2=~0xff;
	for(i=0;i<8;i++)
	{
		P1=~table0[i];
		P3=~table1[i];
		delay(65);
	}
	
	for(i=0;i<8;i++)
	{
		P1=~table7[i];
		P3=~table6[i];
		delay(65);
	}
	P1=~0x7f; P3=~0xfe;
	for(i=0;i<8;i++)
	{
		P0=~table0[i];
		P2=~table0[i];
		delay(65);
	}
	
	for(i=0;i<8;i++)
	{
		P0=~table1[i];
		P2=~table1[i];
		P1=~table1[i];
		P3=~table0[i];
		delay(200);
	}
	
	for(i=0;i<8;i++)
	{
		P0=~table0[i];
		P1=~table0[i];
		P2=~table0[i];
		P3=~table1[i];
		delay(200);
	}	
	P0=~0xff;P1=~0xff; P2=~0xff;P3=~0xff;
}

void disp38()			//状态38 逐步顺时针点亮P2、P1的LED,熄灭后,再顺时针点亮P0、P3的LED
{
	P0=~0xff; P1=~0xff; P2=~0xff; P3=~0xff;
	for(j=0;j<2;j++)
	{
		for(i=0;i<8;i++)
		{
			P2=~table3[i];
			P1=~table3[i];
			delay(65);
		}
		P2=~0xff; P1=~0xff;
		for(i=0;i<8;i++)
		{
			P0=~table2[i];
			P3=~table3[i];
			delay(65);
		}
		P0=~0xff; P3=~0xff;
	}	
}

void disp39()			//状态39 P1、P3LED(下半部分)一直亮,上半部分LED向外扩张亮,然后闪烁3次
{
	P1=~0x00; P3=~0x00;
	for(i=0;i<8;i++)
	{
		P0=~table3[i];
		P2=~table3[i];
		delay(150);
	}
	for(i=0;i<8;i++)
	{
		P0=~table3[i];
		P2=~table3[i];
		delay(300);
	}
	for(i=0;i<4;i++)
	{
		P0=~P0; P2=~P2;
		delay(300);
	}
	delay(750);
}

void disp40()			//状态40 LED从P3.0、P0.7开始逆时针同时熄灭,直到LED全部熄灭
{
	for(i=0;i<9;i++)
	{
		P3=~table4[i];
		P0=~table5[i];
		delay(65);
	}
	for(i=1;i<9;i++)
	{
		P2=~table4[i];
		P1=~table4[i];
		delay(65);
	}
	delay(300);	
}

void disp41()			//状态41 LED从P2.7、P1.7开始顺时针同时熄灭,直到全部熄灭
{
	for(i=0;i<9;i++)
	{
		P2=~table5[i];
		P1=~table5[i];
		delay(65);
	}
	for(i=1;i<9;i++)
	{
		P0=~table4[i];
		P3=~table5[i];
		delay(65);
	}
	delay(300);		
}

void main()
{	
	P0 = P1 = P2 = P3 = 0XFF;
	delay(500);		
	P0 = P1 = P2 = P3 = 0X00;
	delay(1);		
	while(1)
	{	
		disp32();		//状态32 LED自上而下逐步点亮,然后从下往上逐步熄灭
		disp33();		//状态33 LED从左往右开始点亮(直到全亮),然后从左右两边开始熄灭(直到全部熄灭)
		disp37();		//状态37 2个LED自上而下移动,并点亮最下2个LED,然后2个LED再自下而上回去,同时4个LED(上下各2个LED)再来回移动一次
		disp22();		//装态22 2个LED自上而下移动(循环5次,且频率渐快,到最快时持续循环16次,然后循环5次频率再逐渐降低)
		disp0();		//状态0 所有LED闪烁3次
		disp1();		//状态1 LED顺时针转一圈
		disp2();		//状态2 LED逆时针转一圈
		disp3();		//状态3 4个LED同时顺时、逆时针移动1/4圈
		disp4();		//状态4  2个LED同时顺时针移动半圈
		disp5();		//状态5  2个LED同时逆时针移动半圈
		disp6();		//状态6 LED自上而下逐渐点亮(一半点亮一半不亮)
		disp7();		//状态7 LED自下而上逐渐点亮(直到全部点亮)
		disp0();		//状态0 所有LED闪烁3次
		disp8();		//状态8 间断8格的4个LED亮并逆时针旋转
		disp9();		//状态9 间断8格的4个LED亮,然后逆时针逐渐点亮(直到全部点亮)
		disp10();		//状态10 从LED全部亮到全不亮(间断8格的4个LED开始逆时针熄灭)
		disp11();		//状态11 间断8格的4个LED亮并顺时针旋转
		disp12();		//间断8格的4个LED亮,然后顺时针逐渐点亮(直到全部点亮)
		disp13();		//状态13 从LED全部亮到全不亮(间断8格的4个LED开始顺时针熄灭)
		disp14();		//状态14 从LED不亮到全亮(从P0.0、P1.0、P2.0、P3.7开始逐布点亮)   
		disp15();		//状态15 从LED全亮到全不亮(从P0.7、P1.7、P2.7、P3.0开始逐步熄灭)
		disp16();		//状态16 LED灯交替闪烁(频率有慢变快)
		disp17();		//状态17 LED从P0.7开始逆时针逐步点亮,并且速度会逐步提高
		disp18();		//状态18 LED从P0.7开始逆时针逐步点亮(每亮8位后就熄灭)
		disp19();		//状态19 LED从P2.7开始顺时针逐步点亮,(循环2次)并且速度会逐步提高
		disp20();		//状态20 LED从P2.7开始顺时针逐步点亮(每亮8位后就熄灭)
		disp21();		//状态21 2个LED开始上下移动半圈
		disp22();		//装态22 2个LED自上而下移动(循环5次,且频率渐快,到最快时持续循环16次,然后循环5次频率再逐渐降低
		disp23();		//状态23 LED上下交替闪烁
		disp39();		//状态39 P1、P3LED(下半部分)一直亮,上半部分LED向外扩张亮,然后闪烁3次
		disp24();		//状态24 LED左右交替闪烁
		disp25();		//状态25 LED交替闪烁  
		disp8();		//状态8 间断8格的4个LED亮并逆时针旋转
		disp9();		//状态9 间断8格的4个LED亮,然后逆时针逐渐点亮(直到全部点亮)
		disp10();		//状态10 从LED全部亮到全不亮(间断8格的4个LED开始逆时针熄灭)
		disp26();		//状态26 2个LED开始上下移动半圈(LED不亮流水)
		disp27();		//状态27 逐步顺时针点亮P2、P1的LED,熄灭后,再顺时针点亮P0、P3的LED
		disp28();		//状态28 P1、P2和P0、P3交替闪烁
		disp38();		//状态38 逐步顺时针点亮P2、P1的LED,熄灭后,再顺时针点亮P0、P3的LED
		disp29();		//状态29 逐步顺时针点亮P2、P1的LED,再顺时熄灭后,再顺时针点亮P0、P3的LED,再顺时熄灭
		disp30();		//状态30 逐步逆时针点亮P2、P1的LED,熄灭后,再逆时针点亮P0、P3的LED
		disp31();		//状态31 逐步逆时针点亮P2、P1的LED,再逆时熄灭后,再逆时针点亮P0、P3的LED,再逆时熄灭
		disp32();		//状态32 LED自上而下逐步点亮,然后从下往上逐步熄灭
		disp33();		//状态33 LED从左往右开始点亮(直到全亮),然后从左右两边开始熄灭(直到全部熄灭)
		disp37();		//状态37 2个LED自上而下移动,并点亮最下2个LED,然后2个LED再自下而上回去,同时4个LED(上下各2个LED)再来回移动一次
		disp36();		//状态36  从P0.7、P3.0开始同时逆时针旋转,直到LED全亮
		disp40();		//状态40 LED从P3.0、P0.7开始逆时针同时熄灭,直到LED全部熄灭
		disp35();		//状态35  从P2.7、P1.7开始同时顺时针旋转,直到LED全亮
		disp41();		//状态41 LED从P2.7、P1.7开始顺时针同时熄灭,直到全部熄灭
		disp34();		//状态34 LED从左往右开始点亮(直到全亮),然后从中间往左右边熄灭
		disp28();		//状态28 P1、P2和P0、P3交替闪烁

		P0 = P1 = P2 = P3 = 0XFF;
		delay(2000);		

	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 10
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
交通信号灯是城市道路上最常见的设施之一,既起到了保障行人和车辆交通安全的作用,又是城市交通管理的重要组成部分。基于AT89C51单片机的交通灯设计,可以实现自动控制红绿灯信号灯的切换,从而达到合理控制交通流量,避免交通拥堵和事故发生的目的。 具体设计步骤如下: 1. 确定交通信号灯的控制方式:交通信号灯的控制方式主要有手动控制和自动控制两种。在此我们选用自动控制方式,通过AT89C51单片机对交通灯进行控制。 2. 确定交通信号灯的时序:交通信号灯的时序通常为红灯、黄灯、绿灯,不同的交通场合,其时序会有所不同。在此我们假设红灯亮20秒,黄灯亮3秒,绿灯亮15秒。 3. 确定AT89C51单片机的管脚连接:根据交通灯的控制原理,我们可以将AT89C51单片机的P0口连接到红灯、黄灯和绿灯的控制引脚,P1口连接到传感器模块的输出引脚。 4. 编AT89C51单片机程序代码:根据时序和控制原理,编AT89C51单片机程序代码,实现红灯、黄灯和绿灯的自动控制。 5. 将程序代码下载到AT89C51单片机:将编好的程序代码下载到AT89C51单片机中,连接交通灯和传感器模块,即可实现交通灯的自动控制。 总之,基于AT89C51单片机的交通灯设计,可以实现自动控制红绿灯信号灯的切换,从而达到合理控制交通流量,避免交通拥堵和事故发生的目的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

shejizuopin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值