使用51单片机按键控制LED灯

1.开发环境介绍

  • 使用C语言,环境为keil

  • Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用.

  • 什么是单片机

  • 单片机(Single-Chip Microcomputer)是一种集成电路芯片,把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用.

    2.了解IO口

  • 怎么找到IO口

  • sfr“指令”: 用来直接描述硬件地址;“一组IO口“的起始地址中数据 sfr P0 = 0x80;P0= 0;

  • 怎么找到IO口具体的某个引脚

  • sbit“指令”:对应可位寻址空间的一个位;“一个IO口/针脚“的地址中数据 sbit led2 =P3^6;

  • IO口介绍

  • stc89c51有4组IO口,分别为P0,P1,P2,P3;stc89c52有5组IO口,分别为P0,P1,P2,P3,P4每组对应8个针脚,P4是RC系列才有,7个针脚.

    3.基本IO控制

    对单片机来讲,IO口的 输入(把外面东西拿回来)/输出(把里面的东西给外面)

    sbit beep = P1^0;
    sbit IFfire = P1^1;
    int main()
    {
    int IO_data;
    //什么情况叫做输入
    IO_data = IFfire; // 给变量赋值,就是输入 —— 或者理解为,这个针脚有数据,拿个变量来保存
    if(IO_data == 0){
      beep =0;
    }
    //什么情况叫做输出
    IFfire = 1; // 被给予一个数值,引起IO口电压变化(一般1输出高电平,0输出低电平),此时为输
    出,来影响外接的电路
    return 0;
    }

    4. 按键控制灯

  • 4.1 电路图介绍

  • 4.2 简单亮灯

  • 电路图中LED1(D5)的标志,是在P3的IO口组中,在P3.7引脚,编程让P3.7出低电平(0)就让D5灯完成一个串联电路,亮灯

    #include "reg52.h"
    sbit led1 = P3^7;
    void main()
    {
    //灯亮,给一个P3.7低电平
    led1 = 0;
    }
  • 4.3 使灯闪烁

  • 使用延时函数,让灯每隔0.5秒亮(灭)

    #include "reg52.h"
    sbit led1 = P3^7;
    //延时函数
    void Delay500ms() //@11.0592MHz
    {
    unsigned char i, j, k;
        i = 4;
        j = 129;
        k = 119;
    do
    {
        do
        {
            while (--k);
        } while (--j);
      } while (--i);
    }
    
    void main()
    {
    //灯灭,给一个高电平
    //重复执行
        while(1){
    //灯亮,给一个P3.7低电平
        led1 = 0;
    //数数,数的期间,维持低电平,灯亮,延迟
        Delay500ms();
    //灯灭,给一个高电平
        ledOne = 1;
    //数数,数的期间,维持高电平,灯灭,延迟
        Delay500ms();
        }
    }
  • 4.4 通过按键控制灯

  • 查询法按键控制灯

    sw1按键被按下,KEY1位置和GND接通,表现为低电平,值为0;

    sw1按键没有被按下,KEY1位置通过上拉电阻到5V,表现为高电平,值为1;

    代码介绍

    通过按键控制灯,SW1开,SW2关,案例中只在SW1添加软件消抖,按键按下一次,灯状态改变,通过状态位来控制LED;

    具体案例如下:

    #include "reg52.h"
    #include <intrins.h>
    sbit key1 = P2^1;
    sbit key2 = P2^0;
    sbit led1 = P3^7;
    
    void Delay50ms() //@11.0592MHz
    {
    unsigned char i, j, k;
    _nop_();
    _nop_();
        i = 3;
        j = 26;
        k = 223;
    do
        {
          do
            {
                while (--k);
            } while (--j);
        } while (--i);
    }
    
    void main()
    {
    int ledMark = OFF_STATUS;
        led1 = 1;
    //查询法检测,是否被按下
    while(1){
    if(key1 == 0)/
    {
    //感觉被按下,不知道是抖动还是人为,延迟50ms再判断一次
    //软件消除抖动
    Delay50ms();
       if(key1 == 0){     //key1被按下
            ledMark = ON_STATUS;
        }
    }
    if(key2 == 0)
    {
    Delay50ms();
       if(key2 == 0){     //key2被按下,与GND连通,为低电平,0
            ledMark = OFF_STATUS;
        }
    }
        if(ledMark == OFF_STATUS){
                led1 = 1; //灭
    }else{
                led1 = 0; //亮
            }
        }
    }
    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用51单片机按键控制LED灯

    发表评论