基于51单片机的多功能电子密码锁

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

#includereg52.h#defineuintunsignedint#defineucharunsignedchar#defineKEYP3//键盘输入端口#defineNo_key20//无按键时的返回值#definelcddataP2//1602的数据输入端口sbitlcden=P1^2;sbitlcdrs=P1^0;sbitlcdrw=P1^1;sbitlight=P1^3;sbitlight1=P1^4;ucharj;//用来统计输入个数的全局变量ucharaa;//用来在定时器中计数的全局变量ucharcodetable[]=Hello!;ucharcodetable1[]=OK!;ucharcodetable2[]=Enterplease:;ucharcodekey_table[16]={1,2,3,10,4,5,6,11,7,8,9,12,0,13,14,15};ucharpassword[]={2,0,1,0,9,3};//设定初始密码ucharsave[6];//保存输入的数据ucharconflag;//确认标志ucharlockflag;//锁键盘标志ucharstartflag;//开始标志voiddelay(uintz);//延时子函数voidwright_com(ucharcom);//写指令函数voidwright_data(uchardate);//写数据函数voidinit();//初始化voiddisplay_OK();//显示OKvoiddelete();//删除输入的最后一个数ucharkeyscan();//带返回值的键盘扫描程序voidenter_code(uchart);//输入密码函数,把输入的数据存入数组中并在屏幕上显示相应的东西,voidconfirm();//确认密码对不对,把输入的数据与密码逐一对比,完全一样刚正确,voidsucceed_an();//输入密码成功时的响应,voidfail_an();//输入密码失败时响应voidlockkey();//锁键盘三秒voidalarm();//发出警报声voidreset();//复位函数voiddisplay_enter();//显示输入voidmain(void){uchartemp;init();while(1){if(lockflag){temp=keyscan();//锁键期间也要进行键盘扫描if(temp!=No_key)//重新记时三秒{aa=0;//重新在定时器中计数}}else{temp=keyscan();//反复扫描输入,等待随时输入if(temp!=No_key)//有按键按下才进行下面的操作{if(temp==10){reset();startflag=1;//开始标志置位}if(startflag){enter_code(temp);//每扫描一次键盘就要进行一次处理,保存输入的数值if(temp==13)//按下确认键盘就要进行密码确认{confirm();//进行确认判断if(conflag)//密码确认为正确{succeed_an();//密码正确,作出相应的反应}else{fail_an();//密码错误,作相应反应}}if(temp==14){delete();//作删除操作}}}}}}/******显示enter********/voiddisplay_enter(){ucharnum;wright_com(0x80);for(num=0;num13;num++){wright_data(table2[num]);}}/******显示OK********/voiddisplay_OK(){ucharnum;wright_com(0x80);for(num=0;num13;num++){wright_data(table1[num]);}}/******删除最后一个********/voiddelete(){wright_com(0x80+0x40+j);//确定删除对象wright_data('');//显示空格即为删除save[--j]=0;//删除后数据清零wright_com(0x80+0x40+j);//为下次输入数据时写好位置,必须是在最后一个后面}/******对各种变量进行复位********/voidreset(){ucharnum;display_enter();wright_com(0x80+0x40);//擦除屏幕上的显示for(num=0;num6;num++){save[num]=0;//对输入的数值进行清零wright_data('');//显示的是空格}wright_com(0x80+0x40);//下次再输入时可以又从起始位置输入lockflag=0;//各种变量要清零回起始状态conflag=0;j=0;}/******输入密码正确进行响应********/voidsucceed_an(){light=0;//灯亮display_OK();//显示成功delay(1000);light=1;//灯灭}/******输入密码错误进行响应********/voidfail_an(){alarm();lockkey();}/******发出警报声**********/voidalarm()//这个以后再扩展它{}/******锁键盘三秒************/voidlockkey(){lockflag=1;}/******输入密码并在屏幕上显示星号******/voidenter_code(uchart){if(t=0&&t10){if(j==0){wright_com(0x80+0x40);//第一输入时要先写入地址指令,否则无法显示wright_data('*');}else{wright_data('*');//不是第一个输入则不用再写地址}save[j++]=t;//保存输入的数据}}/******校对密码以确定是不是正确的**********/voidconfirm(){uchark;for(k=0;k6;k++){if(password[k]!=save[k])//对数组中的内容进行逐一比较,一旦有数据不对马上退出循环{break;}}if(k==6)//要是条件退出的话说明六个数全对密码{conflag=1;//进行标志密码正确}}/******中断服务程序**********/voidtimer0()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;//重装初值if(lockflag){aa++;light1=0;if(aa=60)//三秒到了{aa=0;//清零可以方便下次再使用light1=1;//关闭警报lockflag=0;//标志清零解除键锁,方便下次使用}}}/******初始化***********/voidinit(){ucharnum;/*****定时器初始化****/TMOD=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;EA=1;//开启总中断TR0=1;//把定时器关闭/****1602初始化******/lcdrw=0;//这个必须要置零,否则无法正常显示lcden=0;wright_com(0x38);//初始化wright_com(0x0c);//打开光标0x0c不显示光标0x0e光标不闪,0x0f光标闪wright_com(0x01);//清显示wright_com(0x80);for(num=0;num9;num++){wright_data(table[num]);delay(1);}}/******1602写入指令************/voidwright_com(ucharcom){lcdrs=0;lcddata=com;delay(1);lcden=1;delay(1);lcden=0;}/******1602写入数据***********/voidwright_data(uchardate){lcdrs=1;lcddata=date;delay(1);lcden=1;delay(1);lcden=0;}/******延时函数************/voiddelay(uintz){uintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}/**********4x4矩阵键盘扫描函数*********/ucharkeyscan(){uchartemp,num=No_key;//num的初值要为无键盘按下时的返回值/*********扫描第一行****************/KEY=0xfe;temp=KEY;temp=temp&0xf0;//读出高四位while(temp!=0xf0){delay(5);//延时消抖temp=KEY;temp=temp&0xf0;while(temp!=0xf0)//确认确实有按键按下{temp=KEY;switch(temp)//根据这八个电平可以确定是哪个按键按下{case0xee:num=1;break;case0xde:num=2;break;case0xbe:num=3;break;case0x7e:num=10;break;}while(temp!=0xf0)//等待松手{temp=KEY;temp=temp&0xf0;}}}/*********扫描第二行***************/KEY=0xfd;temp=KEY;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=KEY;temp=temp&0xf0;while(temp!=0xf0){temp=KEY;switch(temp){case0xed:num=4;break;case0xdd:num=5;break;case0xbd:num=6;break;case0x7d:num=11;break;}while(temp!=0xf0){temp=KEY;temp=temp&0xf0;}}}/*********扫描第三行****************/KEY=0xfb;temp=KEY;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=KEY;temp=temp&0xf0;while(temp!=0xf0){temp=KEY;switch(temp){case0xeb:num=7;break;case0xdb:num=8;break;case0xbb:num=9;break;case0x7b:num=12;break;}while(temp!=0xf0){temp=KEY;temp=temp&0xf0;}}}/*********扫描第四行****************/KEY=0xf7;temp=KEY;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=KEY;temp=temp&0xf0;while(temp!=0xf0){temp=KEY;switch(temp){case0xe7:num=0;break;case0xd7:num=13;break;case0xb7:num=14;break;case0x77:num=15;break;}while(temp!=0xf0){temp=KEY;temp=temp&0xf0;}}}returnnum;}当输入密码时,只显示“*”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用绿色LED发光二极管亮一秒钟做为提示,;若密码不正确,禁止按键输入3秒,同时绿色发光二极管亮;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功