|
這是我之前做過的紅外指紋電子密碼鎖程序,采用12864液晶顯示.
0.png (54.23 KB, 下載次數(shù): 70)
下載附件
2017-5-9 02:33 上傳
單片機(jī)源程序:
- #include <reg52.h>
- #include <intrins.h>
- #include"24C0x.h"
- #include"LCD12864.h"
- #define uchar unsigned char
- #define uint unsigned int
-
- #define buffer1ID 0x01
- #define buffer2ID 0x02
- #define queren 0x88
- #define tuichu 0x86
- #define shanchu 0x84
- #define User 1
- void fan();
-
- sbit B0=B^0;
- sbit B7=B^7;
- sbit k2=P3^7;
- sbit jidianqi=P3^6;
- sbit Feng=P2^0;
-
- extern unsigned char times[];
- uchar Member=1,sec;
- uchar ErrorCount;
- //////////////////////////紅外相關(guān)//////////////////////////
- //時(shí)間計(jì)算
- #define Imax 14000 //此處為晶振為11.0592時(shí)的取值,
- #define Imin 8000 //如用其它頻率的晶振時(shí),
- #define Inum1 1450 //要改變相應(yīng)的取值。
- #define Inum2 7000
- #define Inum3 3000
- //解碼變量
- unsigned char Im[4]={0x00,0x00,0x00,0x00};
- //全局變量
- uchar f;
- unsigned long m,Tc;
- unsigned char IrOK;
- //////////////////////////紅外相關(guān)//////////////////////////
- uchar code buffer[User][6]=
- {
- {"000000"}
- };
-
-
- uchar dz[4];
- uchar time[4];
- uchar mima[6];
- uchar mimag[6];
- uchar mimaID[6]={1,2,3,4,5,6};
- uchar Address1=20,tempx=20;
- uchar Address2=20;
-
- uchar data K;
- uchar data Key;
-
- uint PageID;
- uchar data querenma=11;
- uchar sum[2];
- int summaf,summas;
- uchar xdata UserPassword[7]={0};//密碼
- uchar xdata DSY_BUFFER[16] ={0};//緩存
- void Red_Init(void);
- #include "zhiwen.h"
- //檢測(cè)脈沖寬度
- unsigned char check(void);
- unsigned char redchange(unsigned char rednum);
-
- void delayms(unsigned int z)
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /********************************************************************
- * 名稱 : Chack(uchar User_Number)
- * 功能 : 單一用戶密碼檢測(cè)
- * 輸入 : User_Number
- * 輸出 : 密碼正確與錯(cuò)誤,錯(cuò)誤返回0,正確返回1
- ********************************************************************/
- uchar Chack(uchar User_Number)
- {
- uchar flag, i,temp[6],Address;
- Address=User_Number*10;
- for(i=0;i<6;i++)
- {
- temp[i]=x24c02_read(Address);
- delayms(10);
- Address++;
- }
- for(i=0;i<6;i++)
- {
- if(temp[i]==UserPassword[i])
- flag=1;
- else
- flag=0;
- }
- return flag;
- }
- /********************************************************************
- * 名稱 : PassWord_Chack()
- * 功能 : 所有用戶密碼檢測(cè)
- * 輸入 : 無
- * 輸出 : 密碼正確與錯(cuò)誤,錯(cuò)誤返回0,正確返回1
- ********************************************************************/
- uchar PassWord_Chack()
- {
- uchar i=0;
- while(i<User)
- {
- if(Chack(i)==1)
- {
- Member=i+1;
- return 1;
- }
- i++;
- }
- return 0;
- }
-
- void delay(uchar tt)
- { uchar i;
- while(tt--)
- {
- for(i=0;i<125;i++);
- }
- }
- /********************************************************************
- * 名稱 : UART_Init()
- * 功能 : 單片機(jī)串口初始化
- * 單片機(jī):晶振11.0592MHz 波特率為9600bps
- * 指紋模塊:波特率為9600bps,
- ********************************************************************/
- void UART_Init()
- {
- SCON= 0x50; //串口方式1 //REN=1; 允許接收
- PCON=0x00; //SMOD=0
- IT1=1;
- EX1=1;
- TH0=0;
- TL0=0;
- TR0=0;
- TMOD= 0x21; //定時(shí)器1定時(shí)方式2
- TH1= 0xFD; //11.0592MHz 模塊默認(rèn)波特率為9600bps
- TL1= 0xFD;
- TR1= 1; //啟動(dòng)定時(shí)器
- EA=1;
- }
-
- unsigned char Keycan(void) //按鍵掃描程序 P1.0--P1.3為行線 P1.4--P1.7為列線
- {
- unsigned char rcode, ccode;
- P1 = 0x0f; // 發(fā)全0行掃描碼,列線輸入
- if((P1&0x0f) != 0x0f) // 若有鍵按下
- {
- delay(1);// 延時(shí)去抖動(dòng)
- if((P1&0x0f) != 0x0f)
- { rcode = 0xFE; // 逐行掃描初值
- while((rcode&0x10) != 0)
- {
- P1 = rcode; // 輸出行掃描碼
- if((P1&0x0f) != 0x0f) // 本行有鍵按下
- {
- ccode = (P1&0x0f)|0x0f;
- //do{;}
- while((P1&0x0f) != 0x0f); //等待鍵釋放
- Feng=0;
- delay(100);
- Feng=1;
- return ((~rcode) + (~ccode)); // 返回鍵編碼
- }
- else
- rcode = (rcode<<1)|0x01; // 行掃描碼左移一位
- }
- }
- }
- if(IrOK==1)
- {
- IrOK=0;
- Feng=0;
- delay(100);
- Feng=1;
- switch (Im[2])
- {
- case 0x16: return 0x28;break; //0
- case 0x0c: return 0x11;break; //1
- case 0x18: return 0x71;break; //2
- case 0x5e: return 0x41;break; //3
- case 0x08: return 0x12;break; //4
- case 0x1c: return 0x22;break; //5
- case 0x5a: return 0x42;break; //6
- case 0x42: return 0x14;break; //7
- case 0x52: return 0x24;break; //8
- case 0x4a: return 0x44;break; //9
- case 0x47: return 0x81;break; //a
- case 0x43: return 0x82;break; //b
- case 0x0d: return 0x74;break; //c
- case 0x15: return 0x88;break; //d
- case 0x19: return 0x48;break;
- }
- }
- return 0; // 無鍵按下,返回值為0
- }
-
- void KeyDeal(unsigned char Key)
- { //unsigned char n;
- if(Key!=0)
- {
-
- switch(Key)
- {
- case 0x11: K=1; break;
- case 0x21: K=2; break;
- case 0x71: K=3; break;
- case 0x81: break;
- case 0x12: K=4; break;
- case 0x22: K=5; break;
- case 0x42: K=6; break;
- case 0x82: K=34;break;
- case 0x14: K=7; break;
- case 0x24: K=8; break;
- case 0x44: K=9; break;
- case 0x74: break;
- case 0x18: break;
- case 0x28: K=0; break;
- case 0x48: K=11; break;
- case 0x88: break;
- default: break;
- }
- }
- }
-
-
- void shuazhiwen()
- {
- uchar IDs1,IDs2,IDs3;
- LcmClearTXT();
- PutStr(1,1,"請(qǐng)按手指開鎖");
- SFG_identify();
- while(querenma==2)
- SFG_identify();
- if(querenma==0)
- {
- LcmClearTXT();
- PutStr(1,2,"門已打開");
- IDs1=PageID/100;
- IDs2=PageID/10%10;
- IDs3=PageID%10;
- PutStr(2,1,"編號(hào)為:");
- WriteCommand(0x8D); //指定第三行顯示位置
- WriteData(0x30+IDs1);
- WriteData(0x30+IDs2);
- WriteData(0x30+IDs3);
- ErrorCount=0;
- Feng=1;
- jidianqi=0;
- delay(2500);
- jidianqi=1;
-
- }
- else if(querenma==9)
- {
- LcmClearTXT();
- PutStr(1,1,"沒搜索到指紋");
- PutStr(2,1,"請(qǐng)重新按手指");
- ErrorCount=3;
- Feng=0;
- }
- else
- {
- LcmClearTXT();
- PutStr(1,1,"接收包出錯(cuò)");
- }
- delay(2000);
- // while(Keycan()==0);
- }
- void addfinger()
- {
- uchar IDa1,IDa2,IDa3;
- LcmClearTXT();
- PutStr(1,2,"請(qǐng)按手指");
- SFG_getimage();
- while(querenma!=0)
- SFG_getimage();
- SFG_genchar(buffer1ID);
- UART_Init();
- SFG_fastsearch(buffer1ID);
- while(querenma==1)
- SFG_fastsearch(buffer1ID);
-
- if(querenma==0)
- {
- LcmClearTXT();
- PutStr(1,1,"該指紋已存儲(chǔ)");
- PutStr(3,0," 按任意鍵繼續(xù)");
- while(Keycan()==0);
- }
- else if(querenma==9)
- {
- LcmClearTXT();
- PutStr(1,1,"請(qǐng)?jiān)俅伟词种?quot;);
- SFG_enroll();
- while(querenma==2)
- SFG_enroll();
- LcmClearTXT();
- if(querenma==0)
- {
- IDa1=PageID/100;IDa2=PageID/10%10;IDa3=PageID%10;
- PutStr(1,1,"指紋采集成功");
- PutStr(2,1,"編號(hào)為:");
- WriteCommand(0x8D);
- WriteData(0x30+IDa1);WriteData(0x30+IDa2);WriteData(0x30+IDa3);
- }
- else if(querenma!=0)
- {
-
- PutStr(1,1,"指紋采集失敗");
- PutStr(2,1,"請(qǐng)重新操作");
- }
- PutStr(3,0," 按任意鍵繼續(xù)");
- while(Keycan()==0);
- }
- LcmClearTXT();
- PutStr(0,0,"按鍵1 : 增加指紋");
- PutStr(1,0,"按鍵2 : 刪去指紋");
- PutStr(2,0,"按鍵3 : 手動(dòng)開鎖");
- PutStr(3,0,"按鍵4 : 修改密碼");
- }
- void deletfinger()
- {
- uchar i,j=0;
- LcmClearTXT();
- PutStr(1,0,"輸入刪去的指紋號(hào)");
- for(i=0;i<5;i++)dz[i]=0;
- Key=Keycan();
- while(Key!=queren)
- {
- Key=Keycan();
- KeyDeal(Key);
- delay(30); //按鍵有抖動(dòng)@@@
- if(Key==0)K=10;
- if((K>=0)&&(K<=9))
- {
- dz[j]=K;
- if(j<3)
- {
- WriteCommand(0x88+j); //指定第三行顯示位置
- WriteData(0x30+dz[j]);
- }
- ++j;
- if(j==4)
- j=3; //@@#yinhuang
- } //顯示LCD12864并行顯示
- if(K==34) //按了刪除鍵
- {
- if(j==0)
- {
- WriteCommand(0x88); //指定第三行顯示位置
- WriteData(0x20);
- }
- else
- {
- --j;
- WriteCommand(0x88+j); //指定第三行顯示位置
- WriteData(0x20);
- }
- }
- }
- if(j>=2)
- PageID=dz[2]+dz[1]*10+dz[0]*100;
- if(j==1)
- PageID=dz[1]+dz[0]*10;
- if(j==0)
- PageID=dz[0];
- SFG_deletchar(PageID);
- if(querenma==0)
- {
- LcmClearTXT();
- PutStr(1,1,"刪去指紋號(hào)成功!");
- }
- else
- {
- LcmClearTXT();
- PutStr(1,2,"刪去指紋號(hào)失敗!");
- }
- PutStr(2,0," 按任意鍵繼續(xù)");
- while(Keycan()==0);
- LcmClearTXT();
- PutStr(0,0,"按鍵1 : 增加指紋");
- PutStr(1,0,"按鍵2 : 刪去指紋");
- PutStr(2,0,"按鍵3 : 手動(dòng)開鎖");
- PutStr(3,0,"按鍵4 : 修改密碼");
- }
-
- void gaimima()
- {
- uchar i,j=0,mima1[6],mima2[6];
- uchar k,temp;
- LcmClearTXT();
- PutStr(1,1,"請(qǐng)輸入新密碼");
- for(i=0;i<6;i++)mima1[i]=0;
- Key=Keycan();
- while(Key!=queren)
- {
- Key=Keycan();
- KeyDeal(Key);
- delay(30);
- if(Key==0)K=10;
- if((K>=0)&&(K<=9))
- {
- mima1[j]=K;
- if(j<6)
- {
- WriteCommand(0x89+j); //指定第三行顯示位置
- WriteData(0x0f);
- }
- ++j;
- if(j==7)
- j=6; //@@#yinhuang
- } //顯示LCD12864并行顯示
- if(K==34) //按了刪除鍵
- {
- if(j==0)
- {
- WriteCommand(0x89); //指定第三行顯示位置
- WriteData(0x20);
- }
- else
- {
- --j;
- WriteCommand(0x89+j); //指定第三行顯示位置
- WriteData(0x20);
- }
- }
- }
- LcmClearTXT();
- LcmClearTXT();
- j=0;
- PutStr(1,0,"請(qǐng)?jiān)俅屋斎胄旅艽a");
- for(i=0;i<6;i++)mima2[i]=0;
- Key=Keycan();
- while(Key!=queren)
- {
- Key=Keycan();
- KeyDeal(Key);
- delay(30);
- if(Key==0)K=10;
- if((K>=0)&&(K<=9))
- {
- mima2[j]=K;
- if(j<6)
- {
- WriteCommand(0x89+j); //指定第三行顯示位置
- WriteData(0x0f);
- }
- ++j;
- if(j==7)
- j=6; //@@#yinhuang
- } //顯示LCD12864并行顯示
- if(K==34) //按了刪除鍵
- {
- if(j==0)
- {
- WriteCommand(0x89); //指定第三行顯示位置
- WriteData(0x20);
- }
- else
- {
- --j;
- WriteCommand(0x89+j); //指定第三行顯示位置
- WriteData(0x20);
- }
- }
- }
- LcmClearTXT();
- if((mima1[0]==mima2[0])&&(mima1[1]==mima2[1])&&(mima1[2]==mima2[2])&&(mima1[3]==mima2[3])&&(mima1[4]==mima2[4])&&(mima1[5]==mima2[5]))
- {
- for(i=0;i<6;i++)
- mimaID[i]=mima1[i];
- /////////////////////////////////////////////////////
- for(i=0;i<6;i++) //密碼限制在6位以內(nèi)
- {
- UserPassword[i]=mima1[i]+0x30;
- }
- temp=(Member-1)*10;
- delayms(5);
- for(k=0;k<6;k++)
- {
- x24c02_write(temp,UserPassword[k]);
- delayms(10);
- temp++;
- }
- //////////////////////////////////////////////////////
- PutStr(0,1,"密碼修改成功");
- PutStr(3,0," 按任意鍵繼續(xù)");
- ErrorCount=0;
- while(Keycan()==0);
- }
- else
- {
- PutStr(0,0," 密碼修改失敗 ");
- PutStr(1,0,"兩次輸入的密碼不");
- PutStr(2,0,"一致,請(qǐng)重新操作");
- PutStr(3,0," 按任意鍵繼續(xù)");
- while(Keycan()==0);
- }
- LcmClearTXT();
- PutStr(0,0,"按鍵1 : 增加指紋");
- PutStr(1,0,"按鍵2 : 刪去指紋");
- PutStr(2,0,"按鍵3 : 手動(dòng)開鎖");
- PutStr(3,0,"按鍵4 : 修改密碼");
- }
- void zhu()
- {
- LcmClearTXT();
- PutStr(1,2,"門已打開");
- jidianqi=0;
- delay(2500);
- jidianqi=1;
- PutStr(3,0," 按任意鍵繼續(xù)");
- while(Keycan()==0);
- PutStr(0,0,"按鍵1 : 增加指紋");
- PutStr(1,0,"按鍵2 : 刪去指紋");
- PutStr(2,0,"按鍵3 : 手動(dòng)開鎖");
- PutStr(3,0,"按鍵4 : 修改密碼");
- }
- void guanliyuan()
- {
- uchar i,j=0,x=1;
- uchar Right_flag;
- LcmClearTXT();
- PutStr(1,1,"請(qǐng)輸入密碼:");
- for(i=0;i<6;i++)mima[i]=0;
- Key=Keycan();
- while(Key!=queren)
- {
- Key=Keycan();
- KeyDeal(Key);
- delay(30);
- if(Key==0)K=10;
- if((K>=0)&&(K<=9))
- {
- mima[j]=K;
- if(j<6)
- {
- WriteCommand(0x89+j); //指定第三行顯示位置
- WriteData(0x0f);
- }
- ++j;
- if(j==7)
- j=6;
- } //顯示LCD12864并行顯示
- if(K==34) //按了刪除鍵
- {
- if(j==0)
- {
- WriteCommand(0x89); //指定第三行顯示位置
- WriteData(0x20);
- }
- else
- {
- --j;
- WriteCommand(0x89+j); //指定第三行顯示位置
- WriteData(0x20);
- }
- }
- }
- LcmClearTXT();
- for(i=0;i<6;i++)
- {
- UserPassword[i]=mima[i]+0x30;
-
- }
- if(j==6)
- {
- if(mima[0]==1&&mima[1]==3&&mima[2]==1&&mima[3]==4&&mima[4]==2&&mima[5]==0)
- Right_flag=1;
- else
- Right_flag=0;
- }
- if (Right_flag==1)
- {
- Right_flag=0;
-
- for(i=0;i<6;i++)mima[i]=0;
- PutStr(0,0,"按鍵1 : 增加指紋");
- PutStr(1,0,"按鍵2 : 刪去指紋");
- PutStr(2,0,"按鍵3 : 手動(dòng)開鎖");
- PutStr(3,0,"按鍵4 : 修改密碼");
- while(i!=tuichu)
- {
- i=Keycan();
-
- KeyDeal(i);
- switch(K)
- {
- case 1: addfinger();K=6; break;
- case 2: deletfinger(); break;
- case 3: zhu(); K=8; break;
- case 4: gaimima(); break;
- default: break;
- }
- }
- }
- else
- {
- PutStr(1,2,"密碼錯(cuò)誤");
- PutStr(2,0," 請(qǐng)重新操作!");
- PutStr(3,0," 按任意鍵繼續(xù)");
- while(Keycan()==0);
- PutStr(0,0,"按鍵1 : 增加指紋");
- PutStr(1,0,"按鍵2 : 刪去指紋");
- PutStr(2,0,"按鍵3 : 手動(dòng)開鎖");
- PutStr(3,0,"按鍵4 : 修改密碼");
- }
- Key=0;
-
- }
- void mimakaisuo()
- {
- uchar i,j=0,x=1;
- uchar Right_flag;
- LcmClearTXT();
- PutStr(1,0,"請(qǐng)輸入密碼開鎖:");
- for(i=0;i<6;i++)mima[i]=0;
- Key=Keycan();
- while(Key!=queren)
- {
- Key=Keycan();
- KeyDeal(Key);
- delay(30);
- if(Key==0)K=10;
- if((K>=0)&&(K<=9))
- {
- mima[j]=K;
- if(j<6)
- {
- WriteCommand(0x89+j); //指定第三行顯示位置
- WriteData(0x0f);
- }
- ++j;
- if(j==7)
- j=6;
- } //顯示LCD12864并行顯示
- if(K==34) //按了刪除鍵
- {
- if(j==0)
- {
- WriteCommand(0x89); //指定第三行顯示位置
- WriteData(0x20);
- }
- else
- {
- --j;
- WriteCommand(0x89+j); //指定第三行顯示位置
- WriteData(0x20);
- }
- }
- }
- LcmClearTXT();
- for(i=0;i<6;i++)
- {
- UserPassword[i]=mima[i]+0x30;
-
- }
- if(j==6){Right_flag=PassWord_Chack(); }
- if (Right_flag==1&&ErrorCount<3)
- {
- Right_flag=0;
- zhu();ErrorCount=0;
- Feng=1;
- for(i=0;i<6;i++)mima[i]=0;
- }
- else
- {
- if(ErrorCount<3)
- ErrorCount++;
- if(ErrorCount==3)
- Feng=0;
-
- PutStr(1,2,"密碼錯(cuò)誤");
- PutStr(2,0," 還有 次機(jī)會(huì)");
- PutStr(3,0," 按任意鍵繼續(xù)");
- WriteCommand(0x8a);
- WriteData(' ');
- WriteData(3-ErrorCount+0x30);
-
- delay(1000);
-
- }
- Key=0;
- LcmClearTXT();
- }
- void fan()
- {
- // PutStr(1,2,"請(qǐng)先按鍵");
- // PutStr(2,2,"再刷指紋");
- if(Key!=0x81) //管理員操作
- {
- PutStr(0,2,"歡迎使用");
- PutStr(1,0,"指紋密碼門禁系統(tǒng)");
- PutStr(2,0,"密碼開鎖請(qǐng)按 C鍵");
- PutStr(3,1,"請(qǐng)按手指開鎖");
- }
- Key=Keycan();
- if(k2==1) //指紋刷機(jī)
- {
- LcmClearTXT();
- shuazhiwen();
- LcmClearTXT();
- }
- if(Key==0x81) //管理員操作
- {
- LcmClearTXT();
- guanliyuan();
- LcmClearTXT();
- }
- if(Key==0x84&&ErrorCount<3) //密碼開鎖
- {
- LcmClearTXT();
- mimakaisuo();
- LcmClearTXT();
- }
- }
-
- void main()
- {
- //PSB=0;
- UART_Init(); //串口初始化
- x24c02_init(); //24C02初始化
- LcmInit(); //LCD12864初始化
- LcmClearTXT(); //LCD12864清屏
- while(1)
- {
- fan();
- delay(100);
- }
- }
- //外部中斷解碼程序_外部中斷1
- void intersvr1(void) interrupt 2
- {
- TR0=1;
- Tc=TL0*256+TH0;//提取中斷時(shí)間間隔時(shí)長
- TH0=0;
- TL0=0; //定時(shí)中斷重新置零
- if((Tc>Imin)&&(Tc<Imax))
- {
- m=0;
- f=1;
- return;
- } //找到啟始碼
- if(f==1)
- {
- if(Tc>Inum1&&Tc<Inum3)
- {
- Im[m/8]=Im[m/8]>>1|0x80; m++;
- }
- if(Tc>Inum2&&Tc<Inum1)
- {
- Im[m/8]=Im[m/8]>>1; m++; //取碼
- }
- if(m==32)
- {
- m=0;
- f=0;
- if(Im[2]==~Im[3])
- {
- IrOK=1;
- TR0=0;
- }
- else IrOK=0; //取碼完成后判斷讀碼是否正確
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
下載:
1-程序串行.zip
(253.88 KB, 下載次數(shù): 137)
2017-5-8 09:24 上傳
點(diǎn)擊文件名下載附件
這是我之前做的基于51單片機(jī)的紅外指紋電子密碼鎖程序 下載積分: 黑幣 -5
|
|