点灯、点各式各样的灯

news2025/3/17 5:55:50

鱼离水则身枯,心离书则神索。

    • 前言
    • 闪灯
    • 呼吸灯
    • 流水灯
    • 二进制数显示灯
    • 蜂鸣器节拍
    • 流水音乐会
    • 总结


前言

上回书咱们简单了解了一点有关特殊功能寄存器sfr、通用输入输出GPIO、位操作运算符sbit和一个不靠单片机上的晶振(拿来定时的)的依托于单片机CPU空操作的ms级延时函数,这节课咱们来复盘一下并更深入的实操一下

闪灯

既然咱们已经能让LED亮起来了,那一闪一闪亮晶晶对咱们来说也就只是加一个延时函数的事情:

#include<regx52.h>

void delay_ms(unsigned int n) {
    unsigned int i;
    while(n--) {
        for(i=0; i<280; ++i);
    }
}

int main() {
    while(1) {
        P2_0 = 0;       // 点亮LED
        delay_ms(100);
        P2_0 = 1;       // 熄灭LED
        delay_ms(100);
    }
}

呼吸灯

咱们可是会利用变量的,那当然可以让它闪烁的频率像一个垂垂老矣的迟暮耄耋老者愈发慢下来

#include<regx52.h>

void delay_ms(unsigned int n) {
    unsigned int i;
    while(n--) {
        for(i=0; i<280; ++i);
    }
}

int main() {
    unsigned int i = 100;
    while(1) {
        P2_0 = 0;       // LED亮
        delay_ms(i);
        P2_0 = 1;       // LED灭
        delay_ms(i);
        if(++i >= 1000) i = 100; // 呼吸范围控制
    }
}

流水灯

一个LED太孤单了,让咱们把一个GPIO口的八个LED伙伴都运行起来呢?

#include<regx52.h>

void delay_ms(unsigned int n) {
    unsigned int i;
    while(n--) {
        for(i=0; i<280; ++i);
    }
}

int main() {
    unsigned int i;
    while(1) {
        for(i=0; i<8; ++i) {
            P2 = ~(1 << i); // 流水灯位移
            delay_ms(100);
        }
    }
}

咱知道,这里肯定会有朋友直接懵逼了,因为咱们之前点亮LED使用的是位操作法,即使用sbit对寄存器地址的某一单独位定义后进行操作;但是咱们这么想,这里一个地址对应八个二进制数也就是八个LED,要定义代码冗余且不说效率也低啊,万一以后老板让我同时控制音乐会上的几万个LED光代码就几万行也太难写了,于是咱们引入总线操作法,也就是一次性操作整个P2端口(8个引脚)的方法:咱上一篇说到过一个GPIO对应的特殊功能寄存器sfr绑定的地址有八个二进制数,诶,那咱们直接写入一个表示八位二进制数转换成十六进制的数不就好了吗
但是这里的核心代码 P2 = ~(1 << i); // 流水灯位移还是看不懂咋办?别急,这里涉及到位运算取反操作的一些性质,咱这样列个表会清晰很多:

i值1 << i(二进制)取反操作(~)最终P2输出(十六进制)点亮效果
000000001111111100xFE第1个LED亮
100000010111111010xFD第2个LED亮
200000100111110110xFB第3个LED亮
300001000111101110xF7第4个LED亮
400010000111011110xEF第5个LED亮
500100000110111110xDF第6个LED亮
601000000101111110xBF第7个LED亮
710000000011111110x7F第8个LED亮

等效的位操作法代码:

#include<regx52.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;

void delay_ms(unsigned int n) {
    unsigned int i;
    while(n--) {
        for(i=0; i<280; ++i);
    }
}

int main() {
    unsigned char i;
    while(1) {
        // 正向流水灯
        for(i=0; i<8; ++i) {
            // 关闭所有LED
            LED0 = 1;  // 高电平熄灭
            LED1 = 1;
            LED2 = 1;
            LED3 = 1;
            LED4 = 1;
            LED5 = 1;
            LED6 = 1;
            LED7 = 1;
            
            // 点亮当前LED
            switch(i) {
                case 0: LED0 = 0; break;  // 低电平点亮
                case 1: LED1 = 0; break; 
                case 2: LED2 = 0; break; 
                case 3: LED3 = 0; break; 
                case 4: LED4 = 0; break; 
                case 5: LED5 = 0; break; 
                case 6: LED6 = 0; break; 
                case 7: LED7 = 0; break; 
            }
            delay_ms(100);
        }
    }
}

二进制数显示灯

诶,恭喜你,已经把成都理工大学单片机课程中的GPIO实验做得七七八八了,接下来你会问:“主播主播你的设计确实简单,但是还是太无聊了,有没有什么既简单又有意思的实验?”,有的兄弟,有的,来看看这一款八位二进制数显示灯,先看代码:

#include<regx52.h>

void delay_ms(unsigned int n) {
    unsigned int i;
    while(n--) {
        for(i=0; i<280; ++i);
    }
}

