找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3272|回复: 1
收起左侧

液晶显示数字密码锁程序设计

[复制链接]
ID:210077 发表于 2017-6-16 16:56 | 显示全部楼层 |阅读模式
字密码锁是二十一世纪制锁业的一次革命。锁的特点是不用钥匙、无锁孔、机械传动、不易损坏、不磨损、不易被破译、可多次更换密码、换号不换锁、一把锁多个密码,具有防拨、防砸、防撬、防堵等功能。安装门锁时不破坏原门的结构,避免用钥匙开启旋芯式锁具的一切烦恼(如丢、落、拆、堵门被反锁等)。 “数字密码锁”是利用数字密码来开启的锁具,其重复概率仅为十万分之一,有着很高的安全性;而旋芯式锁具使用不够安全。通过对社会各阶层千余人的调查,百分之百的人对目前身上挂着的串串钥匙无可奈何。但现在又没有一种锁具可摆脱钥匙的束缚。都愿意一身轻松没有任何顾虑的出入家门,都愿意用上一种既安全方便又不用钥匙的锁具。因此,“数字密码锁”产品的市场发展前景极为广阔。在调查的千余人中有60%的人有丢失钥匙的经历,25%的人有把钥匙反锁在室内的,75%的人居室在三层以上的,36%的人把钥匙忘在工厂的,有8%的人是利用邻居的阳台、窗户跳跃进入自己家来打开被反锁的房门,90%的人或听或看新闻得知有因无法打开房门,而冒险跃窗发生事故非死既伤,给家庭造成麻烦。精神和肉体的损伤是无法挽回的,为了解决上述各种数据给人们带来的各种烦恼,所以“数字密码锁”,使人们在无忧无虑的环境中生活

