历史上的今天

今天是:2024年09月10日(星期二)

正在发生

2020年09月10日 | 单片机电子密码锁代码+Proteus仿真(24C02+LCD1602显示)

发布者:EnchantedHeart 来源: 51hei关键字:单片机  电子密码锁  24C02  LCD1602显示 手机看文章 扫描二维码
随时随地手机看文章

基于51单片机的电子密码锁按键设置6位密码,输入密码若密码正确,则锁打开。显示open!
密码可以自己修改(6位密码),必须是锁打开时才能改密。为防止误操作,修改密码得输入两次。
1.按键设置6位密码,输入密码若密码正确,则锁打开。显示open!
2.密码可以自己修改(6位密码),必须是锁打开时才能改密。为防止误操作,修改密码得输入两次。
3.若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。
4.24C02有复位、掉电保存密码功能
按键排列方式:     1  2 3  A

  4 5  6  B

  7 8  9  C

  * 0  #  D

ABC无定义、 *号键为取消当前操作、#号键为确认、D键为修改密码自己焊接的电路,首次使用时输入:131420,对密码进行初始化,当显示:initpassword,证明密码初始化完成,此时的密码为:000000。然后可以改密了

按下 * 键或复位键,可以关锁并退出。当输入密码错误后,报警并锁定键盘3秒钟。

修改密码:在开锁状态下,再次输入正确的密码并按下 # 键,此时听到两声提示,输入新的六位密码并按 D 键,再重复输入一次新密码并按 D ,会听到两声提示音,表示重设密码成功,内部保存新密码并存储。如两次输入的新密码不一样,则重设密码失败。


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

单片机源程序如下:

//包含头文件

#include

#include

//宏定义

#define LCM_Data  P0                  //将P0口定义为LCM_Data

#define uchar unsigned char

#define uint  unsigned int

//1602的控制脚

sbit lcd1602_rs=P2^5;

sbit lcd1602_rw=P2^6;

sbit lcd1602_en=P2^7;


sbit Scl=P3^4;                        //24C02串行时钟

sbit Sda=P3^5;                        //24C02串行数据


sbit ALAM = P2^1;                //报警       

sbit KEY = P3^6;                //开锁


bit  pass=0;                        //密码正确标志

bit  ReInputEn=0;                //重置输入允许标志       

bit  s3_keydown=0;                //3秒按键标志位

bit  key_disable=0;                //锁定键盘标志


unsigned char countt0,second;        //t0中断计数器,秒计数器


void Delay5Ms(void);                //声明延时函数


unsigned char code a[]={0xFE,0xFD,0xFB,0xF7};                                 //控盘扫描控制表

//液晶显示数据数组

unsigned char code start_line[]        = {"password:       "};

unsigned char code name[]                  = {"===Coded Lock==="};        //显示名称

unsigned char code Correct[]         = {"     correct    "};                //输入正确

unsigned char code Error[]           = {"      error     "};          //输入错误

unsigned char code codepass[]        = {"      pass      "};

unsigned char code LockOpen[]        = {"      open      "};                //OPEN

unsigned char code SetNew[]         = {"SetNewWordEnable"};

unsigned char code Input[]           = {"input:          "};                //INPUT

unsigned char code ResetOK[]         = {"ResetPasswordOK "};

unsigned char code initword[]        = {"Init password..."};

unsigned char code Er_try[]                = {"error,try again!"};

unsigned char code again[]                = {"input again     "};


unsigned char InputData[6];                                                                        //输入密码暂存区

unsigned char CurrentPassword[6]={0,0,0,0,0,0};                         //读取EEPROM密码暂存数组

unsigned char TempPassword[6];

unsigned char N=0;                                //密码输入位数记数

unsigned char ErrorCont;                        //错误次数计数

unsigned char CorrectCont;                        //正确输入计数

unsigned char ReInputCont;                         //重新输入计数

unsigned char code initpassword[6]={0,0,0,0,0,0};                        //输入管理员密码后将密码初始为000000

