当前位置:   article > 正文

单片机课程设计--电子密码锁(源代码+proteus仿真)_单片机电子密码锁

单片机电子密码锁

目录

器件选择

电路图 

代码 

1、LCD显示功能

1)LCD端口

2)字模的定义

3)提示符的显示

4)输入密码/重置密码时密码行的显示

2、总控制

1)主函数

2)key函数---判断用户想要进行的操作

3)display函数功能---接收用户输入数据并调用相应函数进行操作

4)判断密码正误

5)重置密码

6)in_code函数---将后一个数组内容复制到前一个数组中

程序运行效果

1、启动

2、输入密码时的显示

3、重置密码时的显示

4、其他提示符的显示

1)密码输入正确提示符

 2)密码输入错误提示符

 3)密码错误三次时的提示符


本设计是基于AT89C51单片机的电子密码锁设计,实现电子密码锁的基本功能。

器件选择

序号

器件编号

Proteus器件名称

器件性质

参数及说明

1

U1

AT89C51

单片机

12MHz

2

D1-D2

LED

发光二极管

red,green

3

R1-R2

RES

电阻

470欧

4

LCD1

LMO16L

液晶显示屏

/

5

K0-K9,KA,KB

BUTTON

按钮开关

置数

电路图 

代码 

1、LCD显示功能

1)LCD端口

  1. /*LCD端口定义*/
  2. sbit RS=P2^0;
  3. sbit RW=P2^1;
  4. sbit E=P2^2;

2)字模的定义

  1. /*字模的定义*/
  2. uchar code string1[]={"input code"};//输入密码字符显示
  3. uchar code string2[]={"INCORRET"};//提示密码错误
  4. uchar code string3[]={"TRY AGAIN"};//输入密码字符显示
  5. uchar code string4[]={"CORRET"};//密码正确提示
  6. uchar code string5[]={"UNLOCK"};
  7. uchar code string6[]={"ERROR THREE TIMES"};//密码错误三次提示
  8. uchar code string7[]={"LOCK ---"};//密码正确提示
  9. uchar code string8[]={"input new code"};//提示输入新密码
  10. uchar code string9[]={"SUCCESS!"};//提示输入新密码
  11. /*坐标*/
  12. uchar data table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

3)提示符的显示

  1. /*输出提示字符*/
  2. /*input code*/
  3. void ic(uchar m)
  4. {
  5. for(m=0;m<sizeof(string1);m++)
  6. lcd_write(m+3,0,string1[m]);
  7. }
  8. /*密码正确提示*/
  9. void correct(uchar m)
  10. {
  11. for(m=0;m<sizeof(string4);m++)
  12. { lcd_write(m+5,0,string4[m]);
  13. }
  14. for(m=0;m<sizeof(string5);m++)
  15. { lcd_write(0,m+5,string5[m]);
  16. }
  17. delay(1000);
  18. initialize();
  19. lcd_wcom(0x01); //清显示,光标复位到地址00H位置
  20. }
  21. /*密码错误提示*/
  22. void incorrect(uchar m)
  23. {
  24. for(m=0;m<sizeof(string2);m++)
  25. { lcd_write(m+4,0,string2[m]);
  26. }
  27. for(m=0;m<sizeof(string3);m++)
  28. { lcd_write(0,m+3,string3[m]);
  29. }
  30. delay(500);
  31. lcd_init(); //清显示,光标复位到地址00H位置
  32. initialize();
  33. }
  34. /*密码错误三次提醒*/
  35. void three(uchar m)
  36. {
  37. uint i;
  38. for(i=0;i<6;i++)
  39. {
  40. for(m=0;m<sizeof(string6);m++)
  41. { lcd_write(m,0,string6[m]);
  42. }
  43. for(m=0;m<sizeof(string7);m++)
  44. { lcd_write(0,m+1,string7[m]);
  45. }
  46. delay(500);
  47. lcd_write(0,10,table[5-i]);
  48. lcd_write(0,11,'s');
  49. }
  50. lcd_init(); //清显示,光标复位到地址00H位置
  51. initialize();
  52. }
  53. /*输入新密码提示*/
  54. void new_code(uchar m)
  55. {
  56. for(m=0;m<sizeof(string8);m++)
  57. lcd_write(m+1,0,string8[m]);
  58. }
  59. /*成功提示*/
  60. void new_su(uchar m)
  61. {
  62. for(m=0;m<sizeof(string9);m++)
  63. lcd_write(m+5,0,string9[m]);
  64. delay(1000);
  65. lcd_init(); //清显示,光标复位到地址00H位置
  66. initialize();
  67. }
  68. /*输出input code*/
  69. void string_show(uchar choice)
  70. {
  71. uchar m;
  72. lcd_init();
  73. switch(choice)
  74. {
  75. case 1:ic(m);break;//输入提示
  76. case 2:correct(m);break;//正确提示
  77. case 3:incorrect(m);break;//错误提示
  78. case 4:three(m);break;//错误三次提示
  79. case 5:new_code(m);break;//输入新密码提示
  80. case 6:new_su(m);break;//重置密码成功
  81. default:break;
  82. }
  83. }

