单片机和24C02制作的可以改密码的电子密码锁

   4*4键盘输入,可以更改密码,有24C02存储密码。我用的是6位。也可以多几位,更改相应变量即可。很简单。24C02里面我事先写入了初始密码2 3 4 6 7  0  。调试成功,可以直接用。STC89C51RC单片机 ,万能板焊接

    //实验板上24C02已写入数据 {2,3,4,6,7,0}
#include<REG52.H>
#include <intrins.H>
#define uchar unsigned char
#define uint unsigned int
char code SKEY[16]={4,8,11,15,3,7,10,14,2,6,0,13,1,5,9,12};
char code act[4]={0xfe,0xfd,0xfb,0xf7};
char data rd[6]={1,9,8,5,1,1};
char ct=0;
sbit contel=P2^1;
sbit cin=P0^3;
sbit set=P0^4;
sbit wrong=P0^5;  
sbit SDA=P2^6;
sbit SCL=P2^7;
bdata char com_data;
sbit mos_bit=com_data^7;
sbit low_bit=com_data^0;
void delay_iic(int n);
uchar rd_24c01(char a);
void wr_24c01(char a,char b); 
void wtsec(); 
/**************************************/
void delay_iic(int n)
{
int i;
for(i=1;i<n;i++){}
}

void delay(unsigned int k)
{
unsigned int data i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}
}
}

//*************************************
void start()
{
SDA=1;_nop_();_nop_();_nop_();_nop_();
SCL=1;_nop_();_nop_();_nop_();_nop_();
SDA=0;_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();
}
//*****************************************
void stop()
{
SDA=0;_nop_();_nop_();_nop_();_nop_();
SCL=1;_nop_();_nop_();_nop_();_nop_();
SDA=1;_nop_();_nop_();_nop_();_nop_();
}
//***********************
void ack()
{
SCL=1;_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();
}
//***********************
void shift8(char a)
{
data uchar i;
com_data=a;
for(i=0;i<8;i++)
{
SDA=mos_bit;
SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
com_data=com_data*2;
}
}
//******************
uchar rd_24c01(char a)
{
data uchar i,command;
SDA=1;_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();
start();
command=160;
shift8(command);
ack();
shift8(a);
ack();
start();
command=161;
shift8(command);
ack();
SDA=1;_nop_();_nop_();_nop_();_nop_();
for(i=0;i<8;i++)
{
com_data=com_data*2;
SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
low_bit=SDA;
SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
stop();
return(com_data);
}
//*****************
void wr_24c01(char a,char b)
{
data uchar command;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();
start();
command=160;
shift8(command);
ack();
shift8(a);
ack();
shift8(b);
ack();
stop();
_nop_();_nop_();_nop_();_nop_();_nop_();
}

//键盘扫描
char scan_key(void)
{
char i,j,in,ini=0,inj=0,temp,del;
bit find=0;
 P1=0x0f;
 temp=P1;
 if(temp!=0x0f)        //按键有松开过
for(del=10;del>0;del--);     //键盘去抖延迟
if(temp!=0x0f)
{
 for(i=0;i<4;i++)
 {
 P1=act[i];
 in=P1;
 in=in>>4;
 in=in|0xf0;
  for(j=0;j<4;j++)
  {
    if(act[j]==in)
    {find=1;
    inj=j;ini=i;
    }
  }
 }
}
 if(find==0)return -1;
 return (ini*4+inj);
}
//输入函数
void put_secret()
{
char wrt[6];
char et,ft;
char wt,x=1;
char *p,*t;
p=rd;
t=wrt;
for(wt=0;wt<6;)
{
 et=scan_key();
if(et!=-1)
{
wrt[wt]=SKEY[et];
wt=wt+x;
cin=0;
delay(200);
cin=1;
}
}
ct=0;
for (ft=0;ft<6;)
{
if(wrt[ft]==rd[ft])
{ct=ct+x; }

ft=ft+x;
}
if(ct==6)
 contel=1;
else
wrong=0;
}

 void  wtsec()
  {
char t[6];
char e,f,i=10;
char w,x=1;
char *m,*n;
m=rd;
n=t;
for(w=0;w<6;)
{
 e=scan_key();
if(e!=-1)
{
t[w]=SKEY[e];
w=w+x;
cin=0;
delay(200);
cin=1;
}      
}
for (f=0;f<6;)
{
wr_24c01(i,t[f]);
delay_iic(250);
rd[f]=rd_24c01(i);
delay_iic(250);
f=f+x;
i=i+x;
}      
  }
//============================
void main(void)
{
char c,f, key_val,x=1,ii=10;
contel=0;
wrong=1;
cin=1;
set=0; 
delay(2000);
for (f=0;f<6;)
{
rd[f]=rd_24c01(ii);
delay_iic(250);
f=f+x;
ii=ii+x;
}
set=1;
delay(1000);
 while(1)
 { 
 c=scan_key();
   if(c!=-1)
   key_val=SKEY[c];
   switch(key_val)  
    {  
   case 12:cin=0;delay(1000);cin=1;put_secret();break ;
      case 13:ct=0;wrong=1;contel=0;cin=1;set=1;break; 
      case 14:if(ct==6){set=0;wtsec();set=1;} set=1;ct=0;break;
      default:break;
}
}
}

  

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
单片机控制的电子密码锁: 设计要求: 1、状态显示功能: 锁定状态时系统用3位数码管显示OFF,用3位数码管显示成功开锁次数;成功开锁时用3位数码管显示888,用3位数码管显示成功开锁次数。 2、密码设定功能: 通过一个4×4的矩阵式键盘可以任意设置用户密码(1-16位长度),同时系统掉电后能自动记忆和存储密码在系统中。 3、报警和加锁功能: 密码的输入时间超过12秒或者连续3次输入失败,声音报警同时锁定系统,不让再次输入密码。此时只有管理员方能对系统解锁。 设计电路思路描述:本电路分为四部分组成:主程序部分,4×4矩阵键盘部分,6位数码管串口静态显示部分,24c02读写部分。 主程序部分主要分两方面:一、用户模式密码输入,密码比较,开锁,报警,修改密码;二、管理员模式密码比较,取消锁定键盘,报警,修改密码,清除开锁次数。 电路操作描述:上电时6位数码管前三位显示0FF,后三位显示开锁成功次数。 指示灯L1亮,等待输入用户密码或者按下管理员模式键输入管理员密码。如果输入用户密码正确,成功开锁,6位数码管前三位显示888,后三位显示成功开锁次数,指示灯L1灭,L2亮,并且开锁信号输出,用于控制电路开锁电路,成功开锁后,如果开锁次数到100此时,将锁定电路,如果按下密码修改键那么进入密码修改模式,输入0到16位密码,确认后等待退出键按下。 如果用户输入密码错误或12秒未完成输入,那么系统进入第一次报警,6位数码管显示NONONO,声光报警,三秒后,从新回到开锁前状态,如果输入错误次数到3次,那么锁定键盘,只有按下管理员模式键,输入正确的管理员密码打开键盘。 在管理员模式下,按下修改键可以修改管理员密码,按下清零键可以清除成功开锁次数。 24c02存储管理员密码,和用户密码,及开锁次数。
、状态显示功能: 锁定状态时系统用3位数码管显示OFF,用3位数码管显示成功开锁次数;成功开锁时用3位数码管显示888,用3位数码管显示成功开锁次数。 2、密码设定功能: 通过一个4×4的矩阵式键盘可以任意设置用户密码(1-16位长度),同时系统掉电后能自动记忆和存储密码在系统中。 3、报警和加锁功能: 密码的输入时间超过12秒或者连续3次输入失败,声音报警同时锁定系统,不让再次输入密码。此时只有管理员方能对系统解锁。 设计电路思路描述:本电路分为四部分组成:主程序部分,4×4矩阵键盘部分,6位数码管串口静态显示部分,24c02读写部分。 主程序部分主要分两方面:一、用户模式密码输入,密码比较,开锁,报警,修改密码;二、管理员模式密码比较,取消锁定键盘,报警,修改密码,清除开锁次数。 电路操作描述:上电时6位数码管前三位显示0FF,后三位显示开锁成功次数。 指示灯L1亮,等待输入用户密码或者按下管理员模式键输入管理员密码。如果输入用户密码正确,成功开锁,6位数码管前三位显示888,后三位显示成功开锁次数,指示灯L1灭,L2亮,并且开锁信号输出,用于控制电路开锁电路,成功开锁后,如果开锁次数到100此时,将锁定电路,如果按下密码修改键那么进入密码修改模式,输入0到16位密码,确认后等待退出键按下。 如果用户输入密码错误或12秒未完成输入,那么系统进入第一次报警,6位数码管显示NONONO,声光报警,三秒后,从新回到开锁前状态,如果输入错误次数到3次,那么锁定键盘,只有按下管理员模式键,输入正确的管理员密码打开键盘。 在管理员模式下,按下修改键可以修改管理员密码,按下清零键可以清除成功开锁次数。
44矩阵键盘控制液晶1602程序 #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int #define shuju P0 //数据 #define bus P3 //键盘 sbit rs=P1^0; sbit rw=P1^1; sbit e=P1^2; sbit sda=P0; //IO口定义 sbit scl=P2^1; // uchar r; void delayms(int i) { int j; for(j=0;j<i;j++) {} } void enable() { rs=0; rw=0; e=0; delayms(65000); e=1; } void write() { rs=1; rw=0; e=0; delayms(65000); e=1; } void chushi() { sda=0; scl=0; shuju=0x01; enable(); shuju=0x38; enable(); shuju=0x0f; enable(); shuju=0x06; enable(); shuju=0x80; enable(); } void display(uchar i) { //uchar a; shuju=i; write(); } void jianpan() { uchar a; uchar k; bus=0xff; bus=0xef; //扫描第一行 delayms(600); a=bus; a=a&0x0f; if(a!=0x0f) { delayms(200); if(a!=0x0f) { switch(a) { case 0x0e: k=0x30; break; case 0x0d: k=0x34; break; case 0x0b: k=0x38; break; case 0x07: k=0x43; break; } display(k); r=r-1; while(a!=0x0f) { bus=0x0f; delayms(200); a=bus; //a=a&0x0f; } } } bus=0xdf; //扫描第二行 // lcdbus=0xff; delayms(600); a=bus; a=a&0x0f; if(a!=0x0f) { delayms(200); if(a!=0x0f) { switch(a) { case 0x0e: k=0x31; // shuju=0x05; break; case 0x0d: k=0x35; // shuju=0x06; break; case 0x0b: k=0x39; shuju=0x07; break; case 0x07: k=0x44; // shuju=0x08; break; } display(k); r=r-1; while(a!=0x0f) { bus=0x0f; delayms(200); a=bus; } } } bus=0xbf; //扫描第3行 delayms(600); a=bus; a=a&0x0f; if(a!=0x0f) { delayms(200); if(a!=0x0f) { switch(a) { case 0x0e: k=0x32; break; case 0x0d: k=0x36; break; case 0x0b: k=0x41; //k=58; // jia(); break; case 0x07: k=0x45; // jian(); break; } display(k); r=r-1; while(a!=0x0f) { bus=0x0f; delayms(200); a=bus; } } } bus=0x7f; //扫描第4行 delayms(600); a=bus; a=a&0x0f; if(a!=0x0f) { delayms(200); if(a!=0x0f) { switch(a) { case 0x0e: k=0x33; // jia(); // shuju=0x13; break; case 0x0d: k=0x37; //jian(); // shuju=0x14; break; case 0x0b: k=0x42; //cheng(); // shuju=0x50; break; case 0x07: k=0x46; //chu(); //shuju=0x16; break; } display(k); r=r-1; //a=lcdbus; // a=a&0x0f; while(a!=0x0f) { bus=0x0f; delayms(200); a=bus; } } } } void main() { while(1) { chushi(); r=0x10; while(r>0) { jianpan(); } shuju=0xc0; enable(); r=0x10; while(r>0) { jianpan(); } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值