单片机6位密码锁设计(汇编语言源程序配Proteus电路图)

合集下载

单片机密码锁设计

单片机密码锁设计

单片机密码锁设计工作过程1.按键设置6位密码,输入密码,通过单片机判断,若密码正确,通过则锁打开,显示open!2.首次使用时输入:131420,对密码进行初始化,当显示:initpassword,证明密码初始化完成,此时的密码为:000000。

设计思想(1)本设计为了防止密码被窃取要求在输入密码时在LCD屏幕上显示*号。

(2)设计开锁密码位六位密码的电子密码锁。

(3)能够LCD显示在密码正确时显示open!,密码错误时显示ERROR,输入密码时显示initpassword。

(4)实现输入密码错误超过限定的三次电子密码锁定。

(5)4×4的矩阵键盘其中包括0-9的数字键和A-D的功能键(6)本产品具备报警功能,当输入密码错误时蜂鸣器响并且LED灯亮。

(7)密码可以由用户自己修改设定(只支持6位密码),修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作自锁开关说明自锁开关电路中起到电源的开关作用,常开的其中一脚接DC电源插口电源脚,常开的另一脚接电路的VCC自锁开关原理图自锁开关硬件图上拉电阻介绍其实排阻就是由8个电阻组成的,其中一端全部接在一起,103为8个10K电阻,102为8个1K电阻,他们在电路中起到“上拉”的作用,又称上拉电阻。

上拉就是将不确定的信号通过一个电阻嵌位在高电平,电阻同时起限流作用,下拉同理.上拉是对器件注入电流,下拉是输出电流,弱强只是上拉电阻的阻值不同,没有什么严格区分,对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。

上拉,就是把电位拉高,比如拉到VCC下拉,就是把电压拉低,拉到GND一般就是刚上电的时候,端口电压不稳定,为了让他稳定为高或低,就会用到上拉或下拉电阻。

有些芯片内部集成了上拉电阻(如单片机的P1、2、3口),所以外部就不用上拉电阻了。

但是有一些开漏的(如单片机的P0口),外部必须加上拉电阻。

单片机密码锁设计(汇编语言 )带原理图电路图(带注释)

单片机密码锁设计(汇编语言 )带原理图电路图(带注释)

电子密码锁功能描述:适合毕业设计,基于51内核开发版的电子密码锁主控板,可以掉电存储,修改密码,密码错误3次报警且锁定键盘,有门铃功能等等在p2^0口接一个低电平驱动继电器(淘宝价5元左右),继电器接一个电控锁(淘宝价格18元左右)最后的连接不清楚或者过程中不懂的我们会全程帮助***************部分源代码/*模块名称:主函数*//*模块功能:程序入口*///************************************************************ ************************************************************* ***********void main(void)//主函数{//AT24C04_WritePage(); //密码初始化(只需使用一次写入初始密码)System_init(); //系统初始化while(1){if(keyboard==0) //如果密码错误三次则锁定键盘{KeyDown(); //按键检测}keysend(); //数据传递lcdxianshi(); //输入显示sure(); //密码认证condition_delete(); //按键清除new_password(); //密码修改Add_Function(); //附功能函数}}附件内容包括:整个电路设计原理图和PCB源文件,用A D软件打开;C语言源程序(有详细的中文注释);proteus电路仿真;。

单片机控制的电子密码锁(电路图 流程图 原理图)-课程设计

单片机控制的电子密码锁(电路图 流程图 原理图)-课程设计

单片机控制的电子密码锁(电路图+流程图+原理图)-课程设计单片机控制的电子密码锁(电路图+流程图+原理图) 摘要:本系统由单片机系统、矩阵键盘、LED显示和报警系统组成。

系统能完成开锁、超时报警、超次锁定、管理员解密、修改用户密码基本的密码锁的功能。

除上述基本的密码锁功能外,还具有调电存储、声光提示等功能,依据实际的情况还可以添加遥控功能。

本系统成本低廉,功能实用关键词:AT89S51,AT24C02, 电子密码锁,矩阵键盘一、引言随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲呢。

设计本课题时构思了两种方案:一种是用以AT89s51为核心的单片机控制方案;另一种是用以74LS112双JK触发器构成的数字逻辑电路控制方案。

考虑到数字电路方案原理过于简单,而且不能满足现在的安全需求,所以本文采用前一种方案。

二、方案论证与比较方案一:采用数字电路控制。

其原理方框图如图1-1所示。

图2-1 数字密码锁电路方案采用数字密码锁电路的好处就是设计简单。

用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过40秒(一般情况下,用户不会超过40秒,若用户觉得不便,还可以修改)电路将报警80秒,若电路连续报警三次,电路将锁定键盘5分钟,防止他人的非法操作。

电路由两大部分组成:密码锁电路和备用电源(UPS),其中设置UPS电源是为了防止因为停电造成的密码锁电路失效,使用户免遭麻烦。

密码锁电路包含:键盘输入、密码修改、密码检测、开锁电路、执行电路、报警电路、键盘输入次数锁定电路。

方案二:采用一种是用以AT89S51为核心的单片机控制方案。

基于51单片机的电子密码锁系统设计制作,电路图+源程序

基于51单片机的电子密码锁系统设计制作,电路图+源程序

基于51单片机的电子密码锁系统设计制作,电路图+源程序这款基于51单片机的电子密码锁系统,单片机用STC89C52RC单片机,电路简单,制作过程中不需要进行调试,支持密码掉电保存功能!密码储存于单片机内部自带的的EEPROM中,不需要外置AT24C01保存密码,是学习电子密码锁比较好的教学试验系统,主要功能如下:1、1602液晶菜单显示。

2、6位密码,密码可重置,重置密码时,先输入原始密密,正确后输入新密码,再交输入新密码,两次输入的密码一致辞时,密码修改成功。

开锁时,密码通过键盘输入,若密码正确,则将锁打开,诺密码不正确时,无法开锁,密码输入错误三次时,蜂鸣器报警并且锁定键盘,10分钟。

3、支持掉电保存密码功能。

单片机中的密码是储存于单片内部的EEPROM中,在密码锁系统断电时,储存在密码锁系统中的密码不会丢失。

