51单片机之LED灯模块篇

news2024/10/7 16:24:59

御风以翔

破浪以飏


🎥个人主页

🔥个人专栏


目录

点亮一盏LED灯 

LED的组成原理

LED的硬件模型

点亮一盏LED灯的程序设计

 LED灯闪烁

LED流水灯 

 独立按键控制LED灯亮灭

独立按键的组成原理

独立按键的硬件模型

  独立按键控制LED灯状态

按键的抖动

 独立按键控制LED灯移位

位移的原理

点亮一盏LED灯 

LED的组成原理

<1>LED即发光二极管,是一种有方向性的半导体固体发光器件,在单片机上是贴片形式

<2>LED的 阳极 串联一个电阻,然后连接到电源VCC,而LED的 阴极 连接到单片机的P2口,如果想把LED灯点亮,就把单片机相关的 I/O 口赋为低电平

<3>单片机中,用 0 表示低电频,用 1 表示高电频

LED的硬件模型

我们可以看到LED连上了单片机的管脚。而单片机需要通过CPU控制寄存器的值,进而通过驱动器加大控制力度,由控制电路输出高低电平

CPU访问寄存器为 1 输出高电频,为 0 输出低电频

点亮LED灯的程序就是让 LED = 0 (低电平),熄灭LED灯的程序就是 LED = 1(高电平)

所以我们只要在对应的寄存器上写 0 或 1 ,即可控制LED的亮灭

点亮一盏LED灯的程序设计

根据硬件原理图和寄存器定义,来对操作寄存器地址,实现灯的点亮

因为单片机只能识别十六进制,所以 1111 1110 要写成0xFE

#include <REGX52.H>

void  main()
{
	while(1)
	{
		P2 = 0xFE;
	}
}

我们发现这里编译器并没有报任何的错误

于是我们选择生成文件,将代码下载到板子上

我们找到对应板子的型号,然后打开程序文件,点击下载

这样我们就点亮了一盏LED灯啦

 LED灯闪烁

<1>通过STC-ISP拷贝延时代码

<2>加入延时,方便观察灯的闪烁

<3>加上while循环,循环的表达式的值为真,LED就会反复不停的亮和灭

#include <REGX52.H>
#include <INTRINS.H>

void Delay500ms(void)	//@12.000MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void  main()
{
	while(1)
	{
		P2 = 0xFE;
		Delay500ms();
		P2 = 0xFF;
		Delay500ms();
	}
}

单片机闪烁

LED流水灯 

我们学习了点亮LED小灯闪烁,现在我们就可以进一步的让LED灯依次亮起来

这就是我们日常中的流水灯

从之前的代码操作可知,我们可以通过对P2的控制来实现8个LED灯的亮灭

我们只要对P2依次赋值就可以啦:

0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F

#include <REGX52.H>
#include <INTRINS.H>

void Delay500ms(void)	//@12.000MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


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

每次延迟500毫秒太单调了,我们可以让流水灯想延迟多少行秒就可以延迟多少行秒

51单片机的数据类型

我们先将 1毫秒 的代码拷贝到我们的编译器上

然后将代码改成 传参类型

void Delay1ms(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;
	while(xms)
	{
	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	xms--;
	}
}

这样我们传多少毫秒就延迟多少毫秒

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

 独立按键控制LED灯亮灭

独立按键的组成原理

独立按键直接用 I/O 口线构成的单个按键电路,其特点是每个按键单独占用一根 I/O 口线,每个按键的工作不会影响其他 I/O 口线的状态

独立按键的硬件模型

<1>独立按键电路构成是由各个按键的一个管脚连接在一起接地,按键其他引脚分别接到单片机 IO 口

<2>单片机的 IO 口既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能,独立按键的一端接地, 另一端与单片机的 I/O 口相连

<3>开始时先给该 IO 口赋一高电频,然后让单片机不断地检测该 I/O 口是否变为低电频,当按键闭合时,即相当于该 I/O 口通过按键与地相连,变成低电频,程序一旦检测到I/O 口变为低电频则说明按键被按下,然后执行相应的指令

当按下k1时,LED小灯D1亮起,松开按键时D1灭掉

#include <REGX52.H>

void main()
{
	P2_0 = 1;       
	while(1)
	{
		if(P3_1 == 0)   //检测按键判断是否点亮LED灯
		{
			P2_0 = 0;   
		}
		else
		{
			P2_0 = 1;   
		}
	}
}

  独立按键控制LED灯状态

按键的抖动

通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的 抖动

按键的效抖

<1>硬件消抖:按键上并联一个电容,利用电容的充放电特性对抖动过程中产生的电压毛刺进行平滑处理,从而实现消抖

<2>软件消抖:通过对按键状态进行两次检测,并引入适当的延时,从而忽略前沿抖动的影响

#include <REGX52.H>

void Delay(unsigned int xms)	//单位毫秒的延时函数
{
	unsigned char i, j;
	while(xms)
	{
	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	xms--;
	}
}

