找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2981|回复: 4
打印 上一主题 下一主题
收起左侧

电子密码锁设计

[复制链接]
跳转到指定楼层
楼主
ID:166437 发表于 2017-2-25 09:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.实验任务
根据设定好的密码,采用二个按键实现密码的输入功能,当密码输入正确之后,锁就打开,如果输入的三次的密码不正确,就锁定按键3秒钟,同时发现报警声,直到没有按键按下3种后,才打开按键锁定功能;否则在3秒钟内仍有按键按下,就重新锁定按键3秒时间并报警。
2.C语言源程序
#include <AT89X52.H>
  
unsigned char code ps[]={1,2,3,4,5};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
                         0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
unsigned char pslen=9;
unsigned char templen;
unsigned char digit;
unsigned char funcount;
unsigned char digitcount;
unsigned char psbuf[9];
bit cmpflag;
bit hibitflag;
bit errorflag;
bit rightflag;
unsigned int second3;
unsigned int aa;
unsigned int bb;
bit alarmflag;
bit exchangeflag;
unsigned int cc;
unsigned int dd;
bit okflag;
unsigned char oka;
unsigned char okb;
  
void main(void)
{
unsigned char i,j;
  
P2=dispcode[digitcount];
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
ET0=1;
EA=1;
  
while(1)
    {
     if(cmpflag==0)
       {
         if(P3_6==0) //function key
          {
              for(i=10;i>0;i--)
              for(j=248;j>0;j--);
              if(P3_6==0)
                {
                  if(hibitflag==0)         //按键是否被锁
                   {
                      funcount++;
if(funcount==pslen+2) //前面有按下功能键1次和按数字键1次,来完成密码长度的输入
{
                          funcount=0;
                          cmpflag=1;
                         }
                       P1=dispcode[funcount]; //可以由灯判断按键是否按下,
                   }
                    else
                      {
                         second3=0;
                      }
                  while(P3_6==0);
                }
          }
  
         if(P3_7==0) //digit key
          {
              for(i=10;i>0;i--)
              for(j=248;j>0;j--);
              if(P3_7==0)
                {
                  if(hibitflag==0)
                   {
                      digitcount++;                     
                      if(digitcount==10)
                        {
                          digitcount=0;
                        }
                      P2=dispcode[digitcount];
                      if(funcount==1)         //按下功能键后,开始输入密码长度
                        {
                          pslen=digitcount;
                          templen=pslen;
                        }
                        else if(funcount>1)    //开始记录各位密码
                          {
                           psbuf[funcount-2]=digitcount;
                          }
                   }
                    else
                      {
                        second3=0;
                      }
                  while(P3_7==0);
               }               
           }
     }  //原文少了这个“}
else //进行比较
          {
           cmpflag=0;
           for(i=0;i<pslen;i++)
             {
                if(ps!=psbuf)
                  {
hibitflag=1; //密码输入不正确,按键禁止功能被激活
                    i=pslen;
                    errorflag=1;
                    rightflag=0;
                    cmpflag=0;
                    second3=0;
                    goto a;
                  }
              }
           cc=0;
           errorflag=0;
           rightflag=1;
           hibitflag=0;
a:         cmpflag=0;
          }      
   }
}
  
void t0(void) interrupt 1 using 0
{
TH0=(65536-500)/256;
TL0=(65536-500)%256;
  
if((errorflag==1) && (rightflag==0))
    {
     bb++;
     if(bb==800)
       {
          bb=0;
         alarmflag=~alarmflag;
       }
     if(alarmflag==1)
       {
         P0_0=~P0_0;            //报警声
       }
  
     aa++;
      if(aa==800)
       {
         aa=0;
         P0_1=~P0_1; //LED2发光二极管闪
       }
     second3++;
     if(second3==6400) //4次后(8次变换),自动复位到按ENTER前的状态
       {
         second3=0;
         hibitflag=0;
         errorflag=0;
         rightflag=0;
         cmpflag=0;
         P0_1=1;
         alarmflag=0;
         bb=0;
          aa=0;
       }
    }
  
if((errorflag==0) && (rightflag==1)) //发出“叮咚”声
    {
     P0_1=0;               //LED2发光二极管亮
     cc++;
     if(cc<1000)
       {
         okflag=1;
       }
       else if(cc<2000)
         {
           okflag=0;
         }
         else             //自动复位到按ENTER前的状态
           {
              errorflag=0;
              rightflag=0;
              hibitflag=0;
              cmpflag=0;
              P0_1=1;            //LED2发光二极管灭
              cc=0;
              oka=0;
              okb=0;
              okflag=0;
              P0_0=1;
           }
     if(okflag==1)
       {
         oka++;
         if(oka==2)
           {
              oka=0;
              P0_0=~P0_0;
           }
       }
     else
         {
           okb++;
           if(okb==3)
              {
                okb=0;
                P0_0=~P0_0;
              }
         }
    }
}
                                                                                                                        
                              
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:185637 发表于 2017-4-2 18:32 | 只看该作者

 好东西  值得拥有
回复

使用道具 举报

板凳
ID:251766 发表于 2017-11-21 14:42 | 只看该作者
好东西哈,谢谢分享
回复

使用道具 举报

地板
ID:259267 发表于 2017-12-11 20:30 | 只看该作者
东西哈,谢谢分享
回复

使用道具 举报

5#
ID:264121 发表于 2017-12-20 10:44 | 只看该作者
kooklee 发表于 2017-4-2 18:32
**** 作者被禁止或删除 内容自动屏蔽 ****

来学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表