液晶显示密码锁结构原理图.png 0.png
单片机源程序如下:
  1. #include<reg52.h>            
  2. #include<math.h>               
  3. #include<intrins.h>              
  4. #define        uchar unsigned char      
  5. #define        uint unsigned int
  6. #define         data_IO P2

  7. sbit     rs=P3^0;        //指令和数据寄存器 “1是数据,” “0是指令”
  8. sbit     rw=P3^1;//读写控制,“1读” “0写”
  9. sbit          e=P3^2; //片选信号
  10. sbit      p=P2^7;
  11. sbit   deng=P3^3;///响音乐的端口
  12. sbit   md=P3^4;///修改密码时的灯


  13. uchar  pwflag;//密码是否正确的标志位
  14. uchar  count;//
  15. uchar  gg=0 ;//只有输入正确的密码才能修改密码
  16. uchar  cs=3 ;//输入密码的错误次数


  17. uchar m[]={1,2,3,4,5,6}; ///初始密码
  18. static uchar mbuf[6];///输入的密码


  19. char d[32]={' ','I','M','P','O','R','T',' ','C','I','P','H','E','R',':',' ',
  20.              ' ',' ','_',' ',' ','_','_','_','_','_','_',' ',' ',' ',' ',' '};//输入密码

  21. code  char ks[32]={'C','O','N','G','R','A','T','U','L','A','T','E',' ','Y','O','U',
  22.                           ' ','O','P','E','N','I','N','G',' ',' ','L','O','C','K','!',' '};////开锁

  23. code char cw[32]={' ','C','I','P','H','E','R',' ',' ','E','R','R','O','R',' ',' ',
  24.                               '~','~','~','~','~','~','~','~','~','~','~','~','~','~','~','~' };////错误         

  25. code char xc[32]={' ',' ','A','M','E','N','D',' ','S','U','C','C','E','E','D',' ',
  26.                   ' ',' ',' ',' ',' ','!','!','!','!','!','!',' ',' ',' ',' ',' '};//修改成功  

  27. code char xg[32]={' ','A','M','E','N','D',' ',' ','C','I','P','H','E','R',':',' ',
  28.                   ' ',' ',' ',' ',' ','_','_','_','_','_','_',' ',' ',' ',' ',' '};///修改密码*/


  29. void yanshi(uint n)///////////////延时函数///////////////////////////////////
  30. {
  31. uint i;
  32.   for(i=0;i<n;i++){};
  33. }

  34. void delay(uint n)///////////////延时函数///////////////////////////////////
  35. {
  36. uint i,j;
  37.   for(i=0;i<1000;i++)
  38.    {for(j=0;j<n;j++){}}
  39.    
  40. }

  41. void busy() ////////////////////判断是否忙////////////////////////////////////////
  42. {data_IO=0xff;
  43. rs=0; //写指令        ////////////////////
  44. rw=1; //表示读状态    // 三个的状态表示 //
  45. e=1;  //下降延//      // 判忙状态       //
  46. while(!p);         ////////////////////
  47. // e=0;
  48. }
  49. void xiezl(uchar shuju) /////////////////////*写指令*/////////////////////////////
  50. {
  51. busy();/*yanshi(6500);*/
  52. data_IO=shuju;
  53. rs=0; //写指令        ////////////////////
  54. rw=0; //表示写状态    // 三个的状态表示 //
  55. e=1;  //下降延//      // 写指令         //
  56. e=0;  /////////       ////////////////////

  57. }

  58. void w_dat(uint n)//////////////////写数据//////////////////////////
  59. {
  60. busy(); /*yanshi(6500) ;*/
  61.   data_IO=n;
  62.    rs=1; //写数据       ////////////////////
  63.    rw=0; //表示写状态    // 三个的状态表示 //
  64.    e=1;  //下降延//      //写数据         //
  65.    e=0;  /////////       ////////////////////
  66.   // return;
  67. }

  68. void xianshi(uchar js[]) //////////////////显示函数///////////////////////////////
  69. {
  70.   uchar h,v;
  71.   xiezl(0x01); //清屏显示
  72.   yanshi(2000) ;
  73.   xiezl(0x80); // DDRAM地址的设置
  74. for(h=0;h<16;h++)
  75.    {w_dat(js[h]);  ///n表示有写几位数据
  76.    yanshi(100) ;
  77.    }
  78.    xiezl(0xc0);//换行
  79. for(v=(16);v<32;v++)
  80.    {w_dat(js[v]);  ///n表示有写几位数据
  81.    yanshi(100) ;
  82.    }
  83. }

  84. void chushihua(void)///////////////////*液晶模块初始化*/
  85. { uchar i;
  86.    rs=0; //写指令
  87.    rw=0; //表示写状态
  88.    e=0;  //使能
  89.    for(i=0;i<3;i++)
  90.    {
  91.     xiezl(0x38);  //功能设置,8位,一行显示,5*7点阵
  92.     yanshi(1000);
  93.    }
  94.     xiezl(0x38); //两行显示
  95.     xiezl(0x0f); //显示开关控制位
  96.     xiezl(0x18); //移位控制,光标和显示一起左移  
  97.     xiezl(0x06); //设置输入模式
  98.     xiezl(0x01); //清屏显示
  99.     xiezl(0x80); // DDRAM地址的设置
  100.     }

  101. bit pwcmp(void)
  102. {
  103.         bit flag;
  104.         uchar i;
  105.         for (i=0;i<6;i++)
  106.         {
  107.                 if (m[i]==mbuf[i])   flag = 1;   //*密码正确*/
  108.                 else  {        flag = 0;  i=6; } //*密码错误*/
  109.         }
  110.         return(flag);
  111. }

  112. void gb(void)/////////转移光标
  113. {  uchar c;
  114.    xiezl(0xc0);//换行
  115.    yanshi(3000) ;
  116.    for(c=0;c<5;c++)
  117.    {w_dat(' ');///n表示有写几位数据
  118.     yanshi(2000) ;
  119.    }
  120. }
  121. uchar getkey(void)///得到键值
  122. { uchar h,l,k;
  123.   while(P1!=0x0f)
  124.   {
  125.    h=P1&0x0f;
  126.    P1=0xf0;
  127.    l=P1&0xf0;
  128.    k=h|l;
  129.    return(k);
  130.   }
  131. }


  132. void diaoyong(uchar i)///////////调用各键的函数//////输入密码
  133. {  uchar lq;
  134.          switch(i)
  135.             {
  136.           case 0x7e: if (count<6) { mbuf[count]=1; count++;  w_dat('*');}  break;  // 01111110       1
  137.           case 0xbe:  if (count<6) { mbuf[count]=2; count++;  w_dat('*');}  break;  // 10111110                 2
  138.           case 0xde: if (count<6) { mbuf[count]=3; count++;  w_dat('*');}  break;  // 11011110                 3
  139.           case 0xee:  if (count<6) { mbuf[count]=4; count++;  w_dat('*');}  break;  // 11101110                 4

  140.           case 0x7d:  if (count<6) { mbuf[count]=5; count++;  w_dat('*');}  break;  // 01111101                 5
  141.           case 0xbd:  if (count<6) { mbuf[count]=6; count++;  w_dat('*');} break; // 10111101                 6
  142.           case 0xdd: if (count<6) { mbuf[count]=7; count++;  w_dat('*');}  break;  // 11011101                 7
  143.           case 0xed: if (count<6) { mbuf[count]=8; count++;  w_dat('*');} break;  // 11101101                 8

  144.           case 0x7b:  if (count<6) { mbuf[count]=9; count++;  w_dat('*');}  break;  // 01111011                 9
  145.           case 0xbb:  if (count<6) { mbuf[count]=0; count++;  w_dat('*');} break;  // 10111011                 0
  146.           case 0xdb: if (count==6) { pwflag = pwcmp();}   else  pwflag = 0;// 只有输入6个密码后按确认键才作密码比较
  147.                                    if(pwflag) {deng=0; xianshi(ks);gg=1; }   else { cs--;deng=1; xianshi(cw); delay(200); xianshi(d);gb();count = 0; }
  148.                                     break;  // 11011011                 a           
  149.           case 0xeb:  count = 0;deng=1; xianshi(d);  gb();gg=0;         /*取消键*/
  150.                                break;  // 11101011                 b         

  151.           case 0x77: if(gg==1){ count=0;xianshi(xg); gb();} //修该密码
  152.                                break;  // 01110111                 c
  153.          
  154.                   case 0xb7: if((count==6)&&(gg==1)) { count=0;
  155.                   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;}//保存密码
  156.                                break;  // 10110111                 d
  157.           /*case 0xd7: sr[jm]='e'; break;  // 11010111                 e
  158.             case 0xe7: sr[jm]='f'; break;  // 11100111                 f        */

  159.           default: break;
  160. ……………………

  161. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
程序.zip (33.66 KB, 下载次数: 25)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:36173 发表于 2017-6-16 21:14 | 显示全部楼层
谢谢分享,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表