02LED灯
一、LED灯是什么
LED是一个发光二极管,当一段为高电平另一端为低电平就可以点亮。但是需要注意,这个有规定高电平端和低电平端,如果两个端口反了,LED点亮不了。
LED的使用范围很广的,多个LED组合在一起就可以变成一个LED矩阵,比如说后面介绍的8*8LED矩阵,其实就是将64个LED灯组合在一起就变成了8*8LED矩阵了
二、原理图
LED灯在开发板的原理图如下:

这个板子上的LED灯是需要负极才能进行点亮,因为有一端是接到正极的,所以另一端需要给低电平才可以进行点亮。
另一端是接到单片机上的P2引脚,我们可以通过的控制P2引脚进行控制LED的亮或者灭。
三、对LED进行操作
1.点亮第一个LED灯
首先学习点亮一个LED灯,这个是最基础的,也是必须经过的一个任务。
从上面我们知道了,要点亮一个LED灯需要给一个低电平,所以我们可以控制需要控制P2引脚的电平来让LED亮。
比如说要让第3个LED点亮,代码就可以这样写:
#include <at89x51.h>
void main(){
    P2_3 = 0;
}
这样就可以让第三个LED灯亮了。

当然也可以使用操作P2组来实现这个操作,但需要先计算一下,第三个LED是P2组中第3个引脚进行控制的,所以需要让第三个引脚为低电平,其它引脚为高电平,所以给P2组的二进制内容应该为1111 0111,翻译为十六进制的内容就为0xF7。
#include <at89x51.h>
void main(){
    P2 = 0xF7;
}
这样也可以实现点亮。
2.LED双数点亮
让LED里为2的倍数的LED灯进行点亮,这个操作很简单,可以有两种方法,第一种是位操作。
#include <at89x51.h>
void main(){
    P2_0 = 0;
    P2_2 = 0;
    P2_4 = 0;
    P2_6 = 0;
}
但是代码量比较多,这里还是比较推荐组操作,直接操作P2组
#include <at89x51.h>
void main(){
    P2 = 0x55;
}
3.LED流水灯
这个是在点灯中比较有技术含量的,流水灯就是第一个亮完后第二个亮,然后到最后一个后又倒回来继续点亮,以此类推。
首先可以使用一个最简单的方式,就是对位进行操作
#include <at89x51.h>
void main(){
    while(1){
        P2_0 = 0;
        P2_7 = 1;
        P2_1 = 0;
        P2_0 = 1;
        P2_2 = 1;
        P2_1 = 0;
        P2_3 = 0;
        P2_2 = 1;
        P2_4 = 0;
        P2_3 = 1;
        P2_5 = 0;
        P2_4 = 1;
        P2_6 = 0;
        P2_5 = 1;
        P2_7 = 0;
        P2_6 = 1;
    }
}
可以发现是不是代码量非常的高,而这种方法一般不推荐,因为很麻烦,我们一般对组进行操作,代码如下:
#include <at89x51.h>
void main(){
    P2 = 0xFE;
    P2 = 0xFD;
    P2 = 0xFB;
    P2 = 0xF7;
    P2 = 0xEF;
    P2 = 0xDF;
    P2 = 0xBF;
    P2 = 0x7F;
}
当然,代码量还是非常的多,那么还有什么更好的方法吗?
其实还是有的,这种方法需要对C语言了解的比较深,对一些运算符的了解要深刻一点,代码如下:
#include <at89x51.h>
void main(){
    char i, x = 0xFE;
    while(1){
        for (i = 0; i < 8; i++){
            P2 = ~(~x << i);
        }
    }
}
这个代码量就会很小,大家可以慢慢研究一下,这个也非常的简单,C语言学得好基本上很快就看得懂了。
但是当我把这个代码跑起来后,会发现它变成这种情况:

为什么会出现这个情况呢?
因为单片机的运行速度非常快,它执行完这个代码只需要几微秒或者几毫秒就可以执行完,我们人眼根本就看不见。
为了处理这个问题我们可以添加一个延迟函数,当它执行完这行代码后,让它去另一个代码里转一下,等转完就可以继续回来执行,延迟函数的写法很简单,下面是一个简单的延迟函数:
void delay(){
    int i, j;
    for (i = 0; i < 100; i++){
        for (j = 0; j < 200; j++);
    }
}
然后将写好的延迟函数添加到刚才写的代码里面
#include <at89x51.h>
void delay(){
    int i, j;
    for (i = 0; i < 100; i++){
        for (j = 0; j < 200; j++);
    }
}
void main(){
    char i, x = 0xFE;
    while(1){
        for (i = 0; i < 8; i++){
            P2 = ~(~x << i);
            delay();
        }
    }
}
这样就可以看到LED流水灯的效果了。
延迟函数可以使用一些软件进行生成。
四、延迟函数的生成
这里使用的STC-ISP烧录软件做演示,首先打开软件

然后找到软件延迟计数器

然后选择条件

这里选择11.0592MHz 这个频率是根据你单片机上接的晶振频率来选择的,1毫秒,指令集选择Y6,这里的指令集是根据你的单片机信号来选择的,它会有提示的,根据提示来选择指令集。
然后点击生成代码就可以得到代码了,然后将代码写入进你的文件中进行调用即可。
void delay(){
    unsigned char i, j;
    i = 15;
    j = 90;
    do
    {
        while (--j);
    } while (--i);
}
当然你也可以改成执行传入的毫秒数
void delay(unsigned int time){
    unsigned char i, j;
    while(time--){
        i = 15;
        j = 90;
        do
        {
            while (--j);
        } while (--i);
    }
}
因为我们生成的是1毫秒,那么我们让这1毫秒重复100次是不是就是100毫秒了。
02LED灯的更多相关文章
- 微信硬件H5面板开发(二) ---- 实现一个灯的控制
		
