任务:在上一节的基础下在8路LED闪烁3遍后熄灭,接着依次点亮LED灯,继电器吸合一会后断开,然后依次熄灭LED灯,蜂鸣器鸣叫一会后关闭。(使其循环实现)
实验电路:
来看看图中涉及到的芯片等元件:
1️⃣ULN2003:是高耐压、大电流复合晶体管阵列,由七个硅NPN复合晶体管组成,每一对达林顿管都串联一个2.7K的基极电阻,在5V的工作电压下他能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱动继电器等负载。(也可理解为放大倍数较大的三极管)
从其内部结构可以知道:输入端与输出端电位相反。由于输入与输出端通过一个非门连接,所以对应一组输入与输出结果是相反的。(ULN2003详细介绍)
2️⃣BUZZER:由原理图可知当N-BUZZ脚接低电平时蜂鸣器鸣叫。
3️⃣继电器:当N-RELAY接低电平时继电器吸合。
由图可知:首先锁存器需要设置为同步模式,由P04、P06分别控制N-BUZZ和N-RELAY脚输出低电平就可以实现控制蜂鸣器的鸣叫和继电器的吸合。其他操作同LED灯的点亮。
接下来上代码。
#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--);
}
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);
}
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();
}
}
简化后:
#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--);
}
void ChooseHC138(unsigned int n)
{
switch(n)
{
case 4:
HC138_C = 1;
HC138_B = 0;
HC138_A = 0;//让Y4输出低电平
break;
case 5:
HC138_C = 1;
HC138_B = 0;
HC138_A = 1;//让Y5输出低电平
break;
case 6:
HC138_C = 1;
HC138_B = 1;
HC138_A = 0;//让Y6输出低电平
break;
case 7:
HC138_C = 1;
HC138_B = 1;
HC138_A = 1;//让Y7输出低电平
break;
}
}
void OutputHC138AndP0(unsigned int num,unsigned char number)
{
ChooseHC138(num);
P0 = number;
}
void LEDRunning()
{
unsigned char i;
for(i = 0; i < 3; i++)
{
OutputHC138AndP0(4,0x00);
Delay(60000);
OutputHC138AndP0(4,0xff);
Delay(60000);
}
for(i = 1; i <= 8; i++)
{
OutputHC138AndP0(4,(0xff << i));
Delay(60000);
}
OutputHC138AndP0(5,0x10);
Delay(60000);
OutputHC138AndP0(5,0x00);
for(i = 1; i <= 8; i++)
{
OutputHC138AndP0(4,~(0xff << i));
Delay(60000);
}
OutputHC138AndP0(5,0x40);
Delay(60000);
OutputHC138AndP0(5,0x00);
}
void InitSystem()
{
OutputHC138AndP0(5,0x00);
}
void main()
{
InitSystem();
while(1)
{
LEDRunning();
}
}
好啦,代码大概就是这样,其中还有一个地方可以简化:
void ChooseHC138(unsigned int n)
{
switch(n)
{
case 4:
HC138_C = 1;
HC138_B = 0;
HC138_A = 0;//让Y4输出低电平
break;
case 5:
HC138_C = 1;
HC138_B = 0;
HC138_A = 1;//让Y5输出低电平
break;
case 6:
HC138_C = 1;
HC138_B = 1;
HC138_A = 0;//让Y6输出低电平
break;
case 7:
HC138_C = 1;
HC138_B = 1;
HC138_A = 1;//让Y7输出低电平
break;
}
}
-------------->
void ChooseHC138(unsigned int n)
{
switch(n)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
但是我还没搞明白,所以就没改,而且我觉得不改看着也还行改了反而看着麻烦😳(如果有大佬知道就教教我,感谢!)