1. 基于proteus的51单片机开发实例(5)--流水灯(跑马灯)

1.1. 实验目的

在实例1和实例2中,我们分别使用了51单片机的P1口和P0口实现对发光二极管的控制,本实例中,将使用51单片机的P2口来控制发光二极管,并且直接用P2口的8个输出脚控制8个发光二极管实现流水灯(跑马灯)的效果。

通过本实例,了解51单片机P2口的内部结构和原理,同时掌握51单片机编程实现端口移位控制。

1.2. 设计思路

本实例中使用单片机的P2端口的8个引脚连接8个发光二极管,使用灌电流的驱动方式驱动发光二极管,编程实现每次控制P2口的1位输出低电平,使对应引脚上的发光二极管点亮。

1.3. 基础知识

本实例涉及的基础知识主要是51单片机P2口的内部结构及原理,以及51单片机编程中的移位实现。

51单片机的P2口即可以作为普通I/O口,也可以作为外部地址总线的高8位接口。图1是51单片机的P2口的内部结构。

51单片机写一个流水灯(基于proteus的51单片机开发实例)(1)

图1 51单片机P2口的内部结构

从图中可以看出,控制信号端决定了模拟开关MUX是处于地址总线接口还是通用I/O接口。当控制信号为0时,模拟开关MUX被拨向下方,这时P2口就可以作为通用I/O端口了。而当控制信号为1时,模拟开关MUX被拨到上方,P2口则被当做地址总线的高8位使用。当P2口被选作通用I/O口时,其内部结构和工作原理与实例1中介绍的P1端口一样。

1.4. 电路设计

本实例的电路如图2所示。使用51单片机的P2口驱动D1~D8这8个发光二极管,从图中可以看出,驱动方式采用的是“灌电流”的驱动方式。

51单片机写一个流水灯(基于proteus的51单片机开发实例)(2)

图2 流水灯电路图

本例中使用了排阻这一电路元件。我们来认识一下排阻这个元器件。

51单片机写一个流水灯(基于proteus的51单片机开发实例)(3)

图3 排阻实物图

排阻(Network Resistor),即网络电阻器(Wire-wound Resistor)。排阻是将若干个参数完全相同的电阻集中封装在一起,组合制成的。它们的一个引脚都连到一起,作为公共引脚。其余引脚正常引出。所以如果一个排阻是由n个电阻构成的,那么它就有n 1只引脚,一般来说,最左边的那个是公共引脚。它在排阻上一般用一个色点标出来。排阻具有装配方便、安装密度高等优点。排阻通常都有一个公共端,在封装表面用一个小白点表示。其颜色通常为黑色或黄色。使用排阻比用若干只固定电阻更方便。

1.5. 程序设计

本实例的程序代码如下。

#include <AT89X52.h> int main(void) { unsigned char i,j; unsigned char LED; LED = 0x01; //×îµÍλLEDµãÁÁ P2 = ~LED; //¹àµçÁ÷Çý¶¯ while(1) { for(i=0;i<250;i ) //Èí¼þÑÓʱ { for(j=0;j<250;j ); } if(LED == 0x80) //ÅжÏÊÇ·ñµ½×î¸ß룬Èç¹ûÁ÷Ë®µ½Í·£¬ÔòÕÛ·µµ½×îµÍλµãÁÁ { LED = 0x01; } else { LED = LED << 1; //ÒÆ룬ÐгÌÁ÷Ë® } P2 = ~LED; } }

程序中,首先将P2.0端口连接的LED灯D1点亮,然后将之熄灭,同时点亮D2......,如此按顺序依次点亮所有8个LED灯。

程序中使用变量LED来依次使P2口的8位按从低到高的顺序输出高电平,点亮对应的LED等。其中使用了移位操作。移位语句如下:

这句话是左移操作,例如:当LED=0x01时,执行左移一位LED<<1后,LED变为0x02。

我们把数据展开来看,就能很好的理解移位操作的原理了,0x01是16进制数据,展开成2进制数后变成0000 0001,左移一位后,变为0000 0010,也就是0x02。左移操作后,最后一位以0填充。

1.6. 实例仿真

在keil下将本程序代码编译后,生成hex文件,将这个HEX文件装载到本实例的proteus电路的51单片机中,点击开始仿真按钮,就可以观察到流水灯(跑马灯)的效果了。

修改程序中延时程序中i或j的值,可以改变流水灯的移动速度。

仿真执行结果如下所示。

1.7. 总结

本实例继续学习单片机的端口结构及原理,学习了P2口的内部结构。经过学习,不但加深了对51单片机端口结构的了解,还学会了如何编程实现移位操作。

,