需求:先让8路LED指示灯闪烁3遍后熄灭,接着依次点亮LED指示灯,继电器吸合后断开,然后依次熄灭LED指示灯,蜂鸣器叫一会儿后关闭。

N_BUZZ输出为低电平时,蜂鸣器工作;N_RELAY为低电平时,继电器吸合。

N_BUZZ和N_RELAY这两个信号通过74HC573锁存器和ULN2003。因此,要控制这两个信号74HC573锁存器的LE需要接收高电平,即Y5C输出高电平。

Y5C受一个或非门控制,WR为0,Y5C要为1,Y5则为0。Y5信号受138译码器控制,要让Y5输出低电平,138译码器的C、B、A口分别为1、0、1即可。此时已经完成了74HC573的数据导通,导通后数据来到ULN2003,其为一个晶体管阵列,内部主要就是非门,原理图如下:

要让N_BUZZ和N_RELAY这两个信号为0,通过ULN2003的非门,那么IN5和IN7的输入信号则要为1,既然74HC573锁存器信号已经导通,那么只需P04和P06为1即可完成蜂鸣器与继电器的运行。
完整代码:
#include "reg52.h"
sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;
void Delay(unsigned int t)
{
while(t--);
while(t--);
}
void LEDRunning()
{
unsigned char i;
HC138_C = 1;
HC138_B = 0;
HC138_A = 0; //让Y4输出低电平
for(i = 0; i < 3; i++)
{
P0 = 0x00;
Delay(60000);
Delay(60000);
P0 = 0xff;
Delay(60000);
Delay(60000);
}
for(i = 1; i <= 8; i++)
{
P0 = 0xff << i;
Delay(60000);
Delay(60000);
}
HC138_C = 1;
HC138_B = 0;
HC138_A = 1; //让Y5输出低电平
P0 = 0x10;
Delay(60000);
Delay(60000);
P0 = 0x00;
HC138_C = 1;
HC138_B = 0;
HC138_A = 0; //让Y4输出低电平
for(i = 1; i <= 8; i++)
{
P0 = ~(0xff << i);
Delay(60000);
Delay(60000);
}
HC138_C = 1;
HC138_B = 0;
HC138_A = 1; //让Y5输出低电平
P0 = 0x40;
Delay(60000);
Delay(60000);
P0 = 0x00;
}
void InitSystem()
{
HC138_C = 1;
HC138_B = 0;
HC138_A = 1; //让Y5输出低电平
P0 = 0x00;
}
void main()
{
InitSystem();
while(1)
{
LEDRunning();
}
}