void main()
{
	while(1)
	{
		if(P3_1 == 0)             //当按键按下时K1会与地相连 引脚处会被置低电频,D1点亮
		{
			Delay(20);            //延迟20毫秒
			while(P3_1 == 0);     //当再次按下K1键,引脚处会被置高电频
			Delay(20);
			P2_0 =~P2_0;          //D1按位取反,回到高电频,D1关闭
		}
	}
}

首先检测按键是否处于按下状态,然后进行一段较短时间的延时,再次检测按键状态。如果确认按键仍然被按下,则执行相应的操作(在示例中为 取反  操作),并延时一段时间来避免连续按下造成的快速闪烁。最后,使用一个 while循环 来等待按键被释放

 独立按键控制LED灯移位

通过控制独立按键K1、K2来实现左右移位

位移的原理

#include <REGX52.H>

void Delay(unsigned int xms)   //1毫秒的延迟函数	
{
	unsigned char i, j;
	while(xms--)
	{
	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	}
}

unsigned char LEDNum;          //全局变量初始化为0
void main()
{
	P2 = ~0x01;                //给P2按位取反就是点亮D1
	while(1)
	{
		if(P3_1 == 0)          //检测K1键有没有按下
	  {
		Delay(20);            
		while(P3_1 == 0);      //消抖
		Delay(20);
		
		LEDNum++;              //LEDNum自增
                               //随着K1按键按下,LEDNum二进制变大,LED灯也会往右依次亮起
		if(LEDNum>=8)          //处理边界问题
			LEDNum = 0;
		P2 = ~(0x01<<LEDNum);  //LED的第LEDNum位点亮
	  }
		if(P3_0 == 0)
	  {
		Delay(20);
		while(P3_0 == 0);
		Delay(20);
			
		if(LEDNum == 0)
		    LEDNum = 7;
			else
				LEDNum--;
		P2 = ~(0x01<<LEDNum);
	  }
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1433386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KubeMQ简介

如今&#xff0c;企业组织之间的竞争是残酷的。每个组织都希望在其系统之间即时、实时或近乎实时地交换信息&#xff0c;以便做出更好、更快的决策。为了使此类信息持续流动&#xff0c;应用程序组件之间的集成需要无缝。为了充分利用云计算的所有优势&#xff0c;如今构建的应…

双非本科准备秋招(16.1)—— 力扣二叉树

1、101. 对称二叉树 检查是否对称&#xff0c;其实就是检查左节点等不等于右节点&#xff0c;我们可以用递归来做。 如果左右节点都为null&#xff0c;说明肯定对称呀&#xff0c;返回true。 如果一个为null一个不为null&#xff0c;或者左右的值不相等&#xff0c;则为false。…

k8s-深入理解Service(为Pod提供负载均衡和发现)

一、Service存在的意义 二、Service的定义和创建 Pod与Service的关系 Service的定义和创建 三、Service使用NodePort对外暴露应用 四种类型&#xff0c;常用的三种&#xff1a; 指定Service的NodePort端口 在实际生产中&#xff0c;k8s的集群不会直接暴露在公网中&#xff0c…

free5GC+UERANSIM

使用arp、ifconfig、docker inspect及网桥brctl 相关命令&#xff0c;收集容器IP及Mac地址相关信息&#xff0c;可以梳理出UERANSIMfree5GC模拟环境组网&#xff0c;如下图所示&#xff1a; 如上图所示&#xff1a;环境基于ubuntu 18.04 VMware虚机部署&#xff0c;5GC网元分别…

【Redis】字符串原理--简单动态字符串SDS

一.SDS定义 free 属性值为0&#xff0c;标识SDS没有分配任何未使用空间。len 属性值为5&#xff0c;标识SDS保存了一个5字节长度的字符串。buf 属性是一个char类型数组&#xff0c;数组的前5个字节保存了&#xff0c;R e d i s 五个字符&#xff0c;最后一个保存空字符串 \0…

uniapp android和微信小程序实现PDF在线预览

在使用uniapp开发移动端时&#xff0c;微信开发者工具里webview能正常打开后端接口返回的pdf文件流。正式发布后&#xff0c;在配置了业务域名和服务器域名的前提下&#xff0c;预览pdf文件却只能看到白屏&#xff0c;因此我猜测微信小程序不能通过webview读取文件流。这个想法…

Leetcode—32. 最长有效括号【困难】(动态规划及ranges::max()使用)

2024每日刷题&#xff08;110&#xff09; Leetcode—32. 最长有效括号 栈实现代码 class Solution { public:int longestValidParentheses(string s) {stack<int> st;st.push(-1);int n s.size();int maxn 0;for(int i 0; i < n; i) {if(s[i] () {st.push(i);}…

vulnhub靶场之Thales

一.环境搭建 1.靶场描述 Description : Open your eyes and change your perspective includes 2 flags:user.txt and root.txt. Telegram: machineboy141 (for any hint) This works better with VIrtualBox rathe than VMware 2.靶场地址 https://www.vulnhub.com/entry/t…

platform tree架构下i2c应用实例(HS3003)

目录 概述 1 探究platform tree下的i2c 1.1 platform tree下的i2c驱动 1.2 查看i2c总线下的设备 1.3 使用命令读写设备寄存器 2 认识HS3003 2.1 HS3003特性 2.2 HS3003寄存器 2.2.1 温湿度数据寄存器 2.2.2 参数寄存器 2.2.3 一个参数配置Demo 2.3 温湿度值转换 2.…

ubuntu22.04 经常死机,鼠标,键盘无响应

一、现象说明 1. 开机一小时后&#xff0c;突然之间网络掉线&#xff0c;鼠标、键盘无反应。 2.强制重启后&#xff0c;恢复正常。 3.多次重复出现该问题。 二、环境说明&#xff1a;内核、显卡 三、异常日志&#xff1a; /var/log/syslog: 四、问题解答&#xff1a; 1.…

Linux 路由配置与使用

概念 路由信息用于指导数据包从源地址查找到目的地址传输路径的信息&#xff1b; 路由分类 根据路由信息的来源分为静态路由和动态路由 静态路由 由管理员手动配置的路由表项信息&#xff0c;根据路由形式的不同&#xff0c;静态路由又可细分为&#xff1a; 直连路由&#xf…

asp.net core 依赖注入 实例化对象实例

在面向对象编程中&#xff0c;推荐使用面向接口编程&#xff0c;这样我们的代码就依赖于服务接口&#xff0c;而不是依赖于实现类&#xff0c;可以实现代码解耦。 名称解释&#xff1a; 我们把负责提供对象的注册和 获取功能的框架叫作“容器”&#xff0c; 注册到容器中的对象…

java设计模式:观察者模式

在平常的开发工作中&#xff0c;经常会使用到设计模式。合理的使用设计模式&#xff0c;可以提高开发效率、提高代码质量、提高代码的可拓展性和维护性。今天来聊聊观察者模式。 观察者模式是一种行为型设计模式&#xff0c;用于对象之间一对多的依赖关系&#xff0c;当被观察对…

vue前端+nodejs后端通信-简单demo

本文记录vue前端nodejs后端通讯最简单的方法&#xff0c;供广大网友最快速进入全栈开发。 技术架构 前端 vue axios 后端 nodejs express 一、前端部分-搭建VUE 项目 vue create Vnodenpm run serve 启动&#xff1b; 具体操作步骤&#xff0c;请自行百度&#xff0c;这里没…

MySQL-----约束

目录​​​​​ 约束 一 主键约束 1-1 操作-添加单列主键 1-2 操作-添加多列主键 1-3 修改表结构添加主键 1-4 删除主键约束 二 自增长约束 2-1 指定自增长字段的初始值 2-2 删除自增列 三 非空约束 3-1 创建非空约束 3-2 删除非空约束 四 唯一约束…

算法学习——华为机考题库10(HJ64 - HJ69)

算法学习——华为机考题库10&#xff08;HJ64 - HJ69&#xff09; HJ64 MP3光标位置 描述 MP3 Player因为屏幕较小&#xff0c;显示歌曲列表的时候每屏只能显示几首歌曲&#xff0c;用户要通过上下键才能浏览所有的歌曲。为了简化处理&#xff0c;假设每屏只能显示4首歌曲&a…

ffmpeg的使用,安装,抽帧,加水印,截图,生成gif,格式转换,抓屏等

实际使用中总结的关于ffmpeg对视频的处理的记录文档 具体信息&#xff1a; http://ffmpeg.org/download.html 官网下载ffmpeg 关于ffmpeg的安装详细步骤和说明 装ffmpeg 方式,Linux和windows下的 http://bbs.csdn.net/topics/390519382 php 调用ffmpeg , http://bbs.csdn.net/t…

『 C++ - Hash 』闭散列与开散列哈希表详解及其实现 ( 万字 )

文章目录 &#x1f47e; 哈希表概念&#x1f47e; 常见哈希函数&#x1f38f; 直接定址法&#x1f38f; 除留余数法 &#x1f47e; 哈希冲突的解决方案&#x1f38f; 闭散列与闭散列哈希表的实现&#x1f390; 闭散列哈希表的节点设置与基本架构&#x1f390; 闭散列哈希表的插…

【Linux系统 01】Vim工具

目录 一、Vim概述 1. 文件打开方式 2. 模式切换 二、命令模式 1. 移动与跳转 2. 复制与粘贴 3. 剪切与撤销 三、编辑模式 1. 插入 2. 替换 四、末行模式 1. 保存与退出 2. 查找与替换 3. 分屏显示 4. 命令执行 一、Vim概述 1. 文件打开方式 vim 文件路径&#…

jmeter设置关联

一、为什么要设置关联&#xff1f; http协议本身是无状态的&#xff0c;客户端只需要简单向服务器请求下载某些文件&#xff0c;无论是客户端还是服务端都不去记录彼此过去的行为&#xff0c;每一次请求之间都是独立的。如果jmeter需要设置跨线程组脚本&#xff0c;就必须设置…