4、密码锁系统采用5V继电器模拟开锁过程。

5、输入的正确时,继电器吸合2-3秒,开锁指示灯亮2-3秒,模拟开锁。

6、密码错误报警且有错误提示(显示Error)。

7、密码正确开锁指示。

8、4X4矩阵键盘输入。

9、随时可修改密码存储,支持掉电保存密码功能,功能更为实用。

10、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。

修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。

源程序如下:1. #include<reg52.h>2. #define uint unsigned int3. #define uchar unsigned char4. void key_scan();5. uchar count0,count1,count3,num,n=0,temp,a,j,count4;6. uchar mima[8]; //初始密码存储区7. uchar tab_key[50]; //输入密码存储区8. uchar code table[]={9. 0x3f,0x06,0x5b,0x4f,10. 0x66,0x6d,0x7d,0x07,11. 0x7f,0x6f,0x77,0x7c,12. 0x39,0x5e,0x79,0x71};13. bit enterflag; //确认键按下与否的标志14. bit mimaflag; //密码正确与否的标志15. bit xiugaiflag; //修改密码标志16. bit enter1flag; //修改密码确认键标志17. sbit red=P3^7;18. sbit bell=P3^6;19. sbit rs=P2^0;20. sbit rw=P2^1;21. sbit lcden=P2^2;22. sbit scl=P3^4;23. sbit sda=P3^5;24. uchar code table1[]="input the passco";25. uchar code table2[]="de: --------";26. uchar code table3[]="*";27. uchar code table4[]="right (^_^) ";28. uchar code table5[]="first error";29. uchar code table6[]="second error";30. uchar code table7[]="third error see ";31. uchar code table8[]="u tomorrow (^_^)";32. uchar code table9[]="define the passc";33. uchar code table10[]="ode: --------";34. uchar code table11[]="code is new";35. //******************************键盘消抖函数*******************************36. void delay1()37. { ;; }38. void delay2(uchar x)39. {40. uchar a,b;41. for(a=x;a>0;a--)42. for(b=100;b>0;b--);43. }44.45. void delay(uint z)46. {47. uint x,y;48. for(x=z;x>0;x--)49. for(y=110;y>0;y--);50. }51.52. //****************************e^2room的初始化*******************************53. void start() //开始信号54. {55. sda=1;56. delay1();57. scl=1;58. delay1();59. sda=0;60. delay1();61. }62.63. void stop() //停止64. {65. sda=0;66. delay1();67. scl=1;68. delay1();69. sda=1;70. delay1();71. }72. //****************************应答信号*************************************73. void respond()74. {75. uchar i;76. scl=1;77. delay1();78. while((sda==1)&&(i<250))i++;79. scl=0;80. delay1();81. }82. //*****************************写字节操作函数**********************************83. void write_byte(uchar date)84. {85. uchar i,temp;86. temp=date;87. for(i=0;i<8;i++)88. {89. temp=temp<<1; //保持最高位,左移到进位CY90. scl=0;91. delay1();92. sda=CY;93. delay1();94. scl=1;95. delay1();96. }97. scl=0;98. delay1();99. sda=1;//总线释放100. delay1();101. }102. //*******************************读字节操作函数***************************** 103. uchar read_byte()104. {105. uchar i,k;106. scl=0;107. delay1();108. sda=1;109. delay1();110. for(i=0;i<8;i++)111. {112. scl=1;113. delay1();114. k=(k<<1)|sda; //或运算,放到最低位115. scl=0;116. delay1();117. }118. return k;119. }120. //**********************************写地址函数****************************** 121. void write_add(uchar address,uchar date)122. {123. start();124. write_byte(0xa0);125. respond();126. write_byte(address);127. respond();128. write_byte(date);129. respond();130. stop();131. }132. //*******************************读地址函数************************************* 133. uchar read_add(uchar address)134. {135. uchar date;136. start();137. write_byte(0xa0);138. respond();139. write_byte(address);140. respond();141. start();142. write_byte(0xa1);143. respond();144. date=read_byte();145. stop();146. return date;147. }148. //****************************LCD1602的初始化******************************* 149. void write_com(uchar com)150. {151. rs=0;152. lcden=0;153. P0=com;154. delay(5);155. lcden=1;156. delay(5);157. lcden=0;158. }159.160. void write_date(uchar date)161. {162. rs=1;163. lcden=0;164. P0=date;165. delay(5);166. lcden=1;167. delay(5);168. lcden=0;169. }170.171. //***************************************密码比较函数******************************** 172. bit mimacmp()173. {174. bit flag;175. uchar i;176. for(i=0;i<8;i++)177. {178. if(mima[i]==tab_key[i])179. flag=1;180. else181. {182. flag=0;183. i=8;184. }185. }186. return(flag); //返回flag187. }188.189. ////**********************************LCD显示函数开始**************************************190. void lcd_display()191. {192. uchar i=0;193. write_com(0x80+0x40+8);194. for(i=0;i<n;i++)195. {196. write_date(table3[0]);197. }198. }199.200. //****************************************键盘功能分配函数群开始****************************201. //** 0 ** 1 **2 ** 3**202. //** 4** 5** 6 **7 **203. //**8** 9** 确认(A) **无效(B)204. //**取消(C)**修改密码键(D)**确认修改键(E)**无效(F)205.206. void key_manage1()207. {208. tab_key[n]=0;209. n++;210. if(xiugaiflag==1)211. {212. mima[count4]=0;213. count4++;214. }215. }216.217. void key_manage2()218. {219.220. tab_key[n]=1;221. n++;222. if(xiugaiflag==1)223. {224. mima[count4]=1;225. count4++;226. }227. }228.229. void key_manage3()230. {231.232. tab_key[n]=2;233. n++;234. if(xiugaiflag==1)235. {236. mima[count4]=2;237. count4++;238. }239. }240.241. void key_manage4() 242. {243. tab_key[n]=3; 244. n++;245. if(xiugaiflag==1) 246. {247. mima[count4]=3; 248. count4++;249. }250. }251.252. void key_manage5() 253. {254. tab_key[n]=4; 255. n++;256. if(xiugaiflag==1) 257. {258. mima[count4]=4; 259. count4++;260. }261. }262.263. void key_manage6() 264. {265. tab_key[n]=5; 266. n++;267. if(xiugaiflag==1) 268. {269. mima[count4]=5; 270. count4++;271. }272. }273. void key_manage7() 274. {275. tab_key[n]=6; 276. n++;277. if(xiugaiflag==1) 278. {279. mima[count4]=6; 280. count4++;281. }282. }283. void key_manage8() 284. {285. tab_key[n]=7; 286. n++;287. if(xiugaiflag==1) 288. {289. mima[count4]=7; 290. count4++;291. }292. }293.294. void key_manage9()295. {296. tab_key[n]=8;297. n++;298. if(xiugaiflag==1)299. {300. mima[count4]=8;301. count4++;302. }303. }304. void key_manage10()305. {306. tab_key[n]=9;307. n++;308. if(xiugaiflag==1)309. {310. mima[count4]=9;311. count4++;312. }313. }314. //**********************************确认键**************************************************************315. void key_manage11()316. {317. enterflag=1; //确认键按下318. if(n==8) //只有输入8个密码后按确认才做比较319. mimaflag=mimacmp();320. else321. mimaflag=0;322. if(enterflag==1)323. {324. enterflag=0;325. n=0;326. //用FFFFFFFF清除已经输入的密码327. for(count3=0;count3<8;count3++)328. {329. delay(5);330. tab_key[count3]=0x0f;331. }332.333. TR1=1; //打开计数器1334. count1=0; //定时器1由50MS累计到1S 所用的计数器335. if(mimaflag==1)336. {337. a=0;338.339. write_com(0x01);340. write_com(0x80);341. for(count3=0;count3<16;count3++)342. {343. write_date(table4[count3]); //密码正确,显示RIGHT,绿灯亮344. delay(5);345. }346. }347.348. else349. {350. n=0;351. red=0;352. bell=0;353. a++;354. if(a==1)355. {356. for(count3=0;count3<8;count3++) //ffffffff清除密码357. {358. delay(5);359. tab_key[count3]=0x0f;360. }361. write_com(0x01); 362. write_com(0x80);363. for(count3=0;count3<16;count3++)364. {365. write_date(table5[count3]); //密码错误,显示 first error,红灯亮366. delay(5);367. }368. TR1=1;369. }370. if(a==2)371. {372. for(count3=0;count3<8;count3++) //ffffffff清除密码373. {374. delay(5);375. tab_key[count3]=0x0f;376. }377. write_com(0x01);378. write_com(0x80);379. for(count3=0;count3<16;count3++)380. {381. write_date(table6[count3]); //密码错误,显示SECOND ERROR,红灯亮382. delay(5);383. }384. TR1=1;385. }386.387. if(a==3)388. {389. for(count3=0;count3<8;count3++) //ffffffff清除密码390. {391. delay(5);392. tab_key[count3]=0x0f;393. }394. write_com(0x01);395. write_com(0x80);396. for(count3=0;count3<16;count3++)397. {398. write_date(table7[count3]); //密码错误,显示third error see,红灯亮399. delay(5);400. }401. write_com(0x80+0x40);402. for(count3=0;count3<16;count3++)403. {404. write_date(table8[count3]);//密码错误,显示 U TOMORROW ,红灯亮405. delay(5);406. }407. TR1=0;408.409. }410.411. }412. }413.414. }415. void key_manage12()416. {417. tab_key[n]=11;418. n++; //密码计数清零419.420. }421. //****************************************************取消键********************************************422. void key_manage13()423. {424.425. n=0; //密码计数清零426. write_com(0x80); //指针所指位置427. for(count3=0;count3<16;count3++)428. {429. write_date(table1[count3]); //第一行显示INPUT THE PASSPORD:430. delay(5);431. }432. write_com(0x80+0x40);433. for(count3=0;count3<16;count3++)434. {435. write_date(table2[count3]); //开机显示--------436. delay(5);437. tab_key[count3]=0x0f; //用FFFFFFFF清楚已经输入的密码438. }439.440. }441. //*******************************************修改密码键********************************** 442. void key_manage14()443. {444. uchar aa=0;445. n=0;446. xiugaiflag=1;447. write_com(0x01);448. write_com(0x80);449. for(count3=0;count3<16;count3++)450. {451. write_date(table9[count3]); //显示define the password452. delay(5);453. tab_key[count3]=0x0f; //用FFFFFFFF清楚已经输入的密码454. }455. write_com(0x80+0x40);456. for(count3=0;count3<16;count3++)457. {458. write_date(table10[count3]); //显示--------459. delay(5);460. }461. TR0=1;462.463. }464. //******************************************修改密码键的确认键********************************465. void key_manage15()466. {467. n=0;468. enter1flag=1;469. if(enter1flag==1)470. {471. enter1flag=0;472. count4=0;473. for(count3=0;count3<16;count3++)474. {475. tab_key[count3]=0x0f; //用FFFFFFFF清楚已经输入的密码476. }477. write_com(0x01);478. write_com(0x80);479. for(count3=0;count3<16;count3++)480. {481. write_date(table11[count3]);482. delay(100);483. }484. TR1=1;485. count1=0;486. }487. }488. void key_manage16()489. {490. tab_key[n]=15;491. n++;492. }493.494. //****************************************定时器1的50MS,共延时1秒*****************************495. void time_1() interrupt 3496. {497.498. TH1=(65536-50000)/256;499. TL1=(65536-50000)%256;500. if(count1<20)501. {502. count1++;503. }504. else //计时到1S505. {506. TR1=0;507. count1=0;508. mimaflag=0;509.510. red=1;511. bell=1;512. //显示FFFFFFFF513. write_com(0x01);514. write_com(0x80);515. for(count3=0;count3<16;count3++)516. {517. write_date(table1[count3]); //显示INPUT THE PASSCODE518. delay(5);519. }520. write_com(0x80+0x40);521. for(count3=0;count3<16;count3++)522. {523. write_date(table2[count3]); //开机显示FFFFFFFF524. delay(5);525. }526. }527.528. }529. //***********************************************定时0**********************************************530. void time_0() interrupt 1531. {532.533. TH0=(65536-50000)/256;534. TL0=(65536-50000)%256;535. if(count4<8)536. {537. key_scan();538. }539. else540. {541. TR0=0;542. count4=0;543. }544. }545.546. //初始化函数547. void init()548. {549.550. uchar i;551. lcden=0;552. write_com(0x38); //打开显示模式设置553. write_com(0x0c); //打开显示,光标等等设置未零554. write_com(0x06); //当读或写一个字符后地址指针加一,且光标加一,当写一个字符后整频显示左移,555. write_com(0x01); //清零指令556. write_com(0x80); //指针所指位置557.558. //定时器初始化559. TMOD=0x11; //T0,T1工作方式1560. TH0=(65536-2000)/256;561. TL0=(65536-2000)%256; //T0初始化2MS563. TH1=(65536-50000)/256;564. TL1=(65536-50000)%256; //T1初始化50MS565.566. TR1=0;567. ET1=1;568. EA=1;569. TR0=0;570. ET0=1;571.572. count0=0; //初始没有密码输入,故为零573. enterflag=0; //没有确认键按下574. mimaflag=0; //密码正确与否键先置零575.576. red=1; //红灯不亮577. //************密码存入EPROM中**********************************578. sda=1;579. delay(5);580. scl=1;581. delay(5);582. for(i=0;i<8;i++)583. {584. write_add(i,8);585. delay2(100);586. }587. for(i=0;i<8;i++)588. {589. mima[i]=read_add(i);590. delay(5);591. }592.593. }594. void main()595. { rw=0;596. init();597. write_com(0x80); //指针所指位置598. for(count3=0;count3<16;count3++)599. {600. write_date(table1[count3]); //第一行显示INPUT THE PASSPORD: 601. delay(5);602. }603. write_com(0x80+0x40);604. for(count3=0;count3<16;count3++)605. {606. write_date(table2[count3]); //开机显示FFFFFFFF607. delay(5);608. }609. while(1)610. {611. key_scan(); //调用键盘扫描函数612. lcd_display();613. }614.615. }616. //**************************************************键盘扫描函数开始********************************619. //**********扫描第一行*********620. P1=0xfe;621. temp=P1;622. temp=temp&0xf0;623. if(temp!=0xf0)624. {625. delay(100);626. if(temp!=0xf0)627. {628. temp=P1;629. switch(temp)630. {631. case 0xee:632. key_manage1();633. break;634.635. case 0xde:636. key_manage2();637. break;638.639. case 0xbe:640. key_manage3();641. break;642.643. case 0x7e:644. key_manage4();645. break;646. }647. while(temp!=0xf0)648. {649. temp=P1;650. temp=temp&0xf0;651. }652. }653. }654. //**************************************************扫描第二行***********************************655. P1=0xfd;656. temp=P1;657. temp=temp&0xf0;658. if(temp!=0xf0)659. {660. delay(100);661. if(temp!=0xf0)662. {663. temp=P1;664. switch(temp)665. {666. case 0xed:667. key_manage5();668. break;669.670. case 0xdd:671. key_manage6();674. case 0xbd:675. key_manage7();676. break;677.678. case 0x7d:679. key_manage8();680. break;681. }682. while(temp!=0xf0)683. {684. temp=P1;685. temp=temp&0xf0;686. }687. }688. }689. //*********************************************扫描第三行***********************************690. P1=0xfb;691. temp=P1;692. temp=temp&0xf0;693. if(temp!=0xf0)694. {695. delay(100);696. if(temp!=0xf0)697. {698. temp=P1;699. switch(temp)700. {701. case 0xeb:702. key_manage9();703. break;704.705. case 0xdb:706. key_manage10();707. break;708.709. case 0xbb:710. key_manage11();711. break;712.713. case 0x7b:714. key_manage12();715. break;716. }717. while(temp!=0xf0)718. {719. temp=P1;720. temp=temp&0xf0;721. }722. }723. }724.725. //***************************************************扫描第四行****************************************727. temp=P1;728. temp=temp&0xf0; 729. if(temp!=0xf0) 730. {731. delay(100);732. if(temp!=0xf0) 733. {734. temp=P1;735. switch(temp) 736. {737. case 0xe7:738. key_manage13(); 739. break;740.741. case 0xd7:742. key_manage14(); 743. break;744.745. case 0xb7:746. key_manage15(); 747. break;748.749. case 0x77:750. key_manage16(); 751. break;752. }753. while(temp!=0xf0) 754. {755. temp=P1;756. temp=temp&0xf0; 757. }758. }759. }760. }复制代码。

