【51单片机】点亮第一个LED灯

news2024/12/25 10:24:48

目录

  • 点亮第一个LED灯
    • 单片机 GPIO 介绍
      • GPIO 概念
      • GPIO 结构
    • LED简介
    • 软件设计
      • 点亮D1指示灯
      • LED流水灯

橙色

点亮第一个LED灯

单片机 GPIO 介绍

GPIO 概念

GPIO(general purpose intput output) 是通用输入输出端口的简称, 可以通过软件来控制其输入和输出。 51 单片机芯片的 GPIO 引脚与外部设备连接起来, 从而实现与外部通讯、 控制以及数据采集的功能。 不过 GPIO 最简单的应用还属点亮 LED 灯了, 只需通过软件控制 GPIO 输出高低电平即可。 当然GPIO 还可以作为输入控制, 比如在引脚上接入一个按键, 通过电平的高低判断按键是否按下。

我所使用的51单片机型号为STC89C52, 此芯片共有40 引脚, 芯片引脚图如下图所示:
在这里插入图片描述
当然,不是所有引脚都是 GPIO , 51 单片机引脚可以分为这么几大类:

  1. 电源引脚: 引脚图中的 VCC、 GND 都属于电源引脚。
  2. 晶振引脚: 引脚图中的 XTAL1、 XTAL2 都属于晶振引脚。
  3. 复位引脚: 引脚图中的 RST/VPD 属于复位引脚, 不做其他功能使用。
  4. 下载引脚: 51 单片机的串口功能引脚(TXD、 RXD) 可以作为下载引脚使用
  5. GPIO 引脚: 引脚图中带有 Px.x 等字样的均属于 GPIO 引脚。 从引脚图可以看出,GPIO 占用了芯片大部分的引脚, 共达 32 个, 分为了 4 组, P0、 P1、P2、 P3, 每组为 8 个 IO, 而且在 P3 组中每个 IO 都具备额外功能, 只要通过相应的寄存器设置即可配置对应的附加功能, 同一时刻, 每个引脚只能使用该引脚的一个功能。

GPIO 结构

51 单片机所有 IO 口都是双向的, 即可以作为输入也可以作为输出使用。由于 P0 口是漏极开路的, 所以要操作 P0 口必须外接上拉电阻, 其他P1、 P2、 P3 口都内部自带上拉电阻, 可以不加, 如果要增强 IO 口驱动能力, 可以外接上拉电阻。

LED简介

LED 即发光二极管。 它具有单向导电性, 通过 5mA 左右电流即可发光, 电流越大, 其亮度越强, 但若电流过大, 会烧毁二极管, 一般我们控制在 3 mA-20mA之间, 通常我们会在 LED 管脚上串联一个电阻, 目的就是为了限制通过发光二极管的电流不要太大, 因此这些电阻又可以称为“限流电阻” 。

当发光二极管发光时, 测量它两端电压约为 1.7V, 这个电压又叫做发光二极管的“导通压降” 。下图左右分别为直插式发光二极管和贴片式发光二极管实物图。 发光二极管正极又称阳极, 负极又称阴极, 电流只能从阳极流向阴极。 直插式发光二极管长脚为阳极, 短脚为阴极。 仔细观察贴片式发光二极管正面的一端有彩色标记,通常有标记的一端为阴极。
在这里插入图片描述

软件设计

点亮D1指示灯

本章所要实现的功能是: 点亮 D1 发光二极管, 即让 P0.0 管脚输出一个低电平。 完成后可再控制 D1 指示灯闪烁, 即间隔一定时间点亮和熄灭 D1 指示灯。

#include "reg52.h"

sbit led=P2^0;

void main()	
{
	led=0;
	while(1)
	{
	}

}

编译一下,如下图所示:
在这里插入图片描述

可以看到没有错误, 也没有警告。 从编译信息可以看出, 我们的代码占用FLASH 大小为: 19 字节, 所用的 SRAM 大小为: 9 个字节(9+0) 。 这里我们解释一下, 编译结果里面的几个数据的意义:

  • Code: 表示程序所占用 FLASH 的大小。
  • data: 数据储存器内部 RAM 占用大小。
  • xdata: 数据储存器外部 RAM 占用大小。

有了这个就可以知道你当前使用的 flash 和 sram 大小了。 一定要注意的是程序的大小不是.hex 文件的大小, 而是编译后的 Code 和 data 之和。

LED流水灯

#include "reg52.h"
#include<intrins.h>

typedef unsigned int u16;
typedef unsigned char u8;

#define led P2

//延时函数,i=1时,大约延时10us
void delay(u16 i)
{
	while(i--);
}

void main()	
{
	u8 i;
	led=~0x01;//0x01 取反即为 0xFE
	delay(5000);//大约延时450ms
	while(1)
	{
		for(i=0;i<8;i++)
		{
			P2=~(0x01<<i);//将 1 右移 i 位, 然后将结果赋值到 P2 口
			delay(50000);
		}
	}
}

进入 main 函数后,首先 led=~ 0x01, 因为 LED 是低电平点亮, 所以 0X01 取反后的结果是 0XFE, 对应二进制数为 1111 1110, 即最低位为 0, 因此最开始的 D1指示灯会点亮;然后延时一段时间进入while循环, 由于要实现8个LED从D1->D8循环点亮, 因此可以使用 for 循环语句循环 8 次, 每循环一次,点亮的小灯向右移动一个,即 P2 口输出的低电平要左移一位, 因此可以使用 P2=~(0x01<<i);语句实现。 0X01<<i 表示0x01 中的 1 移动移动 i 位。因为1(高电平)不会让LED点亮,需要取反后变为低电平才能点亮,所以最后的结果需要取反后给P2口.


左移_crol_、 右移_cror_函数的使用

上面的代码是通过for 循环语句实现移位,但 KEIL C51 软件内也有对应的移位库函数,左移函数是_crol_(), 右移函数是_cror_(), 这两个函数在在 intrins.h 头文件当中。 该移位函数实现的移位功能就相当于一个队列内循环移动, 如果是左移, 那么最高位就被移到最低位了, 次高位变为最高位, 依次类推。使用左移、 右移函数实现的流水灯操作代码如下:

#include "reg52.h"
#include<intrins.h>

typedef unsigned int u16;
typedef unsigned char u8;

#define led P2

void delay(u16 i)
{
	while(i--);
}


void main()	
{
	u8 i;
	led=~0x01;
	delay(5000);
	while(1)
	{
		for(i=0;i<7;i++)
		{
			led=_crol_(led,1); //将led左移一位
			delay(50000);
		}
		for(i=0;i<7;i++)
		{
			led=_cror_(led,1); //将led右移一位
			delay(50000);
		}
	}

}

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

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

相关文章

【Go面试向】defer与time.sleep初探

【Go面试向】defer与time.sleep初探 大家好 我是寸铁&#x1f44a; 总结了一篇defer传参与time.sleep初探的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 请大家看下面这段代码&#xff0c;看运行结果会出现什么&#xff0c;为什么&#xff1f; 问题 demo package mainim…

pycharm安装过程

1、安装包官网下载 PyCharm: the Python IDE for Professional Developers by JetBrains 点击下载 下拉选择社区版本 选择下载 下载完成后&#xff0c;双击exe安装。 安装完成&#xff0c;生成的桌面快捷方式 同意并继续 进入开发界面

Linux 下 TFTP 服务搭建及 U-Boot 中使用 tftp 命令实现文件下载

目录 搭建 TFTP 服务文件下载更多内容 TFTP&#xff08;Trivial File Transfer Protocol&#xff0c;简单文件传输协议&#xff09;是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务&#xff0c;端口号…

【CANoe使用大全】——DBC数据库制作

文章目录 1.DBC数据库选择1.1.DBC模板选择1.3. 新建报文1.4. 新建信号1.5.数值表建立 2. DBC导入 1.DBC数据库选择 首先找到DBC编辑器入口 1.1.DBC模板选择 举例说明&#xff1a; 新建选择CANFD的模板 1.3. 新建报文 注意上图中报文周期“Cycle Time”处于不可编辑状态…

最新综述!3D Gaussian Splatting

作者&#xff1a;小柠檬 | 来源&#xff1a;3DCV 在公众号「3DCV」后台&#xff0c;回复「原论文」可获取论文 文章介绍了3D高斯喷洒在场景重建和渲染中的应用&#xff0c;并探讨了其在机器学习和计算机视觉领域的潜在应用。文章还提供了3D高斯喷洒的基本原理和优化方法&#x…

基于若依的ruoyi-nbcio流程管理系统一种简单的动态表单模拟测试实现(五)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…

HTTP动态代理的原理及其对网络性能的影响

HTTP动态代理是一种通过代理服务器来转发HTTP请求和响应数据的网络技术&#xff0c;它可以优化网络性能、提高网络安全性&#xff0c;并解决跨域请求的问题。本文将详细介绍HTTP动态代理的原理及其对网络性能的影响。 一、HTTP动态代理的原理 HTTP动态代理的基本原理是在客户…

免费SSL申请和自动更新

当前是在mac下操作 安装certbot # mac下brew安装即可 brew install certbotcentos 安装 centos安装文档 申请泛解析证书 sudo certbot certonly --manual --preferred-challengesdns -d *.yourdomain.com## 输出 Saving debug log to /var/log/letsencrypt/letsencrypt.lo…

【Kafka】高级特性:生产者

目录 消息发送消息生产流程ProducerRecord序列化器分区器拦截器 生产者原理剖析主线程消息累加器 发送线程 生产者参数 消息发送 消息生产流程 整个流程如下&#xff1a; Producer创建时&#xff0c;会创建一个Sender线程并设置为守护线程。生产消息时&#xff0c;内部其实是…

