蓝桥杯单片机组备赛指南请查看 :本专栏第1篇文章
本文章针对蓝桥杯-单片机组比赛开发板所写,代码可直接在比赛开发板上使用。
型号:国信天长4T开发板(绿板),芯片:IAP15F2K61S2
(使用国信天长蓝板也可以完美兼容,与绿板几乎无差别)
开发板由于布线局限,开机蜂鸣器就会响吵死人,因此可以在开发板上将J6跳线帽接到OFF端,可以避免插电就开始嗡叫。
1.编程目的
通过此次练习将74HC138译码器熟练掌握,并可以随心所欲的控制继电器、LED、数码管等与译码器相连的硬件电路。
本文着重介绍 继电器与蜂鸣器 的使用,其余硬件资源的调用可阅读本专栏下的其他文章。
2.原理图介绍
2.1 与单片机相连的锁存器原理图
(截取自官方4T开发板SCH_硬件原理图V30.pdf)
74HC573为锁存器,由锁存器的真值表可知,当OE接地,且LE为低电平时该锁存器工作于锁存模式,(可以理解为让该锁存器正常工作的模式,但要注意这里的锁存器与上一篇博客中提到的控制LED的锁存器不同)。因此,当我们需要使用继电器、电机、蜂鸣器时,需要设置Y5C为低电平,激活锁存器的锁存模式。编程时,将Y5C设置为低电平即可激活使用继电器、点击、蜂鸣器的电路。
74HC573锁存器的真值表如下图:
ULN2003为达林顿管阵列,主要特点为取反信号,高耐压、大电流复合晶体管阵列。用于承载特殊情况下的大电流大电压,保护内部其他芯片不被损坏。不需要单独设置,编程时不用管他。
ULN2003的内部原理图如下:
由图可见里面的每一个引脚都接了一个非门,因此穿过ULN2003的信号会取反一次。
2.2 继电器原理图介绍
(截取自官方4T开发板SCH_硬件原理图V30.pdf)
由原理图电路可知,当输入端N_RELAY为低电平时,二极管1N4148处于截止状态相当于断路,则电流流过电磁线圈SPDT产生电磁场形成电磁铁,将开关K1与引脚3吸合,发光二极管此时一端经过电阻R24后接地,一端接高电平,发光。
当输入端N_RELAY为高电平时,二极管1N4148处于导通状态,电流不经过电磁线圈SPDT,直接经过二极管流到发光二极管L10阳极,开关K1不会吸合与引脚3结合,则发光二极管L10中没有电流流过,不发光。
编程时,只需时Y5C控制的锁存器处于锁存状态时,对P0^4引脚赋值高电平,由于ULN2003器件的取反作用,继电器输入端N_RELAY处于低电平,L10就会发光。
2.3 蜂鸣器原理图介绍
(截取自官方4T开发板SCH_硬件原理图V30.pdf)
由原理图可知,蜂鸣器SP1的阳极通过J6的跳线帽直接接高电平,因此当我们将输入端N_BUZZ设置为低电平时,蜂鸣器即可工作。
编程时,需要先激活Y5C控制的74HC573锁存器,然后对单片机引脚P0^6赋值为高电平,由于ULN2003器件的取反作用,即设置蜂鸣器输入端N_BUZZ为低电平,蜂鸣器开始嗡嗡狂吠。
3.编程代码
3.1 继电器单独工作代码
代码效果:通过继电器不断开合使灯光L10不断闪烁
//通过继电器不断开合使灯光L10不断闪烁
#include <reg51.h>
sbit HCB173_A = P2^5;
sbit HCB173_B = P2^6;
sbit HCB173_C = P2^7;
sbit Relay = P0^4;
sbit Buzz = P0^6;
void Delay ( unsigned int t )
{
while ( t-- );
while ( t-- );
}
//初始化与继电器相关的锁存器,并让继电器在开始时处于断开状态
void Init_Y5C ()
{
HCB173_A = 1;
HCB173_B = 0;
HCB173_C = 1;
Relay = 0; // 断开继电器
Buzz = 0; //断开蜂鸣器
}
void main ()
{
Init_Y5C ();//初始化锁存器
//
while ( 1 )
{
Relay = 1; //继电器闭合
Delay( 1000 );
Relay = 0; //继电器断开
Delay( 1000 );
}
}
3.2 蜂鸣器单独工作代码
代码效果:通过设置蜂鸣器循环产生SOS摩斯密码“... --- ...”信号音频,忽略频率变化,只考虑音长。(即蜂鸣器在.时短鸣,在-时长鸣)
//蜂鸣器循环产生SOS摩斯密码“... --- ...”信号音频
#include <reg51.h>
#include <intrins.h>
sbit HCB173_A = P2^5;
sbit HCB173_B = P2^6;
sbit HCB173_C = P2^7;
sbit Relay = P0^4;
sbit Buzz = P0^6;
void Delay50ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay100ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//初始化与继电器相关的锁存器,并让继电器在开始时处于断开状态
void Init_Y5C ()
{
HCB173_A = 1;
HCB173_B = 0;
HCB173_C = 1;
Relay = 0; // 断开继电器
Buzz = 0; //断开蜂鸣器
}
void short_voice ()
{
Buzz = 1; //.
Delay50ms();
Buzz = 0;
Delay50ms();
}
void long_voice ()
{
Buzz = 1; //-
Delay100ms();
Buzz = 0;
Delay100ms();
}
void main ()
{
Init_Y5C ();//初始化锁存器
//
while ( 1 )
{
short_voice (); //S信号
short_voice ();
short_voice ();
long_voice ();//O信号
long_voice ();
long_voice ();
short_voice (); //S信号
short_voice ();
short_voice ();
Delay100ms();//延时三百毫秒发送下一次
Delay100ms();
Delay100ms();
}
}
3.3 二合一代码
代码效果:通过同时设置继电器开关与蜂鸣器,使得蜂鸣器嗡叫与灯光L10闪烁同时进行
//通过同时设置继电器开关与蜂鸣器,使得蜂鸣器嗡叫与灯光L10闪烁同时进行
#include <reg51.h>
sbit HCB173_A = P2^5;
sbit HCB173_B = P2^6;
sbit HCB173_C = P2^7;
void Delay ( unsigned int t )
{
while ( t-- );
while ( t-- );
}
//根据设置的不同channal设置138译码器,并将dat_led值传入P0引脚
void InputLed ( unsigned char channal , unsigned char dat_Led )
{
switch ( channal )
{
case 4 :
HCB173_A = 0;
HCB173_B = 0;
HCB173_C = 1;
break;
case 5 :
HCB173_A = 1;
HCB173_B = 0;
HCB173_C = 1;
break;
case 6 :
HCB173_A = 0;
HCB173_B = 1;
HCB173_C = 1;
break;
case 7 :
HCB173_A = 1;
HCB173_B = 1;
HCB173_C = 1;
break;
}
P0 = dat_Led;
}
//设置继电器与蜂鸣器工作
void InputRelay ( unsigned char dat_Relay )
{
if ( dat_Relay == 1 ) //输入1时,蜂鸣器和继电器工作
{
InputLed ( 5 , 0x00 );
}
else
{
InputLed ( 5 , 0xff );
}
}
void main ()
{
InputRelay ( 0 );
while ( 1 )
{
InputRelay( 1 );
Delay( 1000 );
InputRelay( 0 );
Delay( 1000 );
}
}
3.4 小蜜蜂老师课程代码
代码效果:控制led正向流水灯,正向一次之后闪烁两次,之后周期性闪烁;设置初始化,使得蜂鸣器不响,并使得继电器不工作;优化代码,使得锁存器与译码器可以封装使用;
//任务要求,控制led正向流水灯,正向一次之后闪烁两次,之后周期性闪烁
//设置初始化,使得蜂鸣器不响,并使得继电器不工作
//优化代码,使得锁存器与译码器可以封装使用
#include <reg51.h>
sbit HCB173_A = P2^5;
sbit HCB173_B = P2^6;
sbit HCB173_C = P2^7;
unsigned char i;
void OutputP0 ( unsigned char );
void InputLed ( unsigned char , unsigned char );
void Delay ( unsigned int );
void InputBuzzer ( unsigned char );
void Delay ( unsigned int t )
{
while ( t-- );
while ( t-- );
}
//流水灯运行程序
void LEDrunning ( )
{
for ( i=1 ; i<=8 ; i++ )
{
InputLed ( 4 , ( 0xff << i ) );
Delay ( 6000 );
}
Delay ( 60000 );
InputLed ( 4 , 0x00 );
Delay ( 60000 );
InputLed ( 4 , 0xff );
Delay ( 60000 );
InputLed ( 4 , 0x00 );
Delay ( 60000 );
InputLed ( 4 , 0xff );
InputBuzzer ( 1 );
Delay ( 60000 );
InputBuzzer ( 0 );
}
//根据设置的不同channal设置138译码器,并将dat_led值传入P0引脚
void InputLed ( unsigned char channal , unsigned char dat_Led )
{
//很不一样的使用方法,我会在本专栏关于数码管的博客中进行讲解这一版块的原理
/***
switch ( numHCB )
{
case 4 :
P2 = ( P2 & 0x1f ) | 0x80;
break;
case 5 :
P2 = ( P2 & 0x1f ) | 0xa0;
break;
case 6 :
P2 = ( P2 & 0x1f ) | 0xc0;
break;
case 4 :
P7 = ( P2 & 0x1f ) | 0xe0;
break;
}
***/
switch ( channal )
{
case 4 :
HCB173_A = 0;
HCB173_B = 0;
HCB173_C = 1;
break;
case 5 :
HCB173_A = 1;
HCB173_B = 0;
HCB173_C = 1;
break;
case 6 :
HCB173_A = 0;
HCB173_B = 1;
HCB173_C = 1;
break;
case 7 :
HCB173_A = 1;
HCB173_B = 1;
HCB173_C = 1;
break;
}
P0 = dat_Led;
}
//设置继电器与蜂鸣器工作
void InputBuzzer ( unsigned char dat_buzzer )
{
if ( dat_buzzer == 1 ) //输入1时,继电器工作关闭开关,蜂鸣器工作
{
InputLed ( 5 , 0xff );
}
else
{
InputLed ( 5 , 0x00 );
}
}
void main ()
{
InputBuzzer ( 0 );
while ( 1 )
{
LEDrunning ();
}
}
4.代码讲解
编程时,当我们需要用到点击、蜂鸣器、继电器等资源时,流程为设置74HC138译码器输入端为101使得Y5输出低电平,进而激活74HC573锁存器,对单片机引脚P0^4赋值高电平时继电器闭合,对单片机引脚P0^5赋值高电平时控制电机运动,对单片机引脚P0^6赋值高电平时蜂鸣器嗡叫。
提出上段文字要点,即流程为先设置138译码器,再直接对P0端口进行赋值操作。
5.硬件相关
5.1继电器
主要是通过内部由线圈+铁心+组成的线圈构建产生电场,形成电磁铁。产生的磁力可以吸附衔铁,进而使得与衔铁相连的撞针顶住左板簧,使得左板簧的触点向右与右板簧的触电连接,形成物理开关闭合的效果。
衔铁吸合后,在线圈焊片和触点焊片下各自连接一根导线,即可实现电流导通效果。
5.2蜂鸣器
主要分为有源蜂鸣器与无源蜂鸣器两种,
有源蜂鸣器和无源蜂鸣器的根本区别是产品对输入信号的要求不一样;有源蜂鸣器工作的理想信号是直流电,通常标示为VDC、VDD等。因为蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号,从而实现磁场交变,带动铝片振动发音。但是在某些有源蜂鸣器在特定的交流信号下也可以工作,只是对交流信号的电压和频率要求很高,此种工作方式一般不采用。
无源蜂鸣器没有内部驱动电路,有些公司和工厂称为讯响器,国标中称为声响器。无源蜂鸣器工作的理想信号方波。如果给予直流信号蜂鸣器是不响应的,因为磁路恒定,钼片不能振动发音。
简易区分方法有三种:
1.采用目测,拿KS-12C01YE和KS-12D05YA做比较,其中“C”代表无源,"D"代表有源;
2.使用万用表的电阻档,将蜂鸣器正极接万用表黑表笔,并将红表笔在负极上不断点触,如果发出咔咔声且断续不连贯,电阻值只有几欧姆则为无源蜂鸣器;如果发出连续的蜂鸣音,电阻值有上百欧姆则为有源蜂鸣器。
3.采用低压直流信号看哪个会响,依据原理直流信号只有有源蜂鸣器会响。
6.总览概括
在近几年蓝桥杯历届真题中,少有出现继电器与蜂鸣器相关题目。但是编程简单,掌握后根据原理图可以快速编写出需要的代码。