前言:
眼前大家对“单片机流水灯程序c语言分析”大约比较关注,同学们都需要分析一些“单片机流水灯程序c语言分析”的相关资讯。那么小编在网上汇集了一些有关“单片机流水灯程序c语言分析””的相关知识,希望各位老铁们能喜欢,兄弟们快快来学习一下吧!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口的内部结构。
从图中可以看出,控制信号端决定了模拟开关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个发光二极管,从图中可以看出,驱动方式采用的是“灌电流”的驱动方式。
本例中使用了排阻这一电路元件。我们来认识一下排阻这个元器件。
排阻(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单片机端口结构的了解,还学会了如何编程实现移位操作。
标签: #单片机流水灯程序c语言分析