关于51单片机启蒙的那点事儿

 1.2.1 关于灯LED的那些事儿 

思维发散:
  • 单片机编程是什么:人类要求单片机干具体的活,有点像提前写个小纸条贴冰箱上,告诉你女朋友 煮鸡蛋不加水
  • 单片机执行程序怎么理解: 女朋友看到纸条后,照做!
  • 单片机能做什么事情: IO口供电,串口数据传输等
  • 肉眼可见的引脚是什么:方便人类对单片机IO口,串口接东西
  • 单片机CPU怎么找到IO口:通过寻址,说白了有一些地址数据,头文件帮你做很多了
  • 怎么写纸条(编程)找到IO口呢:ANSI C
  • sfr“指令”: 用来直接描述硬件地址,小白先理解成一组IO的起始地址中数据 sfr P0 = 0x80; P0 = 0;
  • 怎么找到IO口的具体一个引脚呢: sbit“指令:对应可位寻址空间的一个位,小白先理解成一个IO/针脚的地址中数据 sbit led2 = P3^6 c语言的一个字节,char型就是8

我手上的89C525组这样的输入输出口,分别为P0,P1,P2, P3每组对应8个针脚,P4RC系列才有,7个 针脚

89C52 比较简单粗暴,关于引脚输入还是输出的功能不需要配置
比如
sbit IFfire = P1^0;
int main()
{
    int io_data;
    //什么情况叫做输入
    io_data = IFfire; // 给变量赋值,就是输入 —— 或者理解为,这个针脚有数据啦,拿个变量来保存
    if(io_data == 0)
    {

    }
    //什么情况叫做输出
    IFfire = 1; // 被给予一个数值,引起IO口电压变化(一般1输出高电平,0输出低电平),此时为输出,来影响外接的电路
    return 0;
}
为什么灯会亮
得看电路图,但是不要怕,初中电路知识而已!也叫单片机原理图,是硬件设计者设计的
记住:原理图中标号一样代表是同一根 电线
简单的串联电路, D4,D5,D6 板子上有标记, D5 一端通过电阻接 5v ,另外一端接着 "LED1 标志的线 " ,我们发现在89C52RC 的电路图中也有 LED1 的标志,是在 P3 IO 口组中,在 P3.7 引脚,所以编程让 P3.7 出 低电平(0)就让 D5 灯完成一个串联电路,所以亮
#include "reg52.h"

sbit ledOne = P3^7;

void main()
{
    //灯亮,给一个P3.7低电平
    ledOne = 0;
}

 也就是说,给LED1对应标号的P3^7一个低电平,就能点亮

怎么做才会闪烁
  • 使用STC-ISP自带延时函数
#include "reg52.h"

sbit ledOne = 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低电平
    ledOne = 0;
    //数数,数的期间,维持低电平,灯亮,延迟
    Delay500ms();
    //灯灭,给一个高电平
    ledOne = 1;
    //数数,数的期间,维持高电平,灯灭,延迟
    Delay500ms();
    }
}

1.2.2 按键控制灯

        原理:按键和灯不是我们传统理解的思维,传统按键和灯是在同一个电路中的。而我们单片机编程按键和灯是分开的两个电路,通过单片机作为媒介来处理数据,通过逻辑来实现按键控制灯
查询法按键控制灯
  • 怎么知道sw1按键被按下
        KEY1位置和 GND 接通,表现为低电平,值为 0
  • 怎么知道sw1按键没有被按下
        KEY1位置通过上拉电阻到 5V ,表现为高电平,值为 1
通过图 a2 得知
同理 LED 的分析,
KEY1 接到 STC89C52RC P2.1 口,我们只要不断检测 P2.1 口的值( 0- 按下, 1- 松开)就知道按键是 否被按下

按键控制灯 

#include "reg52.h"

sbit key1 = P2^1;
sbit ledOne = P3^7;

void main()
{
    while(1)
    {
        //注意:用“==”两个等于号表示判断,新手容易犯错
        if(key1 == 0)
        { 
            //KEY1位置和GND接通,表现为低电平,值为0
            //灯亮,给一个P3.7低电平
            ledOne = 0;
        }
    }
}
按键控制灯, SW1 开, SW2 关,案例中只在 SW1 添加软件消抖
#include "reg52.h"
#include <intrins.h>

sbit key1 = P2^1;
sbit key2 = P2^0;
sbit ledOne = 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()
{
    //查询法检测,是否被按下
    while(1)
    {
        if(key1 == 0)//KEY1位置和GND接通,表现为低电平,值为0
        {
            //感觉被按下,不知道是抖动还是人为,延迟50ms再判断一次
            //软件消除抖动
            Delay50ms();
            if(key1 == 0)
            {
                //灯亮,给一个P3.7低电平
                ledOne = 0;
            }
        }
        if(key2 == 0)
        {
             //KEY2位置和GND接通,表现为低电平,值为0
             ledOne = 1;//灭
        }
    }
}
按键按下一次,灯状态改变
void main()
{
    led1 = 0;
    led2 = 0;
    while(1)
    {
        if(sw1 == 0)
        {
             led1 = !led1;
        }
    }
}
状态位来控制 LED
void main()
{
    int ledMark = OFF_STATUS;
    ledOne = 1;
    //查询法检测,是否被按下
    while(1)
    {
        if(key1 == 0)//KEY1位置和GND接通,表现为低电平,值为0
        {
            //感觉被按下,不知道是抖动还是人为,延迟50ms再判断一次
            //软件消除抖动
            Delay50ms();
            if(key1 == 0)
            {
                //记住,key1被按下,记住,在其他地方点灯
                ledMark = ON_STATUS;
            }
        }
        if(key2 == 0)
        {
            //KEY2位置和GND接通,表现为低电平,值为0
            ledMark = OFF_STATUS;
        }
        if(ledMark == OFF_STATUS)
        {
            ledOne = 1;
        }
        else
        {
            ledOne = 0;
        }
    }
}

        后期学习分享将在下一篇博文中详细讲解哦,敬请期待吧

1.3 遇见潇潇遇见你,不负代码不负卿

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值