前言
因 蓝桥杯单片机竞赛 而学单片机。
开发板是 国信长天单片机竞赛实训平台 搭载有 IAP15F2K61S2单片机。
软件采用的是 Keil uVision4 (V4.60.6.10) 以及 STC-ISP (V6.86R)。
Mission 1 LED
原理
LED,即发光二极管。有亮(1)和灭(0)两种状态。原理图中,VCC的值一般为5V,代表逻辑1。以最上方的LED灯 L1 为例,右侧电压为 1 ,高电平。若左侧电压为 1 高电平,则 L1 熄灭;为 0 低电平,则 L1 亮。因此, L1 的亮灭取决于 Q1 即 19 管脚,其他同理。
发光二极管通过 锁存器U6 与单片机相连。单片机的数据不会直接送到发光二级管上,而是送到锁存器上。
Y4C 是 锁存器U6 的选择端。只有当 Y4C 为 1 的时候,锁存器U6才会被选中。(之所以有选中之说,是因为除了U6还有U7、U8等锁存器,选中哪个,哪个工作)
如果锁存器没有被选中,那么数据不会从锁存器输出。也就是说,我们要使得有数据输出到LED上,那么 Y4C 必须是 1 。
如何选中锁存器
Y4C由单片机控制。
若要使得 Y4C=1 ,那么Y4=0、WR=0 同时成立。比赛时,WR默认接地即为0 。 因此,Y4C=1 的充要条件是 Y4=0。
译码器74HC138 的工作特点是,工作时,只有一个端口会输出 0 ,其余输出 1 。因此,在这里我们要让 Y4 端输出 0 。
输出端口的选择由 P27 P26 P25 决定,当 P27 P26 P25 = 1 0 0 (二进制的 4)时,Y4端输出 0 。
至此,我们完成了锁存器的选择。
总结,单片机用 P2 口的高三位来选择锁存器。
锁存器的数据输出
锁存器的数据输出由 P0 口决定。
以上图为例,当 P0=0 0 0 0 1 1 1 1 时,那么Q8 Q7 Q6 Q5为低电平,LED亮, Q4 Q3 Q2 Q1为高电平,LED灭。
代码
下面展示 示范代码
。
* 硬件环境:IAP15F2K61S2单片机,单片机内部振荡器频率:11.0592M
* 注意事项:包含STC15F2K60S2.H头文件,里面包含了所有的STC15系列的寄存器定义,
此头文件可在STC-ISP软件中生成,要用到_nop_()必须要包含intrins.h
头文件
* 日期版本:2019-6-24/V2.0
*******************************************************************************/
#include "STC15F2K60S2.H"
#include "intrins.h"
//定义关闭蜂鸣器
void cls_buzz(void)
{
P2 = (P2&0x1F|0xA0);
P0 = 0x00;
P2 &= 0x1F;
}
//定义延时200ms
void delay() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 9;
j = 104;
k = 139;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main(void)
{
cls_buzz(); //关蜂鸣器
while(1)
{
P2 = ((P2&0x1f)|0x80); //选择U6锁存器
P0 = 0xff; //LED关 P0=11111111
P2 &= 0x1f; //不选U6锁存器
delay(); //延时
P2 = ((P2&0x1f)|0x80);
P0 = 0x00; //LED开 P0=00000000
P2 &= 0x1f; //不选U6锁存器
delay(); //延时
}
}
代码简析
关蜂鸣器是基本操作,用不到蜂鸣器的时候最好都用上面的代码关掉。
这里要用到延时函数 delay(),如果不延时,那么很快LED就会熄灭,我们为了让LED的状态保持一段时间,所有要用到延时函数。
延时函数 delay() 可以由stc-isp软件自动生成。(比赛可用)
接下来我们来看 main
第一部分调用上面定义的 cls_buzz() 关蜂鸣器
第二部分 while(1) 循环 一直执行
while(1)中 就是上面原理部分讲到的对 P2 P0 的控制,可以不用逻辑运算的形式给出,可以直接用二进制赋值。
总结
LED亮灭控制,只要控制 P2 P0 口就可以完成。