0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何將指紋傳感器與PIC微控制器連接

科技觀察員 ? 來(lái)源:circuitdigest ? 作者:薩達(dá)姆 ? 2022-11-07 16:08 ? 次閱讀

幾年前我們?cè)诳苹秒娪爸锌吹降闹讣y傳感器,現(xiàn)在變得非常普遍,用于驗(yàn)證一個(gè)人出于各種目的的身份。目前,我們?cè)谌粘I钪须S處可見基于指紋的系統(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 電源

pYYBAGNovQiAUgWZAACKZHbSl2s232.jpg

電路圖及說(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。

poYBAGNovQmAWWB4AAA0F3vV_3M613.jpg

因此,首先,我們需要進(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í)鐘。

pYYBAGNovQyAJfaVAADbukztGzg043.png

帶PIC微控制器的指紋傳感器的操作

該項(xiàng)目的操作很簡(jiǎn)單,只需在PIC編程器或刻錄機(jī)(PIckit2或Pickit3或其他)的幫助下,將從源代碼生成的十六進(jìn)制文件上傳到PIC微控制器中,然后您將通過LCD看到一些介紹消息,然后要求用戶輸入操作選項(xiàng)。要匹配指紋,用戶需要按鍵1,然后LCD將要求將手指放在指紋傳感器上?,F(xiàn)在,通過將手指放在指紋模塊上,我們可以檢查我們的指紋是否已存儲(chǔ)。如果您的指紋已存儲(chǔ),則LCD將顯示帶有類似指紋的“ID:2”存儲(chǔ)ID的消息,否則將顯示“未找到”。

現(xiàn)在要注冊(cè)指紋,用戶需要按注冊(cè)按鈕或鍵 2 并按照 LCD 屏幕上的說(shuō)明消息進(jìn)行操作。

如果用戶想要?jiǎng)h除任何指紋,則用戶需要按刪除按鈕或鍵3。之后,LCD將詢問要?jiǎng)h除的指紋的ID。現(xiàn)在,通過使用遞增按鈕或鍵1(匹配按鈕或鍵1)和遞減按鈕或鍵2(注冊(cè)按鈕或鍵2)進(jìn)行遞增和遞減,用戶可以選擇保存的指紋的ID,然后按確定按鈕刪除該指紋。


pYYBAGNovQ6ATqYrAAB-9nYFFuo219.jpg

指紋接口 注意:這個(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ō)明

在編程中,我們使用了以下幀格式。

pYYBAGNovRSAIgBCAAC9FbVO6ZQ491.png

我們通過設(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;

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};

