找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11767|回复: 56
收起左侧

51单片机做的电子密码锁(带仿真文件液晶显示)

  [复制链接]
ID:51269 发表于 2013-6-26 01:23 | 显示全部楼层 |阅读模式
我花了一整天做了这个小玩意,然后又花了10分钟发到51hei论坛,分享给51hei的网友,第一次做这个。。小弟新手,代码也很简单给论坛的朋友们分享下。。
(打算这星期去实验室把实物做出来,这周末更新额。。)
小提示:(小弟新手额,有提示不对的地方望大神指出 )
一:大家用多文件编译的时候得多注意点
      (例如:  .h与.c文件的配对,以及.h的规定格式#ifndef_1602_  #define_1602_  ........................#endif,
                      在其他文件中调用别忘了extern前缀。eg:在文件1中定义了一个全局变量 unsigned int table[10];在文件2中使用
                              extern unsigned int table[10];
                       其他文件中的函数要记得定义,方法为void kay_scan();   注意分号。。。具体的可以买书看看)
二:说下制作的过程中得注意的问题
         1.键盘扫描中记录键盘按下的次数,这个很关键得好好把握,在必要的时候也得清零。一开始我也纠结了很久
         2.设置密码与输入密码数组的存储问题,因为在密码对比的时候用到两个数组所以在
            键盘服务程序中要看情况分别将键盘输入的密码写入不同的数组中。
         4.其他的一些小细节就不说了代码的具体备注很详细
            {:1:}下面的图片也有些阅读提示。。。。
154648wfzhe3lzeraqhagp.png.thumb.jpg
154649urezpkk0pi0r7ve4.png.thumb.jpg
154652ffo9d43xn4xhbxjh.png.thumb.jpg

