【51单片机】02LED流水灯实验

打印 上一主题 下一主题

主题 881|帖子 881|积分 2643

一、点亮第一个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输出低电平),间隔点亮、熄灭
  1. #include <reg52.h>
  2. const int TIME_MS = 100;
  3. sbit LED1 = P2^0;    // 定义LED1对应到P2.0引脚
  4. void delay_10us(int delay_time) {  // 比较暴力的延时方法,执行一个--循环耗时大概是10us
  5.         while(delay_time--);
  6. }
  7. void main() {
  8.     while(1) {
  9.             LED1 = 0;  // 引脚输出低电平,可以驱动LED点亮
  10.                 delay_10us(500 * TIME_MS);   //  约500ms
  11.                 LED1 = 1;         
  12.                 delay_10us(500 * TIME_MS);
  13.         }
  14. }
复制代码
3.LED流水灯



  • 结合之前讲的知识,可以直接操纵P2端口的输出值来操控LED的状态,可以实现如下流水灯程
  1. #include "reg52.h"
  2. // 小灯循环跑
  3. const int TIME_MS = 100;
  4. void delay_10us(int time_us) {
  5.     while(time_us--);
  6. }
  7. void main() {
  8.     int count = 0;
  9.         P2 = 0xff;        // 将P2口赋初值,高电平,小灯全部熄灭  
  10.         while(1){
  11.             P2 = ~(0x01<<count);  // 这里用低位为1开始移动,取反之后就可以变为移动0
  12.                 if (count >= 8){
  13.                     count = 0;          // 重置计数
  14.                 } else  {
  15.                     count++;
  16.                     delay_10us(100 * TIME_MS);
  17.                 }
  18.         }
  19. }
复制代码
  1. #include "reg52.h"
  2. // 小灯来回跑
  3. const int TIME_MS = 100;
  4. void delay_10us(int time_us) {
  5.     while(time_us--);
  6. }
  7. void main() {
  8.     int count = 0;
  9.         char flag = 0;
  10.         P2 = 0xff;        // 将P2口赋初值,高电平,小灯全部熄灭
  11.         while(1){
  12.             switch(flag) {
  13.                     case 0:
  14.                             P2=~(0x01<<count);
  15.                                 count++;
  16.                                 if (count > 8) flag = 1;
  17.                             break;
  18.                         case 1:
  19.                             P2=~(0x80>>(8 - count));
  20.                                 count--;
  21.                                 if (count < 0) flag = 0;
  22.                             break;
  23.                 }
  24.                 delay_10us(30 * TIME_MS);
  25.         }
  26. }
复制代码
源码+实验程序
学习视频泉源:B站-普中官方视频

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表