单片机密码锁设计(汇编语言 )带原理图电路图(带注释)

单片机密码锁设计(汇编语言 )带原理图电路图(带注释)

单片机密码锁设计(汇编语言)带原理图电路图(带注释)单片机密码锁设计(汇编语言)带原理图电路图(带注释)摘要随着电子产品向智能化和微型化的不断发展,单片机已成为电子产品研制和开发中首选的控制器。

本文介绍了一种应用AT89S52单片机设计的防盗自动报警电子密码锁系统。

经实验验证该系统具有软硬件设计简单,易于开发,成本较低,安全可靠,操作方便等特点,可作为产品进行开发,应用于住宅、办公室的保险箱及档案柜等需要防盗的场所,所以电子密码锁凭着比较强的实用性、锁密匙量大,又要制造简单;既安全可靠,又成本低廉;既保密性强,又实用性广,在密码锁的巨大市场上占有一席之地。

本文讲述了基于AT89S52单片机的“电子密码锁”的设计与实现,首先在绪论中介绍了此系统的简介、研究本系统的目的和意义。

此后,本文在第二、三、四章论述了系统整体结构框图,系统各模块功能,论述了系统工作原理并对所使用各种芯片的功能与特性进行了介绍、系统硬件设计;在第五章中重点剖析了软件设计开发的过程。

