蓝桥杯-单片机(LED)

前言:

        相信看到此篇的小伙伴都已经是备战15,16乃至更高届蓝桥杯的小伙伴了。从14届开始,比赛使用的板子已经由国信长天的v10->国信长天v20。不论实物长什么样,更新比赛用板更新到多少代,不论比赛现场提供多少新的资料,淘汰了多少旧的资料,比赛一直不变的会提供单片机板子的原理图和各个芯片手册,在接下的文章中,我也将会结合芯片手册和原理图和大家讲解一下,我对这颗IAP15F2K61S2的理解和上层逻辑的编程。

        本次内容是讲述LED灯的原理和实现LED跑马灯的程序:

一、LED灯的原理

        LED灯,又名发光二极管,顾名思义,发光二极管和普通二极管差不多,都是由PN结组成的,具有单向导通性,想要实现LED的点亮,需要在LED两端施加2-4V的电压。

LED在原理图中,长这样:

在这里,我们需要知道一个概念:共阳,共阴。

在LED中共阳的概念是:发光二极管的阳极接在一起。那么共阴的概念就是:发光二极管的阴极接在一起。

可能有些同学分不清哪个是发光二极管的阳极,哪个是二极管的阴极,在这我们引入一张图说明:

(“+”为阳极,“-”为阴极)

        介绍完共阳共阴的概念之后,我们通过原理图可以知道,在v10的板子中,所有的LED都是共阳,及当单片机的引脚对外输出低电压(接近0V)的时候,LED能够被导通(发光),当单片机引脚输出高电平(接近5V)的时候,LED会截止(不发光)。

        此时,我们目标明确,只要单片机对应引脚输出低电平,我们就能点亮一个LED灯,但,先别着急,让我们先了解一下,从单片机引脚出发经过什么样的电路或配置,才能到达LED的阴极引脚呢?

查看原理图:

详细讲解一下原理图:这个里面有很多数电里面的芯片,在这里主要介绍一下芯片的作用,至于具体芯片的内部组成电路图和工作原理,同学们可以自行百度。

在原理图中,P00,P01,P02……这些表示单片的对外引脚编号,该单片机字长为8位,总共由4个寄存器即P0,P1,P2,P3。寄存器长度为1个字节,对应的每个寄存器内部又有8位,即P00,P01……P07。该单片机支持位带操作,可以单独对寄存器下的某一位进行置高或者置低操作。

根据电路图,可以找到一条点亮LED0的线路:P00输出一个信号,通过74HC573锁存器,然后输出到LED的阴极上去。

对于74HC573锁存器的介绍,见下面链接:

74HC573_百度百科 (baidu.com)icon-default.png?t=N7T8https://baike.baidu.com/item/74HC573/3288101说的直白一点就是:

如果想要实现锁存功能,必须要让LE是高电平,OE端口是低电平。

原理图我们知道OE端口直接被接地,置0。剩下LE端口收到Y4C控制。

通过这个原理图截图,我们知道,Y4C是Y4和WR或非后的产物。WR在CON3的接线端上通过跳线帽和GND连接,即WR的电平为低电平,那么,我们需要让Y4变为低电平就可以了。

查看Y4,他的输出是由74HC138译码(P25,P26,P27)三个输入得到的。对于74HC138译码器的原理图,可以自行通过查看了解。

74HC138_百度百科 (baidu.com)icon-default.png?t=N7T8https://baike.baidu.com/item/74HC138?fromModule=lemma_search-box通过观察138的真值表,可以得出:

当A2=1,A1=0.A0=0的时候,Y4输出为0。对应单片机原理图,即当P27=1,P26=0,P25=0的时候,Y4输出为0。

综上所述,我们完成了所有电路的走线,明白了我们想要点亮一个LED灯,就需要完成对译码器,锁存器的配置。接下来就是代码的完成。

二、代码编写

在代码编写前,需要完成keil的安装,在这边不再赘述,直接上链接。

 蓝桥杯开发板学习——软件准备及芯片包安装_蓝桥杯单片机开发板_阿尔法猫_的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_63043961/article/details/121579381

代码展示如下:

/*----------------点亮第一个LED灯----------------*/
#include "STC15F2K60S2.H"

/*------完成位定义------*/
sbit HC_A=P2^5;           //对锁存器的A进行定义
sbit HC_B=P2^6;           //对锁存器的B进行定义
sbit HC_C=P2^7;           //对锁存器的C进行定义
sbit LED = P0^0;
/*---------------------*/

void main()
{
    HC_A = 0;
    HC_B = 0;
    HC_C = 1;             //完成74HC138的编译,使锁存器正常工作
    P0 = 0xff;            //清P0寄存器
    while(1)
    {
        LED = 0;          //点亮P00的LED灯
    } 
}

/*----------------点亮第一个LED灯----------------*/

 完成点亮第一个LED后,实现流水灯效果:

/*----------------LED流水灯----------------*/
#include "STC15F2K60S2.H"

/*------完成位定义------*/
sbit HC_A=P2^5;           //对锁存器的A进行定义
sbit HC_B=P2^6;           //对锁存器的B进行定义
sbit HC_C=P2^7;           //对锁存器的C进行定义
/*---------------------*/

void delay(unsigned int time)
{
    while(time--);         //这里写了一个延时函数
}

void main()
{
    unsigned int i;
    HC_A = 0;
    HC_B = 0;
    HC_C = 1;             //完成74HC138的编译,使锁存器正常工作
    P0 = 0xff;            //清P0寄存器
    while(1)
    {
        for(i=0;i<8;i++)
        {
            P0=(0xff<<i);
            delay(50000);
        }
      
        for(i=0;i<8;i++)
        {
            P0=~(0X7F>>i);
            delay(50000);
        }

    } 
}

/*----------------LED流水灯----------------*/

这里涉及位操作:左移位和右移位

彻底理解位运算——左移、右移_左移和右移_程序员李哈的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_43799161/article/details/125967961运用一下别人的blog做一个解释。

还有一个就是delay函数:简单说明一下delay的原理就是指令周期的时间为1us,延长时间=time*1.举个例子,time=50000时,延时为:50000*1=50000us=50ms=0.05s。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值