在上篇博文发出之后,有同学说,程序代码太繁琐了,不如用移位啊,数组啊一步就搞定了。由于是入门,我们当然是一步一步来了。这里我们来看一看实现流水灯的三种代码书写形式:


①顺序赋值式

#include<reg52.h>#define uchar  unsigned char
#define uint   unsigned int sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;/* ********************************************* */
// 函数名称: Delay()
// 函数功能:毫秒延时
/* ********************************************* */void delay(uint z)
{uint x,y;for(x = 0; x < z; x++)for(y = 0; y < 113; y++);
}
// 函数名称: main()
// 函数功能: 实现一个LED灯一闪一闪的效果void main(void)
{while(1){LED1 = 0;           //灯亮delay(1000);        //持续亮1sLED1 = 1;           //灯灭delay(1000);        //持续灭1sLED2 = 0;delay(1000);LED2 = 1;delay(1000);LED3 = 0;delay(1000);LED3 = 1;delay(1000);LED4 = 0;           //灯亮delay(1000);        //持续亮1sLED4 = 1;           //灯灭delay(1000);        //持续灭1sLED5 = 0;delay(1000);LED5 = 1;delay(1000);LED6 = 0;delay(1000);LED6 = 1;delay(1000);LED7 = 0;delay(1000);LED7 = 1;delay(1000);} }

     这个便是我们昨天列出的程序,是的,这个程序代码十分冗长,但是这个程序最大的特点就是逻辑简单,用来入门,以及理解单片机的控制原理,以及sbit的用法,再合适不过了。这里对于这段代码我们就不多说了。

②移位操作式

#include <reg52.h>#define uint unsigned int/* ********************************************* */
// 函数名称: delay()
// 函数功能:毫秒延时
/* ********************************************* */void delay(uint z)
{uint x,y;for(x = 0; x < z; x++)for(y = 0; y < 113; y++);
}/* ***************************************************** */
// 函数名称:main()
// 函数功能:实现流水灯效果
// 入口参数:无
// 出口参数:无
/* ***************************************************** */void main(void)
{int i;                     //循环变量while(1)                      {P2 = 0xff;                //设定LED灯初始值delay(1000);for(i = 0;i < 8;i++){P2 = P2 << 1;      //移位、依次点亮delay(1000);       //延时}}
}

      这段代码较上一段代码,很明显简明多了,但是逻辑性强了些,下面我们来解释一下功能函数,以及它的亮点之所在--移位。先说移位,即C语言中的移位运算符,左移运算符<<、右移运算符>>;对于移位运算符,我们简单地介绍一下,

 << 左移运算符:

              移位规则:左边抛弃,右边补零

 >>右移运算符

             移位规则: 左边用0补充,右边丢弃;

      具体函数来说,首先 赋值语句  P2 = 0xff; 0xff转换为二进制即是11111111,八个一,这里实现的作用便是给P2端口的8个I\O口全部赋高电平1,对于LED灯来说,也就是灭;接着for循环,i加1,往左移动一位,随着补0操作,即实现了对应端口的LED灯点亮,如此循环往复,也就实现了流水灯操作。

③数组赋值式

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned intuchar code table[7] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数组/* ********************************************* */
// 函数名称: Delay()
// 函数功能:毫秒延时
/* ********************************************* */void delay(uint z)
{uint x,y;for(x = 0; x < z; x++)for(y = 0; y < 113; y++);
}
/* ***************************************************** */
// 函数名称:main()
// 函数功能:实现流水灯效果
// 入口参数:无
// 出口参数:无
/* ***************************************************** */void main()
{uchar i;while(1){for(i=0;i<8;i++){P2 = table[i];delay(300);}}
}

不得不说,这段代码,就是前两串代码的进阶版了,因为这里引用到了数组,我也最欣赏这种代码的书写方式。

具体代码而言:

    uchar code table[7] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} ; 对于数组定义,方便分析,我们把所有十六进制转换为二进制:

0xfe:11111110          0xfd:11111101      0xfb:11111011    0xf7:11110111  ;

0xef:11101111          0xdf:11011111     0xbf:10111111     0x7f:01111111  ;

     这样一写,我们就看的很清楚了,和上一串代码中的移位操作,可以说有异曲同工之妙。

具体功能函数而言,很简单,就是一个for循环,i累加一次,给P2端口赋一个值,数组的定义我们知道,

      table[0] = 0xfe、table[1] = 0xfd、table[2] = 0xfb ......table[7] = 0x7f  ; 这里明白为什么要定义这样的数组了吧,P2口共8个端口,我们每次一个位置0,给低电平,其余位都给高电平,再加上延迟函数,即实现了流水灯,这里解释一下,延时函数中的数字是我们可以更改的,以调试效果最佳为好。

    好了,以上就是这三种实现代码了,后面有很好了,我们再补充。

细数实现流水灯的三种代码形式相关推荐

  1. 51单片机制作花式流水灯的三种方式总结与仿真运行

    制作流水灯,一共有三种方式,分别是左右移位,延时,与定时器(计数器)方式 其中移位方式较为简便,常与简单的延时一同使用在各类工程中.除此之外,也可以直接操作寄存器改变灯的亮度. 延时方式通过改变占空比 ...

  2. 【单片机基础】stc89c52单片机实现流水灯的三种编程方式

    效果图 实现流水灯的第一种方式 /* 来回点亮LED的第一种方法 */ #include <reg52.h>//包含51一些特殊功能寄存器 #define uchar unsigned c ...

  3. 51单片机流水灯的三种实现方法

    首先,介绍下原理.下图为主控芯片和流水灯模块的原理图.流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯.相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可. ...

  4. 简单51单片机c语言编程流水灯,51单片机如何实现流水灯?51单片机实现流水灯的三种方法详细分析...

    描述 首先,介绍下原理.下图为主控芯片和流水灯模块的原理图.流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯.相反,如果要LED灯熄灭,就要把P1口的电平变为高电平 ...

  5. 基于51单片机的八位流水灯(三种形式)

    写一下寒假做的51小项目. 基本项目 基于AT89C51的流水灯:流水灯共八个,可以实现交替闪烁,一起闪烁,左右流水灯等效果. 模式一:按动key1,实现1,3,5,7和2,4,6,8交替闪烁: 模式 ...

  6. 51单片机(二)流水灯的几种实现方法

    流水灯的几种实现方法 一.暴力法 二.数组法 三.循环左移法 一.暴力法 直接对P1寄存器的每一位进行重命名,然后点亮第一个-->延时-->熄灭第一个.点亮第二个-->延时--> ...

  7. ML之MLiR:利用多元线性回归法,从大量数据(csv文件)中提取五个因变量(输入运输任务总里程数、运输次数、三种不同的车型,预测需要花费的小时数)来预测一个自变量

    ML之MLiR:利用多元线性回归法,从大量数据(csv文件)中提取五个因变量(输入运输任务总里程数.运输次数.三种不同的车型,预测需要花费的小时数)来预测一个自变量 输出结果 代码设计 from nu ...

  8. 机器数的三种表示形式---原码、补码、反码和移码

    疫情严重,没去上班,总结学习一下.武汉加油,中国加油. 一.真值和机器数 介绍机器数的三种表示形式之前,先介绍一下真值和机器数. 带+.-符号的数叫真值,把符号数字化得到的数称为机器数(1表示-,0表 ...

  9. IP 地址的三种表示形式

    使用TCP/IP协议进行网络应用开发的朋友首先要面对的就是对IP地址信息的处理.IP地址其实有三种不同的表示格式:   1)Ascii(网络点分字符串)-        2) 网络地址(32位无符号整 ...

  10. JAVA编写程序,打印九九乘法表(涵盖三种表达形式)

    运用java写出九九乘法表可以概括为三种表达形式 一是长方型 二是正三角型 三是倒三角型 无论是那种,用的都是for循环. 思路: 用两个for循环嵌套循环出因子a乘因子b等于乘积,外循环代表因子a ...

最新文章

  1. HighLight selected features
  2. c#课程设计---猜猜看游戏
  3. 学习mysql触发器遇到的问题
  4. include require区别
  5. Java EE开发三剑客现状及发展浅析
  6. SAP IBASE在solution manager里的场景
  7. Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER will not be exported or published. Runtim
  8. 多php共用一个mysqli连接,在pHP中使用MySQLi连接到多个数据库
  9. python 3.5 import theano ::hypot error
  10. 普通程序员能实现财务自由吗?
  11. Pandas新增数据列
  12. iview+Collapse折叠面板动态操作表单
  13. 逆转ACE《逆转裁判3》中文汉化版发布!
  14. Get busy living--or get busy dying
  15. 分享一些Python导图与速查表
  16. 初始脚本一键搞定虚拟机
  17. IDEA 如何控制编辑左侧的功能图标 ICON
  18. 常见功能测试点的测试用例集合--51testing
  19. linux操作系统_1991年8月25日,Linux操作系统诞生
  20. 用Python对案例进行Ridge算法和Lasso算法的比较

热门文章

  1. 学习环境搭建:UDK2017 下载以及编译
  2. 自学android编程教程,安卓编程入门教程 安卓编程如何自学
  3. 音乐网站搭建源码Sourcecode
  4. 不可见的unicode字符
  5. 使用字典暴力破解练习
  6. ThinkPHP5旅游管理系统
  7. SQL入门教程(一):基础知识
  8. Fiddler4 抓包分析(基础版)
  9. 华为交换机导入配置_华为交换机配置文件导入 华为s5700交换机配置教程
  10. 关于soapUi工具的安装使用教程