日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

基于STM32智能安全门禁

發(fā)布時(shí)間:2023/12/20 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于STM32智能安全门禁 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.引言

學(xué)了這么久的知識(shí)了,現(xiàn)在大二了。想著總不能老是吸取別人的經(jīng)驗(yàn)嘛!于是就突發(fā)奇想地想寫一次博客,跟大家分享一下我的學(xué)習(xí)經(jīng)驗(yàn)。第一次寫博客,如果有什么問(wèn)題,還請(qǐng)大家見諒見諒,歡迎大家指出問(wèn)題來(lái)。
這是我在大一下學(xué)期跟著師兄做的物聯(lián)網(wǎng)智能家居項(xiàng)目里面的模塊,當(dāng)時(shí)師兄讓我負(fù)責(zé)門禁這一方面。沒辦法當(dāng)時(shí)的我就是菜鳥一個(gè),對(duì)于人臉識(shí)別等高技術(shù)根本就不懂。于是就在網(wǎng)上搜索了一天,確定了方案后,斷斷續(xù)續(xù)地花了一個(gè)星期,最終完成任務(wù)。那么廢話少說(shuō)了,開始進(jìn)入正題了。

2.概述

在該項(xiàng)目的門禁系統(tǒng)中我主要采用了以stm32F103系列單片機(jī)作為MCU,以ATK-AS608指紋識(shí)別模塊作為指紋識(shí)別模塊,和4X4矩陣按鍵為密碼按鍵模塊。該門禁系統(tǒng)可以通過(guò)指紋識(shí)別確認(rèn)成功或者通過(guò)按鍵輸入正確密碼則開鎖后,MCU發(fā)送指令控制繼電器驅(qū)動(dòng)模塊進(jìn)行開鎖。當(dāng)指紋識(shí)別失敗或者輸入密碼錯(cuò)誤時(shí)則會(huì)通過(guò)蜂鳴器報(bào)警。
在以上實(shí)現(xiàn)的基礎(chǔ)上,對(duì)指紋模塊和按鍵模塊加以優(yōu)化功能。當(dāng)家里沒有人的時(shí)候,門禁系統(tǒng)需要同時(shí)通過(guò)指紋和按鍵密碼才能開鎖。當(dāng)家里有人是可以任選一種方式。假若刷指紋失敗超過(guò)六次,則需要通過(guò)兩次刷指紋和一次按鍵密碼才能開鎖。
下面是正確操作步驟

刷指紋輸入密碼刷指紋家居系統(tǒng)有人配對(duì)成功輸入正確繼電器開鎖無(wú)人配對(duì)成功

3.元器件部分清單

單片機(jī)STM32F103RC
按鍵4X4矩陣按鍵
繼電器驅(qū)動(dòng)模塊1路繼電器模塊 5V DC-5V
指紋光學(xué)指紋識(shí)別模塊

4.硬件部分說(shuō)明

繼電器模塊的接口說(shuō)明:
1、DC+:接電源正極(電壓按繼電器要求,有5V.9V.12V和24V選擇) 2、DC-:接電源負(fù)極 3、IN:可以高或低電平控制繼電器吸合 繼電器輸出端: 1、NO: 繼電器常開接口,繼電器吸合前懸空,吸合后與COM短接 2、COM:繼電器公用接口 3、NC: 繼電器常閉接口,繼電器吸合前與COM短接,吸合后懸空。下面時(shí)示意圖:

)

)
矩陣按鍵
在本系統(tǒng)中,我采用了4X4的矩陣按鍵來(lái)作為實(shí)現(xiàn)密碼按鍵功能,
)).
目前一般使用的方法有兩種,分別是:

方法一:先通過(guò)高四位全部輸出低電平,然后逐行掃描,如果低四位不為1(非門)則,該行的按鍵被按下
方法二(常用):先給高四位全部輸出低電平,低四位輸出高電平,接受數(shù)據(jù),當(dāng)?shù)退奈徊蝗珵楦唠娖綍r(shí),判斷所在列,然后,低四位輸出低電平,高四位輸出高電平,判斷行,行列都判斷了;

對(duì)于哪種方法比較好,那就個(gè)人而異了。下面的代碼是采用了第二種方法

