1.题目
2. 电路简单分析
-
ULN2003作用:取反。
-
蜂鸣器:VCC为高电平,要想使蜂鸣器工作,N BUZZ端要为低电平,所以ULN2003的7输入端为高电平,所以锁存器的P06端口为高电平,Y5C为高电平。
-
继电器:当N RELAY为低电平时,继电器中才有电流,才能产生磁场,使开关吸合,所以ULN2003的5输入端为高电平。
-
ABC端:要想Y5经过或非使Y5C为高电平,Y5必须为低电平,所以P25、P26、P27要使Y5为低电平,所以P25为高电平,P26为低电平,P27为高电平。
-
综上所述:
P25:1
P26:0
P27:1
Y5:0
Y5C:1
P04:1
P06:1
N RELAY:0
N BUZZ:0//所需电路图等请看文末
3. 代码
#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 InitHC138(unsigned char n)
{
switch(n){
case 4: //HC138-Y4=0
HC138_C=1;
HC138_B=0;
HC138_A=0;
break;
case 5: //HC138-Y5=0
HC138_C=1;
HC138_B=0;
HC138_A=1;
break;
case 6: //HC138-Y6=0
HC138_C=1;
HC138_B=1;
HC138_A=0;
break;
case 7: //HC138-Y7=0
HC138_C=1;
HC138_B=1;
HC138_A=1;
break;
}
}
void OutPutP0(unsigned char channel,unsigned char dat)
{
InitHC138(channel);
P0=dat;
}
void InitSystem()
{
OutPutP0(5,0x00);
}
void LEDRunning()
{
unsigned char i;
for(i=0;i<3;i++){
OutPutP0(4,0x00);
Delay(60000);
Delay(60000);
OutPutP0(4,0xff);
Delay(60000);
Delay(60000);
}
for(i=1;i<=8;i++){
OutPutP0(4,0xff<<i);
Delay(60000);
Delay(60000);
}
OutPutP0(5,0x10);
Delay(60000);
Delay(60000);
OutPutP0(5,0x00);
for(i=1;i<=8;i++){
OutPutP0(4,~(0xff<<i));
Delay(60000);
Delay(60000);
}
OutPutP0(5,0x40);
Delay(60000);
Delay(60000);
OutPutP0(5,0x00);
}
void main()
{
InitSystem();
while(1){
LEDRunning();
}
}
4. 附图
【注】①本文是通过哔哩哔哩的教程学习所得,如有错误之处,欢迎大家指正
②教程学习网站为https://www.bilibili.com/video/av41275873?p=3