51单片机电子密码锁

电子密码锁

1.LCD1602显示
2.有修改密码的功能
3.使用51单片机模拟I2C通信,数据通过读写EEPROM进行存储

代码

此代码只包含程序的主体(main),各使用器件的初始化放个其它引用文件中,程序中定义了很多标志位,变量名取的很随意取的。开机会显示一下密码

#include"reg52.h"
#include"key.h"
#include"lcd.h"
#include"iic.h"

#define u16 unsigned int
#define u8 unsigned char

//EEPROM的读写--不能有0号位置 

u8 poi[]="pji";
u8 datt,state,sta1;passqors_length=6,orig_password[10],enter_password[10],enter_pass_Length,enter_pass_Length2,Length_f,Length1_f,fs=3,lop=0,lop2=0,i=0,Length1_f2;
u16 key_va;

void state_0();
void state_1();
void state_2();
void state_3();
void state_4();
void state_5();
void state_6();

u8 input_password();
u8 cantrast();







void main(){
	u8 a,data1;
	//lcd_com(0x01);//进来先清下lcd屏幕

	lcd_init();
	for(data1=1;data1<passqors_length+3;data1++)		 //	开始的时候屏幕会显示下EEPROM中的数据
	{
		a=At24c02Read(data1)+0x30;
	 	lcd_data(a);	
  																   
 	}	
	delay(100);
	if(At24c02Read(1)!=1){								   //判断1位置--标志位{密码是否存在}--不存在初始化密码---888888
		At24c02Write(1,1);	//储存都是一个字节八位数据
		At24c02Write(2,6);	//密码长度定义为六
		for(datt=3;datt<passqors_length+3;datt++){
			At24c02Write(datt,8);
		}
	}
	delay(100);
	for(a=1;a<passqors_length+1;a++){					   //将密码读出来---保存到数组orig_password中去
		orig_password[a]=At24c02Read(a+2);
	}
	enter_pass_Length=0;
	sta1=0;			  //用于判断--是进入修改密码---还是登录
	state=0;
	Length_f=0;
	Length1_f=0;
	Length1_f2=0;
	
	while(1){
		key_va=keyvalude();	//每时每刻都在获取键值
		switch(state){
			case(0):
				state_0();
				break;
			case(1):
				state_1();
				break;
			case(2):
				state_2();
				break;
			case(3):
				state_3();
				break;
			case(4):
				state_4();
				break;
		  	case(5):
				state_5();
				break;
			case(6):
				state_6();
				break;
		
		}
	}

}


void state_0(){
	show(0x00,"----welcome----");
//	show(0x1f,key_va);
	if(key_va==16){
		state=1;
	}
		
}
void state_1(){
	show(0x00,"change password");
	show(0x0f,"<");
	show(0x10,"enter password");
	show(0x1f," "); 
	
	state=5;

}
void state_2(){
	 u8 flag;
	
	if(Length_f==1){
		enter_pass_Length=0;
		Length_f=0;
	}
	if(lop==0){
		lcd_com(0x01);
		show(0x00,"original password:");
		lcd_com(0x80+0x40);
		//lcd_com(0x06);
		lop=1;
	}		
	 

   
	
	if(key_va>0 && key_va<10){
	//	enter_pass_Length=0;
		enter_password[enter_pass_Length]=key_va;	   //密码长度不会冲突
		enter_pass_Length++;					   //输入密码的长度
		lcd_data(0x30+key_va);
	}
	if(key_va==16){
		flag=cantrast();
		if(flag==0){		  //密码修改成功---返回初始状态
			lcd_com(0x01);
			show(0x00,"OK");
			delay(1000);
			state=4;

		}else{
			lcd_com(0x01);
			show(0x00,"err_changep");
			delay(100);
			state=2;
			Length_f=1;
			lop=0;
		}
		enter_pass_Length=0;
	}	

}
void state_3(){
	u8 flag;
	if(Length1_f2==1){
		enter_pass_Length=0;
		Length1_f2=0;
	}
	if(lop2==0){
		lcd_com(0x01);
		show(0x00,"password:");
		lcd_com(0x80+0x40);
		lop2=1;
	}
	
	if(key_va>0 && key_va<10){
	//	enter_pass_Length=0;
		enter_password[enter_pass_Length]=key_va;
		enter_pass_Length++;					   //输入密码的长度
		lcd_data('*');
	}									   
	if(key_va==16){
		flag=cantrast();
		if(flag==0){		  //
			lcd_com(0x01);
			show(0x00,"china");
			delay(1000);
	
		}else{
			lcd_com(0x01);
			show(0x00,"err");
			delay(1000);
			Length1_f=1;
			lop2=0;
			state=3;
			
		}
	}
}

   



