当前位置: 首页 > news >正文

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

目录

  • 点亮第一个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 取反即为 0xFEdelay(5000);//大约延时450mswhile(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 P2void 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);}}}

相关文章:

  • 707. 设计链表(力扣刷题)(C语言题解)
  • ARM-M0 + 24bit ADC,采样率8KSPS,高精度ADC使用手册
  • [GN] DP学习笔记板子
  • Next.js如何正确处理跨域问题?
  • 网络ADB连接(不用实体安卓线)
  • 每日一练:LeeCode-404、左叶子之和【二叉树】
  • IDEA:git 回滚本地提交-git 选择 Reset Current Branch to
  • 《区块链简易速速上手小册》第4章:区块链与加密货币(2024 最新版)
  • Vue2:请求接口的两种方式axios和vue-resource
  • 大模型重塑车载语音交互:赛道巨头如何引领新周期?
  • 力扣0114——二叉树展开为链表
  • Python爬虫请求库安装
  • Spring Cloud使用笔记
  • 判断一个字符串中出现次数最多的字符,统计这个次数?
  • C++——特殊类
  • 【刷算法】求1+2+3+...+n
  • es的写入过程
  • Gradle 5.0 正式版发布
  • js数组之filter
  • MySQL QA
  • Vue官网教程学习过程中值得记录的一些事情
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 浏览器缓存机制分析
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用API自动生成工具优化前端工作流
  • 数据仓库的几种建模方法
  • ### RabbitMQ五种工作模式:
  • #WEB前端(HTML属性)
  • (007)XHTML文档之标题——h1~h6
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (C语言)字符分类函数
  • (初研) Sentence-embedding fine-tune notebook
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (算法)Game
  • (图)IntelliTrace Tools 跟踪云端程序
  • (译) 函数式 JS #1:简介
  • (原)Matlab的svmtrain和svmclassify
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)memcache、redis缓存
  • (转)编辑寄语:因为爱心,所以美丽
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net 发送邮件
  • .NET 解决重复提交问题
  • .net 中viewstate的原理和使用
  • .Net多线程Threading相关详解
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • @ComponentScan比较
  • @Not - Empty-Null-Blank
  • [ C++ ] STL---string类的模拟实现
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [20140403]查询是否产生日志
  • [20171113]修改表结构删除列相关问题4.txt