找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的密码锁代码

[复制链接]
跳转到指定楼层
楼主
ID:675947 发表于 2019-12-28 11:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2、测试数据(表格)
  
输入数字
  
LED灯
蜂鸣器
液晶显示屏
  
000000(初始密码)
  
全亮
不响
code correct!
  
10000
  
不亮
code wrong!
  
30000
  
不亮
code wrong!
  
  
12345
  

  
顺次亮灭

  
code wrong!
  
wrong 3 times
  
lock the screen

3、数据分析和结论
   从实验的数据来看,当密码正确时,LED灯全部亮,蜂鸣器不响,液晶显示屏上显示“code correct!”。当密码不正确时,LED灯不亮,蜂鸣器响,液晶显示屏上显示“code wrong!”。当三次输错密码时,LED灯顺次亮灭,蜂鸣器响,液晶显示屏上显示“code wrong! wrong 3 times lock the screen”屏幕上锁。
综上所述此简易密码锁完成了密码设置功能、密码输入开锁功能、输入错误报警功能、输入错误锁屏功能。
五、系统使用说明
1、系统外观及接口说明(实物照片)
程序写入后,下载程序到单片机,要给单片机断电(约1 秒即可),然后给单片机上电,上电之后,会把程序烧写到单片机内部。两条数据线把单片机和电脑USB接口连接。下面为系统外观及接口实物图。
2、系统操作使用说明
独立按键S1:选择按钮,可实现光标左右移动进而设置密码。
独立按键S2:选择按钮,可实现光标左右移动进而设置密码。
独立按键S3:确定按钮,以确定密码。
独立按键S4:加法按钮,可设置密码。
独立按键S5:减法按钮,可设置密码。
简易密码锁的初始密码为000000,用户可以对其进行重新设置。当用户输入密码时,若密码正确,LED灯全部亮,蜂鸣器不响,液晶显示屏上显示“code correct!”。当密码不正确时,LED灯不亮,蜂鸣器响,液晶显示屏上显示“code wrong!”。当三次输错密码时,LED灯顺次亮灭,蜂鸣器响,液晶显示屏上显示“code wrong! wrong 3times lock the screen”屏幕上锁。

