找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1426|回復(fù): 0
收起左側(cè)

5位51單片機(jī)電子密碼鎖設(shè)計(jì)

[復(fù)制鏈接]
ID:1039126 發(fā)表于 2024-5-18 14:29 | 顯示全部樓層 |閱讀模式
電子密碼鎖設(shè)計(jì)
1.實(shí)驗(yàn)任務(wù)
根據(jù)設(shè)定好的密碼,采用二個(gè)按鍵實(shí)現(xiàn)密碼的輸入功能,當(dāng)密碼輸入正確之后,鎖就打開,如果輸入的三次的密碼不正確,就鎖定按鍵3秒鐘,同時(shí)發(fā)現(xiàn)報(bào)警聲,直到?jīng)]有按鍵按下3種后,才打開按鍵鎖定功能;否則在3秒鐘內(nèi)仍有按鍵按下,就重新鎖定按鍵3秒時(shí)間并報(bào)警。
2.電路原理圖
圖片1.png
圖4.32.1
3.系統(tǒng)板上硬件連線
(1). 把“單片機(jī)系統(tǒng)”區(qū)域中的P0.0/AD0用導(dǎo)線連接到“音頻放大模塊”區(qū)域中的SPK IN端子上;
(2). 把“音頻放大模塊”區(qū)域中的SPK OUT端子接喇叭和;
(3). 把“單片機(jī)系統(tǒng)”區(qū)域中的P2.0/A8-P2.7/A15用8芯排線連接到“四路靜態(tài)數(shù)碼顯示”區(qū)域中的任一個(gè)ABCDEFGH端子上;
(4). 把“單片機(jī)系統(tǒng)“區(qū)域中的P1.0用導(dǎo)線連接到“八路發(fā)光二極管模塊”區(qū)域中的L1端子上;
(5). 把“單片機(jī)系統(tǒng)”區(qū)域中的P3.6/WR、P3.7/RD用導(dǎo)線連接到“獨(dú)立式鍵盤”區(qū)域中的SP1和SP2端子上;
4.程序設(shè)計(jì)內(nèi)容
(1). 密碼的設(shè)定,在此程序中密碼是固定在程序存儲(chǔ)器ROM中,假設(shè)預(yù)設(shè)的密碼為“12345”共5位密碼。
(2). 密碼的輸入問(wèn)題:
由于采用兩個(gè)按鍵來(lái)完成密碼的輸入,那么其中一個(gè)按鍵為功能鍵,另一個(gè)按鍵為數(shù)字鍵。在輸入過(guò)程中,首先輸入密碼的長(zhǎng)度,接著根據(jù)密碼的長(zhǎng)度輸入密碼的位數(shù),直到所有長(zhǎng)度的密碼都已經(jīng)輸入完畢;或者輸入確認(rèn)功能鍵之后,才能完成密碼的輸入過(guò)程。進(jìn)入密碼的判斷比較處理狀態(tài)并給出相應(yīng)的處理過(guò)程。
(3). 按鍵禁止功能:初始化時(shí),是允許按鍵輸入密碼,當(dāng)有按鍵按下并開始進(jìn)入按鍵識(shí)別狀態(tài)時(shí),按鍵禁止功能被激活,但啟動(dòng)的狀態(tài)在3次密碼輸入不正確的情況下發(fā)生的。
5.C語(yǔ)言單片機(jī)源程序
  1. #include <AT89X52.H>
  2.  
  3. unsigned char code ps[]={1,2,3,4,5};
  4. unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
  5. 0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
  6.  
  7. unsigned char pslen=9;
  8. unsigned char templen;
  9. unsigned char digit;
  10. unsigned char funcount;
  11. unsigned char digitcount;
  12. unsigned char psbuf[9];
  13. bit cmpflag;
  14. bit hibitflag;
  15. bit errorflag;
  16. bit rightflag;
  17. unsigned int second3;
  18. unsigned int aa;
  19. unsigned int bb;
  20. bit alarmflag;
  21. bit exchangeflag;
  22. unsigned int cc;
  23. unsigned int dd;
  24. bit okflag;
  25. unsigned char oka;
  26. unsigned char okb;
  27.  
  28. void main(void)
  29. {
  30. unsigned char i,j;
  31. P2=dispcode[digitcount];
  32. TMOD=0x01;
  33. TH0=(65536-500)/256;
  34. TL0=(65536-500)%256;
  35. TR0=1;
  36. ET0=1;
  37. EA=1;
  38.  
  39. while(1)
  40. {
  41. if(cmpflag==0)
  42. {
  43. if(P3_6==0) //function key
  44. {
  45. for(i=10;i>0;i--)
  46. for(j=248;j>0;j--);
  47. if(P3_6==0)
  48. {
  49. if(hibitflag==0)
  50. {
  51. funcount++;
  52. if(funcount==pslen+2)
  53. {
  54. funcount=0;
  55. cmpflag=1;
  56. }
  57. P1=dispcode[funcount];
  58. }
  59. else
  60. {
  61. second3=0;
  62. }
  63. while(P3_6==0);
  64. }
  65. }
  66.  
  67. if(P3_7==0) //digit key
  68. {
  69. for(i=10;i>0;i--)
  70. for(j=248;j>0;j--);
  71. if(P3_7==0)
  72. {
  73. if(hibitflag==0)
  74. {
  75. digitcount++;
  76. if(digitcount==10)
  77. {
  78. digitcount=0;
  79. }
  80. P2=dispcode[digitcount];
  81. if(funcount==1)
  82. {
  83. pslen=digitcount;
  84. templen=pslen;
  85. }
  86. else if(funcount>1)
  87. {
  88. psbuf[funcount-2]=digitcount;
  89. }
  90. }
  91. else
  92. {
  93. second3=0;
  94. }
  95. while(P3_7==0);
  96. }
  97. }
  98. }
  99. else
  100. {
  101. cmpflag=0;
  102. for(i=0;i<pslen;i++)
  103. {
  104. if(ps[i]!=psbuf[i])
  105. {
  106. hibitflag=1;
  107. i=pslen;
  108. errorflag=1;
  109. rightflag=0;
  110. cmpflag=0;
  111. second3=0;
  112. goto a;
  113. }
  114. }
  115. cc=0;
  116. errorflag=0;
  117. rightflag=1;
  118. hibitflag=0;
  119. a: cmpflag=0;
  120. }
  121. }
  122. }
  123.  
  124. void t0(void) interrupt 1 using 0
  125. {
  126. TH0=(65536-500)/256;
  127. TL0=(65536-500)%256;
  128.  
  129. if((errorflag==1) && (rightflag==0))
  130. {
  131. bb++;
  132. if(bb==800)
  133. {
  134. bb=0;
  135. alarmflag=~alarmflag;
  136. }
  137. if(alarmflag==1)
  138. {
  139. P0_0=~P0_0;
  140. }
  141.  
  142. aa++;
  143. if(aa==800)
  144. {
  145. aa=0;
  146. P0_1=~P0_1;
  147. }
  148. second3++;
  149. if(second3==6400)
  150. {
  151. second3=0;
  152. hibitflag=0;
  153. errorflag=0;
  154. rightflag=0;
  155. cmpflag=0;
  156. P0_1=1;
  157. alarmflag=0;
  158. bb=0;
  159. aa=0;
  160. }
  161. }
  162.  
  163. if((errorflag==0) && (rightflag==1))
  164. {
  165. P0_1=0;
  166. cc++;
  167. if(cc<1000)
  168. {
  169. okflag=1;
  170. }
  171. else if(cc<2000)
  172. {
  173. okflag=0;
  174. }
  175. else
  176. {
  177. errorflag=0;
  178. rightflag=0;
  179. hibitflag=0;
  180. cmpflag=0;
  181. P0_1=1;
  182. cc=0;
  183. oka=0;
  184. okb=0;
  185. okflag=0;
  186. P0_0=1;
  187. }
  188. if(okflag==1)
  189. {
  190. oka++;
  191. if(oka==2)
  192. {
  193. oka=0;
  194. P0_0=~P0_0;
  195. }
  196. }
  197. else
  198. {
  199. okb++;
  200. if(okb==3)
  201. {
  202. okb=0;
  203. P0_0=~P0_0;
  204. }
  205. }
  206. }
  207. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表