幾年前我們?cè)诳苹秒娪爸锌吹降闹讣y傳感器,現(xiàn)在變得非常普遍,用于驗(yàn)證一個(gè)人出于各種目的的身份。目前,我們?cè)谌粘I钪须S處可見(jiàn)基于指紋的系統(tǒng),例如辦公室考勤,銀行員工驗(yàn)證,自動(dòng)取款機(jī)中的現(xiàn)金提取或存款,政府辦公室的身份驗(yàn)證等。我們已經(jīng)將其與Arduino和Raspberry Pi接口,今天我們將指紋傳感器與PIC微控制器連接。
必需組件
PIC16f877A 微控制器
指紋模塊
按鈕或鍵盤
16x2 液晶顯示器
10k鍋
18.432000 MHz 晶體振蕩器
面包板或印刷電路板(從JLCPCB訂購(gòu))
跳線
指示燈(可選)
電阻 150 歐姆 -1 k 歐姆(可選)
5v 電源
電路圖及說(shuō)明
在這個(gè)PIC微控制器指紋傳感器接口項(xiàng)目中,我們使用了4個(gè)按鈕:這些按鈕用于多功能。密鑰 1用于在系統(tǒng)中存儲(chǔ)或刪除指紋時(shí)匹配指紋和遞增指紋 ID。密鑰 2用于注冊(cè)新指紋以及在系統(tǒng)中存儲(chǔ)或刪除指紋時(shí)遞減指紋 ID。鍵 3 用于從系統(tǒng)中刪除存儲(chǔ)的手指,鍵 4 用于確定。LED用于指示檢測(cè)到或匹配指紋。在這里,我們使用了適用于UART的指紋模塊。因此,在這里,我們將此指紋模塊與PIC微控制器連接,其默認(rèn)波特率為57600。
因此,首先,我們需要進(jìn)行所有必需的連接,如下面的電路圖所示。連接很簡(jiǎn)單,我們剛剛將指紋模塊連接到PIC微控制器的UART。16x2 LCD 用于顯示所有消息。10k電位器也與LCD一起使用,以控制其對(duì)比度。16x2 LCD 數(shù)據(jù)引腳是連接的 PORTA 引腳。LCD 的 d4、d5、d6 和 d7 引腳分別與 PIC 微控制器的引腳 RA0、RA1、RA2 和 RA3 連接。四個(gè)按鈕(或鍵盤)連接到 PORTD 的引腳 RD0、RD1、RD2 和 RD,LED 也連接到端口 PORTC 的引腳 RC3。在這里,我們使用了一個(gè)18.432000 MHz的外部晶體振蕩器來(lái)為微控制器提供時(shí)鐘。
帶PIC微控制器的指紋傳感器的操作
該項(xiàng)目的操作很簡(jiǎn)單,只需在PIC編程器或刻錄機(jī)(PIckit2或Pickit3或其他)的幫助下,將從源代碼生成的十六進(jìn)制文件上傳到PIC微控制器中,然后您將通過(guò)LCD看到一些介紹消息,然后要求用戶輸入操作選項(xiàng)。要匹配指紋,用戶需要按鍵1,然后LCD將要求將手指放在指紋傳感器上。現(xiàn)在,通過(guò)將手指放在指紋模塊上,我們可以檢查我們的指紋是否已存儲(chǔ)。如果您的指紋已存儲(chǔ),則LCD將顯示帶有類似指紋的“ID:2”存儲(chǔ)ID的消息,否則將顯示“未找到”。
現(xiàn)在要注冊(cè)指紋,用戶需要按注冊(cè)按鈕或鍵 2 并按照 LCD 屏幕上的說(shuō)明消息進(jìn)行操作。
如果用戶想要?jiǎng)h除任何指紋,則用戶需要按刪除按鈕或鍵3。之后,LCD將詢問(wèn)要?jiǎng)h除的指紋的ID。現(xiàn)在,通過(guò)使用遞增按鈕或鍵1(匹配按鈕或鍵1)和遞減按鈕或鍵2(注冊(cè)按鈕或鍵2)進(jìn)行遞增和遞減,用戶可以選擇保存的指紋的ID,然后按確定按鈕刪除該指紋。
指紋接口 注意:這個(gè)項(xiàng)目的程序?qū)τ诔鯇W(xué)者來(lái)說(shuō)有點(diǎn)復(fù)雜。但其簡(jiǎn)單的接口代碼是利用讀取r305指紋模塊數(shù)據(jù)表制作的。該指紋模塊的所有功能說(shuō)明都在數(shù)據(jù)表中給出。
在這里,我們使用幀格式與指紋模塊通信。每當(dāng)我們向指紋模塊發(fā)送命令或數(shù)據(jù)請(qǐng)求幀時(shí),它都會(huì)以相同的幀格式響應(yīng)我們,其中包含與應(yīng)用命令相關(guān)的數(shù)據(jù)或信息。所有數(shù)據(jù)和命令幀格式已在用戶手冊(cè)或R305指紋模塊的數(shù)據(jù)表中給出。
編程說(shuō)明
在編程中,我們使用了以下幀格式。
我們通過(guò)設(shè)置配置位并定義LCD,按鈕和LED的宏和引腳來(lái)開始程序,您可以在該項(xiàng)目結(jié)束時(shí)給出的完整代碼中簽入。
然后我們聲明并初始化了一些變量和數(shù)組,并制作了一個(gè)框架,我們需要在這個(gè)項(xiàng)目中使用它來(lái)連接指紋模塊和PIC微控制器。
uchar buf[20];
uchar buf1[20];
volatile uint index=0;
volatile int flag=0;
uint msCount=0;
volatile uint count=0;
uchar data[10];
uint id=1;
enum
{
CMD,
DATA,
SBIT_CREN=4,
SBIT_TXEN,
SBIT_SPEN,
};
const char passPack[]={0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x7, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1B};
const char f_detect[]={0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x3, 0x1, 0x0, 0x5};
const char f_imz2ch1[]={0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x4, 0x2, 0x1, 0x0, 0x8};
const char f_imz2ch2[]={0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x4, 0x2, 0x2, 0x0, 0x9};
const char f_createModel[]={0xEF,0x1,0xFF,0xFF,0xFF,0xFF,0x1,0x0,0x3,0x5,0x0,0x9};
char f_storeModel[]={0xEF,0x1,0xFF,0xFF,0xFF,0xFF,0x1,0x0,0x6,0x6,0x1,0x0,0x1,0x0,0xE};
const char f_search[]={0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x8, 0x1B, 0x1, 0x0, 0x0, 0x0, 0xA3, 0x0, 0xC8};
char f_delete[]={0xEF,0x1,0xFF,0xFF,0xFF,0xFF,0x1,0x0,0x7,0xC,0x0,0x0,0x0,0x1,0x0,0x15};
之后,我們制作了LCD功能來(lái)驅(qū)動(dòng)LCD。
void lcdwrite(uchar ch,uchar rw)
{
LCDPORT= ch>>4 & 0x0F;
RS=rw;
EN=1;
__delay_ms(5);
EN=0;
LCDPORT= ch & 0x0F;
EN=1;
__delay_ms(5);
EN=0;
}
lcdprint(char *str)
{
while(*str)
{
lcdwrite(*str++,DATA);
//__delay_ms(20);
}
}
lcdbegin()
{
uchar lcdcmd[5]={0x02,0x28,0x0E,0x06,0x01};
uint i=0;
for(i=0;i<5;i++)
lcdwrite(lcdcmd[i], CMD);
}
給定函數(shù)用于初始化UART
void serialbegin(uint baudrate)
{
SPBRG = (18432000UL/(long)(64UL*baudrate))-1; // baud rate @18.432000Mhz Clock
TXSTAbits.SYNC = 0; //Setting Asynchronous Mode, ie UART
RCSTAbits.SPEN = 1; //Enables Serial Port
TRISC7 = 1; //As Prescribed in Datasheet
TRISC6 = 0; //As Prescribed in Datasheet
RCSTAbits.CREN = 1; //Enables Continuous Reception
TXSTAbits.TXEN = 1; //Enables Transmission
GIE = 1; // ENABLE interrupts
INTCONbits.PEIE = 1; // ENable peripheral interrupts.
PIE1bits.RCIE = 1; // ENABLE USART receive interrupt
PIE1bits.TXIE = 0; // disable USART TX interrupt
PIR1bits.RCIF = 0;
}
給定函數(shù)用于將命令傳輸?shù)街讣y模塊并從指紋模塊接收數(shù)據(jù)。
void serialwrite(char ch)
{
while(TXIF==0); // Wait till the transmitter register becomes empty
TXIF=0; // Clear transmitter flag
TXREG=ch; // load the char to be transmitted into transmit reg
}
serialprint(char *str)
{
while(*str)
{
serialwrite(*str++);
}
}
void interrupt SerialRxPinInterrupt(void)
{
if((PIR1bits.RCIF == 1) && (PIE1bits.RCIE == 1))
{
uchar ch=RCREG;
buf[index++]=ch;
if(index>0)
flag=1;
RCIF = 0; // clear rx flag
}
}
void serialFlush()
{
for(int i=0;i
{
buf[i]=0;
}
}
之后,我們需要?jiǎng)?chuàng)建一個(gè)函數(shù)來(lái)準(zhǔn)備要傳輸?shù)街讣y的數(shù)據(jù)并解碼來(lái)自指紋模塊的數(shù)據(jù)。
int sendcmd2fp(char *pack, int len)
{
uint res=ERROR;
serialFlush();
index=0;
__delay_ms(100);
for(int i=0;i
{
serialwrite(*(pack+i));
}
__delay_ms(1000);
if(flag == 1)
{
if(buf[0] == 0xEF && buf[1] == 0x01)
{
if(buf[6] == 0x07) // ack
{
if(buf[9] == 0)
{
uint data_len= buf[7];
data_len<<=8;
data_len|=buf[8];
for(int i=0;i
data[i]=0;
for(int i=0;i
{
data[i]=buf[10+i];
}
res=PASS;
}
else
{
res=ERROR;
}
}
}
現(xiàn)在,代碼中有四個(gè)函數(shù)可用于四個(gè)不同的任務(wù):
輸入指紋ID的函數(shù) –單位getId()
匹配手指的函數(shù) –void matchFinger()
注冊(cè)新手指的函數(shù) – 無(wú)效注冊(cè)手指()
刪除手指的函數(shù) –void deleteFinger()
最后給出了包含所有四個(gè)函數(shù)的完整代碼。
現(xiàn)在在主功能中,我們初始化GPIO,LCD,UART并檢查指紋模塊是否與微控制器連接。然后它通過(guò)LCD顯示一些介紹消息。最后,在while循環(huán)中,我們讀取所有鍵或按鈕來(lái)操作項(xiàng)目。
int main()
{
void (*FP)();
ADCON1=0b00000110;
LEDdir= 0;
SWPORTdir=0xF0;
SWPORT=0x0F;
serialbegin(57600);
LCDPORTDIR=0x00;
TRISE=0;
lcdbegin();
lcdprint("Fingerprint");
lcdwrite(192,CMD);
lcdprint("Interfacing");
__delay_ms(2000);
lcdwrite(1,CMD);
lcdprint("Using PIC16F877A");
lcdwrite(192,CMD);
lcdprint("Circuit Digest");
__delay_ms(2000);
index=0;
while(sendcmd2fp(&passPack[0],sizeof(passPack)))
{
lcdwrite(1,CMD);
lcdprint("FP Not Found");
__delay_ms(2000);
index=0;
}
lcdwrite(1,CMD);
lcdprint("FP Found");
__delay_ms(1000);
lcdinst();
while(1)
{
FP=match
FP();
}
return 0;
}
#define _XTAL_FREQ 18432000
#include
#include
#include
#include
// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
#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 is digital I/O, HV on MCLR must be used for programming)
#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)
//END CONFIG
#define uchar unsigned char
#define uint unsigned int
#define LCDPORTDIR TRISA
#define LCDPORT PORTA
#define RS RE1
#define EN RE0
#define SWPORTdir TRISD
#define SWPORT PORTD
#define enrol RD4
#define match RD5
#define delet RD7
#define ok RD6
#define up RD5
#define down RD4
#define LEDdir TRISC3
#define LED RC3
#define HIGH 1
#define LOW 0
#define PASS 0
#define ERROR 1
#define checkKey(id) id=up
uchar buf[20];
uchar buf1[20];
volatile uint index=0;
volatile int flag=0;
uint msCount=0;
uint g_timerflag=1;
volatile uint count=0;
uchar data[10];
uint id=1;
enum
{
CMD,
DATA,
SBIT_CREN=4,
SBIT_TXEN,
SBIT_SPEN,
};
const char passPack[]={0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x7, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1B};
const char f_detect[]={0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x3, 0x1, 0x0, 0x5};
const char f_imz2ch1[]={0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x4, 0x2, 0x1, 0x0, 0x8};
const char f_imz2ch2[]={0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x4, 0x2, 0x2, 0x0, 0x9};
const char f_createModel[]={0xEF,0x1,0xFF,0xFF,0xFF,0xFF,0x1,0x0,0x3,0x5,0x0,0x9};
char f_storeModel[]={0xEF,0x1,0xFF,0xFF,0xFF,0xFF,0x1,0x0,0x6,0x6,0x1,0x0,0x1,0x0,0xE};
const char f_search[]={0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x8, 0x1B, 0x1, 0x0, 0x0, 0x0, 0xA3, 0x0, 0xC8};
char f_delete[]={0xEF,0x1,0xFF,0xFF,0xFF,0xFF,0x1,0x0,0x7,0xC,0x0,0x0,0x0,0x1,0x0,0x15};
void lcdwrite(uchar ch,uchar rw)
{
LCDPORT= ch>>4 & 0x0F;
RS=rw;
EN=1;
__delay_ms(5);
EN=0;
LCDPORT= ch & 0x0F;
EN=1;
__delay_ms(5);
EN=0;
}
lcdprint(char *str)
{
while(*str)
{
lcdwrite(*str++,DATA);
//__delay_ms(20);
}
}
lcdbegin()
{
uchar lcdcmd[5]={0x02,0x28,0x0E,0x06,0x01};
uint i=0;
for(i=0;i<5;i++)?
lcdwrite(lcdcmd[i], CMD);
}
void lcdinst()
{
lcdwrite(0x80, CMD);
lcdprint("1-Match 2-Enroll");
lcdwrite(0xc0, CMD);
lcdprint("3-delete Finger");
__delay_ms(10);
}
void serialbegin(uint baudrate)
{
SPBRG = (18432000UL/(long)(64UL*baudrate))-1; // baud rate @18.432000Mhz Clock
TXSTAbits.SYNC = 0; //Setting Asynchronous Mode, ie UART
RCSTAbits.SPEN = 1; //Enables Serial Port
TRISC7 = 1; //As Prescribed in Datasheet
TRISC6 = 0; //As Prescribed in Datasheet
RCSTAbits.CREN = 1; //Enables Continuous Reception
TXSTAbits.TXEN = 1; //Enables Transmission
GIE = 1; // ENABLE interrupts
INTCONbits.PEIE = 1; // ENable peripheral interrupts.
PIE1bits.RCIE = 1; // ENABLE USART receive interrupt
PIE1bits.TXIE = 0; // disable USART TX interrupt
PIR1bits.RCIF = 0;
}
void serialwrite(char ch)
{
while(TXIF==0); // Wait till the transmitter register becomes empty
TXIF=0; // Clear transmitter flag
TXREG=ch; // load the char to be transmitted into transmit reg
}
serialprint(char *str)
{
while(*str)
{
serialwrite(*str++);
}
}
void interrupt SerialRxPinInterrupt(void)
{
if((PIR1bits.RCIF == 1) && (PIE1bits.RCIE == 1))
{
uchar ch=RCREG;
buf[index++]=ch;
if(index>0)
flag=1;
RCIF = 0; // clear rx flag
}
}
void serialFlush()
{
for(int i=0;i
{
buf[i]=0;
}
}
int sendcmd2fp(char *pack, int len)
{
uint res=ERROR;
serialFlush();
index=0;
__delay_ms(100);
for(int i=0;i
{
serialwrite(*(pack+i));
}
__delay_ms(1000);
if(flag == 1)
{
if(buf[0] == 0xEF && buf[1] == 0x01)
{
if(buf[6] == 0x07) // ack
{
if(buf[9] == 0)
{
uint data_len= buf[7];
data_len<<=8;?
data_len|=buf[8];
for(int i=0;i
data[i]=0;
for(int i=0;i
{
data[i]=buf[10+i];
}
res=PASS;
}
else
{
res=ERROR;
}
}
}
index=0;
flag=0;
return res;
}
}
uint getId()
{
uint id=0;
lcdwrite(1, CMD);
while(1)
{
lcdwrite(0x80, CMD);
checkKey(id);
sprintf(buf1,"Enter Id:%d ",id);
lcdprint(buf1);
__delay_ms(200);
if(ok == LOW)
return id;
}
}
void matchFinger()
{
lcdwrite(1,CMD);
lcdprint("Place Finger");
lcdwrite(192,CMD);
__delay_ms(2000);
if(!sendcmd2fp(&f_detect[0],sizeof(f_detect)))
{
if(!sendcmd2fp(&f_imz2ch1[0],sizeof(f_imz2ch1)))
{
if(!sendcmd2fp(&f_search[0],sizeof(f_search)))
{
lcdwrite(1,CMD);
lcdprint("Finger Found");
uint id= data[0];
id<<=8;?
id+=data[1];
uint score=data[2];
score<<=8;?
score+=data[3];
sprintf(buf1,"Id:%d Score:%d",id,score);
lcdwrite(192,CMD);
lcdprint(buf1);
LED=1;
__delay_ms(1000);
LED=0;
}
else
{
lcdwrite(1,CMD);
lcdprint("Not Found");
}
}
}
else
{
lcdprint("No Finger");
}
__delay_ms(2000);
}
void enrolFinger()
{
lcdwrite(1,CMD);
lcdprint("Enroll Finger");
__delay_ms(2000);
lcdwrite(1,CMD);
lcdprint("Place Finger");
lcdwrite(192,CMD);
__delay_ms(1000);
if(!sendcmd2fp(&f_detect[0],sizeof(f_detect)))
{
if(!sendcmd2fp(&f_imz2ch1[0],sizeof(f_imz2ch1)))
{
lcdprint("Finger Detected");
__delay_ms(1000);
lcdwrite(1,CMD);
lcdprint("Place Finger");
lcdwrite(192,CMD);
lcdprint(" Again ");
__delay_ms(2000);
if(!sendcmd2fp(&f_detect[0],sizeof(f_detect)))
{
if(!sendcmd2fp(&f_imz2ch2[0],sizeof(f_imz2ch2)))
{
lcdwrite(1,CMD);
lcdprint("Finger Detected");
__delay_ms(1000);
if(!sendcmd2fp(&f_createModel[0],sizeof(f_createModel)))
{
id=getId();
f_storeModel[11]= (id>>8) & 0xff;
f_storeModel[12]= id & 0xff;
f_storeModel[14]= 14+id;
if(!sendcmd2fp(&f_storeModel[0],sizeof(f_storeModel)))
{
lcdwrite(1,CMD);
lcdprint("Finger Stored");
sprintf(buf1,"Id:%d",id);
lcdwrite(192,CMD);
lcdprint(buf1);
__delay_ms(1000);
}
else
{
lcdwrite(1,CMD);
lcdprint("Finger Not Stored");
}
}
else
lcdprint("Error");
}
else
lcdprint("Error");
}
else
lcdprint("No Finger");
}
}
else
{
lcdprint("No Finger");
}
__delay_ms(2000);
}
void deleteFinger()
{
id=getId();
f_delete[10]=id>>8 & 0xff;
f_delete[11]=id & 0xff;
f_delete[14]=(21+id)>>8 & 0xff;
f_delete[15]=(21+id) & 0xff;
if(!sendcmd2fp(&f_delete[0],sizeof(f_delete)))
{
lcdwrite(1,CMD);
sprintf(buf1,"Finger ID %d ",id);
lcdprint(buf1);
lcdwrite(192, CMD);
lcdprint("Deleted Success");
}
else
{
lcdwrite(1,CMD);
lcdprint("Error");
}
__delay_ms(2000);
}
int main()
{
void (*FP)();
ADCON1=0b00000110;
LEDdir= 0;
SWPORTdir=0xF0;
SWPORT=0x0F;
serialbegin(57600);
LCDPORTDIR=0x00;
TRISE=0;
lcdbegin();
lcdprint("Fingerprint");
lcdwrite(192,CMD);
lcdprint("Interfacing");
__delay_ms(2000);
lcdwrite(1,CMD);
lcdprint("Using PIC16F877A");
lcdwrite(192,CMD);
lcdprint("Circuit Digest");
__delay_ms(2000);
index=0;
while(sendcmd2fp(&passPack[0],sizeof(passPack)))
{
lcdwrite(1,CMD);
lcdprint("FP Not Found");
__delay_ms(2000);
index=0;
}
lcdwrite(1,CMD);
lcdprint("FP Found");
__delay_ms(1000);
lcdinst();
while(1)
{
FP=match
FP();
}
-
指紋傳感器
+關(guān)注
關(guān)注
6文章
196瀏覽量
63535 -
Arduino
+關(guān)注
關(guān)注
188文章
6477瀏覽量
187838
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
如何使用PIC微控制器和脈搏傳感器進(jìn)行心跳監(jiān)測(cè)
![如何使用<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b>和脈搏<b class='flag-5'>傳感器</b>進(jìn)行心跳監(jiān)測(cè)](https://file.elecfans.com//web2/M00/77/1D/pYYBAGNg3nSAaVSmAABIPnC_ZGs821.jpg)
將伺服電機(jī)與PIC微控制器連接的教程
![<b class='flag-5'>將</b>伺服電機(jī)與<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b><b class='flag-5'>連接</b>的教程](https://file.elecfans.com//web2/M00/7A/F1/pYYBAGNx_T6AFaN_AAB5wPm_3ls232.jpg)
如何使用PIC微控制器旋轉(zhuǎn)步進(jìn)電機(jī)
![如何使用<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b>旋轉(zhuǎn)步進(jìn)電機(jī)](https://file.elecfans.com//web2/M00/7A/B1/poYBAGNzWviAaF5JAAA5saEfR0g615.jpg)
如何將GPS模塊與PIC微控制器連接以獲取當(dāng)前位置的緯度和經(jīng)度
![<b class='flag-5'>如何將</b>GPS模塊與<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b><b class='flag-5'>連接</b>以獲取當(dāng)前位置的緯度和經(jīng)度](https://file.elecfans.com/web2/M00/7B/9B/pYYBAGN0rMGADYMNAAJAc1IU4Hk014.png)
如何將超聲波傳感器HC-SR04與PIC微控制器連接
![<b class='flag-5'>如何將</b>超聲波<b class='flag-5'>傳感器</b>HC-SR04與<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b><b class='flag-5'>連接</b>](https://file.elecfans.com//web2/M00/87/24/poYBAGOs9o6AEsd0AACOsw2KntI531.jpg)
用一只傳感器和一個(gè)微控制器采集圖像
如何將微控制器與FPGA連接?
如何將數(shù)據(jù)從傳感器寫入SD卡
MAX1169 ADC與PIC微控制器的接口
![MAX1169 ADC與<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b>的接口](https://file1.elecfans.com//web2/M00/A4/8D/wKgZomUMNLOAEqcuAAAUsOo0p9E393.gif)
用傳感器和PIC微控制器構(gòu)成相對(duì)濕度計(jì)
![用<b class='flag-5'>傳感器</b>和<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b>構(gòu)成相對(duì)濕度計(jì)](https://file1.elecfans.com//web2/M00/A6/40/wKgZomUMPIOAfFd6AAARi6TK4wM548.jpg)
如何將伺服電動(dòng)機(jī)與PIC微控制器連接
如何將SD卡模塊與PIC微控制器連接并在其中存儲(chǔ)數(shù)據(jù)
![<b class='flag-5'>如何將</b>SD卡模塊與<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b><b class='flag-5'>連接</b>并在其中存儲(chǔ)數(shù)據(jù)](https://file.elecfans.com/web2/M00/59/E4/poYBAGLqNdqAE1fnAADpdZORb4g908.png)
如何將PIR傳感器與Arduino微控制器連接起來(lái)
![<b class='flag-5'>如何將</b>PIR<b class='flag-5'>傳感器</b>與Arduino<b class='flag-5'>微控制器</b><b class='flag-5'>連接</b>起來(lái)](https://file.elecfans.com/web2/M00/89/1E/poYBAGO3zw6AHoWHAACCZqeDmoQ937.png)
評(píng)論