基于51单片机的多功能电子密码锁_第1页
基于51单片机的多功能电子密码锁_第2页
基于51单片机的多功能电子密码锁_第3页
基于51单片机的多功能电子密码锁_第4页
基于51单片机的多功能电子密码锁_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 . . . #include <reg52.h>#define uint unsigned int#define uchar unsigned char#define KEY P3      /键盘输入端口#define No_key 20    /无按键时的返回值#define lcddata P2   /1602的数据输入端口sbit   lcden= P12;sbit   lcdrs= P10;sbit   lcdr

2、w= P11;sbit   light= P13;sbit   light1= P14;uchar j ; /用来统计输入 个数的全局变量uchar aa; /用来在定时器中计数的 全局变量 uchar code table= " Hello!"uchar code table1=" OK!       " ;uchar code table2="Enter please:"   ;uchar code key_ta

3、ble16 =              1,2,3,10,    4,5,6,11,    7,8,9,12,    0,13,14,15      ;uchar password=2,0,1,0,9,3 ;   /设定初始密码uchar save6;      &#

4、160;  /保存输入的数据uchar conflag ;                   /确认标志uchar lockflag;      /锁键盘标志uchar startflag;     /开始标志      void delay(uint z);

5、0;                       /延时子函数void wright_(uchar );               /写指令函数void wright_data(uchar date) ;   

6、;   /写数据函数void init();                          /初始化void display_OK();        / 显示OKvoid delete();     &#

7、160;  /删除输入的最后一个数uchar keyscan() ;      /带返回值的键盘扫描程序void enter_code(uchar t);       /输入密码函数,把输入的数据存入数组中并在屏幕上显示相应的东西,void   confirm();     /确认密码对不对,把输入的数据与密码逐一对比,完全一样刚正确,void   succeed_an();  

8、;  /输入密码成功时的 响应,void    fail_an();     /输入密码 失败时 响应 void    lockkey();     /锁键盘三秒void    alarm();    /发出警报声void   reset();      /复位函数void   display_enter()

9、;    /显示输入void main(void)    uchar temp;   init();    while(1)              if(lockflag)           temp=keyscan();   / 锁键期间也要进行键盘扫描

10、0;    if(temp!=No_key) /重新记时三秒                        aa=0;    /重新在定时器中计数                

11、    else               temp=keyscan();   /反复扫描输入,等待随时输入                    if(temp!=No_key) /有按键按下才进行下面的操作   &

12、#160;              if(temp=10)                reset();         startflag=1; /开始标志置位        

13、0;      if(startflag)                        enter_code(temp);   /每扫描一次键盘就要进行一次处理,保存输入的数值            

14、;      if(temp=13)   /按下确认键盘就要进行密码确认                         confirm();    /进行确认判断         

15、0;    if(conflag)       /密码确认为正确                           succeed_an();    /密码正确,作出相应的反应    &#

16、160;                   else                           fail_an();   /密码错误,作相应反应 &

17、#160;                                          if(temp=14)        

18、;            delete();     /作删除操作                                    &

19、#160;                       /* 显示enter*/void   display_enter()    uchar num;   wright_(0x80);for(num=0;num<13;num+)      wright_data(tabl

20、e2num);   /* 显示OK*/void display_OK()    uchar num;wright_(0x80);for(num=0;num<13;num+)             wright_data(table1num);   /* 删除最后一个*/void delete()   wright_(0x80+0x40+j);   /确定删除对象wrig

21、ht_data(' ');     /显示空格即为删除save-j=0;      /删除后数据清零wright_(0x80+0x40+j);   /为下次输入数据时写好位置,必须是在最后一个后面/* 对各种变量进行复位*/void   reset()uchar num;display_enter();wright_(0x80+0x40);   /擦除屏幕上的显示for(num=0;num<6;num+) 

22、0;    savenum=0;    /对输入的数值进行清零   wright_data(' '); /显示的是空格   wright_(0x80+0x40);   /下次再输入时可以又从起始位置输入lockflag=0;      /各种变量要清零回起始状态conflag=0;j=0;/* 输入密码正确进行响应*/void succeed_an()   light=0;   /灯亮 di