而在最后一章简述了本次设计的总结,个人感受。

此外,通过对系统软硬件的不断调试,进一步完善功能,同时也加深了对单片机、LCD液晶显示器、电路设计等方面知识。

关键词:单片机;AT89S52;电子密码锁;LCD显示目录1绪论 (1)1.1密码锁简介 (1)1.2电子密码锁发展趋势 (1)1.3基本原理 (2)1.4研究的主要内容 (3)2系统总体设计方案 (4)2.1系统的功能介绍 (4)2.2系统的整体框图 (4)2.3系统各单元模块功能 (4)3密码锁的工作原理 (6)3.1系统工作原理简介 (6)3.2AT89S52单片机 (6)3.31602LCD液晶显示模块 (8)3.3.1显示特性 (8)3.3.2物理特性 (9)3.3.3外型尺寸图 (9)3.3.4结构块图 (10)3.3.5模块显示特性详解 (10)3.3.6字符码与字符字模之间的对应关系表 (11)4系统硬件设计 (12)4.1单片机AT89S52中断系统 (12)4.28051单片机的复位电路 (12)4.3光声报警电路 (13)4.4矩阵键盘电路 (13)4.51602LCD显示电路 (14)4.6利用PROTEUS仿真的电路图 (14)4.7硬件实物演示 (15)5系统软件设计 (17)5.1KEIL软件介绍 (17)5.2软件开发 (17)6结束语 (20)附录 (21)参考文献 (25)致谢 (26)1绪论1.1密码锁简介安全问题是现代社会各界普遍关注的焦点之一。

