点亮你的LED
- 一、点亮第一个LED
- 1.GPIO介绍
- 2.P1、P2、P3端口
- 二、LED实验
- 2.尝试点亮LED
- 3.LED流水灯
一、点亮第一个LED
1.GPIO介绍
这块内容这里可以做简单的了解,与数电知识强相关。后续可以再回过头来学习
-
GPIO (general purpose input output) 通用输入输出端口的简称,可以通过软件来控制其输入与输出
-
GPIO的工作原理
-
P0口作为输出端口的时候,多路开关是连接到D锁存器的
-
P0作为输入端口时,直接与读缓冲器相连
2.P1、P2、P3端口
- P1口只能作为单独的IO口使用,他有上拉电阻,可以输出高电频
- P2端口同时具有P0和P1的特点,有上拉电阻、也有多路选择开关
- P3口,相比P1多了一个第二功能的输入端口
二、LED实验
2.尝试点亮LED
- D1-D8的LED和单片机的P2端口相连,原理图如下,只要让P2.x的引脚为低电平,就能使发光二极管导通
- 设计实验目标:点亮D1指示灯(P2.0输出低电平),间隔点亮、熄灭
#include <reg52.h>
const int TIME_MS = 100;
sbit LED1 = P2^0; // 定义LED1对应到P2.0引脚
void delay_10us(int delay_time) { // 比较暴力的延时方法,执行一个--循环耗时大概是10us
while(delay_time--);
}
void main() {
while(1) {
LED1 = 0; // 引脚输出低电平,可以驱动LED点亮
delay_10us(500 * TIME_MS); // 约500ms
LED1 = 1;
delay_10us(500 * TIME_MS);
}
}
3.LED流水灯
- 结合之前讲的知识,可以直接操作P2端口的输出值来操控LED的状态,可以实现如下流水灯程
#include "reg52.h"
// 小灯循环跑
const int TIME_MS = 100;
void delay_10us(int time_us) {
while(time_us--);
}
void main() {
int count = 0;
P2 = 0xff; // 将P2口赋初值,高电平,小灯全部熄灭
while(1){
P2 = ~(0x01<<count); // 这里用低位为1开始移动,取反之后就可以变为移动0
if (count >= 8){
count = 0; // 重置计数
} else {
count++;
delay_10us(100 * TIME_MS);
}
}
}
#include "reg52.h"
// 小灯来回跑
const int TIME_MS = 100;
void delay_10us(int time_us) {
while(time_us--);
}
void main() {
int count = 0;
char flag = 0;
P2 = 0xff; // 将P2口赋初值,高电平,小灯全部熄灭
while(1){
switch(flag) {
case 0:
P2=~(0x01<<count);
count++;
if (count > 8) flag = 1;
break;
case 1:
P2=~(0x80>>(8 - count));
count--;
if (count < 0) flag = 0;
break;
}
delay_10us(30 * TIME_MS);
}
}
源码+实验程序
学习视频来源:B站-普中官方视频