大家好,今天在這個項目中,我們將射頻接收器和發(fā)射器模塊與PIC微控制器連接,并在兩個不同的PIC微控制器之間進行無線通信。
在這個項目中,我們將做以下事情:-
我們將使用 PIC16F877A 作為發(fā)射器,使用PIC18F4520作為接收器部分。
我們將鍵盤和LCD與PIC微控制器連接。
在發(fā)射器方面,我們將鍵盤與PIC接口并傳輸數(shù)據(jù)。在接收器側,我們將無線接收數(shù)據(jù)并顯示按下LCD上的哪個鍵。
我們將使用編碼器和解碼器IC來傳輸4位數(shù)據(jù)。
接收頻率將為433Mhz,使用市場上廉價的RF TX-RX模塊。
433MHz射頻發(fā)射器和接收器模塊:
這些是我們在項目中使用的發(fā)射器和接收器模塊。它是433 MHz最便宜的模塊,這些模塊在一個通道中接受串行數(shù)據(jù)。
如果我們看到模塊的規(guī)格,變送器的額定工作電壓為3.5-12V,發(fā)射距離為20-200米。它確實以433 MHz 頻率的 AM(音頻調制)協(xié)議傳輸。我們可以以 4KB/S 的速度以 10mW 的功率傳輸數(shù)據(jù)。
在上圖中,我們可以看到發(fā)射器模塊的引腳。從左到右,引腳是VCC,DATA和GND。我們還可以添加天線并將其焊接在上圖中表示的點上。
對于接收器規(guī)格,接收器的額定電壓為5V 直流,靜態(tài)電流為 4MA作為輸入。接收頻率為433.92 MHz,靈敏度為-105DB。
在上圖中,我們可以看到接收器模塊的引腳。四個引腳從左到右依次為VCC、數(shù)據(jù)、數(shù)據(jù)和GND。中間的兩個引腳在內(nèi)部連接。我們可以使用任何一個或兩個。但是,最好同時使用兩者來降低噪聲耦合。
此外,數(shù)據(jù)表中沒有提到一件事,模塊中間的可變電感或POT用于頻率校準。如果我們無法接收傳輸?shù)臄?shù)據(jù),則發(fā)射和接收頻率可能不匹配。這是一個射頻電路,我們需要將發(fā)射器調諧到完美的發(fā)射頻率點。此外,與發(fā)射器相同,該模塊也有一個天線端口;我們可以以線圈形式焊接焊絲,以獲得更長的接收時間。
傳輸范圍取決于提供給發(fā)射器的電壓和兩側天線的長度。對于這個特定的項目,我們沒有使用外部天線,而是在發(fā)射器側使用了5V。我們檢查了5米的距離,效果很好。
編碼器和解碼器的需求:
這種射頻傳感器幾乎沒有缺點:-
單向溝通。
只有一個通道
非常噪音干擾。
由于這個缺點,我們使用了編碼器和解碼器IC,HT12D和HT12E。D代表解碼器,將在接收器側使用,E代表編碼器,將在發(fā)射器側使用。該 IC 提供4 個通道。此外,由于編碼和解碼,噪聲水平非常低。
在上圖中,左邊是解碼器HT12D,右邊是編碼器HT12E。兩個IC是相同的。A0 到 A7用于特殊編碼。我們可以使用微控制器引腳來控制這些引腳并設置配置。另一側需要匹配相同的配置。如果兩種配置準確且匹配,我們可以接收數(shù)據(jù)。這 8 個引腳可以連接到Gnd或VCC或保持打開狀態(tài)。無論我們在編碼器中進行什么配置,我們都需要匹配解碼器上的連接。在本項目中,我們將為編碼器和解碼器保留這 8 個引腳。9 和 18 引腳分別為 VSS 和 VDD。我們可以使用HT12D中的VT引腳作為通知目的。對于這個項目,我們沒有使用它。TE引腳用于傳輸使能或禁用引腳。
重要的部分是我們需要連接電阻的OSC引腳,以便為編碼器和解碼器提供振蕩。解碼器需要比解碼器更高的振蕩。通常,編碼器電阻值為1Meg,解碼器值為33k。我們將在項目中使用這些電阻器。
DOUT引腳是 HT12E 上的射頻發(fā)射器數(shù)據(jù)引腳,HT12D中的DIN引腳用于連接射頻模塊數(shù)據(jù)引腳。
在HT12E中,AD8至AD11是四通道輸入,通過RF模塊進行轉換和串行傳輸,而在HT12D中發(fā)生的情況恰恰相反,串行數(shù)據(jù)被接收和解碼,我們在4個引腳D8至D11上獲得4位并行輸出。
所需組件:
2 - 面包板
1 - 液晶顯示器 16x2
1 – 鍵盤
HT12D 和 HT12E 對
射頻模塊
1- 10K預設
2 – 4.7k 電阻器
1- 1M 電阻器
1- 33k 電阻器
2- 33pF 陶瓷電容器
1 – 20兆赫晶體
伯格斯
很少的單股線。
PIC16F877A 單片機
PIC18F4520 單片機
一把螺絲刀用于控制頻率的鍋,需要與人體絕緣。
電路圖:
變送器側電路圖 (PIC16F877A):
我們使用PIC16F877A進行傳輸。六角鍵盤通過PORTB連接,4 個通道連接在PORTD的最后4位。
引腳如下-
1.AD11 = RD7
2.AD10 = RD6
3.AD9 = RD5
4.AD8 = RD4
接收器側電路圖 (PIC18F4520):
在上圖中,顯示了接收器電路。液晶屏通過端口連接。我們在這個項目中使用了PIC18F4520的內(nèi)部振蕩器。4 個通道的連接方式與我們之前在發(fā)射器電路中的連接方式相同。
這是發(fā)射器側-
接收器側位于單獨的試驗板中-
代碼說明:
代碼分為兩部分,一部分用于發(fā)射器,另一部分用于接收器。
射頻發(fā)射器的PIC16F877A代碼:
與往常一樣,首先,我們需要在圖片微控制器中設置配置位,定義一些宏,包括庫和晶體頻率。編碼器 ic 的AD8-AD11端口定義為端口RF_TX。您可以在最后給出的完整代碼中檢查所有這些代碼的代碼。
我們使用了兩個函數(shù),void system_init(void)和void encode_rf_sender(char data)。
system_init用于引腳初始化和鍵盤初始化。鍵盤初始化從鍵盤庫調用。
鍵盤端口也在鍵盤 .h中定義。我們使用TRISD=0x00將PORTD作為輸出,并將RF_TX端口設置為默認狀態(tài)0x00。
void system_init(void){
TRISD = 0x00;
RF_TX = 0x00;
keyboard_initialization();
}
在
encode_rf_sender
中,我們根據(jù)按下的按鈕更改了 4 針狀態(tài)。我們創(chuàng)建了?
16
個不同的
十六進制值
或?
PORTD?
狀態(tài),具體取決于按下的?
(4x4) 16
個不同的按鈕。
void encode_rf_sender (char data){ ? ?
if(data=='1')
RF_TX=0x10;
if(data=='2')
RF_TX=0x20;
if(data=='3')
……… ?…. ..
…. ….
在main函數(shù)中,我們首先使用switch_press_scan()函數(shù)接收鍵盤按鈕按下的數(shù)據(jù),并將數(shù)據(jù)存儲在鍵變量中。之后,我們使用encode_rf_sender()函數(shù)對數(shù)據(jù)進行編碼并更改PORTD狀態(tài)。
射頻接收器的PIC18F4520代碼:
與往常一樣,我們首先在PIC18f4520中設置配置位。它與PIC16F877A略有不同,您可以在隨附的zip文件中檢查代碼。
我們包含了LCD頭文件。使用PORTD線路定義了解碼器IC跨PORTD的D8-D11端口連接#define RF_RX連接與編碼器部分中使用的連接相同。LCD端口聲明也在lcd.c文件中完成。
#include
#include "supporing_cfilelcd.h"
#define RF_RX PORTD
如前所述,我們?yōu)?8F4520使用內(nèi)部振蕩器,我們使用了system_init函數(shù),其中我們配置 18F4520 的OSCON寄存器以將內(nèi)部振蕩器設置為8 MHz。我們還為LCD引腳和解碼器引腳設置了TRIS位。由于HT-12D在D8-D11端口提供輸出,我們需要將PORTD配置為輸入以接收輸出。
void system_init (void){
OSCCON = 0b01111110; // 8Mhz, , intosc
//OSCTUNE = 0b01001111; // PLL enable, Max prescaler 8x4 = 32Mhz ? ?
TRISB = 0x00;
TRISD = 0xFF; // Last 4 bit as input bit.
}
我們將OSCON寄存器配置為8MHz,還將端口 B作為輸出,端口D作為輸入。
下面的功能是使用上一個變送器部分中使用的完全相反的邏輯制作的。在這里,我們從端口 D獲得相同的十六進制值,并通過該十六進制值確定在發(fā)射器部分中按下了哪個開關。我們可以識別每個按鍵并將相應的字符提交給LCD。
void rf_analysis (unsigned char recived_byte){ ? ?
if(recived_byte==0x10)
lcd_data('1');
if(recived_byte==0x20)
lcd_data('2');
if(recived_byte==0x30)
……. ….. …
… ………..
從lcd.c文件調用lcd_data。
在主函數(shù)中,我們首先初始化系統(tǒng)和LCD。我們獲取一個可變字節(jié),并存儲從端口 D接收的十六進制值。然后通過該功能rf_analysis我們可以在LCD上打印字符。
void main(void) {
unsigned char byte = 0;
system_init();
lcd_init(); ??
while(1){
lcd_com(0x80);?
lcd_puts("CircuitDigest");
lcd_com (0xC0); ? ? ? ?
byte = RF_RX; ? ? ? ? ? ? ? ? ? ? ??
rf_analysis(byte);
lcd_com (0xC0);
}
return;
}
在運行它之前,我們已經(jīng)調整了電路。首先,我們按下鍵盤中的“D”按鈕。因此,0xF0由RF發(fā)射器連續(xù)傳輸。然后,我們調整接收器電路,直到LCD顯示字符“D”。有時模塊從制造商處正確調諧,有時則沒有。如果一切都正確連接并且沒有在LCD中得到按鈕按下的值,則RF接收器可能未調諧。我們使用絕緣螺絲刀來減少由于我們的身體電感而導致的錯誤調諧可能性。
這就是如何將射頻模塊連接到 PIC微控制器,并使用射頻傳感器在兩個 PIC 微控制器之間進行無線通信的方式。
PIC code for Transmitter Side:?
/*?
* File: ? main.c?
* Author: Sourav Gupta?
* By:- circuitdigest.com?
* Created on April 13, 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 ?
#include ?
#include ?
#include "supporing_cfile/Keypad.h"?
#define RF_TX PORTD?
/*?
Hardware related definition?
*/?
#define _XTAL_FREQ 200000000 //Crystal Frequency, used in delay?
/*?
Other Specific definition?
*/?
void system_init(void); ? ? ?
void encode_rf_sender (char data);?
void main(void){ ? ??
? ?system_init();?
? ?char Key = 'n'; ? ? ? ??
? ?while(1){?
? ? ? ??
? ? ? ? ?Key = switch_press_scan();?
? ? ? ? ?encode_rf_sender(Key); ? ? ? ? ? ? ? ? ? ?
? ? ? ??
? ? ? ??
? ?}?
}?
/*?
* ?System Init?
*/?
void system_init(void){?
? ?TRISD = 0x00;?
? ?RF_TX = 0x00;?
? ?keyboard_initialization();?
}?
void encode_rf_sender (char data){ ? ??
? ?if(data=='1')?
? ?RF_TX=0x10;?
? ?if(data=='2')?
? ?RF_TX=0x20;?
? ?if(data=='3')?
? ?RF_TX=0x30;?
? ?if(data=='4') ? ? ? ? ? ? ?
? ?RF_TX=0x40;?
? ?if(data=='5')?
? ?RF_TX=0x50;?
? ?if(data=='6')?
? ?RF_TX=0x60;?
? ?if(data=='7')?
? ?RF_TX=0x70;?
? ?if(data=='8') ? ? ? ? ? ? ?
? ?RF_TX=0x80;?
? ?if(data=='9')?
? ?RF_TX=0x90;?
? ?if(data=='0')?
? ?RF_TX=0x00;?
? ?if(data=='*')?
? ?RF_TX=0xa0;?
? ?if(data=='#') ? ? ? ? ? ??
? ?RF_TX=0xb0;?
? ?if(data=='A') ? ? ? ? ? ??
? ?RF_TX=0xc0;?
? ?if(data=='B') ? ? ? ? ? ??
? ?RF_TX=0xd0;?
? ?if(data=='C') ? ? ? ? ? ??
? ?RF_TX=0xe0;?
? ?if(data=='D') ? ? ? ? ? ??
? ?RF_TX=0xf0;?
}?
?
PIC code for Receiver Side:?
?
/*?
* File: ? main.c?
* Author: Sourav Gupta?
*CircuitDigest.com?
* Created on 17 May 2018, 12:18?
*/?
?
// PIC18F4520 Configuration Bit Settings?
// 'C' source line config statements?
// CONFIG1H?
#pragma config OSC = INTIO7 ? ? // Oscillator Selection bits (Internal oscillator block, CLKO function on RA6, port function on RA7)?
#pragma config FCMEN = OFF ? ? ?// Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)?
#pragma config IESO = OFF ? ? ? // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)?
// CONFIG2L?
#pragma config PWRT = OFF ? ? ? // Power-up Timer Enable bit (PWRT disabled)?
#pragma config BOREN = SBORDIS ?// Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))?
#pragma config BORV = 3 ? ? ? ? // Brown Out Reset Voltage bits (Minimum setting)?
// CONFIG2H?
#pragma config WDT = ON ? ? ? ? // Watchdog Timer Enable bit (WDT enabled)?
#pragma config WDTPS = 32768 ? ?// Watchdog Timer Postscale Select bits (1:32768)?
// CONFIG3H?
#pragma config CCP2MX = PORTC ? // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)?
#pragma config PBADEN = OFF ? ? ?// PORTB A/D Enable bit (PORTB<4:0> pins are configured as analog input channels on Reset)?
#pragma config LPT1OSC = OFF ? ?// Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation)?
#pragma config MCLRE = ON ? ? ? // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)?
// CONFIG4L?
#pragma config STVREN = ON ? ? ?// Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)?
#pragma config LVP = OFF ? ? ? ?// Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)?
#pragma config XINST = OFF ? ? ?// Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))?
// CONFIG5L?
#pragma config CP0 = OFF ? ? ? ?// Code Protection bit (Block 0 (000800-001FFFh) not code-protected)?
#pragma config CP1 = OFF ? ? ? ?// Code Protection bit (Block 1 (002000-003FFFh) not code-protected)?
#pragma config CP2 = OFF ? ? ? ?// Code Protection bit (Block 2 (004000-005FFFh) not code-protected)?
#pragma config CP3 = OFF ? ? ? ?// Code Protection bit (Block 3 (006000-007FFFh) not code-protected)?
// CONFIG5H?
#pragma config CPB = OFF ? ? ? ?// Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)?
#pragma config CPD = OFF ? ? ? ?// Data EEPROM Code Protection bit (Data EEPROM not code-protected)?
// CONFIG6L?
#pragma config WRT0 = OFF ? ? ? // Write Protection bit (Block 0 (000800-001FFFh) not write-protected)?
#pragma config WRT1 = OFF ? ? ? // Write Protection bit (Block 1 (002000-003FFFh) not write-protected)?
#pragma config WRT2 = OFF ? ? ? // Write Protection bit (Block 2 (004000-005FFFh) not write-protected)?
#pragma config WRT3 = OFF ? ? ? // Write Protection bit (Block 3 (006000-007FFFh) not write-protected)?
// CONFIG6H?
#pragma config WRTC = OFF ? ? ? // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)?
#pragma config WRTB = OFF ? ? ? // Boot Block Write Protection bit (Boot block (000000-0007FFh) not write-protected)?
#pragma config WRTD = OFF ? ? ? // Data EEPROM Write Protection bit (Data EEPROM not write-protected)?
// CONFIG7L?
#pragma config EBTR0 = OFF ? ? ?// Table Read Protection bit (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks)?
#pragma config EBTR1 = OFF ? ? ?// Table Read Protection bit (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks)?
#pragma config EBTR2 = OFF ? ? ?// Table Read Protection bit (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks)?
#pragma config EBTR3 = OFF ? ? ?// Table Read Protection bit (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks)?
// CONFIG7H?
#pragma config EBTRB = OFF ? ? ?// Boot Block Table Read Protection bit (Boot block (000000-0007FFh) not protected from table reads executed in other blocks)?
// #pragma config statements should precede project file includes.?
// Use project enums instead of #define for ON and OFF.?
#include ?
#include "supporing_cfilelcd.h"?
#define RF_RX PORTD?
void system_init (void);?
void rf_analysis (unsigned char recived_byte);?
void main(void) {?
? ?unsigned char byte = 0;?
? ?system_init();?
? ?lcd_init(); ? ?
? ?while(1){?
? ? ? ?lcd_com(0x80); ?
? ? ? ?lcd_puts("CircuitDigest");?
? ? ? ?lcd_com (0xC0); ? ? ? ??
? ? ? ?byte = RF_RX; ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?rf_analysis(byte);?
? ? ? ?lcd_com (0xC0);?
? ?}?
? ?return;?
}?
void system_init (void){?
? ?OSCCON = 0b01111110; // 8Mhz, , intosc?
? ?//OSCTUNE = 0b01001111; // PLL enable, Max prescaler 8x4 = 32Mhz ? ??
? ?TRISB = 0x00;?
? ?TRISD = 0xFF; // Last 4 bit as input bit.?
}?
void rf_analysis (unsigned char recived_byte){ ? ??
? ? ? ?if(recived_byte==0x10)?
? ? ? ?lcd_data('1');?
? ? ? ?if(recived_byte==0x20)?
? ? ? ?lcd_data('2');?
? ? ? ?if(recived_byte==0x30)?
? ? ? ?lcd_data('3');?
? ? ? ?if(recived_byte==0x40)?
? ? ? ?lcd_data('4');?
? ? ? ?if(recived_byte==0x50)?
? ? ? ?lcd_data('5');?
? ? ? ?if(recived_byte==0x60)?
? ? ? ?lcd_data('6');?
? ? ? ?if(recived_byte==0x70)?
? ? ? ?lcd_data('7');?
? ? ? ?if(recived_byte==0x80)?
? ? ? ?lcd_data('8');?
? ? ? ?if(recived_byte==0x90)?
? ? ? ?lcd_data('9');?
? ? ? ?if(recived_byte==0x00)?
? ? ? ?lcd_data('0');?
? ? ? ?if(recived_byte==0xa0)?
? ? ? ?lcd_data('*');?
? ? ? ?if(recived_byte==0xb0)?
? ? ? ?lcd_data('#');?
? ? ? ?if(recived_byte==0xc0)?
? ? ? ?lcd_data('A');?
? ? ? ?if(recived_byte==0xd0)?
? ? ? ?lcd_data('B');?
? ? ? ?if(recived_byte==0xe0)?
? ? ? ?lcd_data('C');?
? ? ? ?if(recived_byte==0xf0)?
? ? ? ?lcd_data('D'); ? ? ? ? ? ? ? ? ? ? ? ? ? ?
}?
?
評論
查看更多