在第一节中讲解了openApi的调用,这一篇讲一下如何实现一个灯的控制.就用微信提供的lamp例子来做,将代码扒下来(实在是没办法,没有示例),整合到自己的项目中.lamp源码:http://file ...
 - S5PV210_流水灯
		
1.整体思路:把相应的配置数据写入相应的寄存器,控制GPIO电平(Led.s)——运用工程管理Makefile编译.链接文件(由Led.s编译得到led.bin,该文件用于USB启动方式点亮LED,若 ...
 - 嵌入式Linux学习入门:控制LED灯
		
记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-G ...
 - c语言实现开灯问题
		
开灯问题: 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依 ...
 - <<你的灯亮着吗?>>读书笔记
		
本书是美国计算机传奇人物杰拉尔德.温伯格和唐纳德.高斯所著,我在网上买到的2003年版的本书,发现本书用20则幽默的现代寓言故事,60幅精美插图,以及一系列的适当提问和建议,让我们的思考方式慢慢得以扩 ...
 - Windows on Device 项目实践 5 - 姿态控制灯制作
		
在前面几篇文章中,我们学习了如何利用Intel Galileo开发板和Windows on Device来设计并完成PWM调光灯.感光灯.火焰报警器和智能风扇的制作,涉及到了火焰传感器.DC直流电机. ...
 - (一)GPIO 编程实验  LED 流水灯控制
		
7个寄存器 是R1-R16.(当然,里面有很多是分几个模式的,所以总共有37个)类似于单片机的R0-R7. GPXCON,GPXDAT等等是另外的寄存器,应该叫,特殊功能寄存器,类似于单片机的P0,P ...
 - 佳能6d 魔灯
		
注意:由于魔灯团队因为开发理念的原因分成了魔灯和悲剧灯两个团队,新用户推荐直接刷魔灯的最新固件,请拉到顶楼最下方参考安装方法! 以下内容为历史版本的安装方法,为悲剧灯(原魔灯)团队开发! 百度网盘下载 ...
 - Arduino 极速入门系列 - 光控灯(3) - 光敏电阻、与电阻分压那些事
		
继续是讲解基础原理,新手专用部分.这次讲光敏电阻,和用电阻分压.光电元器件有好几种,其中测光相关的元器件,常见的有光敏三极管和光敏电阻,我们这次光控灯用光敏电阻.在我们光控灯里面,将会使用它搭建出分压 ...
 - Arduino 极速入门系列 - 光控灯(2) - 关于开关,上拉、下拉电阻那些事
		
接上篇,这次继续讲解光控灯的另外两个组成部分 - 开关和光敏电阻,光控灯里面将会有自锁开关按钮和光敏电阻.这此主要给新玩电子的朋友解释一下开关按钮的做法. 开关按钮的引脚电平读取问题 - 新手专用 我 ...
 
随机推荐
- AI人工智能简史
			
AI人工智能简史 最近学习AI,顺便整理了一份AI人工智能简史,大家参考: 1951年 第一台神经网络机,称为SNARC: 1956年 达特茅斯学院会议,正式确立了人工智能的研究领域: 1966年 M ...
 - lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
			
一.lua变量[ 全局变量和局部变量和表中的域] Lua 变量有三种类型:全局变量和局部变量和表中的域. 全局变量:默认情况下,Lua中所有的变量都是全局变量. 局部变量:使用local 显式声明在函 ...
 - 移除List的统一逻辑写法  LeetCode 203
			
原理:通过创建一个新的结点,放在头结点的前面,作为真正头结点的前驱结点,这样头结点就成为了意义上的非头结点,这样就可以统一操作结点的删除操作. 需要注意的是:这个新的结点是虚拟头结点,真的的头结点依然 ...
 - 06-打包html资源
			
/** * loader:1. 下载 2. 使用(配置loader) * plugins:1. 下载 2. 引入 3. 使用 */ const { resolve } = require('path' ...
 - java生成机器码
			
java根据系统参数生成每个计算机的唯一标识. 1. 获取CPU序列号 /** * 获取CPU序列号 * @return * @throws IOException */ public static ...
 - LLM(大语言模型)解码时是怎么生成文本的?
			
Part1配置及参数 transformers==4.28.1 源码地址:transformers/configuration_utils.py at v4.28.1 · huggingface/tr ...
 - Python-pytest-repeat的简单使用
			
前言: 一.简介 pytest-repeat是pytest的插件,重复执行单个用例,或多个测试用例,并指定重复次数. 二.安装 1.执行如下命令 pip3 install pytest-repeat ...
 - [ [Ynoi2013] 无力回天 NOI2017 ] 解题报告
			
[Ynoi2013] 无力回天 NOI2017 首先看到异或,想到能维护异或的东西就那几样(线性基/01trie/数位 dp/FWT),再看到求选任意个数后的异或最大值,线性基无疑了. 这时再看还要维 ...
 - python的format方法中文字符输出问题
			
format方法的介绍 前言 提示:本文仅介绍format方法的使用和中文的输出向左右和居中输出问题 一.format方法的使用 format方法一般可以解决中文居中输出问题,假如我们设定宽度,当中文 ...
 - Midjourney|文心一格prompt教程[Text Prompt(上篇)]:品牌log、App、徽章、插画、头像场景生成,各种风格选择:科技风、运动风
			
Midjourney|文心一格prompt教程[Text Prompt(上篇)]:品牌log.App.徽章.插画.头像场景生成,各种风格选择:科技风.运动风 1.撰写 Text Prompt 注意事项 ...