int main() {
    unsigned char counter = 0;
    while(1) {
        P2 = ~counter;  // 二进制显示
        delay_ms(100);
        counter++;
    }
}

counter从0(0000,0000)到255(1111,1111)循环,可以直观感受二进制进位(看到LED的波浪式闪烁)


蜂鸣器节拍

蜂鸣器一般分为有源蜂鸣器和无源蜂鸣器,按咱现在的学习和知识储备直白地来说,前者音调较为固定(可用PWM调制,后面会讲,但是效果不好),无源蜂鸣器则音域较广(PWM调制效果好),而这里咱们之所以衔接蜂鸣器而不是按键,是因为蜂鸣器与LED一样都是显示器件,它与LED一样都是依赖简单的GPIO地O也就是OUTPUT输出功能,咱们先把这一类显示器件的使用归类到一起,让观者可以在共性的模板中更好的学习
(这里笔者的板子对应的蜂鸣器是P1的第5位)

#include<regx52.h>
sbit beep = P1^5;

void delay_ms(unsigned int n) {
    unsigned int i;
    while(n--) {
        for(i=0; i<280; ++i);
    }
}

int main() {
    while(1) {
        beep = !beep;   // 0响1停,P口引脚最开始默认输出1
        delay_ms(10);  // 控制节拍速度
    }
}

流水音乐会

好了,咱们已经熟悉了简单显示器件的使用,咱们来做个综合实验

#include<regx52.h>
sbit beep = P1^5;

void delay_ms(unsigned int n) {
    unsigned int i;
    while(n--) {
        for(i=0; i<280; ++i);
    }
}

int main() {
    unsigned int i;
    while(1) {
        for(i=0; i<8; ++i) {
            P2 = ~(1 << i); // 流水灯
            beep = !beep;           
            delay_ms(10);
            beep = !beep;          
            delay_ms(100);
        }
    }
}

总结

简单显示器件的使用都是大同小异,已经难不倒咱们了,于是接下来咱们要去学习一点比较困难的显示器件,它们可能需要的操作往往不局限在代码内,可能是翻阅数据手册,可能是计算进制数……

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

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

相关文章

Matlab 汽车悬架系统动力学建模与仿真

1、内容简介 略 Matlab 170-汽车悬架系统动力学建模与仿真 可以交流、咨询、答疑 2、内容说明 略 本文对题目给定的1/2汽车四自由度模型&#xff0c;建立状态空间模型进行系统分析&#xff0c;并通过MATLAB仿真对系统进行稳定性、可控可观测性分析&#xff0c;对得的结果进行…

专访数势科技谭李:智能分析 Agent 打通数据平权的最后一公里

作者|斗斗 编辑|皮爷 出品|产业家 伦敦塔桥下的泰晤士河底&#xff0c;埋藏着工业革命的隐秘图腾——布鲁内尔设计的隧道盾构机。在19世纪城市地下轨道建设的过程中&#xff0c;这个直径11米的钢铁巨兽没有选择拓宽河道&#xff0c;而是开创了地下通行的新维度。 “我们不…

2、操作系统之软件基础

一、硬件支持系统 &#xff0c;系统管理硬件 操作系统核心功能可以分为&#xff1a; 守护者&#xff1a;对硬件和软件资源的管理协调者&#xff1a;通过机制&#xff0c;将各种各样的硬件资源适配给软件使用。 所以为了更好的管理硬件&#xff0c;操作系统引进了软件。其中3大…

STC89C52单片机学习——第20节: [8-2]串口向电脑发送数据电脑通过串口控制LED

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.03.15 51单片机学习——第20节: [8-2]串口向电脑发送数据&电脑通过串口控制LED 前言…

K8S下nodelocaldns crash问题导致域名请求响应缓慢

前言 最近做项目&#xff0c;有业务出现偶发的部署导致响应很慢的情况&#xff0c;据了解&#xff0c;业务使用域名访问&#xff0c;相同的nginx代理&#xff0c;唯一的区别就是K8S重新部署了。那么问题大概率出现在容器平台&#xff0c;毕竟业务是重启几次正常&#xff0c;偶…

CVPR2024 | TT3D | 物理世界中可迁移目标性 3D 对抗攻击

Towards Transferable Targeted 3D Adversarial Attack in the Physical World 速览总结摘要-Abstract引言-Introduction相关工作-Related Work方法-MethodologyPreliminray-预备知识问题表述-Problem FormulationNeRF参数空间中的双重优化-Dual Optimization in NeRF Paramete…

全面对比分析:HDMI、DP、DVI、VGA、Type-C、SDI视频接口特点详解

在当今的多媒体时代&#xff0c;视频接口的选择对于设备连接和显示效果至关重要。不同的视频接口在传输质量、兼容性、带宽等方面各有优劣。本文将全面对比分析常用的视频接口HDMI、DP、DVI、VGA、Type-C、SDI&#xff0c;帮助读者更好地理解它们的特点和适用场景。 一、HDMI&…

传输层自学

