基于51单片机的多功能电子密码锁仿真图+完整程序.docx

上传人:b****4 文档编号:582722 上传时间:2022-10-11 格式:DOCX 页数:16 大小:121.88KB
下载 相关 举报
基于51单片机的多功能电子密码锁仿真图+完整程序.docx_第1页
第1页 / 共16页
基于51单片机的多功能电子密码锁仿真图+完整程序.docx_第2页
第2页 / 共16页
基于51单片机的多功能电子密码锁仿真图+完整程序.docx_第3页
第3页 / 共16页
基于51单片机的多功能电子密码锁仿真图+完整程序.docx_第4页
第4页 / 共16页
基于51单片机的多功能电子密码锁仿真图+完整程序.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

基于51单片机的多功能电子密码锁仿真图+完整程序.docx

《基于51单片机的多功能电子密码锁仿真图+完整程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机的多功能电子密码锁仿真图+完整程序.docx(16页珍藏版)》请在冰豆网上搜索。

基于51单片机的多功能电子密码锁仿真图+完整程序.docx

基于51单片机的多功能电子密码锁仿真图+完整程序

主要功能:

当输入密码时,只显示“*”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用绿色LED发光二极管亮一秒钟做为提示,;若密码不正确,禁止按键输入3秒,同时绿色发光二极管亮;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。

 

#include

#defineuintunsignedint

#defineucharunsignedchar

#defineKEYP3     //键盘输入端口

#defineNo_key20   //无按键时的返回值

#definelcddataP2  //1602的数据输入端口

sbit  lcden=P1^2;

sbit  lcdrs=P1^0;

sbit  lcdrw=P1^1;

sbit  light=P1^3;

sbit  light1=P1^4;

ucharj;//用来统计输入个数的全局变量

ucharaa;//用来在定时器中计数的全局变量

ucharcodetable[]="Hello!

";

ucharcodetable1[]="OK!

      ";

ucharcodetable2[]="Enterplease:

"  ;

ucharcodekey_table[16]=

     {

      1,2,3,10,

   4,5,6,11,

   7,8,9,12,

   0,13,14,15

     };

ucharpassword[]={2,0,1,0,9,3};  //设定初始密码

ucharsave[6];        //保存输入的数据

ucharconflag;                  //确认标志

ucharlockflag;     //锁键盘标志

ucharstartflag;    //开始标志

     

voiddelay(uintz);                       //延时子函数

voidwright_com(ucharcom);              //写指令函数

voidwright_data(uchardate);     //写数据函数

voidinit();                         //初始化

voiddisplay_OK();       //显示OK

voiddelete();       //删除输入的最后一个数

ucharkeyscan();     //带返回值的键盘扫描程序

voidenter_code(uchart);      //输入密码函数,把输入的数据存入数组中并在屏幕上显示相应的东西,

void  confirm();    //确认密码对不对,把输入的数据与密码逐一对比,完全一样刚正确,

void  succeed_an();   //输入密码成功时的响应,

void   fail_an();    //输入密码失败时响应

void   lockkey();   //锁键盘三秒

void   alarm();   //发出警报声

void  reset();     //复位函数

void  display_enter();   //显示输入

voidmain(void)

{

   uchartemp;

  init();   

while

(1)

  {

    

     if(lockflag)

     {

    temp=keyscan();  //锁键期间也要进行键盘扫描

    if(temp!

=No_key)//重新记时三秒         

        {

     aa=0;   //重新在定时器中计数

     }

      

   }

   else

     {

        temp=keyscan();  //反复扫描输入,等待随时输入  

     

     

     if(temp!

=No_key)//有按键按下才进行下面的操作

       {

         if(temp==10)

       {

       reset();

        startflag=1;//开始标志置位

       }

      if(startflag)

         {

            enter_code(temp);  //每扫描一次键盘就要进行一次处理,保存输入的数值

        

         if(temp==13)  //按下确认键盘就要进行密码确认

          {

             confirm();   //进行确认判断

            if(conflag)      //密码确认为正确

              {

           succeed_an();   //密码正确,作出相应的反应

           }

           else

            {

            fail_an();  //密码错误,作相应反应

            }

            }

        

         if(temp==14)

         {

         delete();    //作删除操作

         }

        }

          }

    }

    

}                   

}

/******显示enter********/

void  display_enter()

{

   ucharnum;

  wright_com(0x80);

for(num=0;num<13;num++)

  {

  wright_data(table2[num]);

  }

}

/******显示OK********/

voiddisplay_OK()

{

   ucharnum;

wright_com(0x80);

for(num=0;num<13;num++)

  {

    

    wright_data(table1[num]);

  }

}

/******删除最后一个********/

voiddelete()   

{

wright_com(0x80+0x40+j);  //确定删除对象

wright_data('');    //显示空格即为删除

save[--j]=0;     //删除后数据清零

wright_com(0x80+0x40+j);  //为下次输入数据时写好位置,必须是在最后一个后面

}

/******对各种变量进行复位********/

void  reset()

{

ucharnum;

display_enter();

wright_com(0x80+0x40);  //擦除屏幕上的显示

for(num=0;num<6;num++)

  {

  save[num]=0;  //对输入的数值进行清零

  wright_data('');//显示的是空格

  }

wright_com(0x80+0x40);  //下次再输入时可以又从起始位置输入

lockflag=0;     //各种变量要清零回起始状态

conflag=0;

j=0;

}

/******输入密码正确进行响应********/

voidsucceed_an()

{

  

light=0;  //灯亮

display_OK();//显示成功

delay(1000);

light=1;    //灯灭

}

/******输入密码错误进行响应********/

void   fail_an()

{

  alarm();

  lockkey();

}

/******发出警报声**********/

void   alarm()  //这个以后再扩展它   

{

}

/******锁键盘三秒************/

void   lockkey()     

{

lockflag=1;

}

/******输入密码并在屏幕上显示星号******/

voidenter_code(uchart)

{

if(t>=0&&t<10)

  {

     

   if(j==0)

    {

      wright_com(0x80+0x40);   //第一输入时要先写入地址指令,否则无法显示

          wright_data('*');

    }

    else       

       {

      wright_data('*');//不是第一个输入则不用再写地址

    }

        save[j++]=t;  //保存输入的数据

  }

}

/******校对密码以确定是不是正确的**********/

void  confirm()

{

uchark;

for(k=0;k<6;k++)

  {

  if(password[k]!

=save[k])   //对数组中的内容进行逐一比较,一旦有数据不对马上退出循环

    {

      break;

    }

  }

if(k==6)     //要是条件退出的话说明六个数全对密码

  {

    conflag=1;  //进行标志密码正确

  }

   

}

 

/******中断服务程序**********/

voidtimer0()interrupt  1

{

    

   TH0=(65536-50000)/256;

TL0=(65536-50000)%256;   //重装初值

if(lockflag)

  {

    aa++;

  light1=0;      

  if(aa>=60)   //三秒到了

  {

  aa=0;  //清零可以方便下次再使用

   light1=1;//关闭警报

   lockflag=0;//标志清零解除键锁,方便下次使用

   

  }

  }

}

/******初始化***********/

voidinit()

{

   ucharnum;

  /*****定时器初始化****/

   TMOD=1;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

ET0=1;

EA=1;//开启总中断

TR0=1;//把定时器关闭

 

/****1602初始化******/

lcdrw=0;    //这个必须要置零,否则无法正常显示

  lcden=0;

wright_com

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1