找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6945|回复: 19
打印 上一主题 下一主题
收起左侧

单片机密码锁带参考论文 程序+仿真图+原理图+PCB

  [复制链接]
跳转到指定楼层
楼主
单片机密码锁带参考课程设计论文  单片机程序+proteus仿真图+原理图+PCB

本次设计使用AT89S52实现一基于单片机的电子密码锁。本系统由单片机系统、矩阵键盘、LCD显示和报警系统组成。系统能完成开锁、超次锁定、修改用户密码基本的密码锁的功能。本系统成本低廉,功能实用。

1、密码显示
             为了帮助用户确认是否有键按下,特在电路中设置了模拟显示电路;而为了防止密码外泄;显示时,并不是显示用户按下的数字符号,而是以一个特定的字母符号提醒用户是否有键按下。有键按下,就会显示出字符“*”,没键按下,则不会显示字符。
2、密码更改
            设置6位密码,密码通过键盘输入,当按下更改密码的功能键时,要先输入原来的密码,正确无误后,再输入新的密码,最后按下确认键即可。
3、本机键开锁
            当用户键入正确密码后,在按确认键,便会自动开锁。但用户键入密码时应注意:数字与数字之间的间隔时间为30秒,例如密码为086541,当键入第一个数字0后应在30秒内键入第二个数字8,否则就会视为无效。如果键入完密码后不按确认键系统会当做放弃开锁处理。

单片机密码锁proteus仿真图文件:


课程设计论文里面的电路图:



单片机密码锁ppt文件:


课程设计论文目录:
目  录
1 前言    4
1.1 数字随机键盘的来源和意义    4
1.2单片机概述    4
2 数字密码锁总体设计说明    5
2.1 总体开发计划    5
2.1.1 基本功能    5
2.1.2 扩展功能    5
2.2 总体设计方案    5
2.2.1 单片机的选择    5
2.2.2 键盘的选择    6
2.2.3 显示模块的选择    6
2.2.4 报警模块的选择    6
3 硬件设计说明    7
3.1 硬件总体设计方案    7
3.1.1 硬件功能模块的划分    7
3.1.2 硬件设计目标    7
3.2 硬件单元设计    7
3.2.1 主控电路    7
3.2.2 显示电路    8
3.2.4 键盘电路    10
3.2.5 报警电路    10
4 软件设计说明    11
4.1 软件设计总体方案    12
4.1.1 软件设计目标    12
4.1.2 软件功能模块划分    12
4.2 软件设计    13
4.2.1 主函数的程序设计    13
4.2.2 系统初始化的程序设计    14
5 系统调试    16

6 总结    19
参考文献    20
附件    21

