【一】【单片机】有关LED的实验

点亮一个LED灯

根据LED模块原理图,我们可以知道,通过控制P20、P21...P27这八个位置的高低电平,可以实现D1~D8八个LED灯的亮灭。VCC接的是高电平,如果P20接的是低电平,那么D1就可以亮。如果P20接的是高电平,D1就不能亮,以此类推。

P20~P27一共有八个端口,依次可以用P2_0,P2_1,P2_2...P2_7进行表示。也可以直接用P2进行表示。

例如P2_0=0,表示P20是低电平,P2_1=1,表示P21是高电平。

如果只用P2表示,P2=0xFF,表示P20~P27全是高电平,因为0xFF是十六进制,转化为二进制是1111 1111,十六进制转二进制是四位一组,F表示15,1111。因此对应P20=1,P21=1,....P27=1

如果P2=0xFE,表示P20=0,P21~P27全是高电平,因为0xFE转化为二进制是1111 1110 从低位开始依次对应P20,P21,P22...P27。一个二进制数对应一个引脚。 低电平表示亮,高电平不亮。0表示低电平,1表示高电平。

 
#include <REGX52.H>
void main(){
        P2=0xFE;//1111 1110 点亮D1
        while(1){
                
        }
}

点亮一个LED

使一个LED灯闪烁

while循环使得程序一直运行下去。如果要使一个LED灯闪烁,那么就要使一个灯亮,然后灭,交替进行。

如果我们写这样的代码,可以使得一个LED灯闪烁吗?

 
#include <REGX52.H>
void main(){
        while(1){
                P2=0xFE;//1111 1110
                P2=0xFF;
        }
}

答案是不可以,因为机器的运算速度是非常的快的,我们的肉眼没办法区分两行代码的区别,所以我们看到的是灯一直亮着。如果要让肉眼看见LED灯闪烁,那就要让机器慢下来,也就是让机器延时,再运行下一段代码。

延时就是空跑,程序什么都不执行,但是需要耗费时间。一般用多个while循环函数实现。

我们可以利用STC-ISP软件自动生成延时函数。我们生成1毫秒的延时函数,然后封装成可以实现任意毫秒的延时函数。

 
#include <REGX52.H>

void Delay(unsigned int xms)                //@11.0592MHz
{
        
        while(xms--){
        unsigned char i, j;

        
        i = 2;
        j = 199;
        do
        {
                while (--j);
        } while (--i);
        }

}

void main(){
        while(1){
                P2=0xFE;//1111 1110
                Delay(500);
                P2=0xFF;
                Delay(500);
        }
}

这段代码实现了周期为1s,使一个LED灯闪烁。

LED闪烁

LED流水灯

LED流水灯意思是,让D1亮,其他不亮,然后D2亮,其他不亮,.....,使得灯亮呈流水状亮。

D1对应P2_0,D2对应P2_1......D8对应P2_7。

D1对应P2 二进制的第一位(个位),D2对应P2 二进制的第二位(十位),......D8对应P2的第八位。(低位依次对应)

D1亮对应P2=0xFE,D2亮对应P2=0xFD,D3亮对应P2=0xFB,D4亮对应P2=0xF7。

D5亮对应P2=0xEF,D6亮对应P2=0xDF,D7亮对应P2=0xBF,D8亮对应P2=0x7F。

我们以四个LED灯为一组,对应的十六进制是E,D,B,7。分别表示第一个灯亮,第二个灯亮,第三个灯亮,第四个灯亮。

 
//main.c
#include <REGX52.H>
#include "Delay.h"
void main(){
        
        while(1){
                P2=0xfe;
                Delay(500);
                P2=0xfd;
                Delay(500);
                P2=0xfb;
                Delay(500);
                P2=0xf7;
                Delay(500);
                P2=0xef;
                Delay(500);
                P2=0xdf;
                Delay(500);
                P2=0xbf;
                Delay(500);
                P2=0x7f;
                Delay(500);
        }
        
}
 
//Delay.c
void Delay(unsigned int xms)                //@11.0592MHz
{
        
        while(xms--){
        unsigned char i, j;

        
        i = 2;
        j = 199;
        do
        {
                while (--j);
        } while (--i);
        }

}
 
//Delay.h
void Delay(unsigned int xms);                //@11.0592MHz

将这三个文件放到同一个组别中,实现模块化编写代码,提高代码的可移植性,便携性。我们只需要在主函数声明Delay.h的头文件即可使用Delay.c中的Delay的延时函数。