传输实体&#xff1a;完成传输层任务的硬件或软件 可能位于&#xff1a; 操作系统内核独立的用户进程绑定在网络应用中的链接库网络接口卡 1.功能&#xff1a; 网络层与传输层作用范围比较&#xff1f; 网络层负责把数据从源机送达到目的机 传输层负责把数据送达到具体的应…

微服务架构下前端如何配置 OpenAPI 接口

在微服务架构中&#xff0c;后端通常由多个独立的服务组成&#xff0c;每个服务可能提供自己的 API 接口。为了在前端项目中高效地调用这些 API&#xff0c;可以使用 OpenAPI 规范生成客户端代码。以下是详细的配置步骤和最佳实践&#xff1a; 1. 理解 OpenAPI 规范 OpenAPI 是…

FreeRTOS源码概述

FreeRTOS源码概述 1 FreeRTOS目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工程中&#xff0c;FreeRTOS 相关的源码如下&#xff1a; 主要涉及2个目录&#xff1a; Core Inc 目录下的 FreeRTOSConfig.h 是配置文件Src 目录下的 freertos.c 是 STM32CubeMX 创建的默认任务 Mi…

日志统计(C++,模拟,双指针)

题目要我们求在某个时间段中&#xff0c;帖子点赞数达到K的帖子数 遍历方式一 我们可以先对所有帖子根据时间&#xff0c;升序排序 枚举每一条帖子&#xff0c;枚举后续每一条帖子&#xff0c;如果id相同且时间差小于d&#xff0c;那么就记录起来&#xff0c;如果记录数量cn…

加固脱壳技术:DEX动态加载对抗

1. 加固技术原理剖析 1.1 DEX保护演进路线 加固方案发展历程&#xff1a; graph LR A[2015 代码混淆] --> B[2017 DEX动态加载] B --> C[2019 VMP指令虚拟化] C --> D[2022 全链路加密] 1.1.1 主流加固方案对比 厂商核心防护技术弱点分析梆梆加固DEX文件分片…

C++之list类(超详细)

在上一节中我们学习了STL中的vector这个容器&#xff0c;这节我们来学习一下另外一个常用的容器——list。 文章目录 前言 一、list的介绍 二、list的使用及相关接口 1.list的使用 2.list的迭代器使用 3.list的相关接口 3.1 list capacity 3.2 list element access 3.3…

强化学习的一些概念

目录 强化学习 打个比方 核心要素 State Action Reward 几个代码demo 学习目标 强化学习 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是机器学习的一个分支&#xff0c;旨在让智能体&#xff08;Agent&#xff09;通过与环境的交互学习最优策略&#xff0c;以…

MambaTab:表格数据处理的新利器

——基于结构化状态空间模型的特征增量学习框架 摘要 本文提出MambaTab&#xff0c;一种基于结构化状态空间模型&#xff08;SSM&#xff09;的表格数据处理框架。通过创新的嵌入稳定化设计与轻量化SSM架构&#xff0c;MambaTab在普通监督学习和特征增量学习场景中均表现优异&…

Kafka的流量控制机制

Kafka的流量控制机制 Kafka 作为一款高吞吐量的消息队列系统&#xff0c;能够在海量数据场景下提供稳定的消息生产和消费能力&#xff0c;其背后的流量控制机制功不可没。我们需要认识到&#xff0c;Kafka 的流量控制并非仅仅是为了防止系统过载或崩溃&#xff0c;它的目标是实…

CSSHTML新特性

HTML5 新特性探秘 在 Web 开发的不断演进中&#xff0c;HTML5 带来了一系列令人振奋的新特性&#xff0c;极大地提升了网页的功能和用户体验。今天&#xff0c;我们就来深入探究一下这些新特性。 语义化标签&#xff1a;让网页结构更清晰 语义化标签是 HTML5 的一大亮点。在…

51单片机的工作方式

目录 一、51 单片机的时钟电路及时钟信号 &#xff08;一&#xff09;时钟电路 &#xff08;二&#xff09;时钟信号 二、51 单片机的CPU 时序 &#xff08;一&#xff09;时钟周期​ &#xff08;二&#xff09;机器周期​ &#xff08;三&#xff09;指令周期​ 三、…

Java算法OJ(12)

目录 1.前言 2.正文 2.1Fib数列 2.2单词搜索 2.3杨辉三角 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来分享几道的练习题&#xff0c;欢迎大家在评论区多多交流&#xff0c;废话不多说让我们直接开始吧。 2.正文 2.1Fib数列 题目&#xff1a;斐波那契数列_牛客题霸…

MrRobot靶机详细解答

一、主机发现 arp-scan -l二、端口扫描、目录枚举、指纹识别 2.1端口扫描 nmap -p- 192.168.55.147发现22端口关闭&#xff0c;且无其它特殊端口&#xff0c;只能去网页中寻找信息 2.2目录枚举 dirb http://192.168.55.1472.3指纹识别 nmap 192.168.55.147 -sV -sC -O --…