继电器、蜂鸣器基本知识
蜂鸣器基本知识:
分为有源蜂鸣器和无源蜂鸣器。它们最大的区别就是内部是否有震荡源。蓝桥杯板载的是有缘蜂鸣器,它自身带有震荡源,所以只要通电就会响,并且声音频率是固定的,所以它发出的声音是只有一个音调的。无源蜂鸣器不带有震荡源,所以想要使无源蜂鸣器发出声音,不仅需要通电还需要额外的震荡源,所以他的音调并不固定,可以通过改变震荡源的占空比来调整声音频率来达到演奏歌曲等目的。
蜂鸣器的工作电压为5V,无需接电阻。
如何区分有源蜂鸣器和无源蜂鸣器:
引脚朝上放置,能看到绿色电路板的为无源蜂鸣器,没有而且为黑色封胶的为有源蜂鸣器。
两个引脚长度一样长的为无源蜂鸣器,不一样长的为有源蜂鸣器。
点阻挡试碰法,发出咔咔声且电阻为8欧姆(16欧姆)的为无源蜂鸣器,发出持续声音且电阻为几百欧姆以上的为有源蜂鸣器。
继电器基本知识:
继电器有3个接线端,分别为常开端、常闭端、公共端。当继电器不通电时,公共端与常闭端吸合,当通电时,会在继电器内部的线圈两端施加一定的电压,由于电磁效应,将会把公共端与常开端吸合,并且继电器其实是个很牛掰的小东西,可以用5V来给继电器供电,来控制220V的电器,但是这样操作容易被电,很痛~~~~
控制继电器与蜂鸣器需要用到的芯片介绍:
译码器(74HC138)、锁存器(74HC573)、或非门(74HC02)、驱动芯片(ULN2003)。
是不是看起来驱动一个蜂鸣器和继电器就要用这么多芯片简直像有病,但这么设计也是有原因的:1.单片机一般讲究低功耗,所以单片机IO的驱动能力有限,不足以驱动蜂鸣器、继电器中的线圈,所以就需要设计驱动芯片来增加驱动能力啦~~2.板载外设太多了,但是IO就只有那么几个,所以就需要通过译码器-锁存器结构来用有限的数据控制口P0来分时控制更多的外设。
如果你买一个没有那么多外设的板子,或者就是一个最小系统,那就不用控制那么芯片了,直接买模块怼到板子上,通电,就好勒。
控制流程:
对数据控制口P0输入相应控制信息来控制蜂鸣器和继电器,再通过74HC138译码器对P27,P26,P25(1 0 1)译码将Y5通入低电平,再通过或门将Y5C通入高电平,将锁存器选通,再对Y5C通入低电平把锁存器锁存。
P06写1,蜂鸣器响;P04写1,继电器吸合。
相应的LED,数码管也是一样的控制流程,译码器-锁存器控制数据如下表所示
P27 | P26 | P25 | 译码器输出 | 或门输出 | ULN2003 |
1 | 0 | 1 | Y5=0 | WR=0 (IO模式) Y5C=1 | P0->P0取反 |
1 | 0 | 0 | Y4=0 | Y4C=1 (LED) | |
1 | 1 | 0 | Y6=0 | Y6C=1 (数码管) | |
1 | 1 | 1 | Y7=0 | Y7C=1 (数码管) |
继电器、蜂鸣器程序控制:
程序控制顺序:P0输出->打开锁存器->关闭锁存器
原则:在打开锁存器之前,需要保持P0数据的稳定,在关闭锁存器之后,才可以操作P0改变数据
下面是继电器蜂鸣器控制代码示例,此方法通过定义变量的方式来进行控制,虽然没有节省内存,但是控制蜂鸣器和继电器时只需要修改变量的值,比较方便。当然也可以通过位定义,对相应的位进行控制等方法来完成。
/*************************************************
初始状态,蜂鸣器不响,继电器不吸合
再循环打开蜂鸣器,关闭继电器1秒,关闭蜂鸣器,吸合继电器1秒
*************************************************/
#include "STC15F2K60S2.h"
#include "intrins.h"
unsigned char buzzer_ctrl; //定义全局变量buzzer_ctrl来控制蜂鸣器,置为1为打开,置为0为关闭
unsigned char relay_ctrl; //定义全局relay_ctrl变量来控制继电器,置为1为打开,置为0为关闭
void Delay1000ms() /* 延时1s@12.000MHz,用STC-ISP软件生成 */
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 46;
j = 153;
k = 245;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Divice_Ctrl(unsigned char p2data,unsigned char p0data) //继电器、蜂鸣器控制函数
{
P0=p0data;
P2=p2data;
P2=0;
}
void System_Init() //系统初始化函数,将继电器、蜂鸣器关闭
{
buzzer_ctrl=0;
relay_ctrl=0;
Divice_Ctrl(0xa0,((buzzer_ctrl<<6)|(relay_ctrl<<4)));
}
void main()
{
System_Init();
while(1)
{
buzzer_ctrl=1; //对全局变量进行赋值
relay_ctrl=0;
Divice_Ctrl(0xa0,((buzzer_ctrl<<6)|(relay_ctrl<<4)));
//调用控制函数,将Y5C置为高电平,打开蜂鸣器,关闭继电器
Delay1000ms(); //延时1秒
buzzer_ctrl=0;
relay_ctrl=1;
Divice_Ctrl(0xa0,((buzzer_ctrl<<6)|(relay_ctrl<<4)));
Delay1000ms();
}
}
473

被折叠的 条评论
为什么被折叠?



