|
单片机1602密码锁程序仿真
目 录
第1节 引言…………………………………………………………………………1
1.1 电子密码锁述……………………………………………………………1
1.2 本设计主要任务…………………………………………………………1
1.3 系统主要功能……………………………………………………………2
第2节 系统硬件设计………………………………………………………………3
2.1 系统的硬件构成及功能 …………………………………………………3
2.2 AT89C2051单片机及其引脚说明………………………………………3
第3节 系统软件设计………………………………………………………………5
3.1 系统主程序设计(流程图)……………………………………………5
3.2 软件设计思想……………………………………………………………5
3.3 储单元的分配……………………………………………………………5
3.4 系统源程序………………………………………………………………6
3.5 系统应用说明……………………………………………………………9
3.6 小结………………………………………………………………………9
结束语……………………………………………………………………10
参考文献 ………………………………………………………………………11
附录 ……………………………………………………………………………12
本设计主要任务
(1)共8位密码,每位的取值范围为1~8。
(2)用户可以自行设定和修改密码。
(3)按每个密码键时都有声、光提示。
(4)若键入的8位开锁密码不完全正确,则报警5秒钟,以提醒他人注意。
(5)开锁密码错3次要报警10分钟,报警期间输入密码无效,以防窃贼多次试探密码。
(6)键入的8位开锁密码完全正确才能开锁,开锁时要有1秒的提示音。
(7)密码键盘上只允许有8个密码按键和1个发光管。锁内有备用电池,只有内部上电复位时才能设置或修改密码,因此,仅在门外按键是不能修改或设置密码的。
(8)密码设定完毕后要有2秒的提示音。
以上是初步设定的电子密码锁的主要功能。
单片机源程序如下:
- #include"reg51.h"
- #include"key.h"
- #include"lcd.h"
- uchar code show_0[]="Please input the password:";
- uchar code show_1[]="The mima is:" ;
- uchar code show_2[]="********";
- uchar code show_3[]="The password is wrong!";
- uchar code show_4[]="This is delay 5s";
- uchar code show_5[]="Please zai shu yici!";
- uchar code show_6[]="you are right!";
- uchar code show_7[]="Please input the new mima:";
- uchar code show_8[]="Input it again!";
- uchar code show_9[]="Establishes successful! ";
- uchar code show_10[]="(^_^)";
- uchar code show_11[]="shuru guanliyuan mima";
- uchar code show_12[]="chao shi baojing";
- sbit baojing = P1^1;
- sbit jidianqi=P1^0;
- int k;
- //蜂鸣器
- void beep() //????????
- { uchar i;
- for(i=0;i<10;i++)
- {
-
- delay(10); //??10??
- baojing =! baojing;
- delay(10); //??10??
- }
- }
-
-
- void play(uchar *j,uchar q) //K是显示的个数,j是地址
- {
- uchar i;
- for(i=0;i<q;i++)
- {
- dat_w(*(j+i));
- delay(20);
- }
- }
- time0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- k++;
-
- if(k>=(20*60*3))
- { k=0;
- //jidianqi=0;
- beep();
- clear();
- gotoxy(1,0);
- play(show_12,16);
- gotoxy(2,0);
- play(show_12+17,10);
- }
-
- }
- void main()
- { uchar init_pswd[]={0,0,0,0,0,0,0,0};
- uchar guanli_pswd[]={8,8,8,8,8,8,8,8};
- uchar pswd[8]={0};
- uchar pswd_1[8]={0};
- uchar j=0,i=0,sum_1=0,g=0;
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- //beep();
- loop:init();
- i=0;sum_1=0;
- clear();
- gotoxy(1,0);
- play(show_0,16);
- gotoxy(2,0);
- play(show_0+17,10);
- /****密码输入****/
- do
- {
- key();
- }
- while(ki!=15);
-
- TR0=1;//定时器开始计时,超时报警
- clear();
- gotoxy(1,0);
- play(show_1,13);
- do
- {
- flag=0;
- key();
-
- gotoxy(2,0);
- if(flag==1&&ki<=9)
- {
- pswd[i]=ki;
- i++;
- play(show_2,i);
-
- }
- }
- while(i<=7);
- for(i=0;i<=7;i++)
- {
- sum_1=init_pswd[i]-pswd[i]+sum_1;//比较密码是否正确
-
- }
-
- if(sum_1==0)
- {
-
- clear();
- gotoxy(1,0);
- play(show_6,15);
- jidianqi=0;
- //beep();
- //TR0=0; //密码正确打开继电器,关闭计时器
- do
- {
- key();
- }
- while(ki!=13);
- jidianqi=1;
- loop1:clear();
- gotoxy(1,0);
- play(show_7,13);
- gotoxy(2,0);
- play(show_7+13,13);
- /****第一次输密码***/
- i=0;
- do
- {
- flag=0;
- key();
- if(flag==1&&ki<=9)
- {
- pswd[i]=ki;
- i++;
- clear();
- gotoxy(1,0);
- play(show_2,i);
- }
- }while(i<=7);
- clear();
- gotoxy(1,0);
- play(show_8,15);
- /***第二次输密码****/
- i=0;
- sum_1=0;
- do
- {
- flag=0;
- key();
- if(flag==1&&ki<=9)
- {
- pswd_1[i]=ki;
- i++;
- clear();
- gotoxy(1,0);
- play(show_2,i);
- }
- }
- while(i<=7);
- for(i=0;i<=7;i++)
- {
- sum_1=sum_1+ pswd_1[i]-pswd[i];
- }
- if(sum_1==0)
- {
- clear();
- gotoxy(1,2);
- play(show_9,12);
- gotoxy(2,2);
- play(show_9+13,11);
- for(i=0;i<=7;i++)
- {
- init_pswd[i]=pswd[i];
- }
- goto loop ;
- }
- if(sum_1!=0)
- {
- clear();
- goto loop1;
- }
- }
- if(sum_1!=0)//密码不正确e
- {
- clear();
-
- j++;//统计输错次数
- if(j==3)
- {
- clear();
-
- beep();//三次输入密码失败,报警
-
-
- while(g==0)
- {
- clear();
- gotoxy(1,0);
- play(show_11,15);
- gotoxy(2,0);
- play(show_11+15,6);
- i=0;sum_1=0;
- do
- {
- flag=0;
- gotoxy(2,7);
- key();
- //beep();
-
-
- if(flag==1&&ki<=9)
- {
- pswd[i]=ki;
- i++;
- play(show_2,i);
-
- }
- }
- while(i<=7);
- for(i=0;i<=7;i++)
- {
- sum_1=guanli_pswd[i]-pswd[i]+sum_1;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
电子密码锁1602液晶显示资料.zip
(446.83 KB, 下载次数: 103)
|
|