单片机源程序如下:
  1. #include<reg52.h>
  2.         #define        uchar unsigned char
  3.         #define uint  unsigned int
  4.            sbit Key1 = P3^7;
  5.         sbit Key2 = P3^6;       
  6.         sbit Key3 = P3^5;
  7.         sbit Key4 = P3^4;
  8.         sbit Key5 = P3^3;
  9.         sbit Key6 = P3^2;
  10.         sbit RS = P1^0;
  11.         sbit RW = P1^1;
  12.         sbit EN = P1^2;       
  13.         uchar K1num = 0;                 //控制主界面选项
  14.         uchar K2num = 0;                 //控制密码位数
  15.         uchar wrong_num = 0;         //记录密码错误次数
  16.         uchar interface = 0;         //各个界面的标志位         1.主界面2.输入密码3.设置密码4.重置密码
  17.     uchar code main1[] = {"1.input code"};
  18.         uchar code main2[] = {"2.reset code"};
  19.         uchar code input[] = {"input your code:"};
  20.         uchar code reset[] = {"input new code:"};
  21.         uchar code code_correct[] = {"code correct!"};
  22.         uchar code code_wrong[] = {"code wrong!"};
  23.         uchar code lockscreen1[] = {"wrong 3 times"};
  24.         uchar code lockscreen2[] = {"lock the screen"};
  25.         uchar code_display[] = {"000000"};
  26.         uchar code_true[] = {"000000"};
  27.         void keyscan();            //按键扫描函数
  28.         void KeyInit();                //按键初始化
  29.         void codeinit();        //显示密码初始化函数
  30.         void savecode();        //保存密码函数
  31.         char judgecode();        //判断密码函数
  32.         void delay(unsigned int ms);                  //延时函数
  33.         void write_date(unsigned char date);  //写数据函数
  34.         void write_com(unsigned char com);    //写指令函数
  35.         void LCD_init();                                          //屏幕初始化函数
  36.         void LCD_main();                                          //显示主界面
  37.         void LCD_inputcode();                                  //显示输入密码界面
  38.         void LCD_resetcode();                                  //显示重置密码界面
  39.         void LCD_setcode();                                          //显示设置密码界面
  40.         void LCD_codeture();                                  //显示密码正确界面函数
  41.         void LCD_codewrong();                                  //显示密码错误界面函数
  42.         void LCD_lockscreen();                                  //显示锁屏界面函数
  43. //***************延时函数********************************
  44.         void delay(uint ms)
  45.         {
  46.                 int i,j;
  47.                 for(i = 0;i < ms; i++)
  48.                         for(j = 0;j < 110;j++);
  49.         }
  50. //***************显示密码初始化函数**********************
  51.         void codeinit()
  52.         {
  53.                 int i;
  54.                 for(i = 0; i < 6; i++)
  55.                                 code_display[i] = '0';
  56.         }
  57. //***************保存密码函数**********************
  58.         void savecode()
  59.         {
  60.                 int i;
  61.                 for(i = 0; i < 6; i++)
  62.                         code_true[i] = code_display[i];                               
  63.         }
  64. //***************判断密码函数**********************
  65.         char judgecode()
  66.         {
  67.                 int i;
  68.                 for(i = 0; i < 6;i++)
  69.                         {
  70.                                 if(code_true[i] != code_display[i])
  71.                                         break;
  72.                         }

  73.                 if(i < 6)
  74.                         return '0';
  75.                 else
  76.                         return '1';
  77.         }

  78. //***************按键初始化函数**********************
  79.         void KeyInit()
  80.         {
  81.           Key1 = 1;                 //给全部按键的io口赋高电平,等待检测
  82.           Key2 = 1;
  83.           Key3 = 1;
  84.           Key4 = 1;
  85.           Key5 = 1;
  86.           Key6 = 1;
  87.         }
  88. //***************按键扫描函数**********************
  89.         void keyscan()          
  90.         {
  91.                 char x;
  92.                 if(Key1 == 0 )                 //Key1,菜单栏上下翻动按键
  93.                         {
  94.                                 delay(5);
  95.                                 if(Key1 == 0)
  96.                                         {
  97.                                                 K1num++;
  98.                                                 while(!Key1);
  99.                                                         if(K1num == 1)                 //当K1按键第一次被按下,菜单1闪烁
  100.                                                                 {
  101.                                                                         write_com(0x80);        //设置光标位置,1
  102.                                                                         write_com(0x0f);        //光标闪烁
  103.                                                                 //        P2 = 0x0f;                        //测试用,下同
  104.                                                                 }
  105.                                                         if(K1num == 2)                 //当K1按键第二次被按下,菜单2闪烁
  106.                                                                 {
  107.                                                                         write_com(0x80+0x40);  //设置光标位置,2
  108.                                                                         write_com(0x0f);
  109.                                                                 //        P2 = 0xf0;
  110.                                                                 }
  111.                                                         if(K1num == 3)                 //当K1按键第三次被按下,计数清零
  112.                                                                 {
  113.                                                                         K1num = 0;
  114.                                                                         write_com(0x0c);        //关闭光标闪烁
  115.                                                                 //        P2 = 0xff;
  116.                                                                 }                               
  117.                                         }
  118.                         }
  119.                 if(Key2 == 0)                  //Key2,选择键
  120.                         {
  121.                                 delay(10);
  122.                                 if(Key2 == 0)
  123.                                         {
  124.                                            while(!Key2);
  125.                                            switch(interface)           //判断当前处于哪一个界面
  126.                                                    {
  127.                                                         case 1 :          //主界面
  128.                                                                 {
  129.                                                                         if(K1num == 1)
  130.                                                                                 {
  131.                                                                                         K1num = 0;                 //key1计数清零
  132.                                                                                         codeinit();
  133.                                                                                         LCD_inputcode();                 //进入输入密码界面
  134.                                                                                 }
  135.                                                                         if(K1num == 2)
  136.                                                                                 {
  137.                                                                                         K1num = 0;
  138.                                                                                         codeinit();
  139.                                                                                         LCD_resetcode();         //进入重置密码界面
  140.                                                                                 }
  141.                                                                 break;                                                               
  142.                                                                 }

  143.                                                         case 2 :         //输入密码界面

  144.                                                         case 3 :        //设置密码界面

  145.                                                         case 4 :    //重置密码界面
  146.                                                                 {
  147.                                                                         K2num ++;
  148.                                                                                 if(K2num == 6)
  149.                                                                                         K2num = 0;
  150.                                                                         write_com(0x80+0x40+K2num);                  //设置光标位置
  151.                                                                         write_com(0x0f);
  152.                                                                  break;
  153.                                                                 }
  154.                                                                
  155.                                                                 default:break;
  156.                                                 }
  157.                                         }
  158.                         }
  159.                 if(Key3 == 0)                 //Key3,返回主界面键(确认键)
  160.                         {
  161.                                 delay(10);
  162.                                 if(Key3 == 0)
  163.                                         {
  164.                                                 while(!Key3);        //等待按键释放
  165.                                                 K2num = 0;                //重置K2按键次数

  166.                                                  if(interface == 2)  //若处于输入密码界面
  167.                                                         {
  168.                                                                 x = judgecode();
  169.                                                                 if(x == '1')                //需判断密码是否正确
  170.                                                                         {
  171.                                                                                  LCD_codeture();
  172.                                                                                 P2 = 0;                                //灯亮代表门开
  173.                                                                                 delay(2000);

  174.                                                                                 P2 = 0xff;
  175.                                                                                 LCD_main();                   //返回主界面
  176.                                                                         }
  177.                                                                 else
  178.                                                                         {
  179.                                                                                 LCD_codewrong();
  180.                                                                                 delay(2000);
  181.                                                                                 codeinit();
  182.                                                                                 LCD_inputcode();

  183.                                                                                 if(wrong_num >= 3)                 //错误三次锁死屏幕并报警
  184.                                                                                 {
  185.                                                                                         LCD_lockscreen();
  186.                                                                                         while(wrong_num >= 3)          
  187.                                                                                                 {
  188.                                                                                                         P2 = 0xf0;         
  189.                                                                                                         delay(300);
  190.                                                                                                         P2 = 0x0f;
  191.                                                                                                         delay(300);                                                                                                                               
  192.                                                                                                 }
  193.                                                                                 }
  194.                                                                         }
  195.                                                         }
  196.                                                        
  197.                                                 if(interface == 4)        //若处于重置密码界面
  198.                                                         {
  199.                                                                 savecode();        //需保存重置密码
  200.                                                                 codeinit();

  201.                                                                 write_com(0xc0);   //关闭光标闪烁
  202.                                                                 LCD_main();                   //返回主界面
  203.                                                         }                                               
  204.                                         }
  205.                         }               
  206.                 if(Key4 == 0)                //Key4,数值+1
  207.                         {                                                                          
  208.                                 delay(10);
  209.                                 if(Key4 == 0)
  210.                                         {
  211.                                                 while(!Key4);
  212.                                                 code_display[K2num] ++;

  213.                                                 if( code_display[K2num] > '9' )
  214.                                                                 code_display[K2num] = '0';
  215.                                                 if( code_display[K2num] < '0')
  216.                                                                 code_display[K2num] = '9';

  217.                                                  if(interface == 2)                //输入密码界面
  218.                                                                 LCD_inputcode();

  219.                                                  if(interface == 4)                //重置密码界面
  220.                                                                 LCD_resetcode();
  221.                                         }
  222.                         }
  223.                 if(Key5 == 0)                //Key5,数值-1
  224.                         {
  225.                                 delay(10);
  226.                                 if(Key5 == 0)
  227.                                         {
  228.                                                 while(!Key5);
  229.                                                 code_display[K2num] --;

  230.                                                 if( code_display[K2num] > '9' )
  231.                                                                 code_display[K2num] = '0';
  232.                                                 if( code_display[K2num] < '0')
  233.                                                                 code_display[K2num] = '9';

  234.                                                  if(interface == 2)                //输入密码界面
  235.                                                                 LCD_inputcode();

  236.                                                  if(interface == 4)                //重置密码界面
  237.                                                                 LCD_resetcode();                                       
  238.                                         }                       
  239.                         }
  240.                 if(Key6 == 0)
  241.                         {
  242.                                 delay(10);
  243.                                 if(Key6 == 0)
  244.                                         {
  245.                                                 while(!Key6);
  246.                                         }                               
  247.                         }
  248.         }
  249. //***************写数据函数**********************       
  250.         void write_date(uchar date)  
  251.         {
  252.                 RS = 1;                  //确认为写数据模式
  253.                 delay(2);
  254.                 P0 = date;
  255.                 EN = 1;
  256.                 delay(5);
  257.                 EN = 0;
  258.         }

  259. //***************写指令函数**********************
  260.         void write_com(uchar com)  
  261.         {
  262.                 RS = 0;                  //确认为写指令模式
  263.                 delay(2);
  264.                 P0 = com;
  265.                 EN = 1;
  266.                 delay(5);
  267.                 EN = 0;
  268.         }

  269. //***************LCD初始化函数**********************       
  270.         void LCD_init()
  271.         {
  272.                 RW = 0;          //只用到写模式
  273.                 EN = 0;          //使能口赋低电平
  274.                 write_com(0x38);   //0011 1000        设置显示模式:16*2显示,八位数据接口
  275.                 write_com(0x0c);   //0000 1100        开显示,不显示光标
  276.         //        write_com(0x0f);   //0000 1111  开显示,显示光标,光标闪烁
  277.                 write_com(0x06);   //0000 0110        写一个字符地址指针+1
  278.                 write_com(0x01);   //0000 0001        清屏
  279.         }

  280. //***************显示主界面函数**********************
  281.         void LCD_main()
  282.         {
  283.                 int i;
  284.                 interface = 1;
  285.                 LCD_init();
  286.             write_com(0x80);                                //设定显示位置为第一行首
  287.             for(i = 0;i < 12;i++)
  288.                                   write_date(main1[i]);
  289.        
  290.                   write_com(0x80+0x40);                        //设定显示位置为第二行首
  291.                   for(i = 0;i < 12;i++)
  292.                                   write_date(main2[i]);               
  293.         }

  294. //***************显示输入密码界面函数**********************
  295.         void LCD_inputcode()
  296.         {
  297.                 int i;
  298.                 interface = 2;
  299.                 write_com(0x80);                                //设定显示位置为第一行首
  300.                 write_com(0x01);                                //清屏
  301.                 for(i = 0;i < 16;i++)
  302.                         write_date(input[i]);               
  303.                
  304.                 write_com(0x80+0x40);                        //地址指针指向第二行
  305.                 for(i = 0;i < 6;i++)
  306.                         write_date(code_display[i]);

  307.                 write_com(0x80+0x40+K2num);                        //地址指针指向第二行
  308.                 write_com(0x0f);                                //开光标闪烁
  309.         }

  310. //***************显示重置密码界面函数**********************
  311.         void LCD_resetcode()
  312.         {
  313.                 int i;
  314.                 interface = 4;
  315.                 write_com(0x80);                                //设定显示位置为第一行首
  316.                 write_com(0x01);                                //清屏
  317.                 for(i = 0;i < 15;i++)
  318.                         write_date(reset[i]);
  319.                                        
  320.                 write_com(0x80+0x40);                        //地址指针指向第二行
  321.                 for(i = 0;i < 6;i++)
  322.                         write_date(code_display[i]);

  323.                 write_com(0x80+0x40+K2num);
  324.                 write_com(0x0f);                                //开光标闪烁
  325.         }

  326. //***************显示设置密码界面函数**********************
  327.         void LCD_setcode()
  328.         {
  329.         //        int i;
  330.                 interface = 3;
  331.         }
  332. //***************显示密码正确界面函数**********************
  333.         void LCD_codeture()
  334.         {
  335.                 int i;
  336.                 write_com(0x01);
  337.                 write_com(0x0c);   //关闭光标闪烁

  338.                 write_com(0x80);
  339.                 for(i = 0; i < 13;i++)
  340.                         write_date(code_correct[i]);
  341.         }

  342. //***************显示密码错误界面函数**********************
  343.         void LCD_codewrong()
  344.         {
  345.                 int i;
  346.                 wrong_num ++;
  347.                 write_com(0x01);               
  348.                 write_com(0x0c);   //关闭光标闪烁

  349.                 write_com(0x80);
  350.                 for(i = 0; i < 11;i++)
  351.                         write_date(code_wrong[i]);       
  352.         }

  353. //***************显示锁屏界面函数**********************
  354.         void LCD_lockscreen()
  355.         {
  356.                 int i;

  357.                 write_com(0x01);
  358.                 write_com(0x0c);   //关闭光标闪烁

  359.                 write_com(0x80);
  360.                 for(i = 0; i < 13;i++)
  361.                         write_date(lockscreen1[i]);

  362.                 write_com(0x80+0x40);
  363.                 for(i = 0; i < 15;i++)
  364.                         write_date(lockscreen2[i]);
  365.         }
复制代码

所有程序51hei提供下载:
密码锁.zip (39.13 KB, 下载次数: 41)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:793184 发表于 2020-6-29 20:26 | 只看该作者
nice 感谢楼主的分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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