基于单片机的电子密码锁的实现

要求:用单片机实现一个电子密码锁的功能,一开始设置密码,设置从0-f,任意多少位密码(只要不超过十位),设置成功,蜂鸣器响一下;接着是验证密码,如果输入错误三次,则暂停一段时间,不允许使用,如果输入成功(F键确认),则密码解锁,步进电机转动,如果按下E键,则停止转动。

连线:P0键盘,P2倒着接数码管,P3.0接蜂鸣器,P1接步进电机

/*****************************键盘码的顺序**********************************/
/*                        0xee,0xde,0xbe,0x7e    0-3                     */
/*                        0xed,0xdd,0xbd,0x7d    4-7                     */
/*                        0xeb,0xdb,0xbb,0x7b    8-b                     */
/*                        0xe7,0xd7,0xb7,0x77    c-f                     */
/*                  密码输入0-d;e,f 作为保留,f暂时用作确认                 */
/*                  连线:P0接键盘, P2接数码管(p2.7接H)                    */
/*************************************************************************/

#include<reg51.h>
#define uchar unsigned char
#define uint  unsigned int

sbit P30=P3^0;
uint a;
uint fre;//控制频率
uint flag;
uint time=0;  //控制中断时间
uchar count=0;//控制多少秒
uint t;
uint ff=0; //判断是否验证成功
uint fff=3;//判断用户输入次数
uint kaiguan=0;//判断电机是否开关的

/***********************步进电机****************************/
void delay(unsigned int t);
unsigned char code RUN[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};  //步进电机相序表
//步进电机驱动
void  motor_ffw()
 {
     if(kaiguan==1)
    { 
       unsigned char i;
      
          for (i=0; i<8; i++)       //一个周期转3.75*8=30度
            {
              P1 = RUN[i]&0x1f;     //取数据
              delay(15);             //调节转速
            }
        }
 }
/***********************************************************/

//八段管显示码
code unsigned char LEDMAP[]={
    ~0x3f, ~0x06, ~0x5b, ~0x4f, ~0x66, ~0x6d, ~0x7d, ~0x07,
    ~0x7f, ~0x6f, ~0x77, ~0x7c, ~0x39, ~0x5e, ~0x79, ~0x71
};
uchar key;//键盘返回的一个码
uint i=0;//i用作数组循环
//存放初始密码
unsigned char mima[10]={0};
//存放缓冲密码
unsigned char shuru[10];
//存放整形数组
uint shuruz[10];
uint kaiguanz[10];//保存开关的
//延时函数
void delay(uint i)//延时函数
{
    uint j=0;
    while(i--)
    {
        for (j;j<100;j++){}
    }
}
//键盘扫描
uchar keyscan()//键盘扫描函数,返回一个键盘码
{
    uchar cord_h,cord_l;//行列值
    P0=0x0f;            //行线输出全为0
    cord_h=P0&0x0f;     //读入列线值
    if(cord_h!=0x0f)    //先检测有无按键按下
    {
        delay(100);        //去抖
        cord_h=P0&0x0f;    //读入列线值      
        if(cord_h!=0x0f)
        {
            P0=cord_h|0xf0;  //输出当前列线值
            cord_l=P0&0xf0;  //读入行线值
            return(cord_h+cord_l);//键盘最后组合码值
        }
    }return(0xff);     //返回该值
}
//将键盘码转化成0-f存放到缓冲区数组中
void inputBuf(uchar shuru[10])
{
    key=keyscan();//调用一次扫描键盘函数,获取返回的一个键码
    delay(500); //延时去抖动
    switch(key)
    {
        case 0xee://0
        {
            i=i%10;
            shuru[i]='0';
            shuruz[i]=0;
            P2=LEDMAP[shuruz[i]];
            delay(30000);
            i++;
            break;
        }
        case 0xde://1
        {
            i=i%10;
            shuru[i]='1';
            shuruz[i]=1;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break;
        }
        case 0xbe://2
        {
            i=i%10;
            shuru[i]='2';
            shuruz[i]=2;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break;
        }
        case 0x7e://3
        {
            i=i%10;
            shuru[i]='3';
            shuruz[i]=3;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break;
        }
        case 0xed://4
        {
            i=i%10;
            shuru[i]='4';
            shuruz[i]=4;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break;
        }
        case 0xdd://5
        {
            i=i%10;
            shuru[i]='5';
            shuruz[i]=5;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break;
        }
        case 0xbd://6
        {
            i=i%10;
            shuru[i]='6';
            shuruz[i]=6;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break;
        }
        case 0x7d://7
        {
            i=i%10;
            shuru[i]='7';
            shuruz[i]=7;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break;
        }
        case 0xeb://8
        {
            i=i%10;
            shuru[i]='8';
            shuruz[i]=8;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break;
        }
        case 0xdb://9
        {
            i=i%10;
            shuru[i]='9';
            shuruz[i]=9;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break;
        }
        case 0xbb://a
        {
            i=i%10;
            shuru[i]='a';
            shuruz[i]=10;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break;
        }
        case 0x7b://b
        {
            i=i%10;
            shuru[i]='b';
            shuruz[i]=11;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break;
        }
        case 0xe7://c
        {
            i=i%10;
            shuru[i]='c';
            shuruz[i]=12;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break;
        }
        case 0xd7://d
        {
            i=i%10;
            shuru[i]='d';
            shuruz[i]=13;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break;
        }
        case 0xb7://e
        {
            i=i%10;
            shuru[i]='e';
            shuruz[i]=14;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break;
        }
        case 0x77://f
        {
            i=i%10;
            shuru[i]='f';
            shuruz[i]=15;
            P2=LEDMAP[shuruz[i]];
            delay(20000);
            i++;
            break; //密码都是以f结尾的
        }
    }
}

 //蜂鸣器响
 void beep(uint t)
 {
     time=0;
      for(time;time<t;time++)
   {
           P30=1;
        delay(100);
        P30=0;
        delay(100);
   }
 }