单片机设计方案密码锁程序和仿真图

单片机设计方案密码锁程序和仿真图

#include<at89x51.h>#define uchar unsigned char#define uint unsigned intuint num=10; //开始让数码管什么都不显示bit set=0; //定义设置密码的位char count=-1; //开始让COUNT=-1,方便后面显示数码管sbit Beep=P1^2; //蜂鸣器uchar temp;uchar pws[6]={3,6,2,3,3,0}; //原始密码uchar pwx[6]; //按下的数字存储区bit rightflag; //密码正确标志位uchar workbuf[6];uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40 }; //段选码,共阴极uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //位选码uint keyscan();void delay(uchar z) //延时,ms级{uchar y;for(;z>0;z--)for(y=120;y>0;y--);}void setpw() //设置密码函数{keyscan();}uint keyscan() //键盘扫描函数{P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5); //键盘去抖,最好ms以上,这里用了mstemp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;//按键计数加temp=P3;switch(temp){case 0xee:{num=7;if(count<6) //六位密码,所以COUNT<6{if(set==0) //设置密码键没有按下时pwx[count]=num; //存储按下的数字elsepws[count]=num; //设置密码键按下时,设置新密码workbuf[count]=tabledu[11]; //相应位的数码管显示"--",不显示相应的数字,密码是保密的}}break;case 0xde:{num=8;if(count<6) //以下扫描键盘的原理差不多同上{if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbe:{num=9;{if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}}break;case 0x7e: //设置密码键按下{set=1; //设置密码标志位置P1_3=0; //设置密码指示灯亮workbuf[0]=0x00;//数码管第一位不显示workbuf[1]=0x00;//......workbuf[2]=0x00;//......workbuf[3]=0x00;workbuf[4]=0x00;workbuf[5]=0x00;//......count=-1; //按键计数复位为-1if(count<6) //密码没有设置完,继续设置密码{setpw(); //设置密码}}break;}while(temp!=0xf0) //按键抬起检测{temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xed:{num=4;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xdd:{num=5;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbd:{num=6;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xeb:{num=1;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xdb:{num=2;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbb:{num=3;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xd7:{num=0;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xe7: num=20;break; //确定键按下检测case 0x77: //复位键或者输入密码全部一次删除{P1_1=0; //锁关P1_3=1; //密码设置指示灯灭set=0; //不设置密码num=10; //num复位count=-1; //COUNT复位workbuf[0]=tabledu[10]; //第一位数码管不显示workbuf[1]=tabledu[10]; //第二位数码管不显示workbuf[2]=tabledu[10];workbuf[3]=tabledu[10];workbuf[4]=tabledu[10];workbuf[5]=tabledu[10]; //......P1_0=1; //锁关}break;case 0xb7: //输入密码删除键(一位一位删除){count--;workbuf[count]=0x00; //因确定键按下时,COUNT也会加,而确定键不是密码,所以这里是COUNT,而不是COUNT+1count--; //因确定键按下时,确定键不是密码,COUNT也会加,这里COUNT再自减if(count<=-1)count=-1;}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}return(num);}void init() //利用定时显示数码管{TMOD=0x01;TH0=(65536-500)/200;TL0=(65536-500)%200;ET0=1;EA=1;TR0=1;}bit compare() //密码比较函数{if((pwx[0]==pws[0])&(pwx[1]==pws[1])&(pwx[2]==pws[2])&(pwx[3]==pws[3])&(pwx[4]==pws[4])&(pw x[5]==pws[5]))rightflag=1;elserightflag=0;return(rightflag);}void main(){uint i,j;init();P0=0;P1_1=0; //锁关while(1){keyscan();if(num==20) //如果确定键按下(修改密码和输入密码共用的确定键){if(count==6){if(set==1) //修改密码确定{P1_3=1;workbuf[0]=0;workbuf[1]=0;workbuf[2]=0;workbuf[3]=0;workbuf[4]=0;workbuf[5]=0;}else//输入密码确定{set=0;compare();if(rightflag==1) //如果密码正确{P1_0=0; //锁开P1_1=1;workbuf[0]=tabledu[8]; //数码管第一位显示"8"workbuf[1]=tabledu[8]; //数码管第二位显示"8"workbuf[2]=tabledu[8];workbuf[3]=tabledu[8];workbuf[4]=tabledu[8];workbuf[5]=tabledu[8]; //......}else{P1_1=0; //锁仍然是关workbuf[0]=0X71; //数码管第一位显示"F"workbuf[1]=0X71;workbuf[2]=0X71;workbuf[3]=0X71;workbuf[4]=0X71;workbuf[5]=0X71; //......for(i=0;i<1000;i++) //密码错误报警{for(j=0;j<80;j++);Beep=~Beep;}break;}}}else//若输入的密码位数不为位时{P1_1=0; //锁仍然关workbuf[0]=0X71; //数码管第一位显示"F"workbuf[1]=0X71;workbuf[2]=0X71;workbuf[3]=0X71;workbuf[4]=0X71;workbuf[5]=0X71;for(i=0;i<1000;i++){for(j=0;j<80;j++);Beep=~Beep;}break;}}}}void timer0() interrupt 1 //显示数码管{uchar i;TH0=(65536-500)/200; TL0=(65536-500)%200; for (i=0;i<6;i++) { P0=workbuf[i]; P2=tablewe[i]; delay(5); P0=0;}}XTAL218XTAL119ALE 30EA31PSEN 29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51234567891RP1RESPACK-812365489=7+CONABCD1243D2LED-RED锁开锁关LS1SOUNDERD3LED-BLUE设置密码指示灯R11kR21kR310KR410K+12VQ3TIP127Q4TIP127Q18050Q28050Q5TIP122Q6TIP122+88.8Amps+88.8Amps+88.8Volts。