5.部分代碼

key.c//按鍵返回值

int key(void) //返回int類型按鍵值 { //已經(jīng)定義PB8~11為上拉輸入,PB12~15為下拉輸入int KeyVal=0; GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0f00)); if((GPIOB->IDR & 0xf000)==0x0000) return -1; else{ delay_ms(5); if((GPIOB->IDR & 0xf000)==0x0000) return -1;}GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0100)); switch(GPIOB->IDR & 0xf000) {case 0x1000: KeyVal=1;Key_Scan[1]=1;break;//1case 0x2000: KeyVal=2;Key_Scan[2]=2; break;//2case 0x4000: KeyVal=3;Key_Scan[3]=3; break;//3case 0x8000: KeyVal=11;break;//A}GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0200)); switch(GPIOB->IDR & 0xf000) {case 0x1000: KeyVal=4;Key_Scan[4]=4; break;case 0x2000: KeyVal=5;Key_Scan[5]=5; break;case 0x4000: KeyVal=6;Key_Scan[6]=6; break;case 0x8000: KeyVal=12;Key_Scan[1]=0; break;}GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0400)); switch(GPIOB->IDR & 0xf000) {case 0x1000: KeyVal=7;Key_Scan[7]=7; break;case 0x2000: KeyVal=8;Key_Scan[1]=1; break;case 0x4000: KeyVal=9;Key_Scan[1]=1; break;case 0x8000: KeyVal=13;Key_Scan[1]=0; break;} GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0800)); switch(GPIOB->IDR & 0xf000) {case 0x1000: KeyVal=15;Key_Scan[1]=0; break;case 0x2000: KeyVal=0;Key_Scan[0]=0; break;case 0x4000: KeyVal=16; Key_Scan[1]=0;break;case 0x8000: KeyVal=14;Key_Scan[1]=0; break;}return KeyVal; }

刷指紋

void press_FR(void) {SearchResult seach;u8 ensure;char *str;ensure=PS_GetImage();//SUO_Init();LED_Init();if(ensure==0x00)//獲取圖像成功{ ensure=PS_GenChar(CharBuffer1);if(ensure==0x00) //生成特征成功{ ensure=PS_HighSpeedSearch(CharBuffer1,0,300,&seach);if(ensure==0x00)//搜索成功{ LED0=1;LED1=0;BEEP=1;delay_ms(2500);BEEP=0;SUO=0;//開鎖LCD_Fill(0,100,lcddev.width,160,WHITE);Show_Str_Mid(0,100,"Search fingerprint success",16,240);// str=mymalloc(50);sprintf(str,"Match ID:%d Match score:%d",seach.pageID,seach.mathscore);//Show_Str_Mid(0,140,(u8*)str,16,240);myfree(str);}else {ShowErrMessage(ensure);BEEP=1; LED0=0;SUO=1;delay_ms(3000);BEEP=0;} }else{ShowErrMessage(ensure);}delay_ms(1000);LCD_Fill(0,100,lcddev.width,160,WHITE);}}

密碼判斷執(zhí)行操作函數(shù)
//由于項(xiàng)目結(jié)題中,省略了部分代碼,詳細(xì)步驟過(guò)程如下

void do_Verify Password{int KEY,key0[10]={0};KEY=key();//key()返回按鍵值 ,無(wú)按下返回-1. if(KEY!=-1){ key0[i]=KEY; i+=1; if(i==6)for(i=0;i<6;i++){ //Key[10]為全局變量,原密碼值,可調(diào)用 change_Password()改變?cè)艽a if(key0[i]==Key1[i]){K+=1;continue;}else {//密碼輸入錯(cuò)誤,請(qǐng)重新輸入密碼,自行寫代碼} }}if(K==6){//密碼輸入正確后,判斷是否開鎖or取消}if(/*判斷條件*/)//執(zhí)行操作,返回主程序 ; } }

6.結(jié)論

如有問(wèn)題,歡迎大家提出來(lái),第一次寫,難免寫得很差,hhhh~。
轉(zhuǎn)載請(qǐng)保留鏈接

總結(jié)

以上是生活随笔為你收集整理的基于STM32智能安全门禁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。