首页 > 其他分享 >51单片机入门流水灯

51单片机入门流水灯

时间:2023-11-16 14:32:31浏览次数:37  
标签:P2 LED 入门 51 unsigned 单片机 流水 延时 sbit

(文章目录)


前言

上次已经实现了LED的点亮了,这篇文章将带大家实现流水灯。

一、延时函数

要想实现流水灯首先就得知道什么是延时函数,延时函数的作用就是等待。比如延时一毫秒就是让程序在这里等待一毫秒。延时函数的本质就是执行一些空指令,因为执行指令需要耗费时间,所以执行一定数量的空指令就能达到延时的效果。

延时函数的实现 这里的延时函数就是不断的在执行;表达式来达到延时的效果。

/*延时函数
单位:ms
x:延时的数值
*/
void delayms(unsigned int x)
{
   unsigned char i;
	 while(x--)
	 {
		 for(i=0;i<113;i++);
	 }
}

二、流水灯代码

下面就是流水灯的代码了,其实操作起来也是非常简单的。不过这样写一个流水灯看起来实在是太过于复杂了,下面将对代码进行整改。

#include <reg52.h>

/*LED灯端口定义*/
sbit LED0 = P2^0;
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit LED4 = P2^4;
sbit LED5 = P2^5;
sbit LED6 = P2^6;
sbit LED7 = P2^7;

/*延时函数
单位:ms
x:延时的数值
*/
void delayms(unsigned int x)
{
   unsigned char i;
	 while(x--)
	 {
		 for(i=0;i<113;i++);
	 }
}


void main()
{
	
	while(1)
	{
		LED0 = 0;
		delayms(1000);
		LED1 = 0;
		delayms(1000);
		LED2 = 0;
		delayms(1000);
		LED3 = 0;
		delayms(1000);
		LED4 = 0;
		delayms(1000);
		LED5 = 0;
		delayms(1000);
		LED6 = 0;
		delayms(1000);
		LED7 = 0;
		delayms(1000);
		LED0 = LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = LED7 = 1;	
	}
}

三、代码改进

上篇文章我们已经讲到了8个LED灯分别接到了P2.0---P2.7上面。所以我们可以直接对P2端口进行操作实现点亮LED灯。 默认状态LED灯都为灭,也就是状态都为1。所以P2.0---P2.7的8个端口状态为 1111 1111。 我们只需要让其中一个位变成0即可让LED灯点亮。 对P2直接进行操作让第一个LED灯点亮就是对P2赋值如下: 1111 1110 换成16进制也就是0xfe 下面的代码就可以点亮第一个LED了

P2 = 0xfe;

所以可以直接对P2进行操作达到流水灯的效果。

#include <reg52.h>

/*延时函数
单位:ms
x:延时的数值
*/
void delayms(unsigned int x)
{
   unsigned char i;
	 while(x--)
	 {
		 for(i=0;i<113;i++);
	 }
}


void main()
{
	int i = 0;
	while(1)
	{
		
		for(i = 0; i < 8; i ++ )
		{
			P2 = ~(1<<i);
			delayms(1000);
		}
	}
		
}

板子上面有8个LED灯,所以这里设计了一个for循环。利用左移操作和取反操作实现了流水灯的效果。 简单解释一下这个for循环实现流水灯的原理 一开始i=0 P2 = ~(1<<0)相当于是1111 1110 i = 2时P2 = ~(1<<1)相当于是1111 1101 后面的以此类推,这里0移到到了哪里哪个LED就会被点亮了。 对左移和取反操作还不熟悉的同学建议去加强一下C语言的知识。

总结

流水灯的点亮就介绍到这里了,大家主要是掌握sbit位定义和直接操作P2进行流水灯的点亮。

标签:P2,LED,入门,51,unsigned,单片机,流水,延时,sbit
From: https://blog.51cto.com/u_16153875/8419653

相关文章

  • 快速入门:构建您的第一个 .NET Aspire 应用程序
    前言云原生应用程序通常需要连接到各种服务,例如数据库、存储和缓存解决方案、消息传递提供商或其他Web服务。.NETAspire旨在简化这些类型服务之间的连接和配置。在本快速入门中,您将了解如何创建.NETAspireStarter应用程序模板解决方案。准备条件要使用.NETAspire,您需......
  • 【LGR-166-Div.4】洛谷入门赛17
    【LGR-166-Div.4】洛谷入门赛#17比赛地址这次是div4的难度,整体不算是很难,很适合小白玩家[10月入门赛-A]食堂题目描述为了给师生提供良好的用餐体验,洛谷小学的食堂坚持现炒、现做每一道菜肴。洛谷小学一共有\(a\)名老师和\(b\)名学生。食堂的营养师为每位师生的用餐进......
  • 异常处理入门
    异常处理入门执行过程中发生异常的事件可以分为两大类Error(错误):java虚拟机无法解决的严重问题,如:JVM系统内部错误,资源耗尽等情况。StackOverflowError[栈溢出]和OOM(outofmemory),Error是严重错误,程序会崩溃Exception:其他因编程错误或偶然的外在因素导致的一般......
  • FPGA入门学习笔记001
    1、assignassign为连续赋值语句,通常用于组合逻辑电路,例如:assignled_out=(key_in==0)?a:b;2、timescale例如:`timescale1ns/1ps定义了一个仿真精度。'1ns'为仿真步进,例如设置100的延时'#100',则实际延时100*1ns。'1ps'为仿真精度,设定延时,可以精确到小数点后两位,例......
  • 这是我在51CTO博客的第一篇博文
    大家好这是我的第一篇文章,文章略浅,请多关照校验字符的表达式后面我会持续努力争取分享更多的知识......
  • VSCode插件开发入门
    来源:https://zhuanlan.zhihu.com/p/99198980内容提要VSCode组成结构插件在VSCode中能做什么编写Helloworld了解插件生命周期主要配置和APIsWebView示例VSCode组成结构VSCode是基于Electron构建的,主要由三部分构成:Electron:UIMonacoEditorExt......
  • 作为一个入门级Centos系统管理员 应该掌握哪些命令
    文件和目录管理:ls:列出目录内容。lscd:切换目录。cd/path/to/directorycp:复制文件或目录。cpsourcedestinationmv:移动或重命名文件或目录。mvsourcedestinationrm:删除文件或目录。rmfilemkdir:创建目录。mkdirdirectorytouch:创建空文件或更新文件的访问和修改时间。touc......
  • vuejs3.0 从入门到精通——项目搭建
    项目搭建一、环境准备软件名称软件版本nodev20.9.0npm10.1.0Windows10专业版22H2vue/cli5.0.8vitev4.5.0二、vite创建项目>npminitvite@latestsaas--templatevue√Selectaframework:»Vue√Selectavariant:»TypeScriptSca......
  • 深入跨域 - 从初识到入门
    前言跨域这两个字就像一块狗皮膏药一样黏在每一个前端开发者身上,无论你在工作上或者面试中无可避免会遇到这个问题。如果在网上搜索跨域问题,会出现许许多多方案,这些方案有好有坏,但是对于阐述跨域的原理和在什么情况下需要用什么方案,缺少系统性的说明。大家在工作中可能因为大佬们......
  • GIT入门
    #GIT笔记安装地址[GitHub下载](https://git-for-windows.github.io/ )[官网下载]( https://git-scm.com/download)##创建库1.初始化库gitinit初始化后产生.git文件2.添加唯一标识  gitconfig--globaluser.name"用户名"  gitconfig--globa......