×
单片机 > 单片机程序设计 > 详情

单片机电子密码锁门禁系统设计 AT24C02保存密码

发布时间:2020-06-17 发布时间:
|

该设计基于STC单片机设计,电路主要由51单片机最小系统和按键部分、蜂鸣器报警部分、LCD液晶显示部分等组成。该电路设计简单,单层板加上几根跳线即可完成,适合电子初学者DIY制作。


电子密码锁具体功能介绍:

1、该电子密码锁默认密码为1234567890,密码通过键盘输入,若密码正确,则将锁打开。

2、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。

3、报警、锁定键盘功能。密码输入错误显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。

4、AT24C02保存密码,支持复位保存,掉电保存功能。

附件内容包括:

整个电子密码锁原理图和PCB源文件,用AD软件打开;


Altium Designer画的原理图和PCB图如下:
 

单片机源程序如下:

#include

#define uint unsigned int

#define        uchar unsigned char

sbit l1=P1^0;        //LED指示

sbit bump=P2^2;        //蜂鸣器控制

sbit relay=P2^3;//继电器输出

sbit lcden=P2^7;//LCD1602液晶控制端

sbit lcdrs=P2^6;

sbit sda=P2^0;        //AT24C02数据端口

sbit scl=P2^1;        //时钟端口

/**********显示内容**************************/

uchar code xianshi0[]="input  password:";

uchar code xianshi1[]="please come in!";

uchar code xianshi2[]="*";

uchar code xianshi3[]=" you are thief!";

uchar code xianshi4[]=" new  password:";

uchar code xianshi5[]=" alter succeed!";

uchar code xianshi6[]="  first error!";

uchar code xianshi7[]="  second error!";

uchar code xianshi8[]="  third error!";

uchar code xianshi9[]="  alter fail!!";

uchar table[8];                         //给按键输入留取存储空间

uchar table1[8];                 //给密码修改留取存储空间

uchar mima[8];                         //给从存储中读取密码留取存储空间

uchar num,num1,num2,num3,etimes,fanhui,kai;

bit alterflog,cpflog,suoflog;//定义各种标志位 修改密码键按下标志   密码比较正确标志  上锁标志

void keyscan();                                                  //声明键盘扫描函数

void init();

void keydeal15();

void keydeal16();                                                  //声明初始化函数

/********************延时一毫秒函数**************/        

void delay_xs(uint x)

{          uint i,j;

        for(i=x;i>0;i--)         for(j=110;j>0;j--);}

void writecom(uchar com)        //写命令

{

        lcdrs=0;         P0=com;                 delay_xs(5);

        lcden=1;          delay_xs(5);                 lcden=0;

}

/*********************液晶写命令数据函数******************/

void writedate(uchar date)        //写命令

{

        lcdrs=1;         P0=date;        delay_xs(5);

        lcden=1;         delay_xs(5);        lcden=0;

}

/***************24c02读取写入数据初始化****************/

void delay()  //微妙级延时函数

{ ;; }

void start()  //开始信号

{        

        sda=1;         delay(); scl=1;        delay(); sda=0;        delay();

}


void stop()   //停止

{

        sda=0;delay();scl=1;delay();sda=1;delay();

}

void respons()  //应答

{

        uchar i;

        scl=1;        delay();

        while((sda==1)&&(i<250)) i++;

        scl=0;         delay();

}

void write_byte(uchar date)                //写一位数据

{

        uchar i,temp;

        temp=date;



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

        {

                temp=temp<<1;

                scl=0; delay();        sda=CY;        delay();

                scl=1; delay();

        }

        scl=0;         delay();

        sda=1;         delay();

}


uchar read_byte()                           //读一位数据

{

        uchar i,k;

        scl=0;         delay();

        sda=1;        delay();

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

        {

                scl=1;        delay();        

                k=(k<<1)|sda;

                scl=0;        delay();        

        }

        return k;

}

void write24c02(uchar address,uchar date) //写一字节函数

{

        start();

        write_byte(0);

        respons();

        write_byte(address);

        respons();

        write_byte(date);

        respons();

        stop();

}


uchar read24c02(uchar address)                //读一字节函数

{

        uchar date;

        start();

        write_byte(0);

        respons();

        write_byte(address);

        respons();

        start();

        write_byte(0xa1);

        respons();

        date=read_byte();

        stop();

        return date;

}

/************各按键对应处理函数***************/

/*************各按键功能********************

1-2-3-4-5-6-7-8-9-0-确认-重新输入-未定义-上锁-密码修改

-密码修改确认-未定义*************************/

void keydeal1()                                 //按键1

{

        table[num]=1;

        num++;

        if(alterflog==1){table1[num1]=1;num1++;        }

}

void keydeal2()                                //按键2

{

        table[num]=2;

        num++;

        if(alterflog==1){table1[num1]=2;num1++;        }

}

void keydeal3()                               //按键3

{

        table[num]=3;

        num++;

        if(alterflog==1){table1[num1]=3;num1++;        }

}

void keydeal4()                               //按键4

{

        table[num]=4;

        num++;

        if(alterflog==1){table1[num1]=4;num1++;        }

}

void keydeal5()                               //按键5

{

        table[num]=5;

        num++;

        if(alterflog==1) {table1[num1]=5;num1++;}

}

void keydeal6()                                        //按键6

{

        table[num]=6;

        num++;

        if(alterflog==1){table1[num1]=6;num1++;        }

}

void keydeal7()                                        //按键7

{

        table[num]=7;

        num++;

        if(alterflog==1){table1[num1]=7;num1++;        }

}

void keydeal8()                                          //按键8

{

        table[num]=8;

        num++;

        if(alterflog==1){table1[num1]=8;num1++;        }

}

void keydeal9()



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项