流水灯

LED流水灯plus版本

#include <REGX52.H>
#include "Delay.h"

void liushui1(unsigned int xms){
        P2=0xfe;
        Delay(xms);
        P2=0xfd;
        Delay(xms);
        P2=0xfb;
        Delay(xms);
        P2=0xf7;
        Delay(xms);
        P2=0xef;
        Delay(xms);
        P2=0xdf;
        Delay(xms);
        P2=0xbf;
        Delay(xms);
        P2=0x7f;
        Delay(xms);
}
void liushui2(unsigned int xms){
        P2=0x7f;
        Delay(xms);
        P2=0xbf;
        Delay(xms);
        P2=0xdf;
        Delay(xms);
        P2=0xef;
        Delay(xms);
        
        P2=0xf7;
        Delay(xms);
        P2=0xfb;
        Delay(xms);        
        P2=0xfd;
        Delay(xms);        
        P2=0xfe;
        Delay(xms);        
        
}
void ji(unsigned int xms){
        P2=0xAA;
        Delay(xms);
}
void ou(unsigned int xms){
        P2=0x55;
        Delay(xms);
}

void man(){
        P2=0x00;
        Delay(500);
        P2=0xff;
        Delay(500);
}
void main(){
        unsigned int xms=300;
        while(1){
                int i;
                liushui1(xms);
                liushui1(xms);
                man();
                man();
                liushui2(xms);
                liushui2(xms);
                man();
                man();
                for(i=1;i<=5;i++){
                        ji(xms);
                        ou(xms);
                        
                }
                xms-=50;
                if(xms==0) xms=300;
        }
        
}

这段代码是用于单片机(基于8051架构)的程序,用来控制LED灯的流水灯效果和闪烁模式。程序包含几个关键函数,每个函数用于实现特定的灯光效果。

包含的头文件和自定义函数

 
#include <REGX52.H>

这行代码包含了一个专为8051单片机设计的头文件,其中包含了对单片机特定功能寄存器的定义和访问方法。

 
#include "Delay.h"

这行代码包含了一个自定义的延时函数库,里面定义的Delay函数被用来在程序中实现延时效果,使LED灯的变化速度符合人眼观察的需求。

liushui1函数

 
void liushui1(unsigned int xms){
        P2=0xfe;
        Delay(xms);
        P2=0xfd;
        Delay(xms);
        P2=0xfb;
        Delay(xms);
        P2=0xf7;
        Delay(xms);
        P2=0xef;
        Delay(xms);
        P2=0xdf;
        Delay(xms);
        P2=0xbf;
        Delay(xms);
        P2=0x7f;
        Delay(xms);
}

liushui1函数实现了LED灯的正向流水效果。通过改变P2端口的输出值,让LED依次点亮,模拟流水的效果。xms参数控制每个LED点亮的持续时间,从而影响流水的速度。

liushui2函数

 
void liushui2(unsigned int xms){
        P2=0x7f;
        Delay(xms);
        P2=0xbf;
        Delay(xms);
        P2=0xdf;
        Delay(xms);
        P2=0xef;
        Delay(xms);
        
        P2=0xf7;
        Delay(xms);
        P2=0xfb;
        Delay(xms);        
        P2=0xfd;
        Delay(xms);        
        P2=0xfe;
        Delay(xms);        
        
}

liushui2函数实现了LED灯的反向流水效果,其工作原理与liushui1相似,但LED点亮的顺序相反。

ji函数和ou函数

 
void ji(unsigned int xms){ P2=0xAA; Delay(xms); }
void ou(unsigned int xms){ P2=0x55; Delay(xms); }

ji函数和ou函数用来实现特定的LED闪烁模式。ji函数让LED以0xAA(10101010二进制模式)的模式闪烁,而ou函数以0x55(01010101二进制模式)的模式闪烁。参数xms控制闪烁的持续时间。

man函数

 
void man(){ P2=0x00; Delay(500); P2=0xff; Delay(500); }

man函数用于实现所有LED全部点亮然后再全部熄灭的效果,每个状态持续500ms。

main函数

 
void main(){
        unsigned int xms=300;
        while(1){
                int i;
                liushui1(xms);
                liushui1(xms);
                man();
                man();
                liushui2(xms);
                liushui2(xms);
                man();
                man();
                for(i=1;i<=5;i++){
                        ji(xms);
                        ou(xms);
                        
                }
                xms-=50;
                if(xms==0) xms=300;
        }
        
}