154708ui48h4phmny10pzc.png.thumb.jpg
  1. /**************************************************************** ***************   
  2. 阅读提示:1.所有的数组以   名字_功能_pad[]
  3.                                  例如code_intput_pad[];   为密码输入数组
  4.                  2.所有的函数以           类型_功能_名字()
  5.                               例如desplay_set_code();   为密码设置函数
  6.                                           desplay_input_code(); 为密码输入函数
  7.                  3.调用函数大家可以多用局部变量方便,空间占用又少
  8.                  (以上名字方式纯属本人自己感到合适的,大家也可以用适合自己的方式,但是
  9.                   不管是什么样的命名方式都得有一套方式,这样做一个比较复杂的程序方便点)
  10.                  4.由于小弟第一次用这种方式写代码,所以在写这个程序中也有些地方没注意;
  11.                          给大家带来不便请谅解。                        
  12.                  5.广告王,这里也插播下吧
  13.                    单片机交流群--best单片机交流群,欢迎你的加入一起学习交流
  14. *********************************************************************************/
  15. #include
  16. #include"delay.h"
  17. #include"1602.h"
  18. #define uint unsigned int
  19. #define uchar unsigned char
  20. #define port_key P1                                                  //矩阵键盘输入口
  21. uchar key_num;                                                                //键盘扫描读回值须为全局变量
  22. uchar keypad[]={0xfe,0xfd,0xfb,0xf7};           //键盘扫描分别将各行置0
  23. uchar code_new_pad[6]={1,1,1,1,1,' '};                //6位的设置密码存储‘ ’用来判断是否输入第六位密码
  24. uchar code_input_pad[6]={1,1,1,1,1,' '};                //用来存储输入的密码
  25. sbit buzzer=P2^7;                                                        //buzzzer接口
  26. sbit led_r=P2^3;                                                
  27. sbit led_l=P2^4;
  28. bit key_pd=0;                                        //按键标志
  29. bit code_compare=0;                                //密码对比标志
  30. uint key_time=0;               //记录键盘按下的次数
  31. uchar temp=0;
  32. void init_T1()                                           //定时器1初始化         利用定时器提高键盘的扫描速度
  33. {
  34.         EA=1;
  35.         ET1=1;
  36.         TMOD=0x10;                                           //定时器工作方式选择16位定时
  37.         TH1=(65536-1000)/256;                  //定时器高八位
  38.         TL1=(65536-1000)%256;                 //定时器低八位
  39.         TR1=1;                                                //开启定时器1
  40. }


  41. void play_buzzer(uint j,uint k)                 //蜂鸣器
  42. {
  43.         uchar i=0;
  44.         for(j;j>0;j--)
  45.         {
  46.                 for(i=0;i<=100;i++)
  47.                 {
  48.                         buzzer=~buzzer;
  49.                         delayms(k);
  50.                 }
  51.         }        
  52. }


  53. uint key_scan()         //4*3矩阵键盘扫描
  54. {
  55.         uint i=0;
  56.         uchar key_temp;
  57.         for(i=0;i<4;i++)
  58.         {
  59.                 port_key=keypad[i];
  60.                 key_temp=port_key;
  61.                 key_temp=key_temp&0xf0;                  
  62.                 if(key_temp!=0xf0)        //判断是否有键盘被按下
  63.                 {
  64.                         delayms(15);     //延迟15ms,去除键盘的抖动
  65.                         key_temp=port_key;             //重新读回key_port的值
  66.                         key_temp=key_temp&0xf0;                 
  67.                         if(key_temp!=0xf0)                 //说明确实有键被按下
  68.                         {
  69.                                 key_temp=port_key;
  70.                                 key_pd=1;                   //键盘按下标志
  71.                                 key_time++;                        //键盘按下次数标志
  72.                                 switch(key_temp)
  73.                                 {
  74.                                         case 0xee: key_num=1+0x30;play_buzzer(2,50); break;                  //将数字转化为ASC
  75.                                         case 0xde: key_num=2+0x30;play_buzzer(2,50); break;
  76.                                         case 0xbe: key_num=3+0x30;play_buzzer(2,50); break;                 //以上3行代码为第一行扫描
  77.                                         case 0xed: key_num=4+0x30;play_buzzer(2,50); break;
  78.                                         case 0xdd: key_num=5+0x30;play_buzzer(2,50); break;
  79.                                         case 0xbd: key_num=6+0x30;play_buzzer(2,50); break;         //第二行扫描
  80.                                         case 0xeb: key_num=7+0x30;play_buzzer(2,50); break;
  81.                                         case 0xdb: key_num=8+0x30;play_buzzer(2,50); break;
  82.                                         case 0xbb: key_num=9+0x30;play_buzzer(2,50); break;           //第三行扫描
  83.                                         case 0xe7: key_num=10;play_buzzer(1,50);        break;                   //...10代表确定键
  84.                                         case 0xd7: key_num=0+0x30;play_buzzer(2,50); break;
  85.                                         case 0xb7: key_num=11;play_buzzer(1,50);        break;                //第四行扫描..11代表删除键                        
  86.                                 }
  87.                                 while(key_temp!=0xf0)                                //松手检测
  88.                                 {
  89.                                         key_temp=port_key;
  90.                                         key_temp=key_temp&0xf0;
  91.                                 }
  92.                         }
  93.                 }               
  94.         }
  95.         return key_num;        
  96. }


  97. void new_save_code()        //将设置密码存入code_new_pad
  98. {
  99.         if(key_time<=6)           //防止密码输入超过6位
  100.         {
  101.                 code_new_pad[key_time-1]=key_num;
  102.                 gotoxy(2,key_time-1);
  103.                 w_dat_lcd(code_new_pad[key_time-1]);
  104.         }
  105. }

  106. void input_save_code()        //将输入的密码存入code_input_pad
  107. {
  108.         if(key_time<=6)
  109.         {
  110.                 code_input_pad[key_time-1]=key_num;                 //注意key_time的控制须好好把握
  111.                 gotoxy(2,key_time-1);
  112.                 w_dat_lcd(code_input_pad[key_time-1]);               
  113.         }        
  114. }


  115. uint compare_code()   //输入密码与设置密码对比
  116. {
  117.         uint i=0;
  118.         for(i=0;i<6;i++)
  119.         {
  120.                 if(code_input_pad[i]==code_new_pad[i])
  121.                 {
  122.                         if(i==5)
  123.                                 code_compare=1;
  124.                         else continue;
  125.                 }
  126.                 else
  127.                 {
  128.                         code_compare=0;        
  129.                         break;                        //只要有一位密码不对就跳出循环
  130.                 }        
  131.         }
  132.         return code_compare;
  133. }


  134. void key_serve()                                //键盘服务程序
  135. {
  136.         if(key_pd==1)                                 //判断是否有键被按下
  137.         {
  138.                 key_pd=0;
  139.                 if(key_num==11)                         //是否按下删除键
  140.                 {
  141.                         gotoxy(2,key_time-2);
  142.                         w_dat_lcd(' ');                 //删除当前数字
  143.                         key_time=key_time-2;
  144.                 }
  145.                 else if(key_num==10&&temp==0)         //是否按下设置密码时的确定键
  146.                 {
  147.                         if(code_new_pad[5]!=' ')           //判断是否输入了第六个密码
  148.                         {                  
  149.                                 key_time=0;
  150.                                 w_com_lcd(0x01);                  //清屏指令
  151.                                 desplay_set_succ();        
  152.                                 delaylong(500);
  153.                                 desplay_input_code();
  154.                                 temp=1;         
  155.                         }                                                         
  156.                         else                                          //没有输入6位密码
  157.                         {
  158.                                 key_time=0;        
  159.                                 w_com_lcd(0x01);         
  160.                                 desplay_set_error();
  161.                                 delaylong(500);
  162.                                 desplay_set_code();                                                        
  163.                         }
  164.                 }
  165.                 else
  166.                 {
  167.                         if(temp==0)                        //利用temp的数值判断将键盘密码存入那个数组中                                 
  168.                                 new_save_code();
  169.                         else if(temp==1)
  170.                         {
  171.                                 input_save_code();
  172.                                 if(code_input_pad[5]!=' ')        //判断是否输入了6位密码
  173.                                 {
  174.                                         if(key_num==10)
  175.                                         {
  176.                                                 compare_code();           //密码判断函数
  177.                                                 if(code_compare==1)
  178.                                                 {        
  179.                                                         w_com_lcd(0x01);
  180.                                                         desplay_input_succ();
  181.                                                         led_r=1;
  182.                                                         play_buzzer(20,88);
  183.                                                 }
  184.                                                 else
  185.                                                 {
  186.                                                         w_com_lcd(0x01);
  187.                                                         desplay_input_error();
  188.                                                         led_l=1;
  189.                                                         play_buzzer(20,50);
  190.                                                         led_l=0;
  191.                                                         desplay_input_code();
  192.                                                         key_time=0;
  193.                                                 }
  194.                                         }               
  195.                                 }
  196.                         }
  197.                 }
  198.         }
  199. }

  200. void main()                  //主函数
  201. {
  202.         led_r=0;
  203.         led_l=0;        
  204.         init_lcd();
  205.         init_T1();
  206.         desplay_set_code();
  207.         for(;;)
  208.         {        
  209.                 key_serve();        
  210.         }
  211. }


  212. void timer1() interrupt 3          // 定时器1中断服务
  213. {
  214.         TH1=(65536-1000)/256;         
  215.         TL1=(65536-1000)%256;
  216.         key_scan();                                             //按键扫描程序放入中断提高扫描速度
  217. }



