bbxyliyang01 发表于 2023-7-27 06:53:28

单片机指纹密码锁12864


一、系统方案 随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的喜爱。锁是置于可启闭的器物上,用以关住某个确定的空间范围或某种器具的,必须以钥匙或暗码打开的扣件。锁具发展到现在已有若干年的历史了,人们对它的结构、机理也研究得很透彻,因此,不用钥匙就能打开的方法和工具也层出不穷。现代人类文明社会里,由于社会中各种矛盾冲突十分剧烈,人们的思想道德观念,价值观念,文化修养水平等差异,群众中良莠不齐,善良的人们能够自觉规范自已的行为,“非礼不为”,虽无钥匙亦不会乱闯。然而,那些毫无道德观念的盗贼却想方设法利用高科技手段撬门开锁,使广大居民防不胜防。为什么会出现这种情况呢?因为传统锁具都存在致命的弱点:
  第一、 锁芯采用常见的铜、铝、锌等材料,抵抗不了强力破坏;
  第二、 锁具制作工艺,技术落后,无法阻止技术手段的开启。
  目前,市场上很多国内外的锁具,实际上都不具备真正的防盗功能。在惯偷面前,两根钢丝或几件简单的工具就可以把这些锁打开,有的惯偷甚至公开扬言:“没有我打不开的锁。”其实,不是他们多高明,而是一般锁具技术原理太过简单。面对这一残酷的现状,新时代提出了锁具必须革命的迫切的要求。(1).如何通过指纹识别模块对指纹的采集,识别,存储。(2).如何控制LCD12864显示需要显示的内容。(3).如何控制AT24C02进行存储信息。(4).设计程序算法正确的读取矩阵键盘,获取所按下的按键位置。
二、硬件设计原理图如下: 三、单片机软件设计1、首先是系统初始化:/*********************************************************函数名称:void T2_init()函数作用:定时器2初始化函数参数说明:*********************************************************/void T2_init(){        RCAP2H=(65536-50000)/256;         RCAP2L=(65536-50000)%256;//自动重装         TH2=RCAP2H;         TL2=RCAP2L;            //定时器2赋初值         EA=1;                  //开总中断        ET2=1;                   //定时器T2中断允许              TR2=0;                                   //关闭定时器2} 2、中断服务程序/*********************************************************函数名称:void T2_interrupt(void) interrupt 5函数作用:定时器2中断处理函数参数说明:定时50MS中断一次*********************************************************/void T2_interrupt(void) interrupt 5{        TF2=0; //清除定时器2溢出标志位               T2_num++;           //计数变量+1        if(T2_num==200)//200*50ms=10S定时完成        {                T2_num=0;//清0计数变量                jdq=1;           //关闭继电器,电磁锁关闭                TR2=0;           //定时器关闭        } }3、按键检测程序#include<reg52.h>#define uchar unsigned char#define uint unsigned int /*****************矩阵键盘引脚定义*******************/#define Key P1 bit key_f;//有按键按下标志/*****************矩阵键盘函数声明*******************/uchar jiema(unsigned char key);        //解码函数,输入按键编码,返回按键位置voidkey_delay();                                //延时函数uchar keycan(void);                                //按键查询函数,返回矩阵键盘位置/********************************************************函数名称:uchar jiema(unsigned char key)函数作用:转换按键码为1~16的数字参数说明:返回按下的按键位置*******************************************************/uchar jiema(uchar key){   uchar n;   switch(key)   {           case 0x11: n= 13; break;           case 0x21: n= 0; break;           case 0x41: n= 14; break;           case 0x81: n= 15; break;           case 0x12: n= 7; break;           case 0x22: n= 8; break;           case 0x42: n= 9; break;           case 0x82: n= 12; break;           case 0x14: n= 4; break;           case 0x24: n= 5; break;           case 0x44: n= 6; break;           case 0x84: n= 11; break;           case 0x18: n= 1; break;           case 0x28: n= 2; break;           case 0x48: n= 3; break;           case 0x88: n= 10; break;           default: break;   }   key_f=1;   return n;} /********************************************************函数名称:void key_delay()函数作用:延时函数参数说明:********************************************************/void key_delay()                   //延时子程序{        uchar n, m;        for (n = 100; n > 0; n--)                for (m = 300; m > 0; m--);    } /********************************************************函数名称:uchar keycan(void)函数作用:进行按键扫描参数说明:返回按键值,=0时表示没有按键按下********************************************************/ uchar keycan(void){        uchar rcode, ccode;        Key = 0xF0;      // 发全0行扫描码,列线输入        if((Key&0xF0) != 0xF0) // 若有键按下        {                key_delay();// 延时去抖动                 if((Key&0xF0) != 0xF0)                {                        rcode = 0xFE;         // 逐行扫描初值                  while((rcode&0x10) != 0)                  {                        Key = rcode;         // 输出行扫描码                          if((Key&0xF0) != 0xF0) // 本行有键按下                          {                                     ccode = (Key&0xF0)|0x0F;                                     do{;}                                           while((Key&0xF0) != 0xF0); //等待键释放                                     return jiema((~rcode) + (~ccode)); // 返回键编码                          }                          else                                  rcode = (rcode<<1)|0x01; // 行扫描码左移一位                        }                }        }        return 0; // 无键按下,返回值为0}4、核心算法程序while(1)        {                i++;                a=keycan();                   //矩阵键盘检测                chuli();                   //矩阵键盘处理                                if(mode==1)                        display_guanli();                  //显示管理界面                else                        if(mode==2)                                  //录入指纹                        {                                if(zhiwen_f==1)                                        cunchu();                  //录入指纹                        }                        else                                if(mode==3)                          //注销指纹                                {                                        if(zhiwen_f==1)                                                shanchu();          //注销指纹                                                }                                else                                                                        if(mode==0&&in_f==0)//正常解锁界面                                        {                                                if(i>=150)                                                {                                                        i=0;                                                        xunzhiwen();//指纹解锁                                                }                                        }        }四、proteus仿真设计Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
页: [1]
查看完整版本: 单片机指纹密码锁12864