main函数是程序的入口点,定义了一个无限循环,在这个循环中不断调用上述定义的函数,以实现不断变化的LED灯效果。通过调整xms的值,可以改变灯光效果的速度。当xms减到0时,程序会将其重置为300ms,保证了程序的连续运行和灯光效果的多样性。正向流水流两次,然后全部点亮全部熄灭两次,逆向流水流两次,然后全部点亮全部熄灭两次,奇偶交替变换五次,然后延时降低50毫秒,一直到延时为0,此时重新设置延时时间为300毫秒。

流水灯plus_0

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS基础属性(学习笔记)

一、CSS介绍 CSS即层叠样式表/级联样式表&#xff0c;简称样式表 html&#xff1a;写网页结构内容 css&#xff1a;写网页样式 实现了内容与表现的分离&#xff0c;提高了代码的重用性和维护性 CSS注释不被浏览器解析&#xff0c;给开发人员一个标注 快捷键&#xff1a;ctrl/ 语…

YOLOv5独家改进:block改进 | RepViTBlock和C3进行结合实现二次创新 | CVPR2024清华RepViT

💡💡💡本文独家改进:CVPR2024 清华提出RepViT:轻量级新主干!从ViT角度重新审视移动CNN,RepViTBlock和C3进行结合实现二次创新 改进结构图如下: 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创…

FTP文件传输协议

FTP 文章目录 FTP1. ftp简介2. ftp架构3. ftp数据连接模式4. 用户认证5. vsftpd5.1 vsftpd安装5.2 配置匿名用户ftp5.2.1上传&#xff08;下面使用的是FileZilla软件&#xff09;5.2.2下载5.2.3创建5.2.4删除 5.3配置本地&#xff08;系统&#xff09;用户ftp5.3.1上传5.3.2下载…

Qt教程 — 3.4 深入了解Qt 控件:Input Widgets部件(3)

目录 1 Input Widgets简介 2 如何使用Input Widgets部件 2.1 Dial 组件-模拟车速表 2.2 QScrollBar组件-创建水平和垂直滚动条 2.3 QSlider组件-创建水平和垂直滑动条 2.4 QKeySequenceEdit组件-捕获键盘快捷键 Input Widgets部件部件较多&#xff0c;将分为三篇文章介绍…

网络基础知识-DNS与DHCP+网络规划与设计故障诊断+嵌入式系统设计师备考笔记

0、前言 本专栏为个人备考软考嵌入式系统设计师的复习笔记&#xff0c;未经本人许可&#xff0c;请勿转载&#xff0c;如发现本笔记内容的错误还望各位不吝赐教&#xff08;笔记内容可能有误怕产生错误引导&#xff09;。 本章的主要内容见下图&#xff1a; 本章知识和计算机…

创意二维码营销案例:帕森斯设计学院在巴黎市中心搭建“沙滩度假地”

作为一个专业的艺术设计学院&#xff0c;帕森斯设计学院&#xff08;Parsons School of Design, The New School&#xff09;以其卓越的教学质量和创新的设计理念享誉全球。 每年的夏天&#xff0c;帕森斯设计学院都会举办一个暑期短期项目&#xff0c;面向全球学生&#xff0…

AI时代,Matter如何融入与服务中国智能家居市场,助力中国企业出海?

随着智能家居产业的飞速发展&#xff0c;丰富多样的智能家居产品为消费者带来了便利的同时&#xff0c;因为不同品牌、不同产品之间的协议与标准不统一&#xff0c;导致消费者体验产生割裂&#xff0c;本来想买个“智能”家居&#xff0c;结果买了个“智障”家居&#xff0c;这…

Qt学习--多态(虚函数)

这次来分享多态的概念&#xff0c;这是比较重要的知识点 面向对象的三大特征&#xff1a;封装、继承、多态 首先&#xff1a;来点官方术语&#xff1a; 多态&#xff0c;通俗来讲就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出…

软考88-上午题-【操作系统】-进程的状态及状态间的切换

一、三态模型 多道程序系统&#xff1a; 在单道程序系统中&#xff0c;计算机内存中只允许一个程序运行&#xff0c;而多道程序系统则允许多个程序同时运行&#xff0c;从而大大提高了系统的整体性能。 通过允许多个程序同时运行和共享资源&#xff0c;多道程序设计技术使得操作…