主程序(完整代码请下载附件):
  1. /***********天马电子设计*******************/
  2. #include<AT89X52.h>
  3. #include "液晶.h"
  4. #include "stdlib.h"
  5. #include<Function.h>
  6. #include "fun_char.h"
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. sbit beep=P2^4;         //警铃
  10. uint TIM=0;
  11. uchar mydata[6]; //输入密码
  12. uchar testdata[6];//存储器保存的密码
  13. uchar ok_stop=0;
  14. struct key
  15. {
  16.   uchar time; //按键时间控制
  17.   uchar down; //输入次数
  18.   uchar open; //键盘打开
  19.   uchar close;//键盘关闭
  20.   uchar setnew;//设置新的密码
  21.   uchar error; //输入密码错误次数
  22.   uchar reset_num; //设置密码次数记录(输入新的密码,需要输入两次,在第二次输入后开始比较)
  23.   uchar reset; //设置新的密码标志位
  24.   uchar disclose;  //关闭显示
  25.   uint time_n;         //定时器中断次数
  26. }key={0,0,0,0,0,0,0,0,0,0};
  27. unsigned char code KEYTAB[16] ={0x7e,0xBE,0XBD,0xBB,0xDE,0xDD,0xDB,0xEE,0xED,0xEB,0x7D,0x7B,0x77,0xb7,0xd7,0xe7};
  28. void clear_all();//
  29. /*******************************************
  30. *函数名称:delay(uint t)延时函数
  31. *函数作用:延时1ms左右
  32. *
  33. *********************************************/
  34. void delay(uint t)
  35. {
  36.    uint i,j;
  37.    for(i=0;i<t;i++)
  38.       for(j=0;j<110;j++);
  39. }
  40. /*******************************************
  41. *函数名称:check_code( )
  42. *函数作用:1、对比输入的密码和存储器中的密码是否一致,一致
  43.             则开锁。不一致,则记录错误次数,如果次数大于3次,
  44.                         则锁键盘,并报警
  45.             2、当设置新的密码时,检测两次输入的密码是否一致
  46.                         一致则保存,

  47. *********************************************/
  48. void check_code(void)
  49. {
  50.      unsigned char i=0;
  51.          unsigned char dif_label=0;
  52.          if(key.setnew==0||key.reset_num==1) //正处于开锁状态时输入6位完成或者是设置新的密码时第二次输入完成
  53.          {
  54.                   for(i=0;i<6;i++) //对这六位和实际的密码进行比较
  55.                   {
  56.                       if((mydata[i]!=testdata[i]))//如果有一位不同
  57.                           {
  58.                              if(key.setnew==0)        //如果现在正处于开锁状态
  59.                                    {
  60.                                     key.error++;//输入密码错误次数记录
  61.                                         if(key.error>2)//如果大于2次
  62.                                         {
  63.                                            if(key.open==0)//如果现在没有锁键盘
  64.                                           {
  65.                                             lock_char();   //显示KEY IS LOCK
  66.                                             key.open=1;           //锁键盘
  67.                                             TR1=1;                  //定时器启动
  68.                                                 key.disclose=1;        //关闭显示
  69.                                                 key.error=0;   //错误清楚
  70.                                                 key.time=0;          //按键时间清零
  71.                                           }                                       
  72.                                         }
  73.                                         else                           //如果没有超过2次
  74.                                         {
  75.                                             error_char(); //显示输入密码错误
  76.                                                 beep=0;
  77.                                         delay(1500);//延时3s左右
  78.                                                 beep=1;
  79.                                         clear();// 变量清零                        
  80.                                         }                           
  81.                                 }
  82.                                 else                   //如果处于设置密码状态,但是设置的密码两次输入不一样
  83.                                 {
  84.                                  
  85.                                   different_char();                //输出it's different
  86.                                   delay(1000); //延时2s         

  87.                                   key.down=0;        //变量清除
  88.                                   reset_char();//重新输入新的密码,这个地方最好有个时间记录
  89.                                   dif_label=1;                //
  90.                                   key.reset_num=0;// 提示重新输入密码                                                                    
  91.                                 }
  92.                                  break;//退出循环                                                                  
  93.                           }                  
  94.                   }
  95.            }
  96.         
  97.           if(key.setnew==1)//如果正输入新的密码
  98.           {
  99.                    if(key.reset_num==0)  //如果是第一次输入新的密码,则i=6,主要是为了下面好判断
  100.                    {
  101.                            i=6;//自动保存了
  102.                  }
  103.          
  104.           }
  105.           if(i==6&&dif_label==0)   //如果输入密码正确,
  106.           {
  107.                   
  108.                 if(key.setnew==0)//输入密码正确
  109.                 {
  110.                              key.error=0;         //清零
  111.                           key.down=0;//复位
  112.                           ok_char();        //显示PASSWORD OK
  113.                           key.disclose=1;//         停止显示光标闪烁
  114.                           key.reset=1;// 允许设置新的密码
  115.                           ok_stop=1;//
  116.                           
  117.                 }
  118.                 else//如果现在正处于输入新的密码状态
  119.                 {
  120.                
  121.                    if(key.reset_num==0)         //如果是第一次输入
  122.                    {
  123.                            
  124.                           for(i=0;i<6;i++)        //保存密码到testdata中
  125.                           {
  126.                                   testdata[i]=mydata[i];//保存数据
  127.                           }
  128.                           key.reset_num=1;//进入第二次数据输入
  129.                           key.down=0;//清零等待第二次数据输入
  130.                           again_char();//现在INPUT AGAIN
  131.                                      }
  132.                    else
  133.                    {
  134.                             //设置密码成功
  135.                                   ISendStr(AT24C02, 0 , &mydata[0],6); //保存密码
  136.                                 delay(20);//
  137.                             ok_char();        //显示PASSWORD OK
  138.                             delay(1000);//不知道什么时候复位啊
  139.                             key.reset_num=0;//这里要重新复位了
  140.                             key.down=0;
  141.                                 ok_stop=1;
  142.                                 key.disclose=1;//这个地方不再显示了        
  143.                                           
  144.                    }               
  145.                 }           
  146.     }
  147. }
  148. /*******************************************
  149. *函数名称:keyscan( ) 键盘扫描函数
  150. *函数作用: 1、扫描键盘,获得键值
  151.              2、显示输入键值(*号),并保存
  152.              3、读取功能按键,并执行相应的功能
  153. 按键的功能划分如下:
  154.          |  7  |  8  |  9   |  修改密码键            |
  155.                  ---------------------------------------
  156.                  |  4  |  5  |  6   |  重新输入密码键 |
  157.                  ---------------------------------------
  158.                  |  1  |  2  |  3   |  没有使用       |
  159.                  ---------------------------------------
  160.                  |     |确         | 清        |
  161.                  |  0  |认         | 除        |  没有使用       |
  162.                  ---------------------------------------
  163. *********************************************/
  164. unsigned char keyscan(void)
  165. {
  166.      unsigned char i=0;
  167.           unsigned char redat;
  168.           unsigned char keynum=0;
  169.             P3=0XFF;
  170.       P1=0XF0;
  171.           redat=P3&0XF0;
  172.           if(redat!=0xF0)
  173.           {         
  174.                      delay(12);
  175.                    redat=P3&0XF0;//再次延时检测
  176.                    if(redat!=0xF0)
  177.                    {
  178.                             keynum=redat;//获得第四位
  179.                           P1=0XFF;//看来这个地方是必须的
  180.                          P3=0X0F;//开始读取高四位
  181.                          delay(1);
  182.                          redat=P1&0X0F;
  183.                          keynum|=redat;
  184.                          for(i=0;i<16;i++)
  185.                          {
  186.                                  if(keynum==KEYTAB[i])
  187.                                 {
  188.                                    
  189.                                            if(key.down<6)//如果输入次数小于6
  190.                                         {
  191.                                           if(i<10&&ok_stop==0) //如果输入键值小于10即0-9
  192.                                            {
  193.                                              key.time_n=0;//键盘时间计数清零
  194.                                              mydata[key.down]=i; //        保存按键
  195.                                                  lcd_pos(key.down+68);         //
  196.                                                  lcd_wdat(0x2a);//显示星号
  197.                                              key.down++; //按键次数加1
  198.                                                  key.time=1;//按键计时开始,如果长时间没有按键按下,认为输入无效
  199.                                                  TR1=1;//启动定时器                                       
  200.                                             }                                         
  201.                                         }

  202.                                         /*****如果按下清除键******/
  203.                                         if(i==11)//等待按下确认键
  204.                                         {
  205.                                               if(key.down>0)  //如果当前还有输入的数据
  206.                                                   {
  207.                                                     key.down=key.down-1;//
  208.                                                     mydata[key.down]=0;//还要再弄一些标志变量
  209.                                                     lcd_pos(key.down+68);
  210.                                                     lcd_wdat(0x20);//将星号显示关闭
  211.                                                         key.time_n=0;
  212.                                                   }
  213.                                         }
  214.                                         /**************等待按下确认键************/
  215.                                         if(key.down==6)//如果已经输入了6个数据
  216.                                         {

  217.                                            if(i==10)  //确认键的键值是10
  218.                                            {
  219.                                                     TR1=0;//关闭定时器
  220.                                                         key.time_n=0;//重新准备开始
  221.                                                         key.time=0;
  222.                                                     check_code();//开始对比输入的密码值和存储器中保存的密码
  223.                                                 
  224.                                            }
  225.                                         }
  226.                                         if(key.reset==1) //只有当锁打开的时候,才允许设置新的密码

  227.                                         {
  228.                                            if(i==15)//没有锁键盘
  229.                                            {
  230.                                                       key.setnew=1;//允许输入新的密码
  231.                                                    key.disclose=0;//重新打开
  232.                                                    reset_char();
  233.                                                    ok_stop=0;
  234.                                            }
  235.                                         }                                         
  236.                                         if(i==14)  //这个按键相当于复位了
  237.                                         {
  238.                                                 clear_all();//重新复位重新开始
  239.                                        
  240.                                         }                                 
  241.                                         delay(400);//键盘延时
  242.                                 }
  243.                      }
  244.                   }         
  245.           }
  246.           return 0;         
  247. }
  248. /*******************************************
  249. *函数名称:display( )        显示函数
  250. *函数作用:
  251.           1、当输入数字键值小于6时,光标闪烁

  252. *********************************************/        
  253. void display()
  254. {
  255.              if(key.down<6)
  256.           {
  257.                      delay(120);        //这个地方显示光标闪烁
  258.                   lcd_pos(68+key.down);//
  259.                   lcd_wcmd(0x0f);
  260.                   delay(140);
  261.                   lcd_pos(68+key.down);//光标闪烁
  262.                   lcd_wcmd(0x0c); //   
  263.           }                                    
  264.             
  265. }
  266. /*******************************************
  267. *函数名称:init_timer( )        定时器初始化函数
  268. *函数作用:
  269.           定时器定时时间1ms

  270. *********************************************/        
  271. void init_timer() //
  272. {
  273.     TMOD|= 0x10;//
  274.            TH1 = 0xEC;
  275.         TL1 = 0x78;
  276.     ET1=1;        
  277.         EA=1;               
  278.     TR1  = 0; //关闭  
  279. }
  280. /*******************************************
  281. *函数名称:clear( )         清除函数
  282. *函数作用:
  283.          只清除按下的次数,以及初始化字符显示

  284. *********************************************/         
  285. void clear() reentrant
  286. {
  287.   key.down=0;
  288.   ok_stop=0;
  289.   init_char();
  290. }
  291. /*******************************************
  292. *函数名称:clear_all( )          清除所有的标志变量
  293. *函数作用:
  294.          

  295. *********************************************/        
  296. void clear_all()  //所有的变量清零
  297. {
  298.    clear();  
  299.    TR1=0;//关闭定时器
  300.    key.close=0;
  301.    beep=1;
  302.    key.reset=0;
  303.    key.setnew=0;
  304.    key.error=0;
  305.    key.reset_num=0;//全部清零
  306.    key.disclose=0;
  307.    key.open=0;
  308. }
  309. /*******************************************
  310. *函数名称:main( )         主函数
  311. *函数作用:
  312.          这个函数必须有的

  313. *********************************************/        
  314. void main()//
  315. {
  316.         uchar i=0;
  317.         beep=1;//初始化蜂鸣器
  318.     lcd_init();
  319.         init_char();
  320.         init_timer();
  321.     while(1)
  322.     {  
  323.             
  324.      if(key.open==0)//如果键盘没有锁,调用键盘扫描
  325.          {
  326.              keyscan();
  327.          }
  328.          if(key.disclose==0) //如果显示没有关闭,调用display
  329.          {
  330.            display(); //显示字符应该控制住的

  331.          }
  332.           if(key.close==1)        //如果三次密码输入错误,报警完成后开始清除所有变量
  333.          {
  334.          
  335.            clear_all();
  336.          }
  337.                
  338.           }   
  339. }  
  340. /*******************************************
  341. *函数名称:TI_int1( )        定时器1中断处理函数
  342. *函数作用:
  343.         
  344. *********************************************/        
  345. void T1_int1(void) interrupt 3//定时器中断
  346. {
  347.     TH1 = 0xEC;        
  348.         TL1 = 0x78;        
  349.           //beep=~beep;
  350.         if(key.time==1)
  351.         {
  352.                 key.time_n++;  
  353.                 if(key.time_n>1099)
  354.                 {
  355.                   //清零
  356.                   key.close=1;
  357.                   key.time_n=0;
  358.                   TR1=0;//关闭定时器
  359.                   key.time=0;
  360.                 }
  361.         }
  362.         else
  363.         {          TIM++;
  364.               beep=0;
  365.                  if(TIM>1300)
  366.             {
  367.                   TIM=0;
  368.                   key.open=0;
  369.                   key.close=1;
  370.                   key.time=0;
  371.                   beep=1;
  372.                 }
  373.         
  374.         }

  375.   
  376. }