复制代码
电子密码锁.rar (110.47 KB, 下载次数: 579)
回复

使用道具 举报

ID:40961 发表于 2013-7-9 14:41 | 显示全部楼层
好好学习一下
回复

使用道具 举报

ID:51833 发表于 2013-7-17 21:05 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:52095 发表于 2013-7-21 18:39 | 显示全部楼层
好好学习 啊
回复

使用道具 举报

ID:52171 发表于 2013-7-23 18:59 | 显示全部楼层
下了,最近正好做这个,借鉴一下
回复

使用道具 举报

ID:52906 发表于 2013-8-10 16:55 | 显示全部楼层
太棒了   够我好好消化一段时间了
回复

使用道具 举报

ID:52966 发表于 2013-8-12 19:14 | 显示全部楼层
学习下
回复

使用道具 举报

ID:53421 发表于 2013-10-4 02:15 | 显示全部楼层
做个玩玩,感谢!
回复

使用道具 举报

ID:54817 发表于 2013-10-20 12:49 | 显示全部楼层
好哟,顶你了
回复

使用道具 举报

ID:56369 发表于 2013-10-27 15:58 | 显示全部楼层
非常详细,谢谢
回复

使用道具 举报

ID:57994 发表于 2013-12-25 17:54 | 显示全部楼层
不错  不错    非常不粗     楼主 辛苦了
回复