unsigned char code adminpassword[6]={1,3,1,4,2,0};                        //输入管理员密码后将密码初始为000000



//=====================5ms延时==============================

void Delay5Ms(void)

{

        unsigned int TempCyc = 5552;

        while(TempCyc--);

}


//===================400ms延时==============================

void Delay400Ms(void)

{

unsigned char TempCycA = 5;

unsigned int TempCycB;

while(TempCycA--)

{

  TempCycB=7269;

  while(TempCycB--);

}

}


//=============================================================================================

//================================24C02========================================================

//=============================================================================================


void mDelay(uint t) //延时

{

        uchar i;

           while(t--)

           {

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

                   {;}

           }

}

   


void Nop(void)                  //空操作

{

        _nop_();                  //仅作延时用一条语句大约1us

        _nop_();

        _nop_();

        _nop_();

}


/*****24c02程序参照24c02时序图*****/

/*起始条件*/


void Start(void)

{

        Sda=1;

        Scl=1;

        Nop();

        Sda=0;

        Nop();

}



/*停止条件*/

void Stop(void)

{

        Sda=0;

        Scl=1;

        Nop();

        Sda=1;

        Nop();

}


/*应答位*/

void Ack(void)

{

        Sda=0;

        Nop();

        Scl=1;

        Nop();

        Scl=0;

}


/*反向应答位*/

void NoAck(void)

{

        Sda=1;

        Nop();

        Scl=1;

        Nop();

        Scl=0;

}


/*发送数据子程序,Data为要求发送的数据*/

void Send(uchar Data)

{

           uchar BitCounter=8;

           uchar temp;

           do

           {

                   temp=Data;                                           //将待发送数据暂存temp

                   Scl=0;

                   Nop();

                   if((temp&0x80)==0x80)                   //将读到的数据&0x80

                   Sda=1;

                   else

                   Sda=0;

                   Scl=1;

                   temp=Data<<1;                                   //数据左移

                   Data=temp;                                           //数据左移后重新赋值Data

                   BitCounter--;                                   //该变量减到0时,数据也就传送完成了

           }

           while(BitCounter);                                   //判断是否传送完成

           Scl=0;

}


/*读一字节的数据,并返回该字节值*/

uchar Read(void)

