数字密码锁是二十一世纪制锁业的一次革命。锁的特点是不用钥匙、无锁孔、机械传动、不易损坏、不磨损、不易被破译、可多次更换密码、换号不换锁、一把锁多个密码,具有防拨、防砸、防撬、防堵等功能。安装门锁时不破坏原门的结构,避免用钥匙开启旋芯式锁具的一切烦恼(如丢、落、拆、堵门被反锁等)。 “数字密码锁”是利用数字密码来开启的锁具,其重复概率仅为十万分之一,有着很高的安全性;而旋芯式锁具使用不够安全。通过对社会各阶层千余人的调查,百分之百的人对目前身上挂着的串串钥匙无可奈何。但现在又没有一种锁具可摆脱钥匙的束缚。都愿意一身轻松没有任何顾虑的出入家门,都愿意用上一种既安全方便又不用钥匙的锁具。因此,“数字密码锁”产品的市场发展前景极为广阔。在调查的千余人中有60%的人有丢失钥匙的经历,25%的人有把钥匙反锁在室内的,75%的人居室在三层以上的,36%的人把钥匙忘在工厂的,有8%的人是利用邻居的阳台、窗户跳跃进入自己家来打开被反锁的房门,90%的人或听或看新闻得知有因无法打开房门,而冒险跃窗发生事故非死既伤,给家庭造成麻烦。精神和肉体的损伤是无法挽回的,为了解决上述各种数据给人们带来的各种烦恼,所以“数字密码锁”,使人们在无忧无虑的环境中生活
单片机源程序如下:
- #include<reg52.h>
- #include<math.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define data_IO P2
- sbit rs=P3^0; //指令和数据寄存器 “1是数据,” “0是指令”
- sbit rw=P3^1;//读写控制,“1读” “0写”
- sbit e=P3^2; //片选信号
- sbit p=P2^7;
- sbit deng=P3^3;///响音乐的端口
- sbit md=P3^4;///修改密码时的灯
- uchar pwflag;//密码是否正确的标志位
- uchar count;//
- uchar gg=0 ;//只有输入正确的密码才能修改密码
- uchar cs=3 ;//输入密码的错误次数
- uchar m[]={1,2,3,4,5,6}; ///初始密码
- static uchar mbuf[6];///输入的密码
- char d[32]={' ','I','M','P','O','R','T',' ','C','I','P','H','E','R',':',' ',
- ' ',' ','_',' ',' ','_','_','_','_','_','_',' ',' ',' ',' ',' '};//输入密码
- code char ks[32]={'C','O','N','G','R','A','T','U','L','A','T','E',' ','Y','O','U',
- ' ','O','P','E','N','I','N','G',' ',' ','L','O','C','K','!',' '};////开锁
- code char cw[32]={' ','C','I','P','H','E','R',' ',' ','E','R','R','O','R',' ',' ',
- '~','~','~','~','~','~','~','~','~','~','~','~','~','~','~','~' };////错误
- code char xc[32]={' ',' ','A','M','E','N','D',' ','S','U','C','C','E','E','D',' ',
- ' ',' ',' ',' ',' ','!','!','!','!','!','!',' ',' ',' ',' ',' '};//修改成功
- code char xg[32]={' ','A','M','E','N','D',' ',' ','C','I','P','H','E','R',':',' ',
- ' ',' ',' ',' ',' ','_','_','_','_','_','_',' ',' ',' ',' ',' '};///修改密码*/
- void yanshi(uint n)///////////////延时函数///////////////////////////////////
- {
- uint i;
- for(i=0;i<n;i++){};
- }
- void delay(uint n)///////////////延时函数///////////////////////////////////
- {
- uint i,j;
- for(i=0;i<1000;i++)
- {for(j=0;j<n;j++){}}
-
- }
- void busy() ////////////////////判断是否忙////////////////////////////////////////
- {data_IO=0xff;
- rs=0; //写指令 ////////////////////
- rw=1; //表示读状态 // 三个的状态表示 //
- e=1; //下降延// // 判忙状态 //
- while(!p); ////////////////////
- // e=0;
- }
- void xiezl(uchar shuju) /////////////////////*写指令*/////////////////////////////
- {
- busy();/*yanshi(6500);*/
- data_IO=shuju;
- rs=0; //写指令 ////////////////////
- rw=0; //表示写状态 // 三个的状态表示 //
- e=1; //下降延// // 写指令 //
- e=0; ///////// ////////////////////
- }
- void w_dat(uint n)//////////////////写数据//////////////////////////
- {
- busy(); /*yanshi(6500) ;*/
- data_IO=n;
- rs=1; //写数据 ////////////////////
- rw=0; //表示写状态 // 三个的状态表示 //
- e=1; //下降延// //写数据 //
- e=0; ///////// ////////////////////
- // return;
- }
- void xianshi(uchar js[]) //////////////////显示函数///////////////////////////////
- {
- uchar h,v;
- xiezl(0x01); //清屏显示
- yanshi(2000) ;
- xiezl(0x80); // DDRAM地址的设置
- for(h=0;h<16;h++)
- {w_dat(js[h]); ///n表示有写几位数据
- yanshi(100) ;
- }
- xiezl(0xc0);//换行
- for(v=(16);v<32;v++)
- {w_dat(js[v]); ///n表示有写几位数据
- yanshi(100) ;
- }
- }
- void chushihua(void)///////////////////*液晶模块初始化*/
- { uchar i;
- rs=0; //写指令
- rw=0; //表示写状态
- e=0; //使能
- for(i=0;i<3;i++)
- {
- xiezl(0x38); //功能设置,8位,一行显示,5*7点阵
- yanshi(1000);
- }
- xiezl(0x38); //两行显示
- xiezl(0x0f); //显示开关控制位
- xiezl(0x18); //移位控制,光标和显示一起左移
- xiezl(0x06); //设置输入模式
- xiezl(0x01); //清屏显示
- xiezl(0x80); // DDRAM地址的设置
- }
- bit pwcmp(void)
- {
- bit flag;
- uchar i;
- for (i=0;i<6;i++)
- {
- if (m[i]==mbuf[i]) flag = 1; //*密码正确*/
- else { flag = 0; i=6; } //*密码错误*/
- }
- return(flag);
- }
- void gb(void)/////////转移光标
- { uchar c;
- xiezl(0xc0);//换行
- yanshi(3000) ;
- for(c=0;c<5;c++)
- {w_dat(' ');///n表示有写几位数据
- yanshi(2000) ;
- }
- }
- uchar getkey(void)///得到键值
- { uchar h,l,k;
- while(P1!=0x0f)
- {
- h=P1&0x0f;
- P1=0xf0;
- l=P1&0xf0;
- k=h|l;
- return(k);
- }
- }
- void diaoyong(uchar i)///////////调用各键的函数//////输入密码
- { uchar lq;
- switch(i)
- {
- case 0x7e: if (count<6) { mbuf[count]=1; count++; w_dat('*');} break; // 01111110 1
- case 0xbe: if (count<6) { mbuf[count]=2; count++; w_dat('*');} break; // 10111110 2
- case 0xde: if (count<6) { mbuf[count]=3; count++; w_dat('*');} break; // 11011110 3
- case 0xee: if (count<6) { mbuf[count]=4; count++; w_dat('*');} break; // 11101110 4
- case 0x7d: if (count<6) { mbuf[count]=5; count++; w_dat('*');} break; // 01111101 5
- case 0xbd: if (count<6) { mbuf[count]=6; count++; w_dat('*');} break; // 10111101 6
- case 0xdd: if (count<6) { mbuf[count]=7; count++; w_dat('*');} break; // 11011101 7
- case 0xed: if (count<6) { mbuf[count]=8; count++; w_dat('*');} break; // 11101101 8
- case 0x7b: if (count<6) { mbuf[count]=9; count++; w_dat('*');} break; // 01111011 9
- case 0xbb: if (count<6) { mbuf[count]=0; count++; w_dat('*');} break; // 10111011 0
- case 0xdb: if (count==6) { pwflag = pwcmp();} else pwflag = 0;// 只有输入6个密码后按确认键才作密码比较
- if(pwflag) {deng=0; xianshi(ks);gg=1; } else { cs--;deng=1; xianshi(cw); delay(200); xianshi(d);gb();count = 0; }
- break; // 11011011 a
- case 0xeb: count = 0;deng=1; xianshi(d); gb();gg=0; /*取消键*/
- break; // 11101011 b
- case 0x77: if(gg==1){ count=0;xianshi(xg); gb();} //修该密码
- break; // 01110111 c
-
- case 0xb7: if((count==6)&&(gg==1)) { count=0;
- for (lq=0;lq<6;lq++){ m[lq]=mbuf[lq]; yanshi(10000);} md=1; xianshi(xc); delay(200); xianshi(d);yanshi(2000);gb();yanshi(200);gg=0;}//保存密码
- break; // 10110111 d
- /*case 0xd7: sr[jm]='e'; break; // 11010111 e
- case 0xe7: sr[jm]='f'; break; // 11100111 f */
- default: break;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
程序.zip
(33.66 KB, 下载次数: 25)
|