使用道具 举报

ID:58111 发表于 2013-12-25 18:15 | 显示全部楼层
谢谢!拿走了
回复

使用道具 举报

ID:58796 发表于 2014-2-14 00:04 | 显示全部楼层
学习。。。。。。。。。
回复

使用道具 举报

ID:47708 发表于 2014-2-19 11:48 | 显示全部楼层
谢谢...............
回复

使用道具 举报

ID:59072 发表于 2014-3-11 19:44 来自手机 | 显示全部楼层
不错,收藏了
回复

使用道具 举报

ID:59319 发表于 2014-3-14 17:22 | 显示全部楼层
多谢分享,好好学习下
回复

使用道具 举报

ID:59655 发表于 2014-3-14 21:06 | 显示全部楼层
下了,学习一下
回复

使用道具 举报

ID:60324 发表于 2014-4-5 23:05 | 显示全部楼层
不错了!
回复

使用道具 举报

ID:60246 发表于 2014-4-5 23:57 | 显示全部楼层
谢谢分享,很好很强大
回复

使用道具 举报

ID:61326 发表于 2014-5-2 19:48 | 显示全部楼层
谢谢你的分享!
回复

使用道具 举报

ID:62288 发表于 2014-5-26 12:17 | 显示全部楼层
万分感激楼主分享。
回复

使用道具 举报

ID:47760 发表于 2014-9-13 09:17 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:51348 发表于 2014-9-14 02:03 | 显示全部楼层
很好  学习  谢谢
回复

使用道具 举报

ID:70599 发表于 2014-12-20 00:31 | 显示全部楼层
感谢楼主分享!
回复

使用道具 举报

ID:71734 发表于 2015-1-7 09:39 | 显示全部楼层
为什么密码正确之后退不出那个界面
回复

使用道具 举报

ID:72268 发表于 2015-1-15 18:50 | 显示全部楼层
感谢分享!!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

ID:72268 发表于 2015-1-15 19:05 | 显示全部楼层
感谢分享!!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

ID:37003 发表于 2015-3-24 16:01 | 显示全部楼层
很好的资料,辛苦了,谢谢!
回复

使用道具 举报

ID:37471 发表于 2015-3-30 16:17 | 显示全部楼层
很好,
谢谢分享
回复

使用道具 举报

ID:75697 发表于 2015-3-30 16:46 | 显示全部楼层
很不错
回复

使用道具 举报

ID:75461 发表于 2015-3-30 18:31 | 显示全部楼层
不错的资料,谢谢分享。
回复

使用道具 举报

ID:72050 发表于 2015-4-26 15:25 | 显示全部楼层
这个东西好
回复

使用道具 举报

ID:78652 发表于 2015-5-2 14:47 | 显示全部楼层
用什么软件才能打开啊
回复

使用道具 举报

ID:78729 发表于 2015-5-3 21:23 | 显示全部楼层
多谢分享,学习了
回复

使用道具 举报

ID:79423 发表于 2015-5-10 09:57 | 显示全部楼层
谢谢啦
回复

使用道具 举报

ID:85424 发表于 2015-7-12 01:23 | 显示全部楼层
不错不错
回复

使用道具 举报

ID:85453 发表于 2015-7-12 14:43 | 显示全部楼层
厉害按  真是
回复

使用道具 举报

ID:70839 发表于 2015-7-20 13:45 | 显示全部楼层
厉害,不过都是图片形式吗?
回复

使用道具 举报

ID:44267 发表于 2015-9-18 11:15 | 显示全部楼层
太强了
回复

使用道具 举报

ID:96498 发表于 2015-11-20 21:11 | 显示全部楼层
不错的资料,谢谢分享。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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