标题: 基于51单片机的电子密码锁程序 [打印本页]
作者: Straw 时间: 2020-10-17 21:00
标题: 基于51单片机的电子密码锁程序
结果图:
一、目的概述(收集相关资料、选设计方案、电路设计):
本设计是以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. }
作者: after. 时间: 2021-2-26 15:57
你好,请问我下载以后为什么蜂鸣器一直叫,按键也没效果
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |