还有一个月参加蓝桥杯单片机设计大赛, 开始准备:
首先当然是点亮LED了, 但是蓝桥杯使用的CT107D开发板使用了74HC573锁存器,74HC02或非门, 138译码器来控制, 这就使得开发板稍微有点难度了.
由于开发板上电后蜂鸣器会鸣叫,继电器会干扰系统的正常运行,所以首先我们要关闭蜂鸣器和继电器.
那么打开开发板原理图, 找到蜂鸣器,.
通过电路发现, 如果N BUZZ端口为0那么蜂鸣器就应该会鸣叫, 寻找N BUZZ的控制.
端口
我们发现NBUZZ接到ULN2003放大器的OUT7口,而放大器的IN7口连接到74HC573锁存器的Q7口, 锁存器Q7的输入口为P06口(D7).
锁存器74HC573的原理为, 如果OE端为0, LE端为1,那么D口可以控制Q口状态, 否则Q端保持上一次的电平状态.而电路图中OE已经接地, 所以当LE为1时,P06口可以控制蜂鸣器,反之为LE为0时蜂鸣器保持当前状态. 但是LE口又连接到Y5C, 找到原理图.
原理图显示Y5C被74HC02或非门控制, 其原理是先让Y5和WR的电平状态进行或运算, 然后将结果非运算后传给Y5C. 而WR在开发板的CON3上与GND相连, 所以当Y5为0时,Y5C为1 (0与0进行与运算为0, 非运算后为1). 然后我们再次找到Y5的控制端口.
Y5被74HC138译码器进行控制. 74HC138译码器的原理为:
P27 P26 P25 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
0 0 0 1 1 1 1 1 1 1 0
0 0 1 1 1 1 1 1 1 0 1
0 1 0 1 1 1 1 1 0 1 1
0 1 1 1 1 1 1 0 1 1 1
1 0 0 1 1 1 0 1 1 1 1
1 0 1 1 1 0 1 1 1 1 1
1 1 0 1 0 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1 1
这就使Y5的控制逻辑
到这里可能有点晕,我们整理一下思路:
为了使NBUZZ为0, 我们要使74HC573锁存器打开, 也就是Y5C为1, 而为了使Y5C为1, 我们要使Y5为0, 而为了使Y5为0,就要使P27为1,P26为0, P27为1, 这就我们可以使P06为0来愉快地关闭蜂鸣器啦. 而关闭继电器的原理与蜂鸣器相同, 可以和蜂鸣器一起操作, 这里就不再说明了.
下面贴上关闭蜂鸣器的代码:
void CloseBUZZ()
{
P2=(P2&0x1f)|0xa0; //先使得P2口的高三位为000,在通过或运算设置为 101,从而使Y5为0, 那么Y5C为1, 开启锁存器,
P0^6=0; //关闭蜂鸣器
P0^4=0; //关闭继电器
P2&=0x1f; //通过与运算使P2口的高三位为000, 使得Y5为1, 锁存器关闭,使得蜂鸣器和继电器保持关闭状态.
}
关闭后我们点亮LED,:
我们发现LED的控制逻辑和蜂鸣器的控制逻辑几乎一模一样, 所以LED的控制逻辑就不再赘述了.
直接贴上点亮LED的整个代码:
#include
typedef unsigned int uint;
typedef unsigned char uchar;
sbit BUZZ=P0^6;
sbit RELAY=P0^4;
void CloseBUZZ();
void main()
{
CloseBUZZ();
P2=(P2&0x1f)|0x80; //打开锁存器控制LED
P0=0x55; //点亮奇数LED
}
void CloseBUZZ() //关闭蜂鸣器以及继电器
{
P2=(P2&0x1f)|0xa0;
BUZZ=0;
RELAY=0;
P2&=0x1f;
}
蓝桥杯每天一更,供大家学习交流使用,转载请先说明来处;