//密码输入错误报警
void cuowubaojin()
{
     uint k=3;
    uint i;
    while(k--)
    {
        i=50;
        while(i--)
        {
        P30=1;
        delay(200);
        P30=0;
        delay(200);
        }
        i=50;
        while(i--)
            delay(400);
    }
}

  //检查密码成功电机转动
 void chenggongzhuandong()
 {

    //j=0;
    while(1)
    {
      kaiguan=1;//打开电机
      inputBuf(kaiguanz);  //监听键盘
      if(key==0xb7)
      {
           kaiguan=0;//关闭电动机
        delay(10);
        P2=0xff;//关闭数码管显示
        delay(10);
        break;
      }
      motor_ffw(); //调用旋转处理函数
      delay(20);
     }
 }

//主函数
void main()
{
    uint j=0,n=3;     //i用于输入密码的次数
    P2=0xff;
///////////设置密码,保存在mima[10]数组中/////////////////////////////////////////
    while (1)
    {
        inputBuf(mima);
        if(key==0x77)
        {
            P2=0xff;
             break;
        }
    }
    //设置成功蜂鸣器响一下
    j=0;

    for(j;j<5;j++)
    {
       beep(8);
    }
    
////////////验证密码,保存在shuru[10]中/////////////////////////////////////////////    

    i=0;//从头开始输入
    
    //密码验证,错误不能超过三次
    while(1)
    {
         inputBuf(shuru);
        if(key==0x77&&n>0)      //fff判断输入密码的次数
        {
            P2=0xff;//关闭数码管
            j=0;
            ff=1;                  //ff判断是否验证成功
               //比较mima[]和shuru[],如果不对,则继续比较
            for(j;j<10;j++)
            {
                 if(mima[j]!=shuru[j])
                {
                    ff=0;
                    cuowubaojin();//失败蜂鸣器响
                    i=0;//从头开始输入到数组里
                    break;
                }
            }
            if(j==10)
            {
                 ff=1;//将标志位设为true;
                n=1;
            }
            n--;            
        }
        if(n==0)
        {
            break;
        }
    }

    if(ff==1)
    {
         chenggongzhuandong();  //电动机转动
    }
    P2=0xff;
    j=0;    //密码输入错误暂停使用
    if(ff==0)
    {
        for(j;j<250;j++)
        {
            
             delay(1000);
        }
    }    
}

时间: 2024-11-01 15:15:02

基于单片机的电子密码锁的实现的相关文章

显示-求汇编程序,关于海关电子密码锁,谢谢大家

