找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1406|回复: 0
收起左侧

单片机4×4键盘及8位数码管显示构成的电子密码锁

[复制链接]
ID:1039126 发表于 2024-5-18 14:33 | 显示全部楼层 |阅读模式
1. 实验任务
用4×4组成0-9数字键及确认键。
用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用LED发光二极管亮一秒钟做为提示,同时发出“叮咚”声;若密码不正确,禁止按键输入3秒,同时发出“嘀、嘀”报警声;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。
2. 电路原理图
图片2.png
4.33.1
3. 系统板上硬件连线
(1). 把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。
(2). 把“单片机系统“区域中的P2.0-P2.7用8芯排线连接到“动态数码显示”区域中的S1S2S3S4S5S6S7S8端子上。
(3). 把“单片机系统”区域中的P3.0-P3.7用8芯排线连接到“4×4行列式键盘”区域中的R1R2R3R4C1C2C3C4端子上。
(4). 把“单片机系统”区域中的P1.0用导线连接到“八路发光二极管模块”区域中的L2端子上。
(5). 把“单片机系统”区域中的P1.7用导线连接到“音频放大模块”区域中的SPK IN端子上。
(6). 把“音频放大模块”区域中的SPK OUT接到喇叭上。
4. 程序设计内容
(1). 4×4行列式键盘识别技术:有关这方面内容前面已经讨论过,这里不再重复。
(2). 8位数码显示,初始化时,显示“P   ”,接着输入最大6位数的密码,当密码输入完后,按下确认键,进行密码比较,然后给出相应的信息。在输入密码过程中,显示器只显示“8.”。当数字输入超过6个时,给出报警信息。在密码输入过程中,若输入错误,可以利用“DEL”键删除刚才输入的错误的数字。
(3). 4×4行列式键盘的按键功能分布图如图4.33.2所示: 
  图片3.png
图4.33.2