4)输入密码/重置密码时密码行的显示

  1. /*显示密码初始位及用户进行输入时的状态*/
  2. uchar data nnumin[]={"- - - -"};
  3. uchar code nnum[]={"- - - -"};
  4. uchar code numshow[]={"* * * *"};
  5. /*初始化初始状态显示数组*/
  6. void initialize()
  7. {
  8. uint i;
  9. for(i=0;i<sizeof(nnum);i++)
  10. { nnumin[i]=nnum[i];
  11. }
  12. }
  13. /*用户输入密码时的显示*/
  14. void input(uchar num)
  15. {
  16. uchar n,i;
  17. for(n=0;n<8;n++)
  18. {
  19. if(sizeof(num)!=0)
  20. {
  21. if(num!=0)
  22. {
  23. for(i=0;i<num;i++)
  24. {
  25. nnumin[2*i]=numshow[2*i];
  26. }
  27. }
  28. else initialize();//输入密码时按下A/B按钮,则重新开始
  29. }
  30. lcd_write(0,n+5,nnumin[n]);
  31. }
  32. }
  33. /*用户重置密码时显示*/
  34. void reset_code(uint c,uchar *num)
  35. {
  36. uchar n,i;
  37. for(n=0;n<8;n++)
  38. {
  39. if(c!=0)
  40. {
  41. for(i=0;i<sizeof(num)+1;i++)
  42. {
  43. if(num[i]!='-')
  44. nnumin[2*i]=table[num[i]];
  45. }
  46. }
  47. lcd_write(0,n+5,nnumin[n]);
  48. }
  49. }

2、总控制

负责完成实现电子密码锁的重置密码,判断密码正误等功能。

1)主函数

  1. void main()
  2. {
  3. lcd_init(); //初始化lcd
  4. lcd_wcom(0x40); //设定CGRAM地址
  5. LEDR=1;
  6. LEDG=1;
  7. while(1)
  8. {
  9. key();//判断用户想要进行的操作(开锁or重置密码)
  10. if(keyin==1)
  11. {
  12. display();
  13. }
  14. }
  15. }

2)key函数---判断用户想要进行的操作

  1. bit keyin=0;//输入状态
  2. bit keyre=0;//判断是否为重置密码状态
  3. /*判断按键的内容*/
  4. void key()
  5. {
  6. num=KeyPro();
  7. if(num=='A')
  8. {
  9. keyin=~keyin;
  10. LEDR=0;
  11. }
  12. if(num=='B')
  13. {
  14. keyre=~keyre;
  15. //重置密码之前需先解锁
  16. display();
  17. reset();
  18. }
  19. }

3)display函数功能---接收用户输入数据并调用相应函数进行操作

密码行初始状态为“----”,输入的密码位会显示为“*”,用户完全输入4位密码后会判断密码正误并根据具体情况输出相应提示符,同时亮相应颜色LED灯。

若用户在输入密码中途触发按钮“A”或“B”则之前输入的密码会清空,密码行状态重置为“----”。

  1. uchar data scode[]={0,0,0,0};//设置的密码,初始为0000
  2. uchar data ncode[]={0,0,0,0};//设置的密码,初始为0000
  3. uchar data ncode2[]={9,9,9,9};//储存用户输入的内容
  4. bit keyin=0;//输入状态
  5. bit keyre=0;//判断是否为重置密码状态
  6. uint inc=1;//判断是否出现连续三次的错误
  7. /*输入密码,若判断为正确则解锁,
  8. 为错误则跳转界面重新输入*/
  9. void display()
  10. {
  11. uint count=1;
  12. string_show(1);
  13. input(0);
  14. while(count<5)//输入四位密码后验证并跳转
  15. { num=KeyPro();
  16. if(num!=0xff)
  17. {
  18. if(num>=0&&num<=9)
  19. {
  20. ncode2[count-1]=num;
  21. input(count);
  22. count++;
  23. }
  24. else//若在输入途中点击按钮A或B,则清零重新输入
  25. {
  26. memset(ncode2,'-',sizeof(ncode2));//ncode2重置
  27. count=1;
  28. input(0);
  29. }
  30. }
  31. }
  32. //判断后输出提示
  33. if(confirm())
  34. { LEDG=0;
  35. string_show(2);
  36. if(keyre!=1) keyin=0;//LCD停止显示
  37. inc=1;
  38. //红灯亮,绿灯灭
  39. LEDG=1;
  40. LEDR=0;
  41. }
  42. else
  43. { LEDR=0;
  44. if(inc<3)
  45. {
  46. string_show(3);
  47. inc++;
  48. }
  49. else
  50. { //错误三次后设置密码失效,锁定5秒
  51. in_code(scode,ncode);//将密码初始化为最初状态
  52. string_show(4);
  53. inc=1;
  54. }
  55. count=1;
  56. }
  57. }

4)判断密码正误

  1. uchar data ncode[]={0,0,0,0};//设置的密码,初始为0000
  2. uchar data ncode2[]={9,9,9,9};//储存用户输入的内容
  3. bit check;//判断输入密码是否正确
  4. /*验证密码,按钮A功能*/
  5. uchar confirm(void)
  6. {
  7. uint i,j;
  8. LEDR=1;
  9. LEDG=1;
  10. for(i=0;i<4;i++)
  11. {
  12. j=i;
  13. if(ncode[i]==ncode2[j])
  14. {
  15. check=1;
  16. }
  17. else
  18. {
  19. check=0;
  20. break;
  21. }
  22. }
  23. memset(ncode2,'-',sizeof(ncode2));
  24. return check;
  25. }

5)重置密码

  1. uchar data ncode2[]={9,9,9,9};//储存用户输入的内容
  2. bit keyre=0;//判断是否为重置密码状态
  3. /*重置密码*/
  4. void reset()
  5. {
  6. uint count=1,cc;
  7. string_show(5);
  8. reset_code(0,ncode2);
  9. while(count<6)
  10. { num=KeyPro();
  11. if(num!=0xff)
  12. {
  13. if(num>=0&&num<=9)
  14. {
  15. ncode2[count-1]=num;
  16. reset_code(1,ncode2);
  17. count++;
  18. cc=1;
  19. }
  20. else//若在输入途中点击按钮A或B,则停止
  21. {
  22. cc=0;
  23. count=6;
  24. break;
  25. }
  26. }
  27. }
  28. //若成功输入四位密码,则成功修改密码
  29. if(cc==1)
  30. {
  31. in_code(ncode,ncode2);
  32. }
  33. string_show(6);
  34. keyre=0;
  35. }

6)in_code函数---将后一个数组内容复制到前一个数组中

  1. void in_code(uchar *cc,uchar *cc1)
  2. {
  3. uint i,j;
  4. for(i=0;i<4;i++)
  5. {
  6. j=i;
  7. cc[i]=cc1[i];
  8. }
  9. }

程序运行效果

1、启动

 2、输入密码时的显示

3、重置密码时的显示

 

4、其他提示符的显示

1)密码输入正确提示符

 2)密码输入错误提示符

 3)密码错误三次时的提示符

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/860348
推荐阅读
相关标签
  

闽ICP备14008679号