前言:
相信看到此篇的小伙伴都已经是备战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)https://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)https://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的安装,在这边不再赘述,直接上链接。
代码展示如下:
/*----------------点亮第一个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博客https://blog.csdn.net/qq_43799161/article/details/125967961运用一下别人的blog做一个解释。
还有一个就是delay函数:简单说明一下delay的原理就是指令周期的时间为1us,延长时间=time*1.举个例子,time=50000时,延时为:50000*1=50000us=50ms=0.05s。