硬件电路图设计
本文仿真采用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
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上仿真输出结果,可以看到数据流水灯整体鲜果还是不错的,整个实验已完成。希望对大家有所帮助,分享编程实例,关注小武哥编程。