{

    uchar temp=0;

        uchar temp1=0;

        uchar BitCounter=8;

        Sda=1;

        do

        {

                Scl=0;

                Nop();

                Scl=1;

                Nop();

                if(Sda)                                   //数据位是否为1

                        temp=temp|0x01;           //为1 temp的最低位为1(|0x01,就是将最低位变为1)

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
关键字:单片机  电子密码锁  24C02  LCD1602显示 引用地址:单片机电子密码锁代码+Proteus仿真(24C02+LCD1602显示)

上一篇:谈51单片机实物与仿真差异
下一篇:能够实现单片机计算器与LCD1602字幕滚动的源程序

推荐阅读

参考原子的stm32f系列的串口通信实验,移植到stm23l系列的程序代码。1、采用串口中断方式,串口接收到消息产生中断,因此需要使能RXNE寄存器。HAL库函数的调用方式是__HAL_UART_ENABLE_IT(&UartHandle1, UART_IT_RXNE); UartHandle1是UART_HandleTypeDef类型,具体参考stm32lxx_hal_uart.h文件。2、关于串口初始化,由于HAL库中的串口初始化函数H...
这几天在调STM32+MPU6050实现 低功耗唤醒功功能描述: 1. 平时没有数据的时候,mcu处于 stop模式下,2. 利用RTC实现定时唤醒,3.以上功能中已经实现 mcu低功耗唤醒 及RTC定时唤醒。下一步要尝试 mpu6050 有数据时唤醒单片机,平时单片机处于低功耗状态如果有朋友也在做 mpu6050低功耗唤醒单片机的功能希望能够一起交流。这里附上qq...
  9月7日—8日, 东营昆宇新能源科技有限公司总裁单辉,财务总监刘荣,南方区销售总监王以圆,深圳市创新投资集团有限公司合伙人吴任华等一行9人来常德经开区,就通讯储能电池项目落地石墨烯产业园进行了友好洽谈。常德经开区党工委书记李育智出席并主持会议。   会上,李育智对东营昆宇一行的到访表示热烈欢迎,并介绍了常德经开区的区位、产业、...
一、应用背景近些年,伴随中国高铁产业迅猛发展,对高速电动车组需求源源不断。电动车组设计生产是个复杂的生产过程,其中电气线路的布置和检测是其生产的重要环节。电动车组电气线路布置有线束众多、各回路交叉、连接器和接线端子复杂多样等特点,这都给电动车组电气线路导通测试带来困难。传统的线路导通测试依赖人工,利用讯响器进行导通测试,带来工作...

史海拾趣

问答坊 | AI 解惑

[转帖]我来说说讨厌的51芯片吧

[转帖]我来说说讨厌的51芯片吧   我用了很久51芯片,本来对它的功耗非常不满,但是因为其价格越来越便宜,本身的性价比依旧很好,所以总也甩不掉。 1、休眠。一般的系统都不会到了忙不过来的地步,适当的休眠还是可以节省一些功耗的,在一些简单 ...…

查看全部问答∨

求高手帮忙画个!EDA或其他的!电气图!截图发我 !谢谢啊!XIONGYAQI@126.COM

求高手帮忙画个!EDA或其他的!电气图!截图发我 !谢谢啊!XIONGYAQI@126.COM…

查看全部问答∨

我有一台创维电视,锁住了

我有一台创维电视,锁住了:\'( 不知道怎么开锁,请问大家要怎么样才能开锁…

查看全部问答∨

请问CF卡读取问题

请问谁知道用EVC怎么来读取多个CF卡的序列号,我现在能读取出一个CF卡的序列号,但是如果有多个CF卡的时候怎么办呢? 而且我还要读出CF卡的个数,谢谢大家。下面是我读取CF卡的程序 #include \"stdafx.h\" //my code #include #include #defin ...…

查看全部问答∨

wince 读写mmc设备问题,大牛帮忙。

我有个ca卡,mmc接口 winxp上,接个usb的读卡器,显示盘符H: 我用createfile("\\\\\\\\.\\\\H:",...); 可以正常操作,reset, read,write都正常。 write一个命令,可以read一串返回值, 现在想在arm wince5平台下操作它, 我用crea ...…

查看全部问答∨

Keil AGDI接口的一个问题?

我用Keil IDE 公司提供的AGDI接口实现Debugger,现在遇到一个问题非常棘手?想问下大家? 现在大部分功能都实现了,就差Watch Breakpoint,(即Access BreakPoint,有Read,Write属性),其他的断点也都OK了。为什么我实现不了它呢?有这样一个问题: ...…

查看全部问答∨

疑惑:磁盘过滤驱动和文件系统过滤驱动到底有什么区别?

请问:磁盘过滤驱动和文件系统过滤驱动到底有什么区别?…

查看全部问答∨

关于AT24C02B的程序问题

为什么我的显示总为零,大伙看看.以下是我的程序: #include "reg52.h" #include "absacc.h" #include "math.h" #define uchar unsigned char #define uint  unsigned int #define dm    XBYTE[0x8000] #defi ...…

查看全部问答∨

wince web服务器问题

那位大侠可以帮忙么? 我在wince上加入了WEB内核,用ASP标准控件编写的网页,控件在WINCE 上显示不出来,但是用HTML控件编写网页控件可以显示出来,但是不能调用.dll,请问为什么?我的vs2005 和2440开发板 …

查看全部问答∨

ARM7调试,怎么查系统从哪启动?

ARM7 44b0,裸机调试。 在AXD下调试,RO Base参数设为0x0c008000 这是开发板的地址空间: nGCS0 [0x0000_0000]:FLASH(SST39VF1601) nGCS1 [0x0200_0000]:NANDFLASH(K9F2808) nGCS2 [0x0400_0000]:IDE/ATA nGCS3 [0x0600_0000]:RTL8019AS nGC ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved