你对花样流水灯了解多少?怎样用查表法去实现

硬件电路图设计

本文仿真采用Proteus和Keil C51编译器。其中Proteus可以仿真分析各种模拟器件和集成电路,C51可完成编程、编译链接和仿真调试,并能生成Hex文件。通过Keil C51和Proteus的联调实现仿真编程,来模拟流水灯效果。

硬件电路采用单片机最小的系统,外部晶振12MHz,利用P0口和P2口作为数据输出端口。由于P0口是一个8位漏极开路的双向I/O口,所以外接LED串上电阻在连接电源,P2口也是外接LED串上电阻在连接电源,形成两组8个LED。当单片机输出1高电平对应的LED灯熄灭,当单片机输出0低电平时则点亮。

你对花样流水灯了解多少?怎样用查表法去实现

硬件电路图

C语言程序

程序相对简单,首先需要构造一个延时子功能函数,延时为毫秒级别,定义两个数组分别对应不用花样流水灯方式,其中Pattern_P0和Pattern_P2分别赋值给P0和P2流水数据,通过定时器定时P0和P2依次查表加1赋值,从而控制每个LED灯的状态。另外,程序将流水灯每个状态的间隔时间进宏定义,这使得修改流水扥的运行速度十分方便。

/*

代码来自小武哥编程,分享编程点点滴滴

*/

#include <reg52.h>

typedef unsigned char uchar;

typedef unsigned int uint;

#define TIME 120 // 设定流水灯间隔时间

// P0显示 LED 码号

uchar code Pattern_P0[]=

{

// 1 2 3 4 5 6 7 8

0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3F,0x7f, // 1

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff, // 2

0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,

0x55,0xaa,0x18,0xff,0x0f,0xf0,0x00,0xff, // 3

0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xfc,0xfe,

0xfc,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0xff, // 4

0x00,0xff,0xf0,0x0f,0xf0,0xff,0x00,0xff,

0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, // 5

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 6

0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,

0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00, // 7

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 8

0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,

0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,

};

// P2显示 LED 码号

uchar code Pattern_P2[]=

{

// 1 2 3 4 5 6 7 8

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,// 1

0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3F,0xff,

0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,// 2

0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,

0x55,0xaa,0x18,0xff,0x0f,0xf0,0x00,0xff,// 3

0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xfc,0xfe,

0xfc,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0xff,// 4

0x00,0xff,0xf0,0x0f,0xf0,0xff,0x00,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,// 5

0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,

0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,// 6

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,// 7

0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,

0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,// 8

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,

};

void DelayMS(uint x)

{

uchar t;

while(x--)

{

for(t=120;t>0;t--);

}

}

void main()

{

uint i;

while(1)

{

for(i=0;i<136;i++)

{

P0=Pattern_P0[i];

P2=Pattern_P2[i];

DelayMS(TIME );

}

}

}

实验演示

以上程序编译成功后,在Proteus上仿真输出结果,可以看到数据流水灯整体鲜果还是不错的,整个实验已完成。希望对大家有所帮助,分享编程实例,关注小武哥编程。

你对花样流水灯了解多少?怎样用查表法去实现


分享到:


相關文章: