细数实现流水灯的三种代码形式
在上篇博文发出之后,有同学说,程序代码太繁琐了,不如用移位啊,数组啊一步就搞定了。由于是入门,我们当然是一步一步来了。这里我们来看一看实现流水灯的三种代码书写形式:
①顺序赋值式
#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,给低电平,其余位都给高电平,再加上延迟函数,即实现了流水灯,这里解释一下,延时函数中的数字是我们可以更改的,以调试效果最佳为好。
好了,以上就是这三种实现代码了,后面有很好了,我们再补充。
细数实现流水灯的三种代码形式相关推荐
- 51单片机制作花式流水灯的三种方式总结与仿真运行
制作流水灯,一共有三种方式,分别是左右移位,延时,与定时器(计数器)方式 其中移位方式较为简便,常与简单的延时一同使用在各类工程中.除此之外,也可以直接操作寄存器改变灯的亮度. 延时方式通过改变占空比 ...
- 【单片机基础】stc89c52单片机实现流水灯的三种编程方式
效果图 实现流水灯的第一种方式 /* 来回点亮LED的第一种方法 */ #include <reg52.h>//包含51一些特殊功能寄存器 #define uchar unsigned c ...
- 51单片机流水灯的三种实现方法
首先,介绍下原理.下图为主控芯片和流水灯模块的原理图.流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯.相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可. ...
- 简单51单片机c语言编程流水灯,51单片机如何实现流水灯?51单片机实现流水灯的三种方法详细分析...
描述 首先,介绍下原理.下图为主控芯片和流水灯模块的原理图.流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯.相反,如果要LED灯熄灭,就要把P1口的电平变为高电平 ...
- 基于51单片机的八位流水灯(三种形式)
写一下寒假做的51小项目. 基本项目 基于AT89C51的流水灯:流水灯共八个,可以实现交替闪烁,一起闪烁,左右流水灯等效果. 模式一:按动key1,实现1,3,5,7和2,4,6,8交替闪烁: 模式 ...
- 51单片机(二)流水灯的几种实现方法
流水灯的几种实现方法 一.暴力法 二.数组法 三.循环左移法 一.暴力法 直接对P1寄存器的每一位进行重命名,然后点亮第一个-->延时-->熄灭第一个.点亮第二个-->延时--> ...
- ML之MLiR:利用多元线性回归法,从大量数据(csv文件)中提取五个因变量(输入运输任务总里程数、运输次数、三种不同的车型,预测需要花费的小时数)来预测一个自变量
ML之MLiR:利用多元线性回归法,从大量数据(csv文件)中提取五个因变量(输入运输任务总里程数.运输次数.三种不同的车型,预测需要花费的小时数)来预测一个自变量 输出结果 代码设计 from nu ...
- 机器数的三种表示形式---原码、补码、反码和移码
疫情严重,没去上班,总结学习一下.武汉加油,中国加油. 一.真值和机器数 介绍机器数的三种表示形式之前,先介绍一下真值和机器数. 带+.-符号的数叫真值,把符号数字化得到的数称为机器数(1表示-,0表 ...
- IP 地址的三种表示形式
使用TCP/IP协议进行网络应用开发的朋友首先要面对的就是对IP地址信息的处理.IP地址其实有三种不同的表示格式: 1)Ascii(网络点分字符串)- 2) 网络地址(32位无符号整 ...
- JAVA编写程序,打印九九乘法表(涵盖三种表达形式)
运用java写出九九乘法表可以概括为三种表达形式 一是长方型 二是正三角型 三是倒三角型 无论是那种,用的都是for循环. 思路: 用两个for循环嵌套循环出因子a乘因子b等于乘积,外循环代表因子a ...
最新文章
- HighLight selected features
- c#课程设计---猜猜看游戏
- 学习mysql触发器遇到的问题
- include require区别
- Java EE开发三剑客现状及发展浅析
- SAP IBASE在solution manager里的场景
- Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER will not be exported or published. Runtim
- 多php共用一个mysqli连接,在pHP中使用MySQLi连接到多个数据库
- python 3.5 import theano ::hypot error
- 普通程序员能实现财务自由吗?
- Pandas新增数据列
- iview+Collapse折叠面板动态操作表单
- 逆转ACE《逆转裁判3》中文汉化版发布!
- Get busy living--or get busy dying
- 分享一些Python导图与速查表
- 初始脚本一键搞定虚拟机
- IDEA 如何控制编辑左侧的功能图标 ICON
- 常见功能测试点的测试用例集合--51testing
- linux操作系统_1991年8月25日,Linux操作系统诞生
- 用Python对案例进行Ridge算法和Lasso算法的比较