六位电子密码锁毕业设计,仿真截图

六位电子密码锁毕业设计,仿真截图

XXXXXXXXXXXXXX届毕业设计说明书六位电子密码锁控制系统的设计院、部:xxxxxxxxxxxxxxx学生姓名:xxx指导教师:xxxx 职称xxxxxx专业:xxxxxx班级:xxxxxxxxxx完成时间:2013.05.29摘要如今的生活中机械锁已经不能满足人们的要求了,这样电子密码锁就广泛的运用到了生活中,随着各式各样的密码锁诞生,对密码锁的要求也越来越高,所以密码锁在以后的生活中有着很大的发展空间。

本次设计中的密码锁采用的是以单片机为核心的电路,设计出来的安全性高、成本低、功耗低、易操作的电子密码锁。

电路中包括了键盘电路、显示电路、报警电路、开锁电路以及掉电存储电路。

其中键盘电路采用的是4*4矩阵型键盘,该键盘电路可以为单片机节省I/O口的使用。

为了更好的让用户知道输入的信息,在本设计中添加了显示电路。

显示电路使用的是使用了单片机的一个串行口,用74LS247驱动数码管发光显示数码,再使用74LS138控制选位信号就可以完成该系统的显示功能。

此显示模块方便而且简单。

在安全性能方面,本设计中设计出了报警电路,防止外人胡乱使用密码而产生的不良后果,在输入密码错误三次的时候,电路就会发出报警并且会锁定键盘。

这样就可以更好的防止用户以外的人胡乱操作密码锁而造成不必要的损失。

在设计中因为要考虑原件成本的问题,所以就用了发光二极管来代替密码锁开锁的功能,根据发光二极管的指示来判断密码锁是否开锁,在发光二极管灯亮的时候,密码锁就打开,发光二极管灯灭,则表示密码锁打开失败。

因为城市的供电一般很难保证百分百的稳定,所以考虑到停电时给用户带来很多的麻烦,所以本设计中用到了拥有掉电存储功能的电路,该电路中主要芯片为AT24CO2,其中包括了电源电路、电子开关自动切换电路、蓄电池自动充电电路。

这样就在停电的情况下密码锁电路依然保持器电路功能。

在本次设计中利用的是汇编语言,经过keil的编译,在protues中仿真,基本实现了以上的功能。

基于单片机的电子密码锁 (含源代码原理图等)

基于单片机的电子密码锁 (含源代码原理图等)

Keywords: matrix keyboards, AT89C51, 1602LCD, combination lock
%%
&'()012345
67
目录
Байду номын сангаас
第 1 章 概论 .......................................................... 1 1.1 设计意义 ..................................................... 1 1.2 背景知识介绍 ................................................. 1 1.3 本文主要工作以及内容安排 ..................................... 2
¡ ¢£¤¥§¨¦
©
摘要
在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报 表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开 锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。随 着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为 满足人们对锁的使用要求,增加其安全性,用数字密码代替钥匙的单片机控制的 电子密码锁应运而生。
关键词:4*4 矩阵键盘, AT89C51, 1602LCD 显示器,密码锁

!"
#$
Abstract
In our daily life, the security of house, company department, documents and finance forms, also some personal information always used the lock to protect them. If use the normal keys to lock out the door, we should taken many keys with us . That is so difficult to use. And if we lost the keys with careless, the security looks very easy to break out. As the developing of the technology people ask for high security machines. For satisfy this request, the cipher lock is appeared. The cipher has higher security, lower cost, lower power and easy to use.

(完整)单片机设计方案密码锁程序和仿真图

(完整)单片机设计方案密码锁程序和仿真图

(完整)单片机设计方案密码锁程序和仿真图编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)单片机设计方案密码锁程序和仿真图)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)单片机设计方案密码锁程序和仿真图的全部内容。

#include〈at89x51.h>#define uchar unsigned char#define uint unsigned intuint num=10;//开始让数码管什么都不显示bit set=0; //定义设置密码的位char count=—1; //开始让COUNT=-1,方便后面显示数码管sbit Beep=P1^2; //蜂鸣器uchar temp;uchar pws[6]={3,6,2,3,3,0};//原始密码uchar pwx[6]; //按下的数字存储区bit rightflag; //密码正确标志位uchar workbuf[6];uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//段选码,共阴极uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位选码uint keyscan();void delay(uchar z) //延时,ms级{uchar y;for(;z〉0;z--)for(y=120;y>0;y-—);}void setpw()//设置密码函数{keyscan();}uint keyscan() //键盘扫描函数{P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5); //键盘去抖,最好ms以上,这里用了mstemp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;//按键计数加temp=P3;switch(temp){case 0xee:{num=7;if(count〈6)//六位密码,所以COUNT〈6if(set==0) //设置密码键没有按下时pwx[count]=num;//存储按下的数字elsepws[count]=num;//设置密码键按下时,设置新密码workbuf[count]=tabledu[11]; //相应位的数码管显示"-—",不显示相应的数字,密码是保密的}}break;case 0xde:{num=8;if(count〈6) //以下扫描键盘的原理差不多同上{if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbe:{num=9;{if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}}break;case 0x7e://设置密码键按下{set=1; //设置密码标志位置P1_3=0; //设置密码指示灯亮workbuf[0]=0x00;//数码管第一位不显示workbuf[1]=0x00;//。