之后,我們制作了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并檢查指紋模塊是否與微控制器連接。然后它通過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();

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 指紋傳感器
    +關(guān)注

    關(guān)注

    6

    文章

    194

    瀏覽量

    63442
  • Arduino
    +關(guān)注

    關(guān)注

    187

    文章

    6455

    瀏覽量

    186357
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何使用PIC微控制器和脈搏傳感器進(jìn)行心跳監(jiān)測(cè)

    今天,我們還將使用帶有PIC微控制器的脈沖傳感器來(lái)計(jì)算每分鐘的心跳次數(shù)和心跳間隔,這些值進(jìn)一步顯示在16x2字符LCD上。我們將在本項(xiàng)目中使用 P
    的頭像 發(fā)表于 11-01 16:53 ?5046次閱讀
    如何使用<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b>和脈搏<b class='flag-5'>傳感器</b>進(jìn)行心跳監(jiān)測(cè)

    伺服電機(jī)與PIC微控制器連接的教程

    在本教程中,我們將了解伺服電機(jī)以及如何將伺服與 MSP430 連接。MSP-EXP430G2 是德州儀器提供的開發(fā)工具,又名 LaunchPad,用于學(xué)習(xí)和練習(xí)如何使用其微控制器。該板屬于 MSP430 超值系列類別,我們可以在
    的頭像 發(fā)表于 11-14 16:33 ?2646次閱讀
    <b class='flag-5'>將</b>伺服電機(jī)與<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b><b class='flag-5'>連接</b>的教程

    如何使用PIC微控制器旋轉(zhuǎn)步進(jìn)電機(jī)

    在本教程中,我們步進(jìn)電機(jī)與PIC微控制器PIC16F877A連接。
    發(fā)表于 11-15 17:25 ?1401次閱讀
    如何使用<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b>旋轉(zhuǎn)步進(jìn)電機(jī)

    如何將GPS模塊與PIC微控制器連接以獲取當(dāng)前位置的緯度和經(jīng)度

    我們選擇了由U-blox制造的G7020 GPS模塊。我們將從衛(wèi)星接收特定位置的經(jīng)度和緯度,并將在 16x2 字符 LCD 上顯示相同的經(jīng)度和緯度。因此,在這里我們通過微芯片GPS與PIC16F877A
    的頭像 發(fā)表于 11-16 17:28 ?2328次閱讀
    <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)度

    如何將超聲波傳感器HC-SR04與PIC微控制器連接

    為了讓任何項(xiàng)目活躍起來(lái),我們需要使用傳感器。傳感器充當(dāng)所有嵌入式應(yīng)用的眼睛和耳朵,它幫助數(shù)字微控制器了解這個(gè)真實(shí)模擬世界中實(shí)際發(fā)生的事情。在本教程中,我們學(xué)習(xí)
    的頭像 發(fā)表于 01-01 10:08 ?3576次閱讀
    <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>

    用一只傳感器和一個(gè)微控制器采集圖像

    和一只AVR公司的ATmega328微控制器IC1設(shè)計(jì)出一個(gè)圖像采集系統(tǒng)?! D1演示了如何將傳感器連接微控制器上,以及對(duì)
    發(fā)表于 12-04 15:44

    如何將微控制器與FPGA連接?

    晚上好,如何將微控制器與FPGA連接?如何使用微控制器配置FPGA?如何使用微控制器或軟件程序?yàn)镕PGA創(chuàng)建.bit文件以使用
    發(fā)表于 03-25 09:22

    如何將數(shù)據(jù)從傳感器寫入SD卡

    我試圖記錄溫度傳感器數(shù)據(jù)到SD卡,連接PIC24F16KA102微控制器。我很難設(shè)置這個(gè)。如何將
    發(fā)表于 05-08 13:20

    MAX1169 ADC與PIC微控制器的接口

    MAX1169 ADC與PIC微控制器的接口 摘要:本應(yīng)用筆記介紹如何連接MAX1169模數(shù)轉(zhuǎn)換(ADC)至PIC®
    發(fā)表于 01-23 21:18 ?634次閱讀
    MAX1169 ADC與<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b>的接口

    傳感器PIC微控制器構(gòu)成相對(duì)濕度計(jì)

    用一個(gè)具有容性響應(yīng)的傳感器和一只PIC微控制器(MCU)就可以構(gòu)成一個(gè)相對(duì)濕度計(jì)。
    發(fā)表于 06-15 14:19 ?1390次閱讀
    用<b class='flag-5'>傳感器</b>和<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b>構(gòu)成相對(duì)濕度計(jì)

    如何將伺服電動(dòng)機(jī)與PIC微控制器連接

     此電路的電路圖實(shí)驗(yàn)如下所示。伺服控制輸入來(lái)自PIC16F628A微控制器的RB1引腳,該PIC16F628A
    的頭像 發(fā)表于 12-05 17:54 ?4273次閱讀

    如何將SD卡模塊與PIC微控制器連接并在其中存儲(chǔ)數(shù)據(jù)

    在本文中,我們向您展示如何簡(jiǎn)單地 SD 卡模塊與 PIC 微控制器連接并在其中存儲(chǔ)數(shù)據(jù)。
    發(fā)表于 08-03 16:47 ?1437次閱讀
    <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ù)

    如何將PIR傳感器與Arduino微控制器連接起來(lái)

    在大多數(shù)項(xiàng)目中,檢測(cè)運(yùn)動(dòng)或運(yùn)動(dòng)一直很重要。在PIR傳感器的幫助下,檢測(cè)人/動(dòng)物的運(yùn)動(dòng)變得非常容易。在這個(gè)項(xiàng)目中,我們學(xué)習(xí)如何將 PIR 傳感器與 Arduino 等
    的頭像 發(fā)表于 01-25 15:36 ?2067次閱讀
    <b class='flag-5'>如何將</b>PIR<b class='flag-5'>傳感器</b>與Arduino<b class='flag-5'>微控制器</b><b class='flag-5'>連接</b>起來(lái)

    MAX1169 ADC與PIC微控制器接口

    本應(yīng)用筆記介紹如何將MAX1169模數(shù)轉(zhuǎn)換(ADC)連接PIC?微控制器。它包括PIC18F
    的頭像 發(fā)表于 02-25 12:11 ?549次閱讀
    MAX1169 ADC與<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b>接口

    MAX1169 ADC與PIC微控制器接口

    本應(yīng)用筆記介紹如何將MAX1169模數(shù)轉(zhuǎn)換(ADC)連接PIC微控制器。它包括PIC18F4
    的頭像 發(fā)表于 03-30 11:29 ?852次閱讀
    MAX1169 ADC與<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b>接口