零基础蓝桥杯单片机学习_第二章_LED与蜂鸣器 这一章我们正式进入代码的编写。读者需清楚的是硬件代码特别是51单片机与软件代码大有不同对于这块板子简要来说就是先指定模块再声明模块要做的事。那如何知道应该怎样让硬件工作呢让我们先看原理图。一、先编LED1.选中让我们先看LED打开“SCH_V31_原理图.pdf”如果你发现后期的学习中有差别可以看看V40的在原理图看看有没有发光二极管我们可以找到下面这个模块。那么我们可以看到LED 的左下角有个叫 Y4C 的引脚。让我们继续搜索 Y4C按 CtrlF 查找看看它到底连到哪里。见下图这个 WR 是当写入时单片机自动拉低电平如果选中 Yx则 Yx 相应被拉低经过或非门后 Y4C 输出高电平达到选中作用。根据上面表述我们要继续追溯 Y4。直接看旁边的三线至八线译码器三八译码器有 Y4。74HC138 是一个三八译码器即将 3 位编码变为 8 个控制。举例我想控制 Y4而 4 的二进制是 100则分别对应A2 | A1 | A01 | 0 | 0又根据上面表述我们看看 A012 对到哪里。直接来到第一页。可以看到对应关系为P25 - A0P26 - A1P27 - A2P26指 P2 口的第 6 引脚其他同理。在软件中我们可以直接控制 Px 的任意数值。也就是说我们只需要让 P2 100x xxxxx 0 or 1就能选中 Y4。但是既然前三位可以控制硬件其他 5 位数字一定也行。所以我们想要选中 Y4就需要在不改变末 5 位的情况下修改前三位。第一步不改变末五位先重置前三位方便下一步操作P2 P2 与 0001 11110x1F第二步将首三位更改成 100最终达到效果100x xxxxP2 P2 或 1000 00000x80但我们不能写 P2单片机不理解。怎么办呢我们将上面两个思路组合写成代码。P2 ( P2 0x1F ) | 0x80这样我们就选中了 LED 模组。选中了然后呢2.声明让我们再回到 LED 这块。不难注意左边有 D01234567有端联想它们分别控制 L12345678 灯。LED 灯的右上角接着 5V这代表着当给予 LED 一个低电平信号类似接地 0V时灯就会亮。那怎么控制 D01234567 呢我们再来到第一页找它们。可见控制 P0就能控制 D。比如说我们想让 L3 灯亮起则有对应的D76543210P76543210LED87654321应给数字11111011即令 P0 0xFB那么这个时候我们就完成了整个链路闭环指定 LED 模块 - 指定哪个灯打开总结起来代码如下P0 0xFB; P2 ( P2 0x1F ) | 0x80;将它转换为完整 C 代码#include STC15F2K60S2.H void main(){ /*这一段为了初始化所有引脚下一章会说*/ P0 0x00; P2 (P20x1f)|0x80; P2 0X1F; P2 (P20x1f)|0xa0; P2 0X1F; P2 (P20x1f)|0xc0; P2 0X1F; P2 (P20x1f)|0xe0; P2 0X1F; while(1){ /*这里开始为本章转换内容。*/ P0 0xFB; P2 (P20x1f) | 0x80; P2 0X1F; } }这里回到开头我讲述的是“先指定模块再声明模块要做的事”其实是错误的只是为了便于读者理解。真正的是先指定模块内的应用【P00xFB】再通过选中开放寄存器【P2 (P20x1f) | 0x80】修改模块内的译码达到目的最后取消选中关闭寄存器使数据保留在模块内。二、再编蜂鸣器不是你不会真的以为我会再打一遍蜂鸣器吧你猜为什么蜂鸣器和 LED 放一块。LED 与蜂鸣器原理相同特此作为技巧训练要求是让蜂鸣器响起来。下面是参考答案。参考答案#include STC15F2K60S2.H void main(){ /*初始化下章讲。*/ P0 0x00; P2 (P20x1f)|0x80; P2 0X1F; P2 (P20x1f)|0xa0; P2 0X1F; P2 (P20x1f)|0xc0; P2 0X1F; P2 (P20x1f)|0xe0; P2 0X1F; while(1){ /*要求达到的代码*/ P0 (P00xBF)| 0x40; P2 (P20x1f) | 0xa0; P2 0X1F; } }