简单六位数字密码锁

简单六位数字密码锁

目录第1章绪论 (1)1.1 设计任务 (1)1.2 设计要求 (1)第2章系统方案设计 (2)2.1 硬件设计思想 (2)2.2软件设计思想 (3)第3章电路设计 (4)3.1 电路原理 (4)3.2 电路原理图 (4)第4章程序设计 (5)4.1流程图 (5)4.2 算法描述 (5)第5章程序清单与仿真结果 (6)5.1 程序清单 (6)5.2 仿真结果 (14)第6章设计总结 (17)6.1 设计体会 (17)参考文献 (18)致谢 (19)实物展示..................................... 错误!未定义书签。

第1章绪论1.1 设计任务(1)设置七个键位,分别是确认,数字1,数字2,数字3,数字4,数字5,数字6,工作有提示(设通电状态为红灯亮)。

(2)在单片机内部预设六位密码,在使用密码解锁器时,要按预设的密码依次输入才能完成解锁。

预设密码以外的数字都不能解开密码锁(如输入非6位或输入6位与预设密码不同的数字)。

(3)输入密码时,数码管同步显示输入的数字。

(4)输入正确后,有解锁提示(设为绿灯亮),输入错误后也有提示(设为红灯闪烁和鸣笛警告)(5)输入错误后可以重输,要有复位功能。

1.2 设计要求利用AT89S52单片机的P2端口的P2.0--P2.6连接到7个按键开关上,分别是输入键数字1,数字2,数字3,数字4,数字5,数字6和确认键,P2.7接蜂鸣器。

启动时,按下电源开关,红色指示灯长亮,输入密码,而数码管显示输入的相应数字,然后按下确认键,若密码正确,绿灯亮,数码管熄灭,弱密码错误,红灯闪烁,蜂鸣器响,发出警报。

第2章系统方案设计2.1 硬件设计思想2.1.1 键盘设计本设计使用7按键,从上到下,从左至右依次设为确认键,数字1,数字2,数字3,数字4,数字5,数字6,用来输入密码,如下图图2.1 键盘仿真图2.1.2 数字显示设计使用共阳极七段数码管来显示输入的数字,图如下:图2.2 显示仿真图2.1.3 检验密码电路设计使用LED灯和蜂鸣器来提示输入的密码是否正确,若密码正确,绿灯亮,若密码错误,红灯闪烁,蜂鸣器响,电路如图:图2.3 密码验证系统仿真图2.2软件设计思想电子密码锁工作的主要过程是从键盘开始输入密码,同时LED显示密码输入情况,按下确认键后判断密码的正确性,作出开锁或报警处理。

基于PROTEUS的单片机密码锁仿真设计

基于PROTEUS的单片机密码锁仿真设计

基于PROTEUS的单片机密码锁仿真设计随着科技的发展,密码锁越来越多地应用于我们的日常生活中,例如家庭、办公室等。

在密码锁的设计中,单片机起着不可替代的作用,实现密码的存储和验证。

为了使密码锁在实际应用中更加稳定可靠,需要对其进行仿真和测试。

本文将介绍一种基于PROTEUS的单片机密码锁仿真设计。

首先,我们需要选择一款合适的单片机。

在本设计中,我们选择了常见的51单片机,因为其易于学习和实现,并且具有较高的性价比。

接下来,我们需要确定电路设计、程序设计和仿真测试的流程。

1. 电路设计密码锁的电路设计需要包括输入密码区、显示屏、确认键、取消键、开关机键等要素。

在这个设计中,我们使用带数字键盘的LCD显示屏作为主显示器。

在输入密码时,用键盘输入数字,并在显示屏上显示相应的密码。

确认、取消和开关机键触发相应的程序,完成密码的验证和锁的开启/关闭等操作。

2. 程序设计在程序设计中,我们需要实现密码的读取、密码的验证、锁的开关控制等功能。

具体实现方式如下:(1)读取密码:通过数字键盘输入密码,并以星号“*”代替密码数字的显示,以实现密码的保护。

(2)密码验证:将输入的密码与预设密码进行比对,若一致则通过,否则错误。

(3)锁的开关:通过电路控制锁的开关状态,完成锁的开启、关闭等功能。

3. 仿真测试在仿真测试中,我们将用PROTEUS仿真软件来模拟电路,以便观察电路的运行状态,并发现任何潜在的问题。

我们可以模拟键盘输入、LCD屏幕输出、锁的开合状态等操作,以确保电路和程序的正常运行。

在基于PROTEUS的单片机密码锁仿真设计中,我们需要考虑以下几个方面:(1)硬件的配置。

(2)编程语言的选择,如C语言。

(3)程序的正确性,如密码验证等实现是否正确。

(4)电路的稳定性和兼容性。

总结来说,基于PROTEUS的单片机密码锁仿真设计是一项非常有挑战性的任务,需要对电路和程序设计有深入的了解,并具备一定的仿真测试技巧。

单片机6位密码锁利用课程设计

单片机6位密码锁利用课程设计

一、概述在当今信息化时代,密码锁已成为人们生活中常见的安全防护设备。

传统机械密码锁随着科技的发展逐渐被电子密码锁所取代,而单片机密码锁作为一种新型密码锁产品,在市场上也逐渐受到了人们的关注。

二、单片机密码锁的基本原理1. 密码输入模块单片机密码锁的核心部件之一是密码输入模块,其作用是接收用户输入的密码。

密码输入模块一般包括数字按钮和确认按钮,用户通过按压数字按钮输入密码,再按下确认按钮确认密码。

2. 单片机控制模块单片机控制模块是密码锁的控制中枢,负责接收密码输入模块的信号,进行密码验证和控制开关锁操作。

单片机控制模块的设计与开发是密码锁制作中的关键环节。

3. 电子锁控制模块电子锁控制模块是单片机密码锁的另一个重要部件,它根据单片机控制模块的指令来控制锁的开合,保障密码锁的安全可靠性。

