历史上的今天
今天是:2024年09月10日(星期二)
2020年09月10日 | 单片机电子密码锁代码+Proteus仿真(24C02+LCD1602显示)
2020-09-10 来源:51hei
基于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)
史海拾趣
|
WINCE5.0下GPRS拨号上网遇到如下问题: 在:开始->设置->网络和拨号连接 中建立新连接,建好后连接时弹出窗口:已与您拨叫的远程计算机断开。请验证“波特率”设置并重试连接。 确定波特率设置没有问题。请问这个是什么 ...… 查看全部问答> |
|
最近从网上下了一NRF24L01无线模块发射程序,改了一下,准备用AT89S51单片机控制,但是运行之后没有反应(不知道模块是否正常运行)。麻烦大家给看一下问题出在哪,程序如下: #include #include #include \"api.h\" /********************** ...… 查看全部问答> |
|
做linux驱动的迷茫啊!(不是技术问题)希望前人指引方向! 我今年毕业,去了一家很大的公司去做嵌入式Linux驱动,公司很好、很大,但是当我去实习时发现,公司的驱动已经做得很成熟了,而且公司的产品更新换代很慢,几乎驱动是不用改的,所以感觉进这样的公司没办法去得到实践,是不是在这样 ...… 查看全部问答> |
|
西门子的TC35模块,有没有集成SIM插槽,收发天线等等呢? 如果我想用单片机对其编程,使其能够发短信到一特定号码上,是不是只要一个RS232的串口线和其连接就够了呢? 有用单片机控制TC35发送短信到特定号码的实例源代码吗? 刚刚学习 ...… 查看全部问答> |
|
请问各位大大,关于DSP远程无线视频监控的的6层PCB电路板设计,其中多层电路板如何分层,在另外想询问一下,哪里能下到TI公司的TMS320DM647的电路原理图和元件封装!… 查看全部问答> |
|
本人急需嵌入式数据应用程序。需要实现下列功能: 基于Windows CE的应用程序可以捕获来自于用户串口数据,并将它们存储在设备上的SQL Server CE数据库中,然后应用程序可以周期性地将SQL Server CE 数据库中的数据通过http上载到SQL Server上的数 ...… 查看全部问答> |
|
举个例来说明这个问题,假设一台PC上有编号1、2、3、4的4个usb port,分别插入4支u盘,我如何用程序来实现:得到编号x的usb port上U盘盘符? 因为插入u盘的次序不同,某个usb port上的U盘盘符可能会变化,如果按顺序插入U盘,编号1、 ...… 查看全部问答> |