void state_4(){
	if(i==0){
	   show(0x00,"new password:");
		lcd_com(0x80+0x40);
	
	}
	
	
	if(key_va>0 && key_va<10){
		i=1;
		At24c02Write(fs,key_va);	 
		fs++;
		lcd_data('*');
	}
	if(key_va==16){
	lcd_com(0x01);
		show(0x00,"pass ok password");
		delay(1000);
		state=6;
	}

}

void state_5(){
	
	if(key_va==1){
		show(0x0f,"<");
		show(0x1f," "); 
		sta1=0;
	}
	if(key_va==5){
		show(0x0f," ");
		show(0x1f,"<");
	   	sta1=1;
	}
	if(key_va==16){
		if(sta1==0){
			state=2;	   //修改密码 
		}else{
	   		state=3;	   //输入密码
	
		}		
	}
}

void state_6(){
	lcd_com(0x01);
    show(0x00,"zengcheng");
	enter_pass_Length=0;
	sta1=0;
	Length_f=0;
	Length1_f=0;
	lop=0;
	lop2=0;
	i=0;
	fs=3;
	delay(10000);
    
   	  state=0;
    

}



u8 cantrast(){
	u8 x=0,y=0;
	if(enter_pass_Length==passqors_length){
		for(x=1;x<7;x++){
			if(enter_password[x-1]==At24c02Read(x+2)){
				break;	
			}else{
				return 1;
			}
		}	
	
	}else{
	   return 1;
	}

	return 0;
}



u8 input_password(){
	u8 flag;
	while(1){
	
		if(key_va>0 && key_va<10){
		//	enter_pass_Length=0;
			enter_password[enter_pass_Length]=key_va;	   //密码长度不会冲突
			enter_pass_Length++;					   //输入密码的长度
			lcd_data(0x30+key_va);
		}
		if(key_va==16){
			flag=cantrast();
			if(flag==0){		  //密码修改成功---返回初始状态
				lcd_com(0x01);
				show(0x00,"OK");
				delay(50);
			//	state=4;
				return 4;
	
			}else{
				lcd_com(0x01);
				show(0x00,"err_changep");
				delay(50);
			//	state=2;
				Length_f=1;
				lop=0;
				return 2;
			}
		}
 
   }

}


  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的51单片机电子密码锁代码,仅供参考: ```c #include <reg51.h> #define PASSWORD_LENGTH 4 // 密码长度 #define PASSWORD "1234" // 正确密码 sbit LED = P1^0; // LED灯 sbit BUZZER = P1^1; // 蜂鸣器 void delay(unsigned int t) // 延时函数 { unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 125; j++); } void main() { unsigned char i, j; unsigned char password[PASSWORD_LENGTH]; // 存储输入的密码 unsigned char input[PASSWORD_LENGTH]; // 存储当前输入的字符 unsigned char count = 0; // 当前输入的字符数 while (1) { for (i = 0; i < PASSWORD_LENGTH; i++) { input[i] = 0; // 清空当前输入的字符 password[i] = 0; // 清空存储的密码 } count = 0; // 清空当前输入的字符数 while (1) { if (count == PASSWORD_LENGTH) // 输入完成 { if (strcmp(input, PASSWORD) == 0) // 输入正确 { LED = 1; // 点亮LED灯 BUZZER = 0; // 关闭蜂鸣器 delay(1000); // 延时1秒 LED = 0; // 熄灭LED灯 } else // 输入错误 { BUZZER = 1; // 打开蜂鸣器 delay(1000); // 延时1秒 BUZZER = 0; // 关闭蜂鸣器 } break; } for (i = 0; i < PASSWORD_LENGTH; i++) { if (password[i] != 0) // 当前位置已经输入过 continue; for (j = 0; j < 10; j++) // 等待按键按下 { P2 = 0xFF; // 设置P2口为输入状态 if (P2 != 0xFF) // 按键按下 { delay(10); // 延时去抖动 if (P2 != 0xFF) // 确认按键按下 { input[count] = j + '0'; // 存储当前输入的字符 password[i] = j + '0'; // 存储当前位置的字符 count++; // 当前输入的字符数加1 break; } } } if (j < 10) // 按键已经按下 break; } } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值