|
89C52单片机的密码锁:
密码锁主程序精华版89c52.rar
(89.5 KB, 下载次数: 51)
部分程序预览:
- /****************************************************************/
- /****通过借鉴别人作品自己加以修改才完成了此作品*****************/
- /****如果大家有啥建议欢迎联系我,我们共同改进*******************/
- /*************************************************/
- /********这个程序舍去了外部eeprom简化了外围电路****************/
- #include<reg52.h>
- #include<intrins.h>
- #include<1602yj.h>
- #include<key.h>
- #include<bujing.h>
- #include<eeprom.h>
- #include<buzzer.h>
- #include<time.h>
- #include<mima.h>
- #define address 0x2000
- uchar idata mima_5[6] = {1,2,3,4,5,6}; //初始密码
- uchar idata mima_6[6]={1,1,1,1,1,1}; //管理员密码
- uchar flag_change,flag;
- uchar aa;//存放密码错误的次数,够三次报警
- uint num;//计数
- uchar flag_bg,flag_h,m;
- uchar flag_key=1;
- uchar i;
- void init()
- {
- init_lcd();//液晶初始化
- fen=1; //关闭蜂鸣器
- beiguang=0;//打开液晶背光
- TMOD |= 0x11; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
- //TH0=0x00; //给定初值
- //TL0=0x00;
- ET1=0; //定时器中断关闭 警报用
- TR1=0; //定时器开关关闭 警报用
- EA = 1;//打开总中断
- ET0 = 1;//打开定时器0中断
- TR0 = 0;//关闭定时器
- TH0 = 0x4c;//50ms装初值
- TL0 = 0x00;
- EX1=1;
- IT1=1; //外部中断0为下降沿触发
- }
- void mima()
- {
- uchar key;
- uchar idata mima_1[6]={' ',' ',' ',' ',' ',' '};//存放密码缓冲区
- uchar idata mima_2[6]={' ',' ',' ',' ',' ',' '};
- uchar idata mima_3[6]={' ',' ',' ',' ',' ',' '};
- key=step_choose();
-
- beiguang=0;
-
- TR0=0;
- switch (key) //switch语句比if语句效率高 在这里选择这种语句
- {
- case E: //恢复出厂设置
- {
-
- lcdpos(0,0);
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_com(0x0f);//显示光标
- display_n(" Admin Password ");
- lcdpos(1,0);
- if(input_mima(mima_2)) //处理输入密码
- {
- if(mimaduibi(mima_2,mima_6)) //密码正确
- {
- lcdpos(0,0);
- write_com(0x0c);
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n(" PassWord Right ");
-
- ERASE(address);
- for(i=0;i<6;i++)
- { Write_ISP (address+i, mima_5[i]);}
- delayx(1500);
- aa = 0; //清除密码错误次数
- fen = 0; //响一下
- delayx(1000);
- fen = 1;
- }
- else //密码 不正确
- {
- lcdpos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密码不正确报警
- }
-
- }
- }
- else //密码没有输入正确或完成
- {
- lcdpos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密码不正确报警
- }
-
- }
-
-
-
-
- }
-
- break;
- case A: //A被按下,接收输入密码,
- {
- for(i=0;i<6;i++)
- {
-
- mima_1[i]= Read_ISP(address+i);
-
- }
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_com(0x0f);//显示光标
- lcdpos(0,0);
- display_n(" Input PassWord");
-
- if(input_mima(mima_2)) //处理输入密码
- {
- if(mimaduibi(mima_2,mima_1)) //密码正确
- {
- lcdpos(0,0);
- write_com(0x0c);
- write_com(0x06);//写一个字符后地址指针加 1
-
- write_com(0x01);//显示清零,数据指针清零
- display_n(" PassWord Right ");
- aa = 0; //清除密码错误次数
- kai(); //开锁
- fen = 0; //响一下
- delayx(1000);
- fen = 1;
- TR0 = 1;
- flag_h=1;
- flag=0;
-
- while(key != C&&flag_h!=0) //C没按下一直开 如果忘记关门定时器10s到了会自动关门
- {
- key = scan();
-
- }
- if(flag_h==1||m==0)//检测是不关过门 flag_h==1表示没关门 m检测进入外部中断后执行关门指令 也除去一个警告
- { guan();
- flag=1;
- TR0 = 0;
- }
- }
- else //密码 不正确
- {
- lcdpos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
-
- aa = 0;
- warn(); //密码不正确报警
- }
-
- }
- }
- else //密码没有输入正确或完成
- {
- lcdpos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密码不正确报警
- }
-
- }
- }
- break;
- case F: //F被按下,修改密
- {
- for(i=0;i<6;i++)
- {
-
- mima_1[i]= Read_ISP(address+i);
-
- }
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- write_com(0x0f);//显示光标
- lcdpos(0,0);
- display_n(" Input PassWord");
- write_com(0x0f);//显示光标
- if(input_mima(mima_2)) //处理输入密码
- {
- if(mimaduibi(mima_2,mima_1)) //密码正确
- {
- lcdpos(0,0);
- write_com(0x0c);
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n(" PassWord Right ");
-
- aa = 0; //清除密码错误次数
- delayx(1000);
-
- flag_change = 1;
- if(flag_change) //下面开始修改密码
- { lcdpos(0,0);
- write_com(0x0c); //关闭光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n("In New PassWord");
- delayx(1000);
- lcdpos(1,0);
- write_com(0x0f);//显示光标
-
-
- if(input_mima(mima_2)) //处理输入密码
- {
-
- lcdpos(0,0);
- write_com(0x0c);
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n("Input New Pass"); //确定新密码
- lcdpos(1,0);
- display_n("PassWord again");
- delayx(2000);
- lcdpos(0,0);
- write_com(0x0f);//显示光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n("In New PassWord");
- if(input_mima(mima_3)) //处理输入密码
- {
- if(mimaduibi(mima_2,mima_3)) //密码正确
- {
- lcdpos(0,0);
- write_com(0x0c);
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n("Change PassWord");
- lcdpos(1,0);
- display_n(" SUCCESSFULLY ");
- ERASE(address);
- for(i=0;i<6;i++)
- { Write_ISP (address+i, mima_3[i]);}//把修改的密码存进内部rom
- delayx(2000);
- flag_change = 0;
- }
- else //密码 不正确
- {
- lcdpos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密码不正确报警
- }
- flag_change = 0;
- }
- }
- else //密码没有输入正确或完成
- {
- lcdpos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密码不正确报警
- }
- }
-
- }
- else //密码没有输入正确或完成
- {
- lcdpos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n("PassWord Error");
- delayx(1000);
- flag_change = 0;
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密码不正确报警
- }
- }
-
- }
- }
- else //密码 不正确
- {
- lcdpos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密码不正确报警
- }
- }
- }
- else //密码没有输入正确或完成
- {
- lcdpos(0,0);
- write_com(0x0c); //关光标
- write_com(0x06);//写一个字符后地址指针加 1
- write_com(0x01);//显示清零,数据指针清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密码不正确报警
- }
- }
- }
- break;
- case C: if(flag==0)
- {
- guan();
- flag=1;
- }
- break;
- default:
- break;
- }
- }
- void main()
- {
- init();
-
- while(1)
- {
-
- mima();
-
- /* lcdpos(0,1);
- display1(scan());// *///测试矩阵键盘程序 键盘必须改成‘1’字符形式
- }
-
- }
- void timer0() interrupt 1 //定时器0中断, 背光// 自锁
- {
- TH0 = 0x4c;//50ms定时
- TL0 = 0x00;
- num++;
- if(num ==600)//30s时间到
- {
- num = 0;
- flag_bg=1;
- }
- }
- void counter(void) interrupt 2
- {
- if(flag==0)
- {
- flag=1;
- TR0 = 0;
- flag_h=0;
- m=0;
- //guan(); 有1个警告 所以不在此调用关锁函数
- }
- }
- /***************因两个定时器工作要考虑优先级********/
- /*************定时不准*****************************/
- /*********所以用了一个定时器**********************/
复制代码
|
评分
-
查看全部评分
|