23、splay_OK(); /显示成功delay(1000);light=1;     /灯灭 /* 输入密码错误进行响应*/void    fail_an()   alarm();   lockkey();/* 发出警报声*/void    alarm()   /这个以后再扩展它    /*锁键盘三秒*/void    lockkey()   

24、60;  lockflag=1;/*输入密码并在屏幕上显示星号*/void enter_code(uchar t)if(t>=0&&t<10)             if(j=0)             wright_(0x80+0x40) ;    /第一输入时要先写入地址指令,否则无法显示   

25、;        wright_data('*') ;          else                        wright_data('*') ;/不是第一个输入则不用再写地址  

26、;             savej+=t;   /保存输入的数据    /*校对密码以确定是不是正确的*/void   confirm()uchar k;for(k=0;k<6;k+)      if(passwordk!=savek)    /对数组中的容进行逐一比较,一旦有数据不对马上退出循环      

27、       break;        if(k=6)      /要是条件退出的话说明六个数全对密码        conflag=1;   / 进行标志密码正确       /*中断服务程序*/void timer0() interrupt   1   

28、     TH0=(65536-50000)/256;TL0=(65536-50000)%256;    /重装初值if(lockflag)        aa+;   light1=0;         if(aa>=60)    /三秒到了      aa=0;   /

29、清零可以方便下次再使用    light1=1; /关闭警报    lockflag=0; /标志清零解除键锁,方便下次使用         /*初始化*/void init()    uchar num;   /*定时器初始化*/    TMOD=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;EA=1; /开启总中断TR0=1;

30、/把定时器关闭/*1602初始化*/lcdrw=0;     /这个必须要置 零,否则无常显示   lcden=0;wright_(0x38) ; /初始化 wright_(0x0c) ; /打开光标    0x0c不显示光标   0x0e光标不闪,0x0f光标闪wright_(0x01) ; /清显示wright_(0x80) ;for(num=0;num<9;num+)      wright_data(tablenum); 

31、  delay(1);   /*1602写入指令*/void wright_(uchar )   lcdrs=0;lcddata=;delay(1);lcden=1;delay(1);lcden=0;/*1602写入数据*/void wright_data(uchar date)   lcdrs=1;lcddata=date;delay(1);lcden=1;delay(1);lcden=0;/*延时函数*/void delay(uint z)   uint x,y;   for(x=

32、z;x>0;x-)      for(y=110;y>0;y-) ;/*4x4矩阵键盘扫描函数*/uchar keyscan()           uchar temp,num=No_key; /num的初值要为无键盘按下时的返回值/*扫描第一行*/    KEY=0xfe;    temp=KEY;    temp=temp&0xf0

33、;   /读出高四位    while(temp!=0xf0)                   delay(5);    /延时消抖      temp=KEY;      temp=temp&0xf0;   

34、0;  while(temp!=0xf0) /确认确实有按键按下                     temp=KEY;      switch(temp)     /根据这八个电平可以确定是哪个按键按下          &

35、#160;    case 0xee:num=1;         break;        case 0xde:num=2;         break;        case 0xbe:num=3;     &#

36、160;   break;        case 0x7e:num=10;         break;             while(temp!=0xf0)    /等待松手         

37、0;     temp=KEY;        temp=temp&0xf0;                           /*扫描第二行*/    KEY=0xfd;    temp

38、=KEY;    temp=temp&0xf0;    while(temp!=0xf0)           delay(5);      temp=KEY;      temp=temp&0xf0;      while(temp!=0xf0)   

39、                   temp=KEY;      switch(temp)               case 0xed:num=4;         brea

40、k;        case 0xdd:num=5;         break;        case 0xbd:num=6;         break;        case 0x7d:num=11; 

41、0;       break;             while(temp!=0xf0)               temp=KEY;        temp=temp&0xf0;   &

42、#160;                         /*扫描第三行*/    KEY=0xfb;    temp=KEY;    temp=temp&0xf0;    while(temp!=0xf0)      

43、     delay(5);      temp=KEY;      temp=temp&0xf0;      while(temp!=0xf0)             temp=KEY;      switch(temp) &#

44、160;             case 0xeb:num=7;         break;        case 0xdb:num=8 ;         break;       

45、 case 0xbb:num=9;         break;        case 0x7b:num=12;         break;             while(temp!=0xf0)               temp=KEY;        temp=temp&0xf0;                        

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论