复制代码



基于单片机电子密码锁设计.rar (4.66 MB, 下载次数: 330)

评分

参与人数 5黑币 +68 收起 理由
Amazing云山 + 5 很给力!
光华人 + 4 赞一个!
w969251573 + 4 很给力!
Tristina + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:99401 发表于 2016-4-22 12:20 | 只看该作者
求密码锁的原理是什么?
回复

使用道具 举报

板凳
ID:99401 发表于 2016-4-22 12:22 | 只看该作者
求密码锁的原理是什么?
回复

使用道具 举报

地板
ID:110780 发表于 2016-9-7 10:14 | 只看该作者
请问有这个的pcb的程序嘛?跪求
回复

使用道具 举报

5#
ID:158129 发表于 2016-12-27 19:59 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

6#
ID:169770 发表于 2017-3-11 00:27 | 只看该作者
密码不是012345啊,密码是什么
回复

使用道具 举报

7#
ID:89286 发表于 2017-3-11 01:21 | 只看该作者
thanks for sharing
回复

使用道具 举报

8#
ID:153791 发表于 2017-4-13 14:27 | 只看该作者
密码不对
回复

使用道具 举报

9#
ID:206113 发表于 2017-5-30 18:15 | 只看该作者
很给力,赞一个
回复

使用道具 举报

