51单片机-按键控制led灯

文章介绍了使用C语言在Keil环境下进行单片机开发,特别是针对IO口的使用,包括如何找到和控制IO口以及具体引脚。通过示例展示了如何进行基本的输入/输出操作,实现灯的点亮、闪烁以及通过按键控制灯的状态,同时引入了软件消抖技术来提高按键检测的稳定性。
摘要由CSDN通过智能技术生成

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; //亮
        }
    }
}
  • 2
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lucas.1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值