【51单片机入门】实现流水灯的原理及四种方法(详细易上手型)

这篇具有很好参考价值的文章主要介绍了【51单片机入门】实现流水灯的原理及四种方法(详细易上手型)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

初学单片机,流水灯的实现是必不可少的,下面将介绍流水灯的原理及使用STC-ISP软件延时计算器生成的延时代码实现流水灯的四种方法,最后介绍如何将延时函数模块化。

目录

 一、流水灯原理 

二、循环

三、移位运算符

四、库函数

五、数组

         六、延时函数模块化

  1、Delay.h

  2、Delay.c

  3、 main.c


 一、流水灯原理 

【51单片机入门】实现流水灯的原理及四种方法(详细易上手型)
LED灯原理图
【51单片机入门】实现流水灯的原理及四种方法(详细易上手型)
流水灯原理图

LED的阳极串联一个电阻,然后连接电源VCC,而LED的阴极连接到单片机的P2口,当引脚(P2口)输出高电平即正极(5V)时,LED不亮;当引脚输出低电平即负极(0V)时,LED亮。通过高低变换把电压输出到引脚,从而将LED以流水灯的形式表现出来。

51单片机使用的是TTL电平,规定高电平为5V,低电平为0V。

在写代码时一般用1表示高电平,用0表示低电平。

二、循环

#include <REGX51.H>
#include <INTRINS.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
	_nop_();
	i = 2;
	j = 199;
	do
	   {
		while (--j);
	   } while (--i);
	}
}  //延时代码

void main()
{
	while(1)
	{
	    P2 = 0xFE;//1111 1110
		    Delay(500);
		P2 = 0xFD;//1111 1101
			Delay(500);
		P2 = 0xFB;//1111 1011
			Delay(500);
		P2 = 0xF7;//1111 0111
			Delay(500);
		P2 = 0xEF;//1110 1111
			Delay(100);
		P2 = 0xDF;//1101 1111
			Delay(100);
		P2 = 0xBF;//1011 1111
			Delay(100);
		P2 = 0x7F;//0111 1111
			Delay(100);
	}
		
}

通过调节Delay中的数字来控制每个LED灯的延时时间。

三、移位运算符

#include <REGX51.H>
#include <intrins.h> 
void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}  //延时代码

void main()
{
    unsigned char k=0;
	P2 = 0x01;
	while(1)
	{
		
		P2 = ~(0x01<<k);//0000 0001~1111 1110
		Delay(500);
		k++;
		if(k == 8)
		{
		k = 0;
		}
	}
}
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
注意:移位运算符的操作数不能为负数,如 Num >> -1 错误

四、库函数

#include <REGX51.H>
#include <INTRINS.H>
void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}  //延时代码

void main()
{
	P2 = 0xFE;
	while(1)
	{
		Delay(500);
		P2 = _crol_ (P2, 1);
	}
}
 _crol_ (a , b) 将a进行b位的左位移
 向左循环时,从左边出去会从右边重新补入
_cror_ (c , d) 将c进行d位的右位移
向右循环时,从右边出去会从左边重新补入

五、数组

#include <REGX51.H>
#include <INTRINS.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}  //延时代码