10#
ID:206113 发表于 2017-5-31 10:40 | 只看该作者
密码有问题,而且显示D1有逻辑冲突,不知道为什么...
回复

使用道具 举报

11#
ID:247141 发表于 2017-11-7 23:14 | 只看该作者
怎么下载啊
回复

使用道具 举报

12#
ID:248401 发表于 2017-11-11 18:10 | 只看该作者
感谢分享 支持一下
回复

使用道具 举报

13#
ID:255915 发表于 2017-12-1 13:43 来自手机 | 只看该作者
求原理图
回复

使用道具 举报

14#
ID:255915 发表于 2017-12-2 09:18 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

15#
ID:245851 发表于 2017-12-2 11:42 | 只看该作者
感谢分享
哈哈
回复

使用道具 举报

16#
ID:307476 发表于 2018-4-16 12:48 | 只看该作者
仿真输入密码显示密码错误是什么情况
回复

使用道具 举报

17#
ID:317418 发表于 2018-4-26 23:12 | 只看该作者
哼厉害,值得表扬
回复

使用道具 举报

18#
ID:396033 发表于 2018-9-10 14:39 | 只看该作者
支持一下~~~~~~
回复

使用道具 举报

19#
ID:266868 发表于 2018-9-10 15:53 来自手机 | 只看该作者
好强。。。
回复

使用道具 举报

20#
ID:396124 发表于 2018-9-10 17:14 | 只看该作者
感谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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