使用uniapp,uni-data-select组件时,内容长度没超过容器宽度时候虽然能显示全内容但是数据后边会出现三个点,逼死强迫症

项目场景&#xff1a; 微信小程序开发&#xff0c;使用uniapp&#xff0c;uni-data-select组件时&#xff0c;内容长度没超过容器宽度时候虽然能显示全内容但是数据后边会出现三个点&#xff0c;逼死强迫症 解决方案&#xff1a; 找到组件的源代码&#xff0c;然后删除那三个…

layui2.9.7-入门初学

下载&#xff1a;https://layui.dev/ 下载后解压&#xff1a; 在hbuider中新建一个项目 将如上解压好的文件打开&#xff0c;复制如下到项目中 写案例&#xff0c;基础学习通之前的bootstrap 那样&#xff0c;挨个相中哪个就测试哪个&#xff0c;在这里不再重复罗列&#x…

windows跳板机配置(端口转发)

目录 前言操作步骤端口防火墙开放测试参考 前言 跳板机一般用于异构网络间的中转站&#xff0c;比如对方在防火墙上只给你开放了一台服务器的权限&#xff0c;你无法访问对方局域网的其它主机&#xff0c;但你能访问的这台服务器则有权限访问其它主机。那么这台服务器就可以作…

Docker 从0安装 nacos集群

前提条件 Docker支持一下的CentOs版本 Centos7(64-bit)&#xff0c;系统内核版本为 3.10 以上Centos6.5(64-bit) 或者更高版本&#xff0c;系统内核版本为 2.6.32-431 或者更高版本 安装步骤 使用 yum 安装&#xff08;CentOS 7下&#xff09; 通过 uname -r 命令查看你当…

Go web 基础相关知识

Go web Web工作方式 浏览器本身是一个客户端&#xff0c;当你输入URL的时候&#xff0c;首先浏览器会去请求DNS服务器&#xff0c;通过DNS获取相应的域名对应的IP&#xff0c;然后通过IP地址找到IP对应的服务器后&#xff0c;要求建立TCP连接&#xff0c;等浏览器发送完HTTP …

通过nginx+xray服务搭建及本地配置

一、xray服务配置 下载&#xff1a;https://github.com/XTLS/Xray-core 进入下载界面 这里我选择的是Xray-linux-64.zip 将文件解压到 /usr/local/xray 编辑配置文件/usr/local/xray/config.json uuid可以在v2ray客服端自动生成&#xff0c;也可以在UUID v4 生成器 - KKT…

高性能 MySQL 第四版(GPT 重译)(二)

第四章&#xff1a;操作系统和硬件优化 你的 MySQL 服务器的性能只能和它最弱的环节一样好&#xff0c;而运行 MySQL 的操作系统和硬件通常是限制因素。磁盘大小、可用内存和 CPU 资源、网络以及连接它们的所有组件都限制了系统的最终容量。因此&#xff0c;你需要仔细选择硬件…

腾讯云服务器多少钱一年?听完你可别后悔!

腾讯云服务器多少钱一年&#xff1f;61元一年起。2024年最新腾讯云服务器优惠价格表&#xff0c;腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

考研数学|张宇还是武忠祥?怎么选?

我觉得张宇老师和武忠祥老师讲课实力都差不多&#xff0c;区别就在于风格的不同 张宇老师的讲课风格比较活泼&#xff0c;擅长调动学生的思维跟着课堂一起走&#xff0c;并且张宇老师发明了很多容易记的段子&#xff0c;但是虽然张宇老师段子多&#xff0c;一点也不妨碍他讲课…

网站制作基本流程|新手必收藏

网站制作基本流程|新手必收藏 我们选择了白嫖雨云的二级域名 浏览器输入https://www.rainyun.com/z22_ 创建账号然后选择一个你喜欢的子域名我建议后缀选择ates.top的 选择自定义地址&#xff0c;类型选择cname 现在要选择记录值了&#xff0c;有a&#xff0c;aa&#xff0c;tx…

数据结构 之 哈希表习题 力扣oj(附加思路版)

哈希表用法 哈希表&#xff1a;键 值对 键&#xff1a;可以看成数组下标&#xff0c;但是哈希表中的建可以是任意类型的&#xff0c;建不能重复,可以不是连续的 值&#xff1a;可以看成数组中的元素&#xff0c;值可以重复&#xff0c;也可以是任意类型的数据 #include<iost…