蜂鸣器与继电器在单片机的应用中非常普遍,在我们参加单片机蓝桥杯比赛时也是非常重要的两部分,那么接下来我们将结合题目来介绍蜂鸣器和继电器在应用中的基本控制。
基于蓝桥杯竞赛开发板,题目有:
首先让8路LED指示灯闪烁3遍后熄灭,接着依次点亮LED灯,继电器吸合一段时间后断开,然后依次熄灭LED灯,蜂鸣器叫一段时间后关闭,程序循环实现以上功能。
开发板图片如下:
在做以上题目之前,我们需要根据开发板的电路图进行分析,进而写出我们所需要的代码实现题目要求。
电路图如下:
经过上图分析,我们需要通过三八译码器将Y5引脚输出低电平,进而通过或非门输出高电平,也就是使Y5C引脚输出高电平。OE非为片选引脚,为高电平,因此74HC573是开启的,LE为选择引脚,得到刚得到的Y5C的高电平,寄存器开始工作,进行数据传输,通过P0口控制各引脚的高低电平,而UNL2003是一个取反的作用,每一个引脚输出的电平,在输出时会得与输入相反的的电平。
三八译码器的真值表如下:
C | B | A | 输出低电平的输出端 |
0 | 0 | 0 | Y0 |
0 | 0 | 1 | Y1 |
0 | 1 | 0 | Y2 |
0 | 1 | 1 | Y3 |
1 | 0 | 0 | Y4 |
1 | 0 | 1 | Y5 |
1 | 1 | 0 | Y6 |
1 | 1 | 1 | Y7 |
实现题目代码如下:
#include <REG52.H>
sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;
unsigned char i;
void delay(unsigned int t)
{
while(t--);
while(t--);
}
void LEDrunning()
{
HC138_C = 1;
HC138_B = 0;
HC138_A = 0;
for( i = 0; i < 3; i++) //八个LED灯闪烁三下
{
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; //让Y5为高电平,让继电器吸合
HC138_B = 0;
HC138_A = 1;
P0 = 0x10;
delay(60000);
delay(60000);
P0 = 0x00;
HC138_C = 1; //三八译码器再次让Y4为高电平
HC138_B = 0;
HC138_A = 0;
for( i =1; i<=8; i++) //LED依次熄灭
{
P0 = ~(0xff << i);
delay(60000);
delay(60000);
}
HC138_C = 1; //让Y5为高电平,让蜂鸣器发声
HC138_B = 0;
HC138_A = 1;
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();
}
}