幻兽帕鲁PalWorld服务器搭建详细教程

幻兽帕鲁PalWorld是一款由Pocketpair开发的游戏&#xff0c;融合了多种玩法&#xff0c;其独特的题材和画风吸引了很多玩家。为了更好地进行游戏体验&#xff0c;很多玩家选择自行搭建服务器。本文将详细介绍如何搭建幻兽帕鲁PalWorld服务器。 第一步&#xff1a;购买服务器 根…

NLP深入学习(九):KNN 算法及分类用法

文章目录 0. 引言1. 什么是 KNN2. k 值的选择3. kd 树3.1 构建 kd 树&#xff1a;3.2 kd 树搜索&#xff1a;3.3 例子 4. 参考 0. 引言 前情提要&#xff1a; 《NLP深入学习&#xff08;一&#xff09;&#xff1a;jieba 工具包介绍》 《NLP深入学习&#xff08;二&#xff09…

【C++】入门(二)

前言&#xff1a; c基础语法&#xff08;下&#xff09; 文章目录 五、引用5.1 引用概念5.2 引用使用规则5.3 常引用5.4 引用的使用场景5.5 引用和指针的区别 六、内联函数6.1 概念6.2 内联函数的特性 七、auto关键字&#xff08;C11&#xff09;7.1 概念7.2 使用规则7.3 用于f…

(M)unity2D敌人的创建、人物属性设置,遇敌掉血

敌人的创建 1.敌人添加与组件设置 1&#xff09;添加敌人后&#xff0c;刚体添加&#xff0c;碰撞体添加&#xff08;一个碰撞体使猪在地上走&#xff0c;不接触人&#xff0c;另一个碰撞体组件使人和猪碰在一起产生伤害&#xff09; ①刚体 ②碰撞体一 设置的只在脚下&a…

关于标准那些事——第十篇 分类标准

最近要赶一个极其重要的CANS认证项目&#xff0c;这会是全中国第一个完全数字化CNAS认证的实验室项目&#xff0c;内容分享进度会比较慢。其实&#xff0c;大多数情况也并不是没有时间&#xff0c;俗话说&#xff1a;时间嘛&#xff0c;挤挤总是有的&#xff01;其实影响进度更…

php低版本(7.4)配置过程中遇到的问题及基本解决手段

目前php不支持较低版本的安装&#xff0c;如果安装低版本必须借助第三方库shivammathur //将第三方仓库加入brewbrew tap shivammathur/php //安装PHPbrew install shivammathur/php/php7.4 可能出现的问题 像这样突然中止然后报错&#xff0c;一般是网络问题&#xff0c;或…

Socket实现服务器和客户端

Socket 编程是一种用于在网络上进行通信的编程方法&#xff0c;以下代码可以实现在不同主机之间传输数据。 Socket 编程中服务器端和客户端的基本步骤&#xff1a;服务器端步骤&#xff1a; 1.创建 Socket&#xff1a; int serverSocket socket(AF_INET, SOCK_STREAM, 0);…

git 对象压缩及垃圾对象清理

git 对象压缩及垃圾对象清理 这篇文章让我们来看看 git 的对象压缩机制&#xff0c;前面的几篇文章我们提到&#xff0c;在执行 git add 命令会会把文件先通过 zlib 压缩后放入到「暂存区」&#xff0c;我们先看看这个步骤&#xff1a; 我们这个实例中有一个 1.28m 的 index.…

网工内推 | 国企、合资公司IT专员,13薪,NA以上即可

01 上海新徐汇&#xff08;集团&#xff09;有限公司 招聘岗位&#xff1a;IT运维 职责描述&#xff1a; 1.负责制定网络体系搭建、IP地址分配、网络拓扑图、无线网络等&#xff1b; 2.负责桌面运维技术支持&#xff0c;确保各类系统和终端设备正常工作&#xff1b; 3.负责弱电…

信号量机制解决经典同步互斥问题

生产者 / 消费者问题、读者 / 写者问题和哲学家问题是操作系统的三大经典同步互斥问题。本文将介绍这三个问题的基本特点以及如何用信号量机制进行解决。 在分析这三个问题之前&#xff0c;我们首先需要了解用信号量机制解决同步互斥问题的一般规律&#xff1a; 实现同步与互斥…

IDCNBSAIS-财务报表功能范围取值管理费用、销售费用、研发费用排除指定科目的实现

IDCNBSAIS-财务报表功能范围取值管理费用、销售费用、研发费用排除指定科目的实现 公司遇到的一个问题&#xff0c;目前报表有些项目是按照功能范围取值的&#xff0c;发现取多了。需要排除某些科目。 下面这例子就是要排除6601010204/05/06 这3个对应的科目 研究了很多方法…