1.2基本IO口控制

1.2.1从最基础的点LED灯开始

  • 单片机通过寻址找到 IO口

  • 怎么(编程)找到IO口呢:ANSI C sfr“指令”: 用来直接描述硬件地址,先理解成“一组IO口”的起始地址中数据 sfr P0 = 0x80; P0 = 0;

  • 找到IO口的具体一个引脚呢: sbit“指令”:对应可位寻址空间的一个位,小白先理解成“一个IO口/针脚”的地址中数据 sbit led2 = P3^6 c语言的一个字节,char型就是8位

stc89c52有5组这样的输入输出口,分别为P0,P1,P2,P3每组对应8个针脚,P4是RC系列才有,7个 针脚

是对单片机来讲的,IO口的 输入(把外面东西拿回来)/输出(给东西给外面)89C52比较简单粗暴,关于引脚输入还是输出的功能不需要配置 ,比如:

sbit IFfire = P1^0;
int main()
{
    int io_data;
    //什么情况叫做输入
    io_data = IFfire; // 给变量赋值,就是输入 —— 或者理解为,这个针脚有数据啦,拿个变量来
    保存
    if(io_data == 0){

    }
    //什么情况叫做输出
    IFfire = 1; // 被给予一个数值,引起IO口电压变化(一般1输出高电平,0输出低电平),此时为输
    出,来影响外接的电路
    return 0;
}

1.1灯为什么会亮

单片机电路图,非常简单,初中知识

(原理图中标号一样代表是同一根“电线” )

简单的串联电路,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一个低电平,就能点亮灯

1.2怎么样使LED灯闪烁,这个简单就是一下亮一下不亮

这里我们使用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.3按键控制LED

轮询法按键控制灯

怎么知道sw1按键被按下 KEY1位置和GND接通,表现为低电平,值为0 怎么知道sw1按键没有被按下 KEY1位置通过上拉电阻到5V,表现为高电平,值为1

我们只要不断检测P2.1口的值(0-按下,1-松开)就知道按键是 否被按下

#include "reg52.h"

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

按键控制灯,SW1开,SW2关,案例中只在SW1添加软件消抖
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;//灭
        }
        按键按下一次,灯状态改变
        状态位来控制LED
    }
}

按键按下一次,灯状态改变

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值