舍友老忘帶鑰匙 我就做了個簡易的指紋鎖,宿舍六個人用第一次上傳這個 比較簡陋哈~ 注釋我寫的很詳細(自以為)
要是能幫到大家,那就很好了  
51hei圖片20191025205014.jpg (3.95 MB, 下載次數: 36)
下載附件
2019-10-25 20:57 上傳
51hei圖片20191025205006.jpg (3.56 MB, 下載次數: 39)
下載附件
2019-10-25 20:57 上傳
51hei圖片20191025204953.jpg (3.77 MB, 下載次數: 27)
下載附件
2019-10-25 20:56 上傳
單片機源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- sbit zhen=P2^0; //電動機正轉,拉把手開門
- sbit fan=P2^1; //電動機反轉,復位門把手
- sbit led_work=P2^2; //單片機已經初始化完成指示LED兼檢測門把手位置指示燈
- sbit check=P2^3; //干簧管位置檢測,門開為1
- sbit pressed=P2^6; //指紋模塊觸摸檢測
- sbit wakeup=P2^7; //指紋模塊上電控制,1為模塊上電,0為關閉
- sbit test=P3^3; //測試開門
- //////////////////////////////////////////////////////////////////////////
- volatile unsigned char FPM10A_RECEICE_BUFFER[32]; //定義接收緩存區
- code unsigned char FPM10A_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF}; //協議包頭
- code unsigned char FPM10A_Get_Img[6] = {0x01,0x00,0x03,0x01,0x00,0x05}; //獲得指紋圖像
- code unsigned char FPM10A_Img_To_Buffer1[7]={0x01,0x00,0x04,0x02,0x01,0x00,0x08}; //將圖像放入到BUFFER1
- code unsigned char FPM10A_Search[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x00,0x64,0x00,0x72}; //搜索指紋搜索范圍0 - 999,使用BUFFER1中的特征碼搜索
- //////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////
- // 定時 //
- /////////////////////////////////////////////
- void delay1s(void) //定時1S,晶振11.0592MHZ
- {
- unsigned char a,b,c;
- for(c=13;c>0;c--)
- for(b=247;b>0;b--)
- for(a=142;a>0;a--);
- _nop_(); //if Keil,require use intrins.h
- }
- void delay100ms(void) //定時100MS,晶振11.0592MHZ
- {
- unsigned char a,b;
- for(b=221;b>0;b--)
- for(a=207;a>0;a--);
- }
- void delay500ms(void) //500ms
- {
- unsigned char a,b,c;
- for(c=98;c>0;c--)
- for(b=127;b>0;b--)
- for(a=17;a>0;a--);
- _nop_();
- }
- void delay1_6_f(void) //誤差 0us
- {
- unsigned char a,b,c;
- for(c=218;c>0;c--)
- for(b=131;b>0;b--)
- for(a=23;a>0;a--);
- _nop_(); //if Keil,require use intrins.h
- }
- void delay50ms(void) //誤差 0us
- {
- unsigned char a,b;
- for(b=173;b>0;b--)
- for(a=143;a>0;a--);
- }
- void delay10ms(void) //誤差 0us
- {
- unsigned char a,b,c;
- for(c=1;c>0;c--)
- for(b=38;b>0;b--)
- for(a=130;a>0;a--);
- }
- /////////////////////////////////////////////
- void kaisuo(void)
- {
- int t;
- zhen=fan=0;
- zhen=1; //電動機正轉啟動
- for(t=0;t<45;t++) //50ms為一個段,共2.25s,控制最大拉動時間,防止出現意外正轉過久把手被拉壞
- {
- if(check==0)
- {
- delay10ms(); //等待10ms,干簧管消抖
- if(check==0) //再次檢測
- {
- led_work=0;//檢測到把手就位,指示燈熄滅以指示
- zhen=0; //電機停機
- delay100ms(); //等待100ms,準備反轉
- //delay500ms();//等待500ms,準備反轉
- fan=1;
- delay1_6_f();//反轉1.6s
- fan=0;
- led_work=1;//狀態指示燈復位
- check=1;
- return;//跳出循環
- }
-
- }
- else
- {
- delay50ms();//50ms每段
- continue;
- }
-
- }
- zhen=0; //超出時間,停機
- delay100ms();//等待100ms,準備反轉
- //delay500ms(); //等待500ms,準備反轉
- fan=1;
- delay1_6_f();
- fan=0;
- }
- void Uart_Init(void) //初始化
- {
- //zhen=1;
- //fan=1;
- SCON=0x50; //UART方式1:8位UART; REN=1:允許接收
- PCON=0x00; //SMOD=0:波特率不加倍
- TMOD=0x20; //T1方式2,用于UART波特率
- TH1=0xFD; //UART波特率設置:FDFD(9600)
- TL1=0xFD; //UART波特率設置:FDFD(9600)
- TR1=1; //允許T1計數
- EA=1; //
- }
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //UART發送和接收部分
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void Uart_Send_Byte(unsigned char c)//uart發送一個字節
- {
- SBUF = c;
- while(!TI); //發送完為1
- TI = 0;
- }
- unsigned char Uart_Receive_Byte()//UART接受一個字節
- {
- unsigned char dat;
- while(!RI); //接收完為1
- RI = 0;
- dat = SBUF;
- return (dat);
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////
- // AS608/FPM10A指紋模塊命令 //
- ////////////////////////////////////////////
- void FPM10A_Cmd_Send_Pack_Head(void) //發送通訊協議包頭
- {
- int i;
- for(i=0;i<6;i++)
- {
- Uart_Send_Byte(FPM10A_Pack_Head[i]);
- }
- }
- void FPM10A_Receive_Data(unsigned char ucLength) //接收指紋模塊反饋數據緩沖
- {
- unsigned char i;
- for (i=0;i<ucLength;i++)
- FPM10A_RECEICE_BUFFER[i] = Uart_Receive_Byte();
- }
- void FPM10A_Cmd_Get_Img(void) ////FINGERPRINT_獲得指紋圖像命令(檢測是否有指紋)
- {
- unsigned char i;
- FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭
- for(i=0;i<6;i++)
- {
- Uart_Send_Byte(FPM10A_Get_Img[i]);
- }
- }
- //講圖像轉換成特征碼存放在Buffer1中
- void FINGERPRINT_Cmd_Img_To_Buffer1(void)
- {
- unsigned char i;
- FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭
- for(i=0;i<7;i++) //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
- {
- Uart_Send_Byte(FPM10A_Img_To_Buffer1[i]);
- }
- }
- //搜索指紋庫前100枚(可以自己改DATA區的數字 最高999個)
- void FPM10A_Cmd_Search_Finger(void)
- {
- unsigned char i;
- FPM10A_Cmd_Send_Pack_Head(); //發送通信協議包頭
- for(i=0;i<11;i++)
- {
- Uart_Send_Byte(FPM10A_Search[i]); //接收指紋模塊發回的數據
- }
- }
- //搜索是否有指紋,若有則認證
- void FPM10A_Find_Fingerprint()
- {
- FPM10A_Cmd_Get_Img(); //發送獲得指紋圖像命令
- FPM10A_Receive_Data(12); //接收反饋數據緩沖
- if(FPM10A_RECEICE_BUFFER[9]==0&&pressed==1) //根據反饋回來的第9位數據來判斷模塊上有無指紋,有則繼續執行無則退出
- {
- FINGERPRINT_Cmd_Img_To_Buffer1(); //講圖像轉換成特征碼存放在Buffer1中
- FPM10A_Receive_Data(12);
- FPM10A_Cmd_Search_Finger(); //搜索全部用戶100枚
- FPM10A_Receive_Data(16);
- if(FPM10A_RECEICE_BUFFER[9] == 0) //如果搜索到有相應的指紋
- {
- kaisuo(); //開鎖
- //delay500ms();//延遲0.5s
- delay1s();
- wakeup=0;//模塊SOC斷電
- }
- else
- {
- wakeup=0;//模塊SOC斷電
- //delay100ms(); //延遲100ms,跳出
- }
- }
- else
- {
- wakeup=0;//模塊SOC斷電
- }
- }
- //////////////////////////////////////////////
- // 主程序 //
- //////////////////////////////////////////////
- void main()
- {
- //delay1s();//單片機上電,等待1s穩定
- Uart_Init(); //初始化串口
- led_work=0;
- zhen=0;
- fan=0;
- wakeup=0;
- pressed=0;
- test=1;
- check=1; //檢測位置干簧管
- led_work=1; //工作指示燈亮,提醒系統已經完成初始化 (測試為0)
- while(1)
- {
- if(pressed==1) //指紋模塊是被按下? 按下為1 否則為0
- {
- //Uart_Init();
- wakeup=1; //模塊SOC上電
- delay500ms();//延遲0.5s//等待SOC初始化完成
- Uart_Init(); //重新初始化串口
- FPM10A_Find_Fingerprint(); //查找,對比指紋
- }
- else
- {
- if(test==0) //測試開鎖
- {
- kaisuo(); //開鎖
- delay500ms();//延遲0.5s
- }
- else
- {
- delay100ms(); //指紋模塊沒被按下 延遲100ms
- }
- }
- }
- }
復制代碼
以上程序51hei提供下載:
指紋鎖.zip
(2.62 KB, 下載次數: 149)
2019-10-25 20:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|