久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1373|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩成人一区 | 一区二区日本 | 日韩欧美国产精品 | a视频在线观看 | 日韩中文在线观看 | 中文字幕精品视频在线观看 | 久草热视频 | 国产目拍亚洲精品99久久精品 | 国产一级久久久久 | 性欧美精品一区二区三区在线播放 | 91麻豆精品国产91久久久更新资源速度超快 | 中文字幕一区二区三区四区不卡 | 91视频在线 | 国产伊人久久久 | 91麻豆精品国产91久久久更新资源速度超快 | 亚洲国产精品久久久 | 欧美成人精品一区二区男人看 | 亚洲一级淫片 | 国产精品成人一区二区三区夜夜夜 | 免费黄色片在线观看 | 亚洲v日韩v综合v精品v | 午夜精品一区二区三区在线播放 | 国产国拍亚洲精品av | 最新免费av网站 | 国产精品一区二区日韩 | 黄色一级大片在线观看 | 国产精品久久国产精品久久 | 亚洲狠狠爱 | 国产免费一区二区三区 | 美女爽到呻吟久久久久 | 99精品视频免费观看 | 日本免费一区二区三区视频 | 亚洲视频在线播放 | 成年人免费看 | 亚洲精品久久久久久国产精华液 | 午夜精品久久久久久久星辰影院 | 婷婷在线视频 | 欧美二区在线 | 午夜理伦三级理论三级在线观看 | 国内自拍第一页 | 久久精品视频在线免费观看 |