51单片机设计的电子密码锁

该程序是基于51单片机设计的电子密码锁,功能较为简单,目前仅有修改密码和检测这一功能,以下是操作过程

运行仿真的初始界面

左边矩阵按键从左边第一行第一列起为0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f

按下按键后界面如下,当四位数码管都显示后,按下矩阵键盘上任意按键确认密码

密码错误D1红灯亮起,密码正确D2绿灯亮起

当按下独立按键时,中断触发,进入密码修改,此时界面如同初始界面,输入原始密码,原始密码正确,绿灯亮起,等待输入新密码,此时界面显示原始密码。原始密码错误红灯亮起,退出修改,返回初始状态。

新密码输入会将原始密码覆盖,输入完成红绿灯同时亮起。

1s后返回初始界面,密码修改完成。

单片机源程序如下:

#include “reg51.h”          //包含头文件

#define uchar unsigned char

#define uint unsigned int

#define DIG P0

#define keys P1

sbit LSA=P2^1;

sbit LSB=P2^2;

sbit LED_Green=P2^3;

sbit LED_Red=P2^4;

uchar time=0,state;

uchar disp[4]={0xbf,0xbf,0xbf,0xbf};

uchar smgduan[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};        //数码管段选表,共阳数码管

uchar password[4]={0xf9,0xf9,0xa4,0x90};  //初始密码1129

void delay_ms(uint t);                //函数声明

void keys_scan();

void digdisp();

void Init();

void delay_ms(uint t)                 //延时函数

{

        uchar i;

        for(;t>0;t–)

        {

                for(i=0;i<125;i++);

        }

}

void keys_scan()                   //矩阵按键扫描

{

        uchar i,k;

        keys=0xf0;

        if(keys!=0xf0)

        {

                delay_ms(2);

                if(keys!=0xf0)

                {

                        switch(keys)                         //确定行

                        {

                                case(0x70):

                                        k=0;break;

                                case(0xb0):

                                        k=4;break;

                                case(0xd0):

                                        k=8;break;

                                case(0xe0):

                                        k=12;break;

                        }

                        keys=0x0f;

                        if(keys!=0x0f)                        

                        {

                                switch(keys)                //确定列

                                {

                                        case(0x07):

                                                         ;break;

                                        case(0x0b):

                                                k=k+1;break;

                                        case(0x0d):

                                                k=k+2;break;

                                        case(0x0e):

                                                k=k+3;break;

                                }

                        }

                        while(keys!=0x0f);                       //松手检测

                        disp[time]=smgduan[k];                //将键值对应的段选码送入显示数组

                        time++;                                               //按键次数检测

                        if((time>4)&&(state!=1))           //检测四位密码是否全部输入

                        {

                                time=0;

                                for(i=0;i<4;i++)

                                {

                                        if(disp[i]!=password[i])        //逐位检测输入密码是否正确

                                        {

                                                LED_Green=1;                        //输入密码不正确,红灯点亮

                                                LED_Red=0;

                                                break;

                                        }

                                        if(i==3)                                        //输入密码正确绿灯点亮

                                        {

                                                LED_Green=0;

                                                LED_Red=1;

                                        }

                                }

                                delay_ms(1000);                                        //延时1s

                        }

                }

        }

digdisp();

[1] [] []

关键字:   编辑:什么鱼 引用地址: 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。