|
电子密码锁 可修改密码等,下面是proteus仿真原理图:
单片机源程序如下:
- #include <reg52.h>
- #include "delay_ms.h"
- #include "矩阵键盘.h"
- #include "i2c.h"
- #include "1602.h"
- #include "delay_ms.h"
- #include "mima.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define A 0x0a //输入密码
- #define B 0x0b //修改密码
- #define D 0x0d //关锁
- #define enter 0x0c //确认
- #define backspace 0x0f //退格键
- sbit baojing = P3^7; //蜂鸣器接口
- sbit lock = P3^3;//锁信号
- sbit set = P3^2;
- uchar idata mima_5[6] = {1,2,3,4,5,6}; //初始密码
- uchar flag_change;
- uchar aa;//存放密码错误的次数,够三次报警
- uchar bb;
- uchar flag_t0;
- void baoj1()//报警函数
- {
- int i;
- for(i = 0;i < 5; i++)
- {
- baojing = 1;
- delay_ms(5);
- baojing = 0;
- delay_ms(5);
- }
- }
- void baoj()
- {
- uchar i;
- for(i = 0; i < 10; i++)
- baoj1();
- }
- /*密码处理函数*/
- void mimachuli()
- {
- uchar key,i;
- uchar idata mima_1[6]={' ',' ',' ',' ',' ',' '};//存放密码缓冲区
- uchar idata mima_2[6]={' ',' ',' ',' ',' ',' '};
- uchar idata mima_3[6]={' ',' ',' ',' ',' ',' '};
- key = step_choose();
- if(key == A)//A被按下,接收输入密码,处理
- {
- read_n_add(mima_1,0x00,6);
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_com(0x0f);//显示光标
- lcd_pos(0,0);
- write_n_char(" press password ");
-
- if(input_mima(mima_2)) //处理输入密码
- {
- if(mimaduibi(mima_2,mima_1)) //密码正确
- {
- lcd_pos(0,0);
- write_com(0x0c);
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_n_char(" password right ");
- aa = 0; //清除密码错误次数
- lock = 0; //开锁
- baojing = 1; //响一下
- delay_ms(1000);
- baojing = 0;
- TR0 = 1;
- flag_t0 = 1;
- while(key != D && flag_t0) //D没按下一直开
- {
- key = keyscan();
- }
- TR0 = 0;
- lock = 1;//D按下了关锁
- }
- else //密码 不正确
- {
- lcd_pos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_n_char(" password wrong");
- delay_ms(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- i = 20; //密码不正确报警
- while(i--)
- baoj();
- }
- }
- }
- else //密码没有输入正确或完成
- {
- lcd_pos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_n_char(" password wrong");
- delay_ms(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- i = 20; //密码不正确报警
- while(i--)
- baoj();
- }
- }
- }
- if(key == B)//B被按下,修改密码
- {
- read_n_add(mima_1,0x00,6);
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_com(0x0f);//显示光标
- lcd_pos(0,0);
- write_n_char(" input password");
- write_com(0x0f);//显示光标
- if(input_mima(mima_2)) //处理输入密码
- {
- if(mimaduibi(mima_2,mima_1)) //密码正确
- {
- lcd_pos(0,0);
- write_com(0x0c);
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_n_char("password right ");
- aa = 0; //清除密码错误次数
- delay_ms(1500);
- flag_change = 1;
- while(flag_change) //下面开始修改密码
- {
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_com(0x0f);//显示光标
- lcd_pos(0,0);
- write_n_char("In new password");
- delay_ms(1500);
- if(input_mima(mima_2)) //处理输入密码
- {
- lcd_pos(0,0);
- write_com(0x0c);
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_n_char("Input new pass"); //确定新密码
- lcd_pos(1,0);
- write_n_char("word again");
- delay_ms(2000);
- lcd_pos(0,0);
- write_com(0x0f);//显示光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_n_char("In new password");
- if(input_mima(mima_3)) //处理输入密码
- {
- if(mimaduibi(mima_2,mima_3)) //密码正确
- {
- lcd_pos(0,0);
- write_com(0x0c);
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_n_char("password has");
- lcd_pos(1,0);
- write_n_char("change already");
- write_n_add(mima_3,0x00,6); //把修改的密码存进24C02
- delay_ms(2000);
- flag_change = 0;
- }
- else //密码 不正确
- {
- lcd_pos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_n_char("password wrong");
- delay_ms(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- i = 20; //3次输入密码不正确报警
- while(i--)
- baoj();
- }
- flag_change = 0;
- }
- }
- else //密码没有输入正确或完成
- {
- lcd_pos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_n_char(" password wrong");
- delay_ms(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- i = 20; //3次输入密码不正确报警
- while(i--)
- baoj();
- }
- }
-
- }
- else //密码没有输入正确或完成
- {
- lcd_pos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_n_char("password wrong");
- delay_ms(1000);
- flag_change = 0;
- aa++;
- if(aa == 4)
- {
- aa = 0;
- i = 20; //3次输入密码不正确报警
- while(i--)
- baoj();
- }
- }
-
- }
- }
- else //密码 不正确
- {
- lcd_pos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_n_char("password wrong");
- delay_ms(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- i = 20; //3次输入密码不正确报警
- while(i--)
- baoj();
- }
- }
- }
- else //密码没有输入正确或完成
- {
- lcd_pos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_n_char("password wrong");
- delay_ms(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- i = 20; //3次输入密码不正确报警
- while(i--)
- baoj();
- }
- }
- }
- }
- /*外部中断函数,恢复出厂设置,长按set键恢复*/
- void int0() interrupt 0
- {
- delay_ms(2000);
- if(!set)
- {
- lcd_pos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- i2cinit();//24C02总线初始化
- write_n_add(mima_5,0x00,6);
- write_n_char("password renew");
- lcd_pos(1,0);
- write_n_char("already");
- delay_ms(1000);
- lcd_pos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_n_char("Input password");
- lcd_pos(1,0);
- write_n_char("Press key A");
- }// 引起了三个警告
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
电子密码锁仿真有代码.zip
(3.92 MB, 下载次数: 487)
|
评分
-
查看全部评分
|