/*******************************************************************************
初始密码:000000 密码位数:6位
注意:掉电后,所设密码会丢失,重新上电时,密码恢复为原始的000000
与P1.0相连的8位发光LED点亮代表锁被打开;熄灭代表锁被锁上
程序功能:
1、开锁:
下载程序后,直接按六次数字0(即代表密码000000),LED亮,锁被打开,输入密码时,
六位数码管依次显示小横杠。
2、更改密码:
只有当开锁(LED亮)后,该功能方可使用。
首先按下更改密码键,然后设置相应密码,此时六位数码管会显示设置密码对应
的数字。最后设置完六位后,按下确认密码更改,此后新密码即生效。
3、重试密码:
当输入密码时,密码输错后按下重试键,可重新输入六位密码。
当设置密码时,设置中途想更改密码,也可按下此键重新设置。
4、关闭密码锁:
按下上锁按键即可将打开的密码锁关闭。
功能测试:输入原始密码000000---按下更改密码按键---按0到9设置密码---按确认键
密码更改---按上锁按键关闭密码锁---输入新的密码打开密码锁
*******************************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar old1,old2,old3,old4,old5,old6; //原始密码000000
unsigned char PassWord[6];
uchar new1,new2,new3,new4,new5,new6; //每次MCU采集到的密码输入
uchar a=8,b=8,c=8,d=8,e=8,f=8; //送入数码管显示的变量
uchar wei,key,temp;
unsigned char st=0;
bit allow,genggai,ok,wanbi,retry,close,err,gaiok; //各个状态位
bit rst1,rst2,rst3,sure;
unsigned char cnt=0;
sbit beep=P3^6;
sbit Lock=P3^7;
sbit GLED=P3^5;
sbit RLED=P3^4;
sbit SCL = P3^3; //引脚定义
sbit SDA = P3^2;
/*共阴: 0,1,2,3,4,5,6,7,8,9,D,E,G,O,R,-,*/
/*段对应关系:A[0],B[1],C[2],D[3],E[4],F[5],G[6],DP[7],*/
unsigned char code table[]=
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x3F,0x79,0x7D,0x3F,0x77,0x40};
void InitI2C();
void I2CStart();
void I2CStop();
void I2CSend(uchar byte);
uchar I2CRead();
void S_Retu_Dis();
void shumima(void);
void timer0_init();
void yanzheng(void);
uchar read_eeprom(uchar addr);
void write_eeprom(uchar addr, uchar databyte);
void send(uchar* state,uchar num);
/*****************************************************************************
** 函数名称:delay
** 功能描述:延时
******************************************************************************/
void delay(unsigned int i)
{
uint j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
/*****************************************************************************
** 函数名称:InitI2C
** 功能描述:配置模拟I2C的IO端口
******************************************************************************/
void InitI2C()
{
SDA = 1;
SCL = 1;
}
/*****************************************************************************
** 函数名称:I2CStart
** 功能描述:发送I2C总线起始状态
** 输 入:无
** 输 出:无
** 全局变量:无
** 调用模块:delay()
** 可移植性:直接移植
******************************************************************************/
void I2CStart()
{
SDA = 1;
delay(1); // 延时子程序
SCL = 1;
delay(1);
SDA = 0;
delay(1);
SCL = 0;
}
/*****************************************************************************
** 函数名称:I2CStop
** 功能描述:发送I2C总线停止起始状态
** 输 入:无
** 输 出:无
** 全局变量:无
** 调用模块:delay()
** 可移植性:直接移植
******************************************************************************/
void I2CStop()
{
SCL = 0;
delay(1);
SDA = 0;
delay(1);
SCL = 1;
delay(1);
SDA = 1;
delay(1);
}
/*****************************************************************************
** 函数名称:I2CSend
** 功能描述:向I2C总线发送一个字节数据,并检测应答
** 输 入:待发送字节byte
** 输 出:无
** 全局变量:无
** 调用模块:delay()
** 可移植性:直接移植
******************************************************************************/
void I2CSend(uchar byte)
{
uchar mask;
uchar i;
mask = 0x80;
for(i = 0; i < 8; i++)
{
SCL = 0;
delay(1);
if((mask & byte) == 0)
{
SDA = 0;
}
else
{
SDA = 1;
}
mask >>= 1;
delay(1);
SCL = 1;
delay(1);
}
SCL = 0;
SDA = 1;
delay(1);
SCL = 1;
delay(1);
SCL = 0;
}
/*****************************************************************************
** 函数名称:I2CRead
** 功能描述:从I2C总线读取最后一个字节数据,并发送非应答位
** 输 入:无
** 输 出:接收到的字节byte
** 全局变量:无
** 调用模块:delay()
** 可移植性:直接移植
******************************************************************************/
uchar I2CRead()
{
uchar byte;
uchar i;
byte = 0;
for(i = 0; i < 8; i++)
{
SCL = 0;
SDA = 1;
delay(1);
SCL = 1;
delay(1);
byte <<= 1;
if(SDA == 1)
{
byte |= 0x01;
}
delay(1);
}
SCL = 0;
SDA = 1;
delay(1);
SCL = 1;
delay(1);
SCL = 0;
return byte;
}
/*****************************************************************************
** 函数名称:read_eeprom
** 功能描述:读取EEPROM数据函数
** 输 入:EEPROM中目的地址addr
** 输 出:读取的数据
******************************************************************************/
uchar read_eeprom(uchar addr)
{
uchar databyte;
I2CStart();
I2CSend(0xa0);
I2CSend(addr);
I2CStart();
I2CSend(0xa1);
databyte = I2CRead();
I2CStop();
return databyte;
}
/*****************************************************************************
** 函数名称:write_eeprom
** 功能描述:向EEPROM写入数据函数
** 输 入:EEPROM中目的地址addr及写入的数据
** 输 出:无
******************************************************************************/
void write_eeprom(uchar addr, uchar databyte)
{
I2CStart();
I2CSend(0xa0);
I2CSend(addr);
I2CSend(databyte);
I2CStop();
}
void display(void)
{
switch(st)
{
case 0: st=1;P0=0xff;P2=table[a];P0=0xfe;break;
case 1: st=2;P0=0xff;P2=table[b];P0=0xfd;break;
case 2: st=3;P0=0xff;P2=table[c];P0=0xfb;break;
case 3: st=4;P0=0xff;P2=table[d];P0=0xf7;break;
case 4: st=5;P0=0xff;P2=table[e];P0=0xef;break;
case 5: st=0;P0=0xff;P2=table[f];P0=0xdf;break;
}
}
void keyscan(void)
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee: key=0;wei++;break;
case 0xde: key=1;wei++;break;
case 0xbe: key=2;wei++;break;
case 0x7e: key=3;wei++;break;
}
beep=0;delay(50);beep=1;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed: key=4;wei++;break;
case 0xdd: key=5;wei++;break;
case 0xbd: key=6;wei++;break;
case 0x7d: key=7;wei++;break;
}
beep=0;delay(50);beep=1;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb: key=8;wei++;break;
case 0xdb: key=9;wei++;break;
case 0xbb: genggai=1;wei=0;break;
case 0x7b: sure=1;
//if(allow)
ok=1;
break;
}
beep=0;delay(50);beep=1;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7: retry=1;break;
case 0xd7: close=1;break;
case 0x77: gaiok = 1;break;
}
beep=0;delay(50);beep=1;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
}
void WritePassWord(void)
{
unsigned char j=0;
for(j=0;j<6;j++)
基于51单片机的密码锁
版权申诉
42 浏览量
2023-03-19
13:09:17
上传
评论 2
收藏 290KB RAR 举报
森旺电子
- 粉丝: 7041
- 资源: 263
最新资源
- 基于STM32单片机空气监测系统设计源码+详细文档+配套全部资料(毕业设计).zip
- rdf0412-kcu116-pcie-c-2019-1.zip(XILINX KCU116 源码)
- 基于C#语言的winform界面火车票订票系统(源码+实验报告)
- 【华为OD部分真题及讲解】华为OD部分真题及讲解
- 基于Python+Django的京东商品比价系统源码+全部资料(毕业设计).zip
- G460 G560 Z460 Z560的最新BIOS 2.18版(无白名单)
- MetaJUI v0.4
- 基于Python+Django的京东商品比价系统源码+全部资料(毕业设计).zip
- linux常用命令大全
- 立体相机标定-使用OpenCV+Cpp对立体相机进行标定-calibration-附项目源码+流程教程-优质项目实战.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