硬件设计:
同样采用的是51 单片机,加矩阵键盘,同样具有声光报警器。输入正确之后,LED会短暂亮起,同时继电器开启,用于模拟锁的开关。
原理图和PCB如下:
程序设计
/*******************************************************************************
初始密码: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=16,b=16,c=16,d=16,e=16,f=16; //送入数码管显示的变量
uchar wei,key,temp;
unsigned char st=0;
bit allow,genggai,ok,wanbi,retry,close; //各个状态位
sbit beep=P3^6;
sbit Lock=P3^7;
sbit GLED=P3^5;
sbit RLED=P3^4;
sbit SCL = P3^3; //引脚定义
sbit SDA = P3^2;
unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};
void InitI2C();
void I2CStart();
void I2CStop();
void I2CSend(uchar byte);
uchar I2CRead();
uchar read_eeprom(uchar addr);
void write_eeprom(uchar addr, uchar databyte);
/*****************************************************************************
** 函数名称: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