51单片机流水灯的三种实现方法「建议收藏」

51单片机流水灯的三种实现方法「建议收藏」首先,介绍下原理。下图为主控芯片和流水灯模块的原理图。流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯。相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可。要实现流水灯功能,我们只要将LED1~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。              实现8个LED流水灯程序用中

大家好,又见面了,我是你们的朋友全栈君。

        首先,介绍下原理。下图为主控芯片和流水灯模块的原理图。流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯。相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可。要实现流水灯功能,我们只要将LED1~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。

       

51单片机流水灯的三种实现方法「建议收藏」

51单片机流水灯的三种实现方法「建议收藏」

        实现8个LED流水灯程序用中文表示为:P1.0低、延时、P1.0高、P1.1低、延时、P1.1高、P1.2低、延时、P1.2高、P1.3低、延时、P1.3高、P1.4低、延时、P1.4高、P1.5低、延时、P1.5高、P1.6低、延时、P1.6高、P1.7低、延时、P1.7高、返回到开始、程序结束。      

        听起来是不是很简单啊!那么下面我们来看下实现流水灯功能的三种常用方法!

第一种,总线方法实现流水灯。

        这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。C程序如下:

#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
code unsigned char tmpled[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义八只LED灯,依次点亮八只LED灯
<pre name="code" class="cpp"> //N毫秒的延时函数

delay_ms(uint ms)      

{

    uint i,j;

    for(i=ms;i>0;i–)

        for(j=114;j>0;j–);

    return 0;  

}

void main(void){unchar i;while (1){for(i=0;i<8;i++) //循环点亮8只LED灯{P1=tmpled[i];delay_ms(500); //延时500毫秒}}}


第二种,移位方法实现流水灯

       上一种方法是逐个将P1口的LED灯点亮来实现闲的,因此程序看起来有一点复杂。下面将一种用移位的方法。采用循环程序结构编程。首先在程序开始给P1.0口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。下面来看具体程序:

#include<reg52.h>
<pre name="code" class="cpp">#define uchar unsigned char
#define uint  unsigned int
<pre name="code" class="cpp"> //N毫秒的延时函数

delay_ms(uint ms)      

{

    uint i,j;

    for(i=ms;i>0;i–)

        for(j=114;j>0;j–);

    return 0;  

}


void main(){uchar a,i;while(1){a=0xfe; //点亮第一位LED灯for(i=0;i<8;i++){P1=a;a=a<<1; //左移一位a=a|0x01; //左移一位后与0x01相或,保证左移后最低位为1 delay_ms(500); }}}


第三种,库函数实现流水灯

        C52 提供了  _crol_(字符循环左移);_cror_ (字符循环右移)等库函数,包含在头文件intrins.h中。接下来还是先讲一下移位的小知识点吧。

         左移。C52中操作符为“<<”,每执行一次左移指令,被操作的数将最高位移入单片机PSW寄存器的CY位。CY位中原来的数丢弃,最低位补0,其他位依次向左移动一位。相信大家学过C语言都清楚吧,这里就不多说了。而函数_crol_的作用是循环左移。它会将最高位移入最低位,其他位依次向左移一位。用法:x=0xfe;x=_crol_(x,1);//循环左移移位。接下来看具体程序:

#include<reg52.h>
#include<intrins.h>
<pre name="code" class="cpp"><pre name="code" class="cpp">#define uchar unsigned char
#define uint  unsigned int


<pre name="code" class="cpp"><pre name="code" class="cpp"> //N毫秒的延时函数

delay_ms(uint ms)      

{

    uint i,j;

    for(i=ms;i>0;i–)

        for(j=114;j>0;j–);

    return 0;  

}



void main(){uint a;a=0xfe;while(1){P1=a;a=_crol_(a,1); delay_ms(500);}}


知识点:PSW寄存器。

        PSW(Program StatusWord)全称为程序状态字标志寄存器,是一个8位寄存器,位于单片机片内的特殊功能寄存器区,字节地址D0H,用来存放运算结果的一些特征,如有无进位、借位等。使用汇编编程时PSW寄存器很有用,但在利用C语言编程时,编译器会自动控制该寄存器,很少人为操作它,大家只需做简单了解即可。其每位的具体含义

如图1 所示:

51单片机流水灯的三种实现方法「建议收藏」

图 1  PWD(Program Status Word)寄存器

    ①CY:进位标志位,它表示运算是否有进位(或借位)。如果操作结果在最高位有进位(加法)或者借位(减法),则该位为1,否则为0。
    ②AC:辅助进位标志,又称半进位标志,它指两个8位数运算低四位是否有半进位,即低四位相加(或相减)是否进位(或借位),如有,则AC为1,否则为0。
    ③F0:由用户使用的一个状态标志位,可用软件来使它置1或清0;也可由软件来测试它,以控制程序的流向。
    ④RS1、RS0:4组工作寄存器区选择控制位。在汇编语言中这两位用来选择4组工作寄存器区中的哪一组为当前工作寄存区。
    ⑤OV:溢出标志位,反映带符号数的运算结果是否有溢出。有溢出时,此位为1,否则为0。
    ⑥P:奇偶标志位,反映累加器ACC内容的奇偶性,如果ACC中的运算结果有偶数个l(如11001100B,其中有4个1),则P为0,否则P为1。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138925.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月30日 下午5:16
下一篇 2022年5月30日 下午5:36


相关推荐

  • 一个多边形内部有3枚钉子_多边形的内部和外部

    一个多边形内部有3枚钉子_多边形的内部和外部Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)Total Submission(s) : 24 Accepted Submission(s) : 7Problem DescriptionStatement of the Problem Several drawing applications allow us to draw polygons and almost all of the

    2022年8月10日
    6
  • OpenClaw 云端部署与AI自动化实战指南:打造7×24小时智能助理

    OpenClaw 云端部署与AI自动化实战指南:打造7×24小时智能助理

    2026年3月14日
    2
  • WINDOWS 1.0模拟器_modelsim激活成功教程版安装教程

    WINDOWS 1.0模拟器_modelsim激活成功教程版安装教程本教程包括软件下载、激活成功教程文件下载、安装激活成功教程方法,助你一次成功。 软件安装好了却不能用,想必大家都有过这样的痛苦和无奈。这款软件的激活成功教程花了我整整一个下午的时间,期间在网上找了各种方法尝试均以失

    2022年8月3日
    10
  • 【手把手】制作一个简单的HTML网页

    【手把手】制作一个简单的HTML网页新建一个html文件:我要给body添加一些样式,就在head元素上挂载一个style元素。然后,写样式表:效果:这样的话,我们就可以看到body部分了。现在,我给body添加一点padding。页面上看不出区别,让我们打开F12,看一下现在的body变成了什么样子。示意图:从图中可以看出,body元素分为三层,最里面的一层,就是520×500的那部分,这个叫做内部真实空间,也就是说,你可以在里面添加其他元素,比如div元素,p元素,a元素等等。然后中间的一层就是paddin

    2022年7月27日
    21
  • eclipse导入jar包的三种方法

    eclipse导入jar包的三种方法使用 Eclipse 开发应用程序 少不了使用第三方 jar 包 而每次引入 jar 包都是一个不小的问题 不仅那些 jar 包的位置经常弄不清楚 而且很浪费时间 鉴于此 我列举了三种常用的 jar 包引入方式 其中第一种是我们最常用的普通操作方式 而第二种和第三种则是快速版的操作方式 nbsp nbsp 下面看第一种方式 基本步骤式 nbsp nbsp 右键项目属性 选择 Property 在弹出的对话框左侧列表中选择 JavaBuildP

    2026年3月19日
    2
  • 没钱买珍珠首饰,能够画一个[通俗易懂]

    没钱买珍珠首饰,能够画一个

    2022年2月3日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号