三、单片机密码锁的设计与制作步骤1. 准备材料与工具制作单片机密码锁首先需要准备好所需的电子元件和工具,包括单片机、数字按钮、确认按钮、电子锁等。

2. 确定系统框图与电路设计在确定材料与工具后,需要进行系统框图的设计和电路的布线,确保各个部件之间的连接合理、稳定。

3. 编写程序编写密码锁的控制程序是密码锁制作中不可或缺的一环,程序的编写需要保证密码的输入、验证和锁的开合操作都能正常进行。

4. 硬件搭建硬件搭建是密码锁制作的最后一步,包括电路的焊接、连接和整体外壳的安装等工作。

四、单片机密码锁的实现效果与测试单片机密码锁制作完成后,需要进行实际的效果与功能测试,确保密码锁的各项功能都能正常运行并且安全可靠。

五、单片机密码锁的应用前景与发展趋势单片机密码锁具有设计简单、可靠性高、安全性好等优点,未来在家庭、企业等领域的应用前景广阔。

随着科技的不断进步,单片机密码锁在功能上将会不断完善,应用范围也将会进一步扩大。

六、结论单片机6位密码锁的设计与制作是一项挑战性的课程设计项目,通过该项目的设计与制作,学生不仅能够加深对单片机原理及应用的理解,还可以提高动手能力和创新能力。

(完整版)单片机6位密码锁设计(汇编语言源程序配Proteus电路图)

(完整版)单片机6位密码锁设计(汇编语言源程序配Proteus电路图)

单片机6位密码锁设计(汇编语言源程序配Proteus电路图)硬件设计基于AT89C51为核心的单片机控制的电子密码锁设计。

本设计能完成开锁,修改密码,密码错误报警,LCD显示密码等基本的密码锁功能。

设计的电路框如图1。

图一电路的功能单元设计1.单片机AT89C51组成基本框图单片机引脚 介绍P0 AT89C51 CPU程序存储器 ROM并行接口串行接口 数据存储器 RAM中断系统定时器/计数器时钟电路 P3P1 P2TxD INT0 RxDINT1T0 T1外中断内中断2.单片机外围电路设计(1)单片机复位电路:采用按键手动复位方式中的电平复位方式,复位电平是通过使RST端经电阻与VCC电源接通而实现的。

(2)单片机时钟电路:AT89C51内部有时钟电路,需外接石英晶体和微调电容,本设计的晶振频率为11.0592MHz。

3.矩阵键盘的设计本设计中用到4*4的键盘。

键盘扫描方式,键盘的列线与P1口的低4位相接,行线与P1口的高3位相接。

首先使P1.0为低电平“0”,其余三根列线为高电平“1”,读行线状态。

如果行线都为高电平状态,则P1.0这列上没键按下,如果读出的行线不全为高电平状态,则为低电平的行线与P1.0相交的键处于闭合状态。

如果P1.0上没有键闭合,接着使P1.1为低电平,其余列线为高电平,用同样的方法检查P1.1这列上有没有按键闭合。

一直到使P1.3为低电平扫描完成。

这一过程称为一次扫描过程。

由于按键是利用机械触电的合、断原理,存在弹性的影响,机械触点在闭合及断开瞬间均有抖动过程,从而使电压信号波动,为了保证CPU对键的稳定闭合仅作一次键输入处理,必须采用消除抖动影响。

本设计采用软件办法,在检测到有键按下时,执行一个延时程序后,确认该键是否保持闭合状态电平。

若仍保持闭合状态电平,则确认该键处于闭合状态,从而消除抖动影响。

若有按键被按下时,就将该按键译码出来,本设计采用双重循环做计数编号,当某一按键按下时,其按键编号便是计数编号,有关按键编号,扫描信号及读取按键数据返回码整理如表1。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机6位密码锁设计(汇编语言源程序配Proteus电路图)
硬件设计
基于AT89C51为核心的单片机控制的电子密码锁设计。

本设计能完成开锁,修改密码,密码错误报警,LCD 显示密码等基本的密码锁功能。

设计的电路框如图1。

电路的功能单元设计
1.单片机AT89C51组成基本框图
单片机引脚 介绍
P0 AT89C51 CPU
程序存储器 ROM
并行接口
串行接口 数据存储器 RAM
中断系统
定时器/计数器
时钟电路 P3
P1 P2
TxD INT0 RxD
INT1
T0 T1
外中断
内中断
2.单片机外围电路设计
(1)单片机复位电路:采用按键手动复位方式中的电平复位方式,复位电平是通过使RST端经电阻与VCC电源接通而实现的。

(2)单片机时钟电路:AT89C51部有时钟电路,需外接石英晶体和微调电容,本设计的晶振频率为11.0592MHz。

3.矩阵键盘的设计
本设计中用到4*4的键盘。

键盘扫描方式,键盘的列线与P1口的低4位相接,行线与P1口的高3位相接。

首先使P1.0为低电平“0”,其余三根列线为高电平“1”,读行线状态。

如果行线都为高电平状态,则P1.0这列上没键按下,如果读出的行线不全为高电平状态,则为低电平的行线与P1.0相交的键处于闭合状态。

如果P1.0上没有键闭合,接着使P1.1为低电平,其余列线为高电平,用同样的方法检查P1.1这列上有没有按键闭合。

一直到使P1.3为低电平扫描完成。

这一过程称为一次扫描过程。

由于按键是利用机械触电的合、断原理,存在弹性的影响,机械触点在闭合及断开瞬间均有抖动过程,从而使电压信号波动,为了保证CPU对键的稳定闭合仅作一次键输入处理,必须采用消除抖动影响。

本设计采用软件办法,在检测到有键按下时,执行一个延时程序后,确认该键是否保持闭合状态电平。

若仍保持闭合状态电平,则确认该键处于闭合状态,从而消除抖动影响。

若有按键被按下时,就将该按键译码出来,本设计采用双重循环做计数编号,当某一按键按下时,其按键编号
4.电路总体设计
下面是本次实验的程序
;*******************************************************。

相关文档
最新文档