找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机密码锁制作完整资料

[复制链接]
跳转到指定楼层
楼主
1. 电子密码锁采用51单片机作为主控芯片,4x4矩阵键盘作为输入设备,通过LCD1602显示,使用24C02芯片用于存储用户密码。
2.系统密码长度设置为7位,具有输入密码,更改密码,恢复初始密码功能,密码具有掉电存储功能。密码输入错误达到三次,则锁住键盘,并报警。
3.电子密码锁使用继电器进行模拟开锁过程。开锁声光提示。


所有制作资料下载:
单片机密码锁.zip (4.71 MB, 下载次数: 28)

部分源码预览:
  1. #include<reg52.h>
  2. #include<intrinS.h>
  3. #include<absacc.h>
  4. #include "keyc1.h" //见3.12
  5. #include "LCD1602.h"
  6. #include "24C02.h"   //见2.2
  7.    //见4.1
  8. #define unchar unsigned char
  9. #define uint unsigned int

  10. #define C02_write 0xa0
  11. #define C02_read 0xa1

  12. //----------------------------------------------------------------------------------------------
  13. #define enter 0x0c    //确定
  14. #define backspace 0x0f   //退格
  15. #define A 0x0a           //输入密码
  16. #define B 0x0b           //修改密码
  17. //-----------------------------------------------------------------------------------------------
  18. unchar idata temp5_password[6]=
  19. {0,0,0,0,0,0};           //设置初始密码为"123456"
  20. unchar num;//错误次数
  21. uint  M1,M2=0,M3,M4,M5,M6;
  22. //-----------------------------------------------------------------------------------------------
  23. sbit SET=P3^2;               //恢复出厂密码设置键
  24. sbit Lock_BIT=P2^0;          //锁控制信号,输出低电平
  25. sbit SPK=P2^2;             //报警信号输出端
  26. //-----------------------------------------------------------------------------------------------
  27. unchar int_count_1;
  28. unsigned int int_count_2;
  29. void SPKdelay(uint z)  //蜂鸣器延时
  30. {         uint i;
  31.    for(i=z;i>0;i--);
  32. }

  33. //===============================================================================================
  34. void Longdelay(unsigned int i)  //长时间延时函数
  35. {
  36.         unsigned int j;
  37.         for (;i>0;i--)
  38.         for(j=10000;j>0;j--);

  39. }

  40. //================================================================================================
  41. bit compare_string(unchar *string1,unchar *string2)//密码对比函数
  42. {
  43.         unchar count;//设置循环对比计数器
  44.         for(count=0;count<6;count++)//设置要对比的密码为六位
  45.         {
  46.                 if(string1[count]!=string2[count])
  47.                 return(0);//输入密码与原密码不相同时返回出错函数0

  48.         }
  49.         return(1);//输入密码正确返回正确参数1
  50. }
  51. //---------------------------------------------------------------------------------------------------
  52. unchar step_choose(void)//选择输入密码或修改密码处理函数
  53. {
  54.         unsigned int i;
  55.         unchar key;
  56.         do{
  57.                   WR_CMD(0x01);//清屏
  58.                 WR_CMD(0x06);//AC递增,画面不动
  59.                 GotoXY(0,0);//设置显示“input password”的地址
  60.                 Show_Char("Input Password");//显示"输入密码"
  61.                 GotoXY(0,1);//设置显示plaese press A的首地址
  62.                 Show_Char("Please Press A");//显示请输入A
  63.                 for(i=0;i<30000;i++)//循环读键盘
  64.                         {
  65.                                 key=key1();//读键盘
  66.                                 if((key==A)||(key==B)) break;//如果是A或B就退出
  67.                         }
  68.                 if((key!=A)&&(key!=B))//如果不是A也不是B,就执行下列程序
  69.                   {
  70.                           WR_CMD(0x01);//清屏
  71.                         WR_CMD(0x06);//        AC递增,画面不动
  72.                         GotoXY(0,0);//设置显示“input password”的地址
  73.                         Show_Char("Change Password");//显示修改密码
  74.                         GotoXY(0,1);//设置显示“please press B”的首地址
  75.                         Show_Char("Please Press B");//显示请输入B
  76.                         for(i=0;i<30000;i++)//循环读键盘
  77.                         {         
  78.                                 key=key1();//读键盘
  79.                                 if((key==A)||(key==B)) break;//如果是A或B就退出
  80.                         }
  81.                   }
  82.           }
  83.           while((key!=A)&&(key!=B));//如果不是A也不是B,就循环读键盘
  84.           return (key);//是A或B就带参数返回
  85. }
  86. //=================================================================================================
  87. bit input_password(unchar *password)//输入密码函数
  88. {
  89.      unchar count,count1;//设置输入密码位数计数器
  90.         unchar key;//设置键值变量
  91.         GotoXY(0,1);
  92.         for(count=0;count<7;count++)
  93.         {
  94.                 Longdelay(3);//延时
  95.                 if(count<6);//输入密码小于六位吗?
  96.                 {       
  97.                         do{key=key1();}//是的,读键盘
  98.                         while(key==0xff);//如果键盘值为0xff,继续读键盘
  99.                     if(key==0x0d) break;   //退出键,回到初始界面
  100.                         if((key!=backspace)&&(key!=enter)&&(key>=0)&&(key<=9))//不是退格或确认键吗?
  101.                         {         
  102.                                 Show_1_Char('*');//不是,是数字键就显示'*'号
  103.                                 password[count]=key;//键值送入输入密码数组对应位
  104.                         }
  105.                 if(key==backspace)//是退格键吗?
  106.                         {
  107.                                 if(count>0)//输入位数大于0吗?
  108.                                 {
  109.                                         GotoXY(--count,1);//是的,送删除位的显示地址
  110.                                         Show_1_Char(' '); //删除位显示空白
  111.                                         password[count]=' '; //输入密码数组对应位置空白
  112.                                         GotoXY(count,1); //送闪烁位
  113.                                         count--;//密码位计数器减1
  114.                                        
  115.                                 }

  116.                         }
  117.                  if(key==enter)//是确认键吗
  118.                         {
  119.                                 GotoXY(0,0);//是的,改变显示首地址
  120.                                 return(0);//返回出错参数0                       

  121.                         }
  122.                 }
  123.                 if(count==6)//密码位计数器等于6吗
  124.                 {
  125.                         do{key=key1();}//等于6,读键盘
  126.                         while((key!=backspace)&&(key!=enter));//不是退格键或确认键,继续读键盘
  127.                         if(key==backspace)//是退格键吗
  128.                         {
  129.                                 GotoXY(--count,1);//是的,送删除位的显示地址
  130.                                 Show_1_Char(' ');//删除位显示空白
  131.                                 GotoXY(count,1);//送闪烁位
  132.                                 count--;//密码位计数器减1
  133.                         }
  134.                            if(key==enter)//是确认键吗
  135.                         {return(1);}//是的,输入密码完成,返回正确参数1
  136.                 }
  137.         }
  138. }
  139. //===================================================================================================
  140. void password()//密码处理函数
  141. {
  142.     uchar key,key2;
  143.         uint kscount=0;
  144.         unchar idata temp1_password[6]={' ',' ',' ',' ',' ',' '};//设置4组6位密码变量
  145.         unchar idata temp3_password[6]={' ',' ',' ',' ',' ',' '};        //初始化为空白
  146.         unchar idata temp2_password[6]={' ',' ',' ',' ',' ',' '};
  147.         unchar idata temp4_password[6]={' ',' ',' ',' ',' ',' '};
  148.         key=step_choose( );//读选择状态
  149.         if(key==A)//是选择输入密码吗?
  150.         {
  151.         Read_Flash(temp1_password,0x00,6);//是的从24c02中读取密码送入第一组密码变量中
  152.                 WR_CMD(0x01);//清屏
  153.                 WR_CMD(0x06);//AC递增,画面不动
  154.                 GotoXY(0,0);//设置显示“input password”的首地址
  155.                 Show_Char("Input Password");//显示“输入密码”
  156.                 if(input_password(temp2_password))//完成输入密码了吗?
  157.                 {
  158.                         if(compare_string(temp1_password,temp2_password))//完成,比较密码正确吗
  159.                         {        num=0;
  160.                                 WR_CMD(0x01);//清屏
  161.                         WR_CMD(0x06);//AC递增,画面不动
  162.                                 GotoXY(0,0);//正确,设置显示“password correct”的首地址
  163.                                 Show_Char("Password Correct");//显示"密码正确"
  164.                                 GotoXY(0,1);//正确,设置显示“password correct”的首地址
  165.                                 Show_Char("Open Lock");//显示"密码正确"        Lock_BIT=0;//密码正确,开锁
  166.                            Lock_BIT=0;//关开锁信号
  167.                            while(1)
  168.                            {
  169.                              kscount++;
  170.                                  if(kscount==1000)
  171.                                   break;
  172.                                 SPK=0;
  173.                                 SPKdelay(10);//发开锁提示声
  174.                                 SPK=1;
  175.                            SPKdelay(40);
  176.                                 }       
  177.                          
  178.                     while(1)
  179.                         {  key2=key1();
  180.                             if(key2==0x0e)
  181.                           {
  182.                                 Lock_BIT=1;//关开锁信号
  183.                                 break;
  184.                                 }
  185.                           }
  186.                                 SPK=0;
  187.                                 //关开锁提示音
  188.                                 TR0=0;//关定时器0
  189.                                 return;//返回
  190.                         }
  191.                         else
  192.                                 {
  193.                                 WR_CMD(0x01);//清屏
  194.                         WR_CMD(0x06);//AC递增,画面不动
  195.                                 GotoXY(0,0);//错误,设置显示“wrong password”的首地址
  196.                                 Show_Char("Wrong Password");//显示“密码错误”
  197.                                   Longdelay(25);
  198.                                 num++;
  199.                                   if(num==3)
  200.                                   {
  201.                                     WR_CMD(0x01);//清屏
  202.                         WR_CMD(0x06);//AC递增,画面不动
  203.                                 GotoXY(0,0);
  204.                                            Show_Char("Please Wait For");
  205.                                            GotoXY(0,1);
  206.                                         Show_Char(" 3 Minute");
  207.                                         while(1)
  208.                                         {
  209.                                            SPK=0;
  210.                                            SPKdelay(100);
  211.                                            SPK=1;
  212.                                            SPKdelay(100);
  213.                                            M1++;
  214.                                            if(M1==24000)
  215.                                             {
  216.                                                  break;
  217.                                                 }
  218.                                         }
  219.                                         Longdelay(1400);
  220.                                      }
  221.                                 Longdelay(10);//延时
  222.                                 return;//返回
  223.                                 }
  224.                 }
  225.                 else
  226.                         {
  227.                                 GotoXY(0,1);//没有完成密码输入,设置显示“error!”的首地址
  228.                                 Show_Char("Error!");//显示“出错”
  229.                                 Longdelay(15);//延时
  230.                         }                                                                                 
  231.         }
  232.         else//是,修改密码
  233.          {
  234.                  Read_Flash(temp1_password,0x00,6);//从24c02中读取密码送入第一组密码变量中
  235.                 WR_CMD(0x01);//清屏
  236.                 WR_CMD(0x06);//AC递增,画面不动
  237.                 GotoXY(0,0);//设置显示“input old password”的首地址
  238.                 Show_Char("Input Old Password");//显示输入旧密码
  239.                 if(input_password(temp2_password))//完成输入密码了吗(输入的旧密码放在数组2中)
  240.                  {
  241.                          if(compare_string(temp1_password,temp2_password))//完成,比较密码正确吗?
  242.                          {
  243.                                  GotoXY(0,1);//正确,设置显示“password correct!”的首地址
  244.                                 Show_Char("Password Correct!");//显示“密码正确”
  245.                                 Longdelay(6);//延时
  246.                                 WR_CMD(0x01);
  247.                                 WR_CMD(0x06);
  248.                                 GotoXY(0,0);
  249.                                 Show_Char("Input New Password!");
  250.                                 if(input_password(temp3_password))//完成第一次新密码输入吗?(输入密码放在数组三中)
  251.                                 {
  252.                                         WR_CMD(0x01);
  253.                                         WR_CMD(0x06);
  254.                                         GotoXY(0,0);
  255.                                         Show_Char("Input Again");//显示再次输入密码
  256.                                         if(input_password(temp4_password))//完成第二次新密码输入吗?(输入的密码放在密码组4中)
  257.                                         {
  258.                                                 if(compare_string(temp3_password,temp4_password))//比较两次输入密码属否相同
  259.                                                 {
  260.                                                         Write_Flash(temp3_password,0x00,6);//相同,将新密码存入24c02中
  261.                                                         WR_CMD(0x01);//清屏
  262.                                                         WR_CMD(0x06);//AC递增,画面不动
  263.                                                         GotoXY(0,0);
  264.                                                         Show_Char("Password has");
  265.                                                         GotoXY(0,1);
  266.                                                         Show_Char("been changed");
  267.                                                         Longdelay(10);
  268.                                                         return;
  269.                                                 }
  270.                                                 else
  271.                                                 {
  272.                                                         WR_CMD(0x01);//两次输入不同清屏
  273.                                                         WR_CMD(0x06);//AC递增,画面不动
  274.                                                         GotoXY(0,0);
  275.                                                         Show_Char("Twice input");  //显示”两次输入“
  276.                                                         GotoXY(0,1);
  277.                                                         Show_Char("is different");        //显示是“不同的”
  278.                                                         Longdelay(10);
  279.                                                         return;       
  280.                                                 }
  281.                                         }
  282.                                         else
  283.                                         {
  284.                                                 GotoXY(0,1);//没有正确完成第二次新密码的输入,设置显示“error”的首地址
  285.                                                 Show_Char("Error!");//显示错误
  286.                                                 Longdelay(15);
  287.                                                 return;
  288.                                         }
  289.                                 }
  290.                                 else
  291.                                 {
  292.                                         GotoXY(0,1);//没有正确完成第一次新密码输入,设置显示“error”的首地址
  293.                                         Show_Char("Error!");
  294.                                         Longdelay(15);
  295.                                         return;
  296.                                 }
  297.                          }
  298.                          else
  299.                             {
  300.                                     WR_CMD(0x01);//两次输入不同清屏
  301.                                         WR_CMD(0x06);//AC递增,画面不动
  302.                                      GotoXY(3,0);//旧密码输入错误,设置显示“wrong password”的首地址
  303.                                     Show_Char("Sorry");
  304.                                     GotoXY(0,1);       
  305.                                     Show_Char("Wrong password");

  306.                                   num++;
  307.                                   if(num==3)
  308.                                   {
  309.                                     WR_CMD(0x01);//清屏
  310.                             WR_CMD(0x06);//AC递增,画面不动
  311.                                      GotoXY(0,0);
  312.                                            Show_Char("Please Wait For");
  313.                                            GotoXY(0,1);
  314.                                         Show_Char(" 3 Minute");
  315.                                         while(1)
  316.                                         {
  317.                                            SPK=0;
  318.                                            SPKdelay(100);
  319.                                            SPK=1;
  320.                                            SPKdelay(100);
  321.                                            M1++;
  322.                                            if(M1==24000)
  323.                                             {
  324.                                                  break;
  325.                                                 }
  326.                                         }
  327.                                          Longdelay(1400);
  328.                                         }
  329.                                         Longdelay(25);
  330.                                         return;
  331.                             }
  332.                  }
  333.                     else
  334.                         {
  335.                                     GotoXY(0,1);//没有正确完成旧密码的输入,设置显示“error!”的首地址
  336.                                         Show_Char("Error!");
  337.                                         Longdelay(15);
  338.                                         return;
  339.                         }
  340.          }
  341. }
  342. //============================================================================================================
  343. void int_service(void) interrupt 0 //外部中断0处理函数
  344. {
  345.         EA=1;//关CPU中断
  346.         EX0=1;//关外部中断0
  347.         for(int_count_1=4;int_count_1>0;int_count_1--)//设置延时时间,10秒
  348.          {
  349.                  for(int_count_2=0xffff;int_count_2>0;int_count_2--)
  350.                 {
  351.                         if(SET==1)//恢复出厂密码设置键松开否?
  352.                          {
  353.                         return;
  354.                          }
  355.                 }
  356.          }                  
  357.          WR_CMD(0x01);
  358.          WR_CMD(0x06);
  359.          Show_Char("Reset Cuccess!");//显示“恢复出厂密码”
  360.          Longdelay(50);
  361.          Write_Flash(temp5_password,0x00,6); //初始密码0000000密码送入24c02中保存
  362.               
  363. /*          EA=1;//关CPU中断
  364.             EX0=1;         */
  365. }
  366. //==========================================================================================

  367. void t0(void) interrupt 1 using 0//定时、计数器0中断处理函数
  368. {
  369.         TH0=(65536-1000)/256;//重新将定时1000微秒初值的高八位送入TH0
  370.         TL0=(65536-1000)%256;//         重新将定时1000微秒初值的低八位送入TL0
  371.         SPK=~SPK;//信号输出位取反,即1000微秒反转一次,产生周期为2ms的方波

  372. }
  373. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  374. main()
  375.   {        unchar key;
  376.     Initialize(); //1602初始化
  377.         IT0=1;//设INT0为跳变沿沿触发方式
  378.         EX0=1;//开外部中断0
  379.         TMOD=0x01;
  380.         TH0=(65536-1000)/256;//重新将定时1000微秒初值的高八位送入TH0
  381.         TL0=(65536-1000)%256;//         重新将定时1000微秒初值的低八位送入TL0
  382.         TR0=0;
  383.         ET0=1;
  384.         EA=1;
  385.         while(1)
  386.         {         
  387.                    password();//运行密码处理函数
  388.     }
  389. }
  390. //=================================终于完成了==================================================
  391.                                                        
复制代码


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

使用道具 举报

沙发
ID:64922 发表于 2017-5-13 12:10 | 只看该作者
很好,非常完美
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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