unsigned char led[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
void main()
{
	unsigned char i;
	while(1)
	{
			for(i = 0; i < 8; i++)
		{
			P2 = led[i];
			Delay(500);
		}
	}
}

 六、延时函数模块化

模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其他.c文件想使用其中的代码时,只需要#include “XXX.h”文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等。

以上一段代码为例:

【51单片机入门】实现流水灯的原理及四种方法(详细易上手型)

 1、Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

 2、Delay.c

void Delay(unsigned int xms)		
{
	unsigned char i, j;
	while(xms--)
	{
	i = 2;
	j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

 3、 main.c

#include <REGX51.H>
#include <INTRINS.H>
#include "Delay.h"

void main()
{
	P2 = 0xFE;
	while(1)
	{
		Delay(500);
		P2 = _crol_ (P2, 1);
	}
}

文章为个人总结,技术

有限,如有错漏还要麻烦各位看官指正。文章来源地址https://www.toymoban.com/news/detail-447907.html

到了这里,关于【51单片机入门】实现流水灯的原理及四种方法(详细易上手型)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 汇编语言实现C51单片机点亮流水灯

    P0作输出口,接8只发光二极管,编写程序实现二极管循环点亮 二极管为共阳极连接时,即二极管正极已接通电源,单片机输出接阴极,所以单片机输出为低电平有效。 所以为实现二极管轮流点亮,单片机的输出应为:0FEH,0FDH,0FBH,....0FEH,每输出一种状态,需要延时0.1us. 最后在

    2024年02月06日
    浏览(42)
  • C51单片机实现流水灯的三种编程方法

        初步学习51单片机,总是离不开流水灯。     下面介绍实现流水灯的三种方法。 目录 一、调用数组实现流水灯 二、 移位符实现流水灯 三、采用左右移函数实现流水灯 思路:for循环调用数组当中的进制数后赋值给LED小灯的负极。 移位符:         移位运算符在程序设

    2024年02月01日
    浏览(35)
  • 【51单片机】键控流水灯

    设置k3作为启动键,只有先按下k3才能开始控制流水灯,按下k3后LED闪烁提示开始成功。 在按下k3后,其余键即可控制流水灯。其中k1执行从右到左,k2执行从左到右。 按下k4,执行外部中断,立马中止流水灯运行,需重新按下启动键重启。

    2024年02月06日
    浏览(28)
  • 51单片机按键控制流水灯

    1独立按键的原理图 按键所对应的引脚为P3的0、1、2、3引脚口,并且这里总共有四个独立按键,它们公共的一段都接到了 GND 电源的负极。这样我们就知道按键上电的默认电平为高电平。所以我们只需要控制按键按下时给一个低电平0,不按下时默认高电平1就行。  2按键控制

    2024年02月11日
    浏览(41)
  • 51单片机学习--LED流水灯

    延时代码可通过软件生成,系统频率要和开发板的晶振频率相对应。  

    2024年02月16日
    浏览(40)
  • 51汇编单片机学习(三)八路流水灯

    流水灯主要是在小灯闪烁的基础上对小灯进行移动 八路流水则为赋值一组引脚并对引脚进行定义,在上一篇文章我们能知道当引脚置1时为高电平,此时小灯不亮,引脚置0时,低电平,小灯亮,所以可知在一组引脚中,可设置小灯初始位置从“01111111”开始亮起,而十六进制

    2024年02月07日
    浏览(35)
  • 【51单片机】:闪灯、流水灯(从左往右)、流水灯(从右往左)、蜂鸣器。

            言归正传,一切都回归本源,从51再来一次,首先就是最简单的点灯大师。         这么些年从51 到  32  再到  arduino  再到  ESP  等等,都是从点灯大师开始的。 于是介绍如下: 闪灯 流水灯(从左往右) 流水灯(从右往左) 蜂鸣器         LED灯的原理:LED是发

    2024年02月11日
    浏览(38)
  • 单片机c51中断 — 中断键控流水灯

    项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第五章,中断   在第4章的实例2中,按键检测是采用查询法进行的,其流程图如图所示 问题是这样的:由于查询法 -按键查询、标志位修改及彩灯循环几个环节是串联关系,当CPU运行于彩灯时,将因不能及

    2024年02月08日
    浏览(44)
  • 51单片机通过两个按键控制流水灯方向

    按键一接单片机P3_1,按键2接P3_0 8个流水灯接P2口 以下是代码:

    2024年02月11日
    浏览(34)
  • 【51单片机】按键操作(单个灯闪烁&&流水灯)

    🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 ⭐注意 🍔同一个灯  🏳️‍🌈效果 🏳️‍🌈代码 🏳️‍🌈问题分析 ⭐注意 ⭐P3_1=0,表示按下按键  ⭐为什么while(

    2024年02月01日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包