在本项目中,我们将继电器与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;
}
全部0条评论
快来发表一下你的评论吧 !