实验目的: 理解并掌握继电器和蜂鸣器驱动电路的工作原理;
理解并掌握用单片机 I/O 驱动大电流器件的驱动方法;
实验模块:核心板+流水灯与独立按键模块+继电器模块+蜂鸣器模块;
实验内容:按键控制继电器和蜂鸣器动作,并用相应的 led 灯进行指示,即第一
个按键按下,第一位 led 灯点亮,蜂鸣器响应;第二个按键按下,第二位 led
灯点亮,继电器吸合;第三个按键按下,第一个、第二个流水灯点亮,继电器吸
合、蜂鸣器响应;第四个按键按下,恢复初始状态,所有的 led 灯熄灭、继电器
断开、蜂鸣器不响应。
模块连接图:
电路原理图:
电路驱动原理:(1)蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,仅仅依靠单片机 I/O 不足以驱动蜂鸣器进行工作;蜂鸣器的正极接到三极管的 C 极上面,蜂鸣器的负极接到地端,三极管的基极 B 经过限流电阻后由单片机的 P1.2 引脚控制,当 P1.2 输出高电平时,三极管 T1 截止,没有电流流过线圈,蜂鸣器不发声;当 P1.42 输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制 P1.2 脚的电平来使蜂鸣器发出声音或关闭。(2)继电器驱动电路如上,主要通过 PNP 型的三极管 S8550 来实现通过单片机的 I/O 口控制继电器的吸合与断开;三极管驱动继电器主要是应用三极管的放大特性和开关特性;当与单片机相连的 I/0 口输出低电平时,三极管导通,此时三极管的 E 极(发射极)与 C 极(集电极)间的阻值很小,此时电路相当于 VCC 经过继电器,再经过通过三极管接到地形成完整回路,继电器吸合;相反,当与单片机相连的 I/0口输出高电平时,三极管截止,此时三极管的 E 极(发射极)与 C 极(集电极)间的阻值很大,电路无法形成回路,继电器不吸合。因此,我们可以通过程序控制与单片机相连 I/O 口的电平来控制继电器的吸合与关闭。
工程代码1:功能描述: 控制蜂鸣器实现播放音乐"生日快乐"
硬件连接: 用1位杜邦线将J10_0与J18_bz连接
#include<reg51.h> //包含头文件
sbit BZ=P0^0; //定义蜂鸣器控制管脚
#define uchar unsigned char
#define uint unsigned int
uchar code SOUNDLONG[25]= //"生日快乐"节拍
{
15,5,20,20,20,40,
15,5,20,20,20,40,
15,5,20,20,20,20,20,
15,5,20,20,20,40
};
uchar code SOUNDTONE[25]= //"生日快乐"音调
{
212,212,190,212,159,169,
212,212,190,212,142,159,
212,212,106,126,159,169,190,
119,119,126,159,142,159
};
//**************************************************************************************************
//延时函数
//**************************************************************************************************
delay(uint time) //int型数据为16位,所以最大值为65535
{
uint i,j; //定义变量i,j,用于循环语句
for(i=0;i<time;i++) //for循环,循环50*time次
for(j=0;j<50;j++); //for循环,循环50次
}
//**************************************************************************************************
//播放音调
//**************************************************************************************************
void Play_music()
{
uint Tone,Long; //定义音调变量
uint i,j,k; //定义
for(i=0;i<25;i++) //"生日快乐"的25种音调
{
Tone=SOUNDTONE[i]; //读取音调
Long=30*SOUNDLONG[i]; //读取节拍
for(j=0;j<Long;j++) //输出不同节拍
{
BZ=0; //关闭蜂鸣器
for(k=0;k<Tone;k++); //Tone的不同来区分7种音调
BZ=1; //打开蜂鸣器
for(k=0;k<Tone;k++); //Tone的不同来区分7种音调
}
}
}
//**************************************************************************************************
//主函数
//**************************************************************************************************
void main()
{
while(1)
{
Play_music(); //播放音乐
BZ=0; //关闭蜂鸣器
delay(10000); //关闭蜂鸣器时间
}
}
硬件连接: 用1位杜邦线将J11_7与J18_K2连接
***************************************************************************************************/
#include "reg51.h" //包含头文件
#define uint unsigned int
//延时函数
//**************************************************************************************************
delay(uint time) //int型数据为16位,所以最大值为65535
{
uint i,j; //定义变量i,j,用于循环语句
for(i=0;i<time;i++) //for循环,循环50*time次
for(j=0;j<50;j++); //for循环,循环50次
}
//主函数
//**************************************************************************************************
void main() //主函数
{
while(1) //进入while死循环
{
K2=0; //断开继电器
delay(5000); //延时
K2=1; //导通继电器
delay(5000); //延时
}
}