将继电器与PIC微控制器PIC16F877A连接的教程

描述

在本项目中,我们将继电器与PIC微控制器PIC16F877A连接。继电器是一种机械设备,用于从较低的电压电平控制高电压、大电流电器的“ON”或“OFF”。继电器在两个电压电平之间提供隔离,通常用于控制交流电器。从机械继电器到固态继电器,电子产品中有各种类型的继电器可供选择。在这个项目中,我们将使用机械继电器。

在这个项目中,我们将做以下事情-

我们将接口一个开关,用于用户的输入。

用 5V 继电器控制220V 交流灯泡。

为了控制继电器,我们将使用 BC547 NPN 晶体管,晶体管将由PIC16F877A控制。LED 将通知继电器打开或关闭条件。

所需组件:

PIC16F877A

20兆赫晶体

2 个 33pF 陶瓷

3 个 4.7K 电阻器

1k 电阻器

1 个发光二极管

BC547 晶体管

1N4007 二极管

5V 立方继电器

交流灯泡

面包板

用于连接零件的电线。

5V适配器或任何具有至少200mA电流能力的5V电源。

继电器及其工作:

继电器的工作原理与典型开关相同。机械继电器使用由电磁线圈制成的临时磁铁。当我们通过这个线圈提供足够的电流时,它就会通电并拉动手臂。因此,连接在继电器上的电路可以是闭合的,也可以是断开的。输入和输出没有任何电气连接,因此它隔离输入和输出。

继电器可以在不同的电压范围内找到,如5V、6V、12V、18V等。在这个项目中,我们将使用5V 继电器,因为我们的工作电压在这里是5 伏。这款5V 立方继电器能够在240VAC时切换7A负载或110VAC时切换10A负载。然而,代替巨大的负载,我们将使用一个 220VAC 灯泡并使用继电器进行切换。

这是我们在本项目中使用的5V 继电器。额定电流明确规定了两个电压电平,120VAC 时为 10A,240VAC 时为 7A。我们需要连接小于指定额定值的继电器负载。

继电器

该继电器有5 个引脚。如果我们看到引脚排列,我们可以看到-

继电器

L1 和L2是内部电磁线圈的引脚。我们需要控制这两个引脚来打开继电器“ON”或“OFF”。接下来的三个引脚是极点、常开和常闭。极与内部金属板连接,当继电器打开时,金属板会改变其连接。在正常情况下,极点与常闭短路。NC代表常态连接。当继电器打开时,极改变其位置并与常开连接。NO代表常开。

在我们的电路中,我们已经与晶体管和二极管进行了继电器连接。带晶体管和二极管的继电器在市场上可作为继电器模块使用,因此当您使用继电器模块时,您无需连接其驱动电路(晶体管和二极管)。

继电器

继电器用于所有家庭自动化项目,以控制交流家用电器。

电路图:

下面给出了用于将继电器与PIC微控制器连接的完整电路:

继电器

在上面的原理图中,使用了pic16F877A,其中在端口B上连接LED和晶体管,使用RBO处的TAC开关进一步控制。R1为晶体管提供偏置电流。R2是一个下拉电阻,用于轻触开关两端。当未按下开关时,它将提供逻辑 0。1N4007是一个箝位二极管,用于继电器的电磁线圈。当继电器关闭时,可能会出现高压尖峰,二极管会抑制它。晶体管是驱动继电器所必需的,因为它需要超过50mA的电流,而微控制器无法提供。我们也可以使用ULN2003代替晶体管,如果应用需要两个或三个以上的继电器,这是一个更明智的选择,请检查继电器模块电路。端口 RB2上的LED将通知“继电器已打开”。

最后的赛道会是这样的——

继电器

代码说明:

在main.c文件的开头,我们添加了pic16F877A的配置行,并定义了跨 PORTB的引脚名称。

与往常一样,首先,我们需要在图片微控制器中设置配置位,定义一些宏,包括库和晶体频率。您可以在最后给出的完整代码中检查所有这些代码的代码。我们制作了RB0作为输入。在此引脚中,开关已连接。

#include

/*

Hardware related definition

*/

#define _XTAL_FREQ 200000000 //Crystal Frequency, used in delay

#define SW PORTBbits.RB0

#define RELAY PORTBbits.RB1

#define LED PORTBbits.RB2

之后,我们调用了 system_init() 函数,在其中初始化引脚方向,并配置了引脚的默认状态。

在 system_init() 函数中,我们将看到

void system_init(void){

TRISBbits.TRISB0 = 1; // Setting Sw as input

TRISBbits.TRISB1 = 0; // setting LED as output

TRISBbits.TRISB2 = 0; // setting relay pin as output

LED = 0;

RELAY = 0;

}

在主功能中,我们不断检查开关按下,如果我们通过检测RB0上的逻辑高电平来检测开关按下;我们等待一段时间,看看开关是否仍然被按下,如果开关仍然被按下,那么我们将反转继电器和 LED 引脚的状态。

void main(void) {

system_init(); // System getting ready    

while(1){

if(SW == 1){ //switch is pressed

__delay_ms(50); // debounce delay

if (SW == 1){ // switch is still pressed

LED = !LED; // inverting the pin status.

RELAY = !RELAY;

}

}

}

return;

}

/*

* File: main.c

* Author: Sourav Gupta

* By:- circuitdigest.com

* Created on May 30, 2018, 2:26 PM

*/


// PIC16F877A Configuration Bit Settings


// 'C' source line config statements


// CONFIG

#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)

#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)

#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)

#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)

#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)

#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)

#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)

#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)





#include

/*

Hardware related definition

*/

#define _XTAL_FREQ 200000000 //Crystal Frequency, used in delay

#define SW PORTBbits.RB0

#define RELAY PORTBbits.RB1

#define LED PORTBbits.RB2


/*

Other Specific definition

*/

void system_init(void);


void main(void) {

system_init(); // System getting ready 

while(1){

if(SW == 1){ //switch is pressed

__delay_ms(50); // debounce delay

if (SW == 1){ // switch is still pressed

LED = !LED; // inverting the pin status.

RELAY = !RELAY;

}

}

}

return;

}



/*

This Function is for system initialisations.

*/


void system_init(void){

TRISBbits.TRISB0 = 1; // Setting Sw as input

TRISBbits.TRISB1 = 0; // setting LED as output

TRISBbits.TRISB2 = 0; // setting relay pin as output

LED = 0;

RELAY = 0;

}


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分