5. 单片机C语言源程序
  1. #include <AT89X52.H>
  2.  
  3. unsigned char ps[]={1,2,3,4,5};
  4.  
  5. unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,
  6. 0xef,0xdf,0xbf,0x7f};
  7. unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
  8. 0x6d,0x7d,0x07,0x7f,0x6f,
  9. 0x77,0x7c,0x39,0x5e,0x79,0x71,
  10. 0x00,0x40,0x73,0xff};
  11. unsigned char dispbuf[8]={18,16,16,16,16,16,16,16};
  12. unsigned char dispcount;
  13. unsigned char flashcount;
  14. unsigned char temp;
  15. unsigned char key;
  16. unsigned char keycount;
  17. unsigned char pslen=5;
  18. unsigned char getps[6];
  19. bit keyoverflag;
  20. bit errorflag;
  21. bit rightflag;
  22. unsigned int second3;
  23. unsigned int aa,bb;
  24. unsigned int cc;
  25. bit okflag;
  26. bit alarmflag;
  27. bit hibitflag;
  28. unsigned char oka,okb;
  29.  
  30. void main(void)
  31. {
  32. unsigned char i,j;
  33.  
  34. TMOD=0x01;
  35. TH0=(65536-500)/256;
  36. TL0=(65536-500)%256;
  37. TR0=1;
  38. ET0=1;
  39. EA=1;
  40.  
  41. while(1)
  42. {
  43. P3=0xff;
  44. P3_4=0;
  45. temp=P3;
  46. temp=temp & 0x0f;
  47. if (temp!=0x0f)
  48. {
  49. for(i=10;i>0;i--)
  50. for(j=248;j>0;j--);
  51. temp=P3;
  52. temp=temp & 0x0f;
  53. if (temp!=0x0f)
  54. {
  55. temp=P3;
  56. temp=temp & 0x0f;
  57. switch(temp)
  58. {
  59. case 0x0e:
  60. key=7;
  61. break;
  62. case 0x0d:
  63. key=8;
  64. break;
  65. case 0x0b:
  66. key=9;
  67. break;
  68. case 0x07:
  69. key=10;
  70. break;
  71. }
  72. temp=P3;
  73. P1_1=~P1_1;
  74. if((key>=0) && (key<10))
  75. {
  76. if(keycount<6)
  77. {
  78. getps[keycount]=key;
  79. dispbuf[keycount+2]=19;
  80. }
  81. keycount++;
  82. if(keycount==6)
  83. {
  84. keycount=6;
  85. }
  86. else if(keycount>6)
  87. {
  88. keycount=6;
  89. keyoverflag=1;//key overflow
  90. }
  91. }
  92. else if(key==12)//delete key
  93. {
  94. if(keycount>0)
  95. {
  96. keycount--;
  97. getps[keycount]=0;
  98. dispbuf[keycount+2]=16;
  99. }
  100. else
  101. {
  102. keyoverflag=1;
  103. }
  104. }
  105. else if(key==15)//enter key
  106. {
  107. if(keycount!=pslen)
  108. {
  109. errorflag=1;
  110. rightflag=0;
  111. second3=0;
  112. }
  113. else
  114. {
  115. for(i=0;i<keycount;i++)
  116. {
  117. if(getps[i]!=ps[i])
  118. {
  119. i=keycount;
  120. errorflag=1;
  121. rightflag=0;
  122. second3=0;
  123. goto a;
  124. }
  125. }
  126. errorflag=0;
  127. rightflag=1;
  128. a: i=keycount;
  129. }
  130. }
  131. temp=temp & 0x0f;
  132. while(temp!=0x0f)
  133. {
  134. temp=P3;
  135. temp=temp & 0x0f;
  136. }
  137. keyoverflag=0;//?????????
  138. }
  139. }
  140. P3=0xff;
  141. P3_5=0;
  142. temp=P3;
  143. temp=temp & 0x0f;
  144. if (temp!=0x0f)
  145. {
  146. for(i=10;i>0;i--)
  147. for(j=248;j>0;j--);
  148. temp=P3;
  149. temp=temp & 0x0f;
  150. if (temp!=0x0f)
  151. {
  152. temp=P3;
  153. temp=temp & 0x0f;
  154. switch(temp)
  155. {
  156. case 0x0e:
  157. key=4;
  158. break;
  159. case 0x0d:
  160. key=5;
  161. break;
  162. case 0x0b:
  163. key=6;
  164. break;
  165. case 0x07:
  166. key=11;
  167. break;
  168. }
  169. temp=P3;
  170. P1_1=~P1_1;
  171. if((key>=0) && (key<10))
  172. {
  173. if(keycount<6)
  174. {
  175. getps[keycount]=key;
  176. dispbuf[keycount+2]=19;
  177. }
  178. keycount++;
  179. if(keycount==6)
  180. {
  181. keycount=6;
  182. }
  183. else if(keycount>6)
  184. {
  185. keycount=6;
  186. keyoverflag=1;//key overflow
  187. }
  188. }
  189. else if(key==12)//delete key
  190. {
  191. if(keycount>0)
  192. {
  193. keycount--;
  194. getps[keycount]=0;
  195. dispbuf[keycount+2]=16;
  196. }
  197. else
  198. {
  199. keyoverflag=1;
  200. }
  201. }
  202. else if(key==15)//enter key
  203. {
  204. if(keycount!=pslen)
  205. {
  206. errorflag=1;
  207. rightflag=0;
  208. second3=0;
  209. }
  210. else
  211. {
  212. for(i=0;i<keycount;i++)
  213. {
  214. if(getps[i]!=ps[i])
  215. {
  216. i=keycount;
  217. errorflag=1;
  218. rightflag=0;
  219. second3=0;
  220. goto a4;
  221. }
  222. }
  223. errorflag=0;
  224. rightflag=1;
  225. a4: i=keycount;
  226. }
  227. }
  228. temp=temp & 0x0f;
  229. while(temp!=0x0f)
  230. {
  231. temp=P3;
  232. temp=temp & 0x0f;
  233. }
  234. keyoverflag=0;//?????????
  235. }
  236. }
  237.  
  238. P3=0xff;
  239. P3_6=0;
  240. temp=P3;
  241. temp=temp & 0x0f;
  242. if (temp!=0x0f)
  243. {
  244. for(i=10;i>0;i--)
  245. for(j=248;j>0;j--);
  246. temp=P3;
  247. temp=temp & 0x0f;
  248. if (temp!=0x0f)
  249. {
  250. temp=P3;
  251. temp=temp & 0x0f;
  252. switch(temp)
  253. {
  254. case 0x0e:
  255. key=1;
  256. break;
  257. case 0x0d:
  258. key=2;
  259. break;
  260. case 0x0b:
  261. key=3;
  262. break;
  263. case 0x07:
  264. key=12;
  265. break;
  266. }
  267. temp=P3;
  268. P1_1=~P1_1;
  269. if((key>=0) && (key<10))
  270. {
  271. if(keycount<6)
  272. {
  273. getps[keycount]=key;
  274. dispbuf[keycount+2]=19;
  275. }
  276. keycount++;
  277. if(keycount==6)
  278. {
  279. keycount=6;
  280. }
  281. else if(keycount>6)
  282. {
  283. keycount=6;
  284. keyoverflag=1;//key overflow
  285. }
  286. }
  287. else if(key==12)//delete key
  288. {
  289. if(keycount>0)
  290. {
  291. keycount--;
  292. getps[keycount]=0;
  293. dispbuf[keycount+2]=16;
  294. }
  295. else
  296. {
  297. keyoverflag=1;
  298. }
  299. }
  300. else if(key==15)//enter key
  301. {
  302. if(keycount!=pslen)
  303. {
  304. errorflag=1;
  305. rightflag=0;
  306. second3=0;
  307. }
  308. else
  309. {
  310. for(i=0;i<keycount;i++)
  311. {
  312. if(getps[i]!=ps[i])
  313. {
  314. i=keycount;
  315. errorflag=1;
  316. rightflag=0;
  317. second3=0;
  318. goto a3;
  319. }
  320. }
  321. errorflag=0;
  322. rightflag=1;
  323. a3: i=keycount;
  324. }
  325. }
  326. temp=temp & 0x0f;
  327. while(temp!=0x0f)
  328. {
  329. temp=P3;
  330. temp=temp & 0x0f;
  331. }
  332. keyoverflag=0;//?????????
  333. }
  334. }
  335.  
  336. P3=0xff;
  337. P3_7=0;
  338. temp=P3;
  339. temp=temp & 0x0f;
  340. if (temp!=0x0f)
  341. {
  342. for(i=10;i>0;i--)
  343. for(j=248;j>0;j--);
  344. temp=P3;
  345. temp=temp & 0x0f;
  346. if (temp!=0x0f)
  347. {
  348. temp=P3;
  349. temp=temp & 0x0f;
  350. switch(temp)
  351. {
  352. case 0x0e:
  353. key=0;
  354. break;
  355. case 0x0d:
  356. key=13;
  357. break;
  358. case 0x0b:
  359. key=14;
  360. break;
  361. case 0x07:
  362. key=15;
  363. break;
  364. }
  365. temp=P3;
  366. P1_1=~P1_1;
  367. if((key>=0) && (key<10))
  368. {
  369. if(keycount<6)
  370. {
  371. getps[keycount]=key;
  372. dispbuf[keycount+2]=19;
  373. }
  374. keycount++;
  375. if(keycount==6)
  376. {
  377. keycount=6;
  378. }
  379. else if(keycount>6)
  380. {
  381. keycount=6;
  382. keyoverflag=1;//key overflow
  383. }
  384. }
  385. else if(key==12)//delete key
  386. {
  387. if(keycount>0)
  388. {
  389. keycount--;
  390. getps[keycount]=0;
  391. dispbuf[keycount+2]=16;
  392. }
  393. else
  394. {
  395. keyoverflag=1;
  396. }
  397. }
  398. else if(key==15)//enter key
  399. {
  400. if(keycount!=pslen)
  401. {
  402. errorflag=1;
  403. rightflag=0;
  404. second3=0;
  405. }
  406. else
  407. {
  408. for(i=0;i<keycount;i++)
  409. {
  410. if(getps[i]!=ps[i])
  411. {
  412. i=keycount;
  413. errorflag=1;
  414. rightflag=0;
  415. second3=0;
  416. goto a2;
  417. }
  418. }
  419. errorflag=0;
  420. rightflag=1;
  421. a2: i=keycount;
  422. }
  423. }
  424. temp=temp & 0x0f;
  425. while(temp!=0x0f)
  426. {
  427. temp=P3;
  428. temp=temp & 0x0f;
  429. }
  430. keyoverflag=0;//?????????
  431. }
  432. }
  433. }
  434. }
  435. void t0(void) interrupt 1 using 0
  436. {
  437. TH0=(65536-500)/256;
  438. TL0=(65536-500)%256;
  439.  
  440. flashcount++;
  441. if(flashcount==8)
  442. {
  443. flashcount=0;
  444. P0=dispcode[dispbuf[dispcount]];
  445. P2=dispbit[dispcount];
  446. dispcount++;
  447. if(dispcount==8)
  448. {
  449. dispcount=0;
  450. }
  451. }
  452.  
  453. if((errorflag==1) && (rightflag==0))
  454. {
  455. bb++;
  456. if(bb==800)
  457. {
  458. bb=0;
  459. alarmflag=~alarmflag;
  460. }
  461. if(alarmflag==1)//sound alarm signal
  462. {
  463. P1_7=~P1_7;
  464. }
  465.  
  466. aa++;
  467. if(aa==800)//light alarm signal
  468. {
  469. aa=0;
  470. P1_0=~P1_0;
  471. }
  472. second3++;
  473. if(second3==6400)
  474. {
  475. second3=0;
  476. errorflag=0;
  477. rightflag=0;
  478. alarmflag=0;
  479. bb=0;
  480. aa=0;
  481. }
  482. }
  483. else if((errorflag==0) && (rightflag==1))
  484. {
  485. P1_0=0;
  486. cc++;
  487. if(cc<1000)
  488. {
  489. okflag=1;
  490. }
  491. else if(cc<2000)
  492. {
  493. okflag=0;
  494. }
  495. else
  496. {
  497. errorflag=0;
  498. rightflag=0;
  499. P1_7=1;
  500. cc=0;
  501. oka=0;
  502. okb=0;
  503. okflag=0;
  504. P1_0=1;
  505. }
  506. if(okflag==1)
  507. {
  508. oka++;
  509. if(oka==2)
  510. {
  511. oka=0;
  512. P1_7=~P1_7;
  513. }
  514. }
  515. else
  516. {
  517. okb++;
  518. if(okb==3)
  519. {
  520. okb=0;
  521. P1_7=~P1_7;
  522. }
  523. }
  524. }
  525.  
  526. if(keyoverflag==1)
  527. {
  528. P1_7=~P1_7;
  529. }
  530. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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