结果图:
一、目的概述(收集相关资料、选设计方案、电路设计): 本设计是以STC89C52单片机为控制核心的电子密码锁,属于单片机的应用。做本设计有助于对单片机矩阵键盘,数码管以及串行通信原理的深入了解。电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的青睐。 系统设计方案为: (1)系统设置6 位密码,密码通过键盘输入,若密码正确,则将锁打开。 (2)密码可由用户自己设定,在开锁状态下,用户可自行修改密码。
(3)具有自动报警功能,密码输入错误时,报警由扬声器发出“滴滴”报警声。而密码输入正确则是“叮咚”声。
系统设计结构图:
本设计由主控芯片51单片机,单片机时钟电路,键盘,数码管组成。单片负责控制整个系统的控制执行过程。开锁成功由数码管显示OPEN,以及蜂鸣器“叮咚”表示,开锁失败由数码管显示Err,以及蜂鸣器“滴滴”表示。
二、实验原理图 电路设计:
程序设计:(只展示核心部分) 主程序
1. //4×4 键盘及8 位数码管显示构成的电子密码锁 2. void main() //主程序 3. { 4. uchar key; 5. Timer0_Init(); 6. while(1) 7. { 8. key = KeyScan(); 9. password(key); 10. } 11. }
核心程序:数码管的动态扫描显示
12. void Display() 13. { 14. uchar i; 15. Segment_sel=0x00;//消隐 16. switch(i) //位选,选择点亮的数码管, 17. { 18. case(0): 19. LSA=0;LSB=0;LSC=0; break; 20. case(1): 21. LSA=1;LSB=0;LSC=0; break; 22. case(2): 23. LSA=0;LSB=1;LSC=0; break; 24. case(3): 25. LSA=1;LSB=1;LSC=0; break; 26. case(4): 27. LSA=0;LSB=0;LSC=1; break; 28. case(5): 29. LSA=1;LSB=0;LSC=1; break; 30. } 31. }
核心程序:矩阵键盘的扫描输入
32. uchar KeyScan() 33. { 34. for(i=0;i<8;i++) 35. { 36. P1 = P1Pin[ i]; 37. Button = P1; 38. if(Button != P1Pin[ i]) 39. { 40. Delayms(5); 41. Button = P1; 42. if(Button != P1Pin[ i]) 43. { 44. KeyState=1; 45. key8 = Button; 46. } 47. while(Button != P1Pin[ i]) 48. { Button = P1; } 49. } 50. } 51. switch(key8) 52. { 53. case 0x77:{key = 1;break;} 54. case 0x7b:{key = 2;break;} 55. case 0x7d:{key = 3;break;} 56. case 0xb7:{key = 4;break;} 57. case 0xbb:{key = 5;break;} 58. case 0xbd:{key = 6;break;} 59. case 0xd7:{key = 7;break;} 60. case 0xdb:{key = 8;break;} 61. case 0xdd:{key = 9;break;} 62. case 0xeb:{key = 0;break;} //0 63. case 0x7e:{key = 10;break;} //÷ 64. case 0xbe:{key = 11;break;} //× 65. case 0xde:{key = 12;break;} //+ 66. case 0xee:{key = 13;break;} //- 67. case 0xed:{key = 14;break;} //= 68. case 0xe7:{key = 15;break;} //ENTER 69. default:{key = 0xff;break;} 70. } 71. return key; 72. }
核心程序:输入密码以及校对和处理
73. void password(uchar key)//0~9 数字键,10 输入密码,11 设置密码,12 删除上一个数,13 重新输入 15 确定 74. { 75. uchar i=0; 76. if(KeyState==1) 77. { 78. switch(state) 79. { 80. case 0: 81. { 82. if(key == 10) 83. { 84. state = 1; 85. LSA=1;LSB=1;LSC=1; 86. Segment_sel=0xff; //显示8 87. } 88. else if(key == 11) 89. { 90. state = 2; 91. LSA=1;LSB=1;LSC=1; 92. Segment_sel=0xfd; //显示P 93. } 94. break; 95. } 96. case 1: 97. { 98. if(key>=0 && key <= 9) //输入 99. { 100. InPassword[5]=InPassword[4]; 101. InPassword[4]=InPassword[3]; 102. InPassword[3]=InPassword[2]; 103. InPassword[2]=InPassword[1]; 104. InPassword[1]=InPassword[0]; 105. InPassword[0]=smgduan[key]; 106. KeyState=0; 107. } 108. else if(key == 15) //确定 109. { 110. if(Compare(InPassword)) 111. { 112. for(i=17;i<23;i++) 113. InPassword[ i]=smgduan; 114. Delayms(1000); 115. }//open 116. else 117. { 118. for(i=23;i<27;i++) 119. InPassword[ i]=smgduan; 120. Delayms(1000); 121. }//err 122. state = 0; 123. } 124. else if(key == 13) //重新输入 125. { 126. for(i=0;i<6;i++) 127. InPassword[ i] = 0xff; // 全亮 128. Delayms(1000); 129. state = 0; 130. } 131. break; 132. } 133. else//如果没有按键按下 134. { 135. if(state == 0) 136. { 137. Segment_sel= 0x00;// 不显示 138. } 139. } 140. } |