问题描述 求汇编程序,关于海关电子密码锁,谢谢大家 用的hqfc集成开发环境,要求程序内置初始密码,具有修改功能,正确与否,在lcd12864上显示,另外有海关密码是万能密码,输入用4* 4 矩阵键盘, 谢谢大家 解决方案 晕,直接写一段这样的代码光调试也需要很长时间

基于J2EE的电子商务开发模型及其实现

摘 要 介绍了J2EE体系结构,对J2EE体系结构进行了改进,提出并实现了基于J2EE的电子商务开发模型,可有效解决电子商务系统中存在的性能和可维护性等问题. 关键词 J2EE:EJB:体系结构:电子商务 随着网络的普及和发展,电子商务在当前的网络时代扮演着越来越重要的角色.电子商务从最初的静态电子商务已经发展到今天的动态电子商务.动态电子商务能够动态适应企业不断变化的业务策略的电子商务流程及相关系统,反映了在实时条件下实现应用动态集成的概念.动态电子商务的特点是软件应该按照业务的过程设计成可重

请教51测u i cos-关于基于单片机测功率因数 电压,电流那个protues仿真。

问题描述 关于基于单片机测功率因数 电压,电流那个protues仿真. 能简单介绍下,测电压,电流,功率开关怎么摆放,测功率因数是不是最高只能0.49?

源代码-基于JAVA的电子商城的设计

问题描述 基于JAVA的电子商城的设计 求基于Java的电子商城设计的源代码,最好是可以直接跑起来的,代码不要太复杂,简单易懂,求大神资源! 解决方案 关于商城系统中商品类别的设计 解决方案二: 看看这个 java开发SHOP电子商城网站平台shop++http://www.zuidaima.com/share/2043180788730880.htm 解决方案三: google里面输入完整下面一行 site:download.csdn.net java 商城 就有一波源代码赶来. 解决方案四:

关于电子密码锁的数码管问题

问题描述 关于电子密码锁的数码管问题 电子密码锁的数码管不亮,但是程序没有错,按键也好使,灯也亮,怎么解决 ,谢谢啦!

基于云计算的电子政务公共平台国家标准研制启动

硅谷网9月3日讯 2013年8月30日,"基于云计算的电子政务公共平台"国家标准研讨会在南京中国电子科技集团公司第二十八研究所召开,会议启动了"基于云计算的电子政务公共平台"的服务管理规范.系统和数据技术接口规范.应用部署和应用迁移技术标准.数据管理技术标准.信息安全技术规范.服务安全技术规范.服务质量评价标准.运行保障管理标准等8项国家标准研制工作. 近年来,我国云计算技术和产业持续发展,应用和实践不断创新,成效逐步显现.理论和实践证明,运用云计算技术,充分发挥既

程序-基于单片机430g2553基础上做一个万用表

问题描述 基于单片机430g2553基础上做一个万用表 基于单片机430g2553基础上做一个电压表,直流电压量程:200mV.2V.20V , 精度(1%+1)内,交流电压量程:200mV.2V.20V,精度(1%+1)内,频率响应40~400Hz,5110数码显示,要求用一节9V电池供电,电阻测量:1Ω---1MΩ,精度(5%+1)内,,用的是adg804,程序怎么写 解决方案 http://wenku.baidu.com/view/b4c31c5d312b3169a451a412.html

求基于单片机如何使用数组存储二叉树各节点数据并随时读取C代码?

问题描述 求基于单片机如何使用数组存储二叉树各节点数据并随时读取C代码? 求基于单片机如何使用数组存储二叉树各节点数据并随时读取C代码? 解决方案 很简单,用数组存储二叉树就是第n层保存在 2^(n-1)~2^n-1的下标区间内.

欧洲基于云计算的电子政务发展状况

随着云计算的发展,基于云计算的电子政务受到越来越多国家的重视.欧洲一些国家将基于云计算的电子政务列入了国家战略,还有一些国家已开始投入应用.其中,奥地利.丹麦.芬兰.法国.德国.爱尔兰.西班牙和英国等国属于发展基于云计算的电子政务较好的国家,而他们从云计算中获益的同时,也面临着诸多挑战. 一.国家战略 (一)奥地利 奥地利虽还未在公共服务中应用云计算,但奥地利总理府数据平台于2012年发布一份公共部门应用云计算的文件,涉及法律.经济.技术以及公共部门使用云计算的机遇和风险等方面.根据该文件,奥地