基于51单片机电子密码锁设计讲解

合集下载

简易电子密码锁(基于51单片机)报告

简易电子密码锁(基于51单片机)报告

简易电子密码锁设计&我的设计思想联想到日前在安全技术防范领域,具有防盗报警功能的电子密码控制系统逐渐代替传统的机械式密码控制系统,并结合近期的学习过程和一些参考书籍,完成了简易的电子密码锁设计学习。

电子密码控制是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。

电子密码控制不论性能还是安全性都已大大超过了机械类结,具有良好的应用前景。

一、设计目的与内容设计了一个简易电子密码锁,可按要求从矩阵键盘输入6位数密码如“080874”,输入过程中有按键音提示。

当密码输入正确并按下确认键(“OK”键)后,发光二极管被点亮。

二、工作原理与基本操作过程介绍采用80C51为核心的单片机控制。

利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,进行电子密码锁的设计。

(1)键盘的人工编码给每个按键指定一个按键值,报告设定按键S1~S9对应的按键值分别为“1~9”,S10为数字“0”,S11为“OK”,S12~S16对应的按键值分别为12~16。

(2)根据按键值,指定每个按键对应的输入数字和信息。

如下表为每个按键代表的数字和输入信息。

当键盘扫描程序扫描到S10键被按下时,将其代表的按键值“0”通知CPU,CPU根据事先的规定,就会知道输入的数字是“0”。

矩阵键盘中每个按键所代表的数字和输入信息(3)输入数字和密码对比。

先将设定的密码用一个数组保存,报告中用的密码“080874”和“OK”确认信息可以用如下数组保存:Unsigned char D[ ]={0,8,0,8,7,4,11};在主程序接收到数字和信息后,通过逐位对比的方法进行判断。

输入的数字经对比正确时,程序才会继续顺序执行,否则,程序拒绝继续执行。

(4)执行预期功能。

如果输入密码正确,执行预期功能,报告设计为点亮P3.0口引脚LED。

三、电路图设计(Proteus绘制)四、程序设计(C语言)矩阵式键盘实现的电子密码锁程序#include<reg51.h> //包含51单片机寄存器定义的头文件sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚sbit sound=P3^7; //将sound位定义为P3.7unsigned char keyval; //储存按键值/************************************************************** 函数功能:延时输出音频**************************************************************/ void delay(void){unsigned char i;for(i=0;i<200;i++);}/************************************************************** 函数功能:软件延时子程序**************************************************************/ void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){unsigned char D[ ]={0,8,0,8,7,4,11}; //设定密码EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0keyval=0xff; //按键值初始化while(keyval!=D[0]) //第一位密码输入不正确,等待;while(keyval!=D[1]) //第二位密码输入不正确,等待;while(keyval!=D[2]) //第三位密码输入不正确,等待;while(keyval!=D[3]) //第四位密码输入不正确,等待;while(keyval!=D[4]) //第五位密码输入不正确,等待;while(keyval!=D[5]) //第六位密码输入不正确,等待;while(keyval!=D[6]) //没有输入“OK”,等待;P3=0xfe; //P3.0引脚输出低电平,点亮LED}/**************************************************************函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位**************************************************************/void time0_interserve(void) interrupt 1 using 1 //定时器T0的中断编号为1,使用第一组寄存器{unsigned char i;TR0=0; //关闭定时器T0P1=0xf0; //所有行线置为低电平“0”,所有列线置为高电平“1”if((P1&0xf0)!=0xf0) //列线中有一位为低电平“0”,说明有键按下delay20ms(); //延时一段时间、软件消抖if((P1&0xf0)!=0xf0) //确实有键按下{P1=0xfe; //第一行置为低电平“0”(P1.0输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=1; //可判断是S1键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=2; //可判断是S2键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=3; //可判断是S3键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=4; //可判断是S4键被按下P1=0xfd; //第二行置为低电平“0”(P1.1输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=5; //可判断是S5键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=6; //可判断是S6键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=7; //可判断是S7键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=8; //可判断是S8键被按下P1=0xfb; //第三行置为低电平“0”(P1.2输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=9; //可判断是S9键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=0; //可判断是S10键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=11; //可判断是S11键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=12; //可判断是S12键被按下P1=0xf7; //第四行置为低电平“0”(P1.3输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=13; //可判断是S13键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=14; //可判断是S14键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=15; //可判断是S15键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=16; //可判断是S16键被按下for(i=0;i<200;i++) //让P3.7引脚电平不断取反输出音频{sound=0;delay();sound=1;delay();}}TR0=1; //开启定时器T0TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%256; //定时器T0的高8位赋初值}五、用Proteus软件进行仿真利用Keil软件进行编译通过后,生成hex文件。

基于51单片机电子密码锁设计PPT

基于51单片机电子密码锁设计PPT

3晶振时钟电路与复位电路
7
晶振时钟电路
复位电路
系统电路图
8
电路PCB板
9
4.软件设计
10
软 件 设 计 流 程 图
5.程序调试
11
调试本程序需要用到KEIL C51,及51开 发板一块及其配套的下载烧录软件
首先打开KEIL C51主程序,新建工程, 新建文本框写入程序,保存,检查是否有语 法错误,经反复检查无误后汇编,生成51单 片机可执行的HEX文件。然后用51开发板相 匹配的烧录软件把HEX文件写入单片机 。
学的精神去解决问题。很多事情看起来是很简单的问题,但实际
做起来去会发现有许多奥妙!这是因为其中蕴含着许多科学的问
题。运用科学的方法去解决问题,这是我这次实训给我带来的思
想上的改变。学习上,使自已在大学所以的知识在这次得到实践
,学到一些书本上无法学到的经验,对电子元件有了进一步的认
识。
电子锁是信息化时代发展的产物,应时而生,我9C51
开锁驱动电路
电磁阀
通过单片机送给开锁执行机构,电路驱动电磁锁吸合,从而 达到开锁的目的。本设计通过P3.0接一个3极管驱动继电器打开 电磁阀线圈实现开关门。
当用户输入的密码正确而且是在规定的时间及次数输入之内 ,单片机便输出开门信号,送到开锁驱动电路,然后驱动电磁锁 ,达到开门的目的。
1
89C52
51单片机的电子锁设计 九组 DZ0901
密码锁的功能
2
开关锁,修改密码
还原,记忆
输入密码
目录
3
1.系统设计
2.硬件设计
3.软件设计
4.程序调试
1.系统设计
4
系统总设计结构图

基于51单片机的电子密码锁

基于51单片机的电子密码锁

电子密码锁一、工作原理本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的I/O 线的数目,在按键比较多的时候,通常采用这样方法。

每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N ×M个按键的键盘。

在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。

4×4矩阵键盘的工作原理在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图5所示。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

扫描原理把每个键都分成水平和垂直的两端接入,比如说扫描码是从垂直的入,那就代表那一行所接收到的扫描码是同一个bit,而读入扫描码的则是水平,扫描的动作是先输入扫描码,再去读取输入的值,经过比对之后就可知道是哪个键被按下。

由于这种按键是机械式的开关,当按键被按下时,键会震动一小段时间才稳定,为了避免让8051误判为多次输入同一按键,我们必须在侦测到有按键被按下,就Delay一小段时间,使键盘以达稳定状态,再去判读所按下的键,就可以让键盘的输入稳定。

利用51单片机设计一个用16个按键输入,6位数字输出显示的电子时钟。

如图1-1所示。

图1-1按键分布图具体要求和按键功能介绍如下:1. 上电后,6 位数码管显示“—”;2. 设置6 位密码,密码通过键盘输入,按“确定”键确认,如密码正确,将锁打开;3. 密码由用户自己设定,若密码正确即锁被打开,则指示灯被点亮;4. 若密码1 次输入错误,则报警;5. 按Set 键,修改密码;6. 按Cle 键可清除已输入的密码,重新进行输二、系统硬件组成本次设计的主要有键盘,数码管,STC89C52芯片,以及LED灯。

基于51单片机的密码锁设计报告

基于51单片机的密码锁设计报告

基于51单片机的密码锁设计报告课程:单片机原理学院:电子与信息工程学院专业:班级:姓名:学号:指导老师:完成日期:目录一、矩阵按键 (1)(1)按键接口 (1)(2)按键开关的抖动问题 (1)二、LCD1602液晶 (2)(1)1602 液晶的介绍 (2)(2)液晶的读写时序介绍 (4)(3)1602 液晶的指令介绍 (6)三、设计 (7)(1)输出密码后,显示LCD1602 (7)(2)输出密码后,交替亮灭显示LED (7)四、程序设计 (7)(1)主程序 (7)(二)LCD1602程序 (9)(3)矩阵键盘程序 (10)五、仿真截图 (12)(1)输出密码后,显示LCD1602 (12)(2)输出密码后,交替亮灭显示LED (15)基于51单片机的密码锁设计一、矩阵按键(1)按键接口键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向单片机输入指令、地址和数据。

一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。

(2)按键开关的抖动问题组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成的。

在下图1、图2中,当按键被按下时,P1.0输入为高电平;当按键按下后,P1.0输入为低电平。

由于按键是机械触点,当机械触点断开、闭合时,会有抖动动,P1.0输入端的波形如图2所示。

这种抖动对于人来说是感觉不到的,但对单片机来说,则是完全可以感应到的,因为单片机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对单片机而言,这已是一个“漫长”的时间。

图1图2按键抖动波形为使CPU能正确地读出P1口的状态,对每一次按键只作一次响应,就必须考虑如何去除抖动,常用的去抖动的方法有两种:硬件方法和软件方法。

单片机中常用软件法,因此,对于硬件方法我们不介绍。

软件法,就是在单片机获得P1.0口为低的信息后,不是立即认定按键已被按下,而是延时10毫秒或更长一些时间后再次检测P1.0口,如果仍为低,说明按键的确按下了,这实际上是避开了按键按下时的抖动时间。

基于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. }复制代码。

基于51单片机的电子密码锁课程设计报告

基于51单片机的电子密码锁课程设计报告

单片机原理与应用课程设计报告题目基于51单片机地电子密码锁设计系别物理与电子工程学院专业电子信息科学与技术学生姓名学号班级2013年 12月26日摘要电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关地闭合,完成开锁、闭锁任务地电子产品.在保密性、操作地方便性、密码地可变性、和一些自动化地功能上已经远远超过了机械密码锁.因此其应用非常广泛.而且由于其使用微型计算机地特质,导致其可以灵活地挂载电子化设备,比如界面友好地显示设备,方便快捷地输入设备等.本文简要介绍了一种基于A T89C51单片机地电子密码锁设计,主要采用汇编程序完成整个软件地设计,可以实现简易地电子密码锁功能.关键词:4×4矩阵键盘;AT89C51;密码锁;单片机目录一、绪论 (3)二、系统所要完成地功能 (3)三、系统总体方案设计 (4)四、硬件电路设计 (6)4.1单片机最小系统 (6)4.2 键盘电路设计 (6)4.3 LCD显示电路 (8)4.4 开锁电路 (8)五、软件设计 (9)六、系统调试 (13)七、心得体会 (13)参考文献 (14)附录 (15)源程序清单 (15)实物图 (23)一、绪论在日常地生活和工作中, 住宅与部门地安全防范、单位地文件档案、财务报表以及一些个人资料地保存多以加锁地办法来解决.若使用传统地机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣.随着科学技术地不断发展,人们对日常生活中地安全保险器件地要求越来越高.为满足人们对锁地使用要求,增加其安全性,用密码代替钥匙地密码锁应运而生.密码锁具有安全性高、成本低、功耗低、易操作等优点.在安全技术防范领域,具有防盗报警功能地电子密码锁逐渐代替传统地机械式密码锁,克服了机械式密码锁密码量少、安全性能差地缺点,使密码锁无论在技术上还是在性能上都大大提高一步.随着大规模集成电路技术地发展,特别是单片机地问世,出现了带微处理器地智能密码锁,它除具有电子密码锁地功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高地安全性、可靠性,应用日益广泛.随着人们对安全地重视和科技地发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世.但是这些产品地特点是针对特定地指纹和有效卡,只能适用于保密要求地箱、柜、门等.而且指纹识识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点.加上其成本较高,一定程度上限制了这类产品地普及和推广.鉴于目前地技术水平与市场地接收程度,电子密码锁是这类电子防盗产品地主流. 二、系统所要完成地功能基于以上思路,本文主要介绍一种使用STC公司地STC11F16XE单片机电子密码锁地设计,其主要具有如下功能:1、密码确认功能:密码通过矩阵键盘输入,若密码输入正确,则将通过驱动口发出高电平信号作为机械制动开锁地依据完成开锁功能.同时在主界面上显示:“The keywords is ok!”2、密码设置功能:单片机刚刚上电复位后会通过LCD1602界面提示设置密码:“Please set the keywords!”而且设置地密码是可重复地,程序运行中可再次通过输入相应密码然后修改.3、在密码输入错误时系统会通过LCD1602界面提示密码输入错误字符:“The keywords i sfalse!”同时不做开锁动作.4、本次设计中利用一只LED代替机械制动系统,灯亮表示开锁,灯灭表示闭锁.在本次地设计中,具体实现系统设计地过程如下:1、完成硬件地设计.通过PROTEL99SE绘制单片机最小系统板和矩阵键盘地原理图和PCB版图,然后通过实验室地腐蚀液腐蚀出来,焊上元件,下载测试程序调试.完成软件地设计.通过Keil uVision3软件,编辑好源汇编程序,然后编译和修改直到编译器通过为止.把编译好地HEX文件下载到单片机内部运行,通过查找系统功能上地不足和可修改地地方,然后回过去修改源文件,最终成型.三、系统总体方案设计方案一:采用数字电路控制.利用数字电路地逻辑运算功能,然后设计成电子密码锁,也可以完成系统地设计,甚至直接用FPGA完成设计就更加方便了.但是如果用FPGA完成则显得非常地浪费,因为,FPGA一方面价格昂贵,另一方面用功能如此强大地芯片制作功能如此简单地系统是一种耗费资源地行为,极不可取,故这里不采用此方案.方案二:采用DSP芯片TMS320F2812完成电子密码锁地设计.由于DSP芯片在逻辑运算和数学运算上地强大,完成电子密码锁地设计非常容易,而且容易实现.但是DSP芯片TMS320F2812地价格昂贵,故此处不采用此方案.方案三:采用51系列单片机STC11F16XE为核心来完成控制方案,然后实现电子密码锁地设计.我们可以利用单片机灵活地编程设计和丰富地IO端口,及其控制地准确性,不但能实现基本地密码锁功能,还能添加调电存储、声光提示甚至添加遥控控制功能.其原理如图3-1所示.图3-1单片机控制方案通过比较以上三种方案,单片机方案有较大地活动空间,不但能实现所要求地功能而且能在很大地程度上扩展功能,而且还可以方便地对系统进行升级,所以我们采用第三种方案.设计地效果场景如下:1、输入密码用矩形键盘,包括数字键、字母键和功能键.2、用液晶显示屏LCD1602显示字符和操作界面.3、用发光二极管代替开锁地电路,发光表示开锁,熄灭表示闭锁.4、打开电源后,显示器显示“Please set the keywords !”提示用户设置密码,用户可以在此时输入一个8位地密码.输入至8位后系统自动跳转到另一界面,显示字符“The keywords set ok !”5、在完成上面地步骤后,系统再次跳换到另一个界面:“Please input the keywords !”此时系统提示用户输入正确地密码以完成开锁地功能.用户此时可以通过矩阵键盘来完成输入密码地功能.输入位数为8位数.6、若输入密码正确则系统会显示:“The keywords is ok !” ,同时点亮LED 灯完成开锁.否则系统将显示“The keywords is false!”并且不做任何动作.在本次设计中,硬件主要完成单片机最小系统和矩阵键盘地设计,软件主要由矩阵键盘子程序、显示初始化程序、显示字符子程序、数据比较子程序、数据寄存子程序和子程序调度主程序等组成.四、硬件电路设计4.1、单片机最小系统设计单片机地最小系统中包括外接晶振、复位电路和P0口地上拉电阻.其原理图如图4.1所示:图4.1 单片机最小系统4.2、键盘电路设计本设计中使用矩阵键盘作为输入设备,它最大地优点就是可以减少单片机I/O总线地占用,节省资源,而且可以产大量地不同组输入数据.在按键比较多地时候,通常采用这样方法.其原理如图4.2所示:.图4.2 矩阵键盘原理图每一条水平(行线)与垂直线(列线)地交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N×M个按键地键盘.在这种行列式矩阵键盘非键盘编码地单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下地程序段.当确认有按键按下后,下一步就要识别哪一个按键按下.对键地识别通常有两种方法:一种是常用地逐行扫描查询法;另一种是速度较快地线反转法.对照图4.2所示地4×4键盘,说明线反转地工作原理.首先辨别键盘中有无键按下,有单片机I/O口向键盘送全扫描字,然后读入行线状态来判断.方法是:向行线输出全扫描字00H,把全部列线置为低电平,然后将列线地电平状态读入累加器A中.如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为1.判断键盘中哪一个键被按下使通过将列线逐列置低电平后,检查行输入状态来实现地.方法是:依次给列线送低电平,然后查所有行线状态,如果全为1,则所按下地键不在此列;如果不全为1,则所按下地键必在此列,而且是在与零电平行线相交地交点上地那个键.本次电路地设计中,矩阵键盘地具体地功能设计如表3.1:表4.1 按键功能按键键名功能说明1-9键数字键输入密码A--F键字母键输入密码4.3、LCD显示电路由于LCD1602地引脚中有一个对比调整电压,因此电路设计中主要就是对它串联可调电阻和对背光灯串联可调电阻地设计.这里我们采用P0口地并口总线和LCD1602数据总线相对应.控制线采用P2.2、P2.3、P2.4三个位组成,分别控制RS、RW和E.在程序中用指令EQU定义.由于显示电路比较简单,故不截图单独说明.4.4、开锁电路在本次设计中,基于节省材料地原则,暂时用发光二极管代替电磁锁,发光管亮,表示开锁;灭,表示没有开锁.电路图如3.3所示.当P2.0口输出低电平时,二极管发光,表示开锁.图4.3 开锁电路五、软件设计5.1、软件设计思路电子密码锁工作地主要过程是LCD1602液晶显示器提示开始输入密码,通过矩阵键盘输入密码,同时由液晶显示器显示输入地情况,到输入完成后系统自动作出判断,作出开锁或闭锁处理.密码地设定,在本设计中地程序中输入地密码是保存在30H—46H中地.在输入过程中,首先输入密码地长度,接着根据密码地长度输入密码地位数,直到所有长度地密码都已经输入完毕;或者输入确认功能键之后,才能完成密码地输入过程.进入密码地判断比较处理状态并给出相应地处理过程.5.2 各个子程序地设计1、键盘扫描子程序键盘扫描流程图如图4.2.1图5.1 键盘扫描流程图键盘扫描子程序如下:KEY1: MOV A,P1 //键盘程序入口ORL A,#0F0HCPL AJZ KEY1ACALL DELAY10MSMOV A,P1ORL A,#0F0HCPL AJZ KEY1MOV P1,#7FH // 确认有键按下 MOV P1,#7FHMOV A,P1ORL A,#0F0HCPL AJNZ CHULI1 // 开始各种相应处理MOV P1,#0BFHMOV A,P1ORL A,#0F0HCPL AJNZ CHULI2MOV P1,#0DFHMOV A,P1ORL A,#0F0HCPL AJNZ CHULI3MOV P1,#0EFHMOV A,P1ORL A,#0F0HCPL AJNZ CHULI42、液晶显示初始化程序初始化程序主要完成各种显示功能地配置:MOV P0,#01H //显示程序入口初始化ACALL ENABLEMOV P0,#38HACALL ENABLEMOV P0,#0FHACALL ENABLEMOV P0,#06HACALL ENABLEMOV P0,80H3、液晶显示部分程序液晶显示程序主要完成读时序和写时序地功能:ENABLE: CLR RSCLR RWCLR EACALL DELAY10MSSETB ERETDAT1: SETB RSCLR RWCLR EACALL DELAY10MSSETB ERET其中,ENABLE子程序主要完成对LCD1602地写控制地功能,DAT1子程序主要完成对其地写数据地功能.4、数据比较判断子程序BIJIAO: ACALL DELAYMOV P0,#01HACALL ENABLEACALL PLEASEACALL INPUTACALL PASSWORD MOV R3,#8MOV R1,#2AHACALL MAINCLR CMOV A,20HSUBB A,2AHJNZ ZHONGZHIMOV A,21HSUBB A,2BHJNZ ZHONGZHIMOV A,22HSUBB A,2CHJNZ ZHONGZHIMOV A,23HSUBB A,2DHJNZ ZHONGZHIMOV A,24HSUBB A,2EHJNZ ZHONGZHIMOV A,25HSUBB A,2FHJNZ ZHONGZHIMOV A,26HSUBB A,30HJNZ ZHONGZHIMOV A,27HSUBB A,31HJNZ ZHONGZHI此子程序根据输入地密码自动和设置地密码进行比对,并且依据其是否相等作出判断而跳转至不同地其他地子程序中去做相应地操作.六、系统调试本次调试采用实物调试.首先设计电子密码锁地源程序,源程序经过汇编后,生成地目标文件下载到单片机内部,运行并做操作后查看和预期结果是否一样.经过不断地修改,效果见附页.其中主要包括了开机界面地显示,输入密码正确后地显示,提示输入密码地界面显示和开锁后地效果.七、心得体会实践是检验真理地唯一标准,当然也是检验学习成果地标准.在经过一段时间地学习之后,我们需要了解自己地所学应该如何应用在实践中,因为任何知识都源于实践,归于实践,所以要将所学地知识在实践中来检验.这次课程设计终于顺利完成了,由于我们对于单片机地应用并不熟悉,因此,我们请了硕勋励志班地优秀同学给我们进行指导.虽然老师并不要求做出实物,但硕勋班地那位同学认为要在实践中我们才能学到更多,理解地更全面.因此,我们在那位同学地指导下做出了实物,虽然并不完美,但却比理论学习地更多,实践是检验真理地唯一标准.当然我们在设计中也遇到了很多问题,仿真软件不熟悉,指令指针应用不熟悉,实务操作就更是困难,真正体现出书到用时方恨少,我们女生在实践方面地劣势也严重地凸显出来.开始地时候,几乎是寸步难行,编程,操作什么地都要靠硕勋班同学细心地解释指导,慢慢地才生疏地上手了,在这里要诚挚地感谢硕勋励志班地同学,耐心地指导我们.其实一直到最后作品出来了,我们也没有真正地理解了所有地东西,只是明白了许多零零散散地概念,这也证明了没有什么是可以轻易学到地.这次我们最大地心得就是要想真正地学习某一方面地东西,就必须全心全意心无旁骛地朝着这个方向走下去..在做设计期间,在励志班同学地指导下,通过自身地不断努力,无论是思想上,学习上,都取得了长足地发展和巨大地收获.顾起此次单片机课程设计,至今我们感慨颇多,地确,从选题到定稿,从理论到实践,在整整两星期地日子里,可以说得是苦多于甜,但是可以学到很多很多地地东西,同时不仅可以巩固了以前所学过地知识,而且学到了很多在书本上所没有学到过地知识.通过这次课程设计使我们懂得了理论与实际相结合是很重要地,只有理论知识是远远不够地,只有把所学地理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己地实际动手能力和独立思考地能力.在设计地过程中遇到问题,可以说得是困难重重,这毕竟第一次做地,难免会遇到过各种各样地问题,同时在设计地过程中发现了自己地不足之处,对以前所学过地知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不好,通过这次课程设计之后,一定把以前所学过地知识重新温故.参考文献[1] 李朝青.单片机原理及接口技术(简明修订版)[M].北京:北京航空航天大学出版社,1998[2] 李全利.单片机原理及接口技术[M].高等教育出版社,2003[3] PROTEL99 SE电路设计与制板[M].机械工业出版社,2007[4] 杨将新,李华军,刘到骏等.单片机程序设计及应用(从基础到实践)[J].电子工业出版社,2006[7] 黄智伟.全国大学生电子设计竞赛训练教程[M].北京:电子工业出版社, 2005附录源程序清单ORG 0000HRS EQU P2.2RW EQU P2.3E EQU P2.4AJMP STARTORG 2000HDB 30H,31H,32H,33H,34H,35H,36H,37HDB 38H,39H,41H,42H,43H,44H,45H,46HORG 0030HSTART: MOV DPTR,#2000H //系统初始化MOV SP,#60HMOV R3,#8MOV R1,#20HSETB P2.0MOV P0,#01H //显示程序入口初始化ACALL ENABLEMOV P0,#38HACALL ENABLEMOV P0,#0FHACALL ENABLEMOV P0,#06HACALL ENABLEMOV P0,80HACALL ENABLEACALL PLEASEACALL SEETACALL PASSWORDACALL MAINACALL XIANSHI1ACALL BIJIAOAJMP $MAIN: MOV P1,#0FHKEY1: MOV A,P1 //键盘程序入口ORL A,#0F0HCPL AJZ KEY1ACALL DELAY10MSMOV A,P1ORL A,#0F0HCPL AJZ KEY1MOV P1,#7FH // 确认有键按下 MOV P1,#7FHMOV A,P1ORL A,#0F0HCPL AJNZ CHULI1 // 开始各种相应处理MOV P1,#0BFHMOV A,P1ORL A,#0F0HCPL AJNZ CHULI2MOV P1,#0DFHMOV A,P1ORL A,#0F0HCPL AJNZ CHULI3MOV P1,#0EFHMOV A,P1ORL A,#0F0HCPL AJNZ CHULI4CHULI1: MOV P1,#07FH //键值生成程序部分 MOV A,P1JNB ACC.0,C1Z1JNB ACC.1,C1Z2JNB ACC.2,C1Z3JNB ACC.3,C1Z4C1Z1: MOV A,#3AJMP WANCC1Z2: MOV A,#7AJMP WANCC1Z3: MOV A,#11AJMP WANCC1Z4: MOV A,#15AJMP WANCCHULI2: MOV P1,#0BFHMOV A,P1JNB ACC.0,C2Z1JNB ACC.1,C2Z2JNB ACC.2,C2Z3JNB ACC.3,C2Z4C2Z1: MOV A,#2AJMP W ANCC2Z2: MOV A,#6AJMP W ANCC2Z3: MOV A,#10AJMP W ANCC2Z4: MOV A,#14AJMP W ANCCHULI3: MOV P1,#0DFHMOV A,P1JNB ACC.0,C3Z1JNB ACC.1,C3Z2JNB ACC.2,C3Z3JNB ACC.3,C3Z4C3Z1: MOV A,#1AJMP W ANCC3Z2: MOV A,#5AJMP W ANCC3Z3: MOV A,#9AJMP W ANCC3Z4: MOV A,#13AJMP W ANCCHULI4: MOV P1,#0EFHMOV A,P1JNB ACC.0,C4Z1JNB ACC.1,C4Z2JNB ACC.2,C4Z3JNB ACC.3,C4Z4C4Z1: MOV A,#0AJMP W ANCC4Z2: MOV A,#4AJMP W ANCC4Z3: MOV A,#8AJMP W ANCC4Z4: MOV A,#12AJMP W ANCWANC: MOV @R1,A //键值显示程序 INC R1MOVC A,@A+DPTRMOV P0,AACALL DAT1DJNZ R3,MM1MM0: AJMP ZUIHOUMM1: AJMP MAINZUIHOU: RETXIANSHI1: MOV P0,#01HACALL ENABLE //清屏MOV P0,#50H //PACALL DAT1MOV P0,#41H //AACALL DAT1MOV P0,#53H //SACALL DAT1MOV P0,#53H //SACALL DAT1MOV P0,#57H // WACALL DAT1MOV P0,#4FH //OACALL DAT1MOV P0,#52H //RACALL DAT1MOV P0,#44H //DACALL DAT1MOV P0,#2DH //-ACALL DAT1ACALL SEETMOV P0,#2DHACALL DAT1 //-MOV P0,#4FHACALL DAT1 //OMOV P0,#4BHACALL DAT1 //KMOV P0,#21HACALL DAT1 //!ACALL DELAYMOV P0,#01H //清屏ACALL ENABLERETDELAY10MS:MOV R0,#5DEL1: MOV R4,#192DEL2: MOV R2,#255DJNZ R2,$DJNZ R4,DEL2DJNZ R0,DEL1RETDELAY: MOV 30H,#50DY1: MOV 31H,#200DY2: MOV 32H,#200DJNZ 32H,$DJNZ 31H,DY2DJNZ 30H,DY1RETBIJIAO: ACALL DELAYMOV P0,#01HACALL ENABLEACALL PLEASEACALL INPUTACALL PASSWORDMOV R3,#8MOV R1,#2AHACALL MAINCLR CMOV A,20HSUBB A,2AHJNZ ZHONGZHIMOV A,21HSUBB A,2BHJNZ ZHONGZHIMOV A,22HSUBB A,2CHJNZ ZHONGZHIMOV A,23HSUBB A,2DHJNZ ZHONGZHIMOV A,24HSUBB A,2EHJNZ ZHONGZHIMOV A,25HSUBB A,2FHJNZ ZHONGZHIMOV A,26HSUBB A,30HJNZ ZHONGZHIMOV A,27HSUBB A,31HJNZ ZHONGZHITRUE: MOV P0,#01HACALL ENABLE //清屏MOV P0,#50H //PACALL DAT1MOV P0,#41H //AACALL DAT1MOV P0,#53H //SACALL DAT1MOV P0,#53H //SACALL DAT1MOV P0,#57H // WACALL DAT1MOV P0,#4FH //OACALL DAT1MOV P0,#52H //RACALL DAT1MOV P0,#44H //DACALL DAT1MOV P0,#2DH //-ACALL DAT1MOV P0,#49H //IACALL DAT1MOV P0,#53HACALL DAT1 //SMOV P0,#2DHACALL DAT1 //-MOV P0,#4FHACALL DAT1 //OMOV P0,#4BHACALL DAT1 //KMOV P0,#21HACALL DAT1 //!CLR P2.0// LCALL DELAYAJMP EDDZHONGZHI: MOV P0,#01HACALL ENABLE //清屏MOV P0,#50H //PACALL DAT1MOV P0,#41H //AACALL DAT1MOV P0,#53H //SACALL DAT1MOV P0,#53H //SACALL DAT1MOV P0,#57H // WACALL DAT1MOV P0,#4FH //OACALL DAT1MOV P0,#52H //RACALL DAT1MOV P0,#44H //DACALL DAT1MOV P0,#2DH //-ACALL DAT1MOV P0,#49H //IACALL DAT1MOV P0,#53HACALL DAT1 //SMOV P0,#2DHACALL DAT1 //-MOV P0,#46HACALL DAT1MOV P0,#61HACALL DAT1MOV P0,#6CHACALL DAT1MOV P0,#53HACALL DAT1MOV P0,#65HACALL DAT1SETB P2.0EDD: AJMP BIJIAORETPLEASE: MOV P0,#50H //P ACALL DAT1MOV P0,#6CH //LACALL DAT1MOV P0,#65H //eACALL DAT1MOV P0,#61H //aACALL DAT1MOV P0,#73H //sACALL DAT1MOV P0,#65H //eACALL DAT1MOV P0,#2DH //-ACALL DAT1RETINPUT: MOV P0,#69H // iACALL DAT1MOV P0,#6EH //nACALL DAT1MOV P0,#70H //pACALL DAT1MOV P0,#75H //uACALL DAT1MOV P0,#74H //tACALL DAT1MOV P0,#2DH //-ACALL DAT1RETPASSWORD: MOV P0,#50H //P ACALL DAT1MOV P0,#41H //AACALL DAT1MOV P0,#53H //SACALL DAT1MOV P0,#0C0HACALL ENABLEMOV P0,#53H //SACALL DAT1MOV P0,#57H // WACALL DAT1MOV P0,#4FH //OACALL DAT1MOV P0,#52H //RACALL DAT1MOV P0,#44H //DACALL DAT1MOV P0,#21HACALL DAT1RETSEET: MOV P0,#73HACALL DAT1MOV P0,#65HACALL DAT1MOV P0,#74HACALL DAT1RETCHU: ACALL PLEASEACALL INPUTACALL PASSWORDRETENABLE: CLR RSCLR RWCLR EACALL DELAY10MSSETB ERETDA T1: SETB RSCLR RWCLR EACALL DELAY10MSSETB ERET硬件实物图。

基于51单片机的密码锁设计报告

基于51单片机的密码锁设计报告

基于51单片机的密码锁设计报告一、引言随着科技的不断发展,安全问题越来越受到人们的关注。

密码锁作为一种常见的安全防护设备,在保护个人财产和隐私方面发挥着重要作用。

本设计报告介绍了一种基于 51 单片机的密码锁系统,该系统具有成本低、可靠性高、操作简单等优点,适用于家庭、办公室等场所。

二、系统总体设计(一)设计目标设计一个基于 51 单片机的密码锁系统,实现以下功能:1、密码输入与验证功能。

2、密码修改功能。

3、错误输入次数限制及报警功能。

4、开锁状态指示功能。

(二)系统组成本系统主要由 51 单片机、矩阵键盘、液晶显示屏(LCD)、电磁锁驱动电路、报警电路等组成。

1、 51 单片机作为核心控制器,负责处理密码输入、验证、修改等操作,并控制其他模块的工作。

2、矩阵键盘用于输入密码和执行相关操作。

3、 LCD 显示屏用于显示系统状态和提示信息。

4、电磁锁驱动电路用于控制电磁锁的开关。

5、报警电路在密码输入错误次数超过限制时发出报警信号。

三、硬件设计(一)51 单片机选型本设计选用 STC89C52 单片机,该单片机具有丰富的 I/O 口资源、较高的性价比和良好的稳定性。

(二)矩阵键盘设计矩阵键盘采用 4×4 行列式结构,通过扫描的方式获取按键值。

(三)LCD 显示屏接口设计选用 1602 液晶显示屏,通过并行接口与单片机连接,实现数据的传输和显示。

(四)电磁锁驱动电路设计电磁锁采用直流电源供电,通过三极管驱动电路控制其开关。

(五)报警电路设计报警电路采用蜂鸣器实现,当密码输入错误次数超过限制时,单片机输出高电平驱动蜂鸣器发声报警。

四、软件设计(一)主程序流程系统上电后,首先进行初始化操作,包括单片机端口初始化、LCD 初始化等。

然后进入密码输入状态,等待用户输入密码。

用户输入密码后,进行密码验证,如果密码正确,则打开电磁锁,并显示开锁成功信息;如果密码错误,则记录错误次数,并显示错误提示信息。

基于51单片机的指纹密码锁设计

基于51单片机的指纹密码锁设计

基于51单片机指纹电子密码锁设计摘要随着人民生活水平的提高,如何实现家庭防盗这一问题也变得尤其突出,传统的机械锁由于其构造简单,安全性低,无法满足人们的需求。

随着电子产品向智能化和微型化的不断发展,单片机已成为电子产品研制和开发中首选的控制器,所以具有防盗报警功能的电子密码锁控制系统逐渐代替传统的机械式密码控制系统,克服了机械式密码锁控制的密码量少,安全性能差的缺点。

在传统的身份认证中,我们往往使用密码加密法,但是这种方法只是”防君子不防小人”。

在高明的黑客眼里,由几个字符组成的密码脆弱得不堪一击.现在,科技的发展让我们有了新的选择——生物识别技术。

将生物识别技术应用于笔记本、门锁等方面,可以对文件、财产起保护作用,并且可以进行身份识别。

生物识别技术的发展主要起始于指纹研究,它亦是目前应用最为广泛的生物识别技术。

本设计开发了一款基于单片机的指纹识别电子密码锁系统。

该系统以STC89C52单片机作为模块核心,通过串口通信控制ZFM—60指纹模块实现录取指纹并存储指纹数据,并通过HS12864-15C液晶显示比对流程及比对结果,辅以直流继电器与发光二极管模拟开锁的动作.本系统具有体积小、性价比高、传输速度快、适合家庭及单位使用.关键词:单片机,密码锁,指纹识别51 single fingerprint-based electronic code lockdesignABSTRACTWith the improvement of people's living standards,how to achieve family security issue has become particularly prominent,the traditional mechanical locks because of its simple structure, low security,can not meet people’s needs. As electronic products to intelligent miniaturized and the continuous development of SCM has become the electronic product research and development preferred controller,the electronic lock control system with anti-theft alarm function gradually replace the traditional mechanical control systems with code,overcome password less, poor safety performance shortcomings of mechanical lock control。

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

一、设计目的1.1课题简介如何实现防盗是很多人关心的问题,传统的机械锁由于其构造简单,被撬的事件屡见不鲜,使人们的人身及财产安全受到很大威胁。

电子密码锁是一种依靠电子电路来控制电磁锁的开与闭的装置,开锁需要输入正确密码,若密码泄露,用户可以随时更改密码。

因此其保密性高,使用灵活性好,安全系数高,可以满足广大用户的需要,现在广泛使用的有红外遥控电子密码锁,声控密码锁,按键密码锁等。

1.2课题研究目的本设计是一种基于单片机的密码锁方案,根据基本要求规划单片机密码锁的硬件电路和软件程序,同时对单片机的型号选择、硬件设计、软件流程图、单片机存储单元的分配等都有注释。

现在很多地方都需要密码锁,电子密码锁的性能和安全性大大超过了机械锁,为了提高密码的保密性,必须可以经常更改密码,以便密码被盗时可以修改密码。

本次设计的密码锁具备的功能:LED数码管显示初始状态“——————”,用户通过键盘输入密码,每输入一位密码,LED数码管相应有一位变为“P”,若想重新输入密码,只需按下“CLR”键。

密码输入完毕后按确认键“#”,密码锁控制芯片将输入的密码与密码锁控制芯片中存储的密码相比,若密码错误,则不开锁,会有红灯亮提示,同时显示“Error”。

若正确,则开锁,会有绿灯亮提示,同时显示“PASS”。

用户可以根据实际情况随意改变密码值或密码长度,密码输入正确后可以按下“CHG”修改密码,输入新密码时每输入一位新密码相应有一位变为“H”,以便提示用户此时输入的是新密码,修改新密码时若想重新输入新密码只需按下“CLR”键即可。

输入新密码后按确认键即修改成功,新密码写入单片机内部RAM中,以便以后用来确认密码的正确性。

按下复位键,系统恢复初始状态,密码也恢复初始密码,本设计中初始密码是“096168”。

本次设计中硬件主要由我完成,软件主要由张振完成。

二、硬件设计2.1概述本系统主要由单片机最小系统、电源电路、输入键盘电路、输出显示电路、开锁电路等组成,系统框图如图1所示:图1 系统框图 2.2最小系统1.单片机:单片机最小系统包括单片机、晶振电路、复位电路等,最小系统是整个系统的核心部分,也是设计中首先应该设计的部分,其中单片机的选择直接决定着之后整个设计应该如何进行, 因为我们刚刚学完单片机,学习时是以MCS-51单片机为主的,对51系列单片机最熟悉,因此决定选用51系列单片机, 51系列单片机中Atmel89C51应用最为广泛,且价格较低,性能完全能满足本次设计,因此决定选用AT89C51芯片。

AT8 9C51外形及引脚排列如图2所示:图2 AT89C51外形及引脚排列AT89C51主要特性:·与MCS-51 兼容·4K字节可编程闪烁存储器·1000次写入/擦除循环·数据保留时间:10年·全静态工作:0Hz-24MHz·三级程序存储器锁定·128×8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路2.晶振电路图3 晶振电路AT89C51中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。

这个放大器与作为反馈元件的片外石英晶体一起构成自激振荡器,晶振电路如图3所示。

石英晶体振荡电路对外接电容C2和C3虽没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程度,一般电容使用30pF±10pF,这里使用30pF的独石电容。

因此晶振电路中使用12M晶振,30pF独石电容。

3.复位电路如图4所示为80C51单片机复位电路。

结合实际需求,本次设计加入了手动复位。

RC构成微分电路,在接电瞬间,产生一个微分脉冲,其宽度若大于2个机器周期,80C51型单片机将复位,为保证微分脉冲宽度足够大,这里取10μF电容、10KΩ电阻。

若按下复位键,则C1被短路,R1两端电压为Vcc,产生的高电平时间足以使单片机复位图4 复位电路关于复位电路的计算如下:AT89C51的最低复位电平是0.7VccV1 为电容最终可充到的电压值Vt 为t时刻电容上的电压值则,Vt=V1×[1-exp(-t/RC)]即,t = RC×Ln[V1/(V1-Vt)]在C1充电到0.7Vcc前,R1上电压均大于0.7Vcc,即为有效复位电压,因此需要求电容充电到0.3Vcc的时间。

将V1=Vcc,Vt=0.3Vcc代入上式: 0.3VCC=Vcc×[1-exp(-t/RC)]即[1-exp(-t/RC)]=0.3;∴exp(-t/RC)=0.7∴- t/RC=ln(0.7)∴t/RC=ln(1.43) ln(1.43)≈0.35也就是t=0.35RC。

带入R=10K C=10μF得。

t=0.35×10K×10uf=35ms∵时钟周期T=1/f=1/12M=1μs∴2个机器周期=2T=4μs∴t>>2μs所以复位电路中电容选10μF电解电容,10K电阻,一只按键开关可以使电路上电复位和手动复位。

4.存储器设定电路最小系统电路的最后部分是存储器的设定,如果把31脚(EA)接地,则采用外部程序存储器,如果将其接Vcc,则采用内部程序存储器。

AT89C51具有4KB可编程闪烁存储器,足以满足本设计要求,因此不采用外部程序存储器,即将31脚(EA)接Vcc,如图5所示:图5 存储器设定电路2.3电源电路本次设计的电源采用以前模拟电路课程设计做的直流稳压电源,电源采用LM7805三端稳压器,外形及引脚排列如图6所示用LM7805来组成稳压电源所需的外围元件较少,LM7805电路内部还有过流、过热及调整管的保护电路,使用起来可靠、方便,而且价格便宜。

该系列集成稳压IC型号中的LM78xx后面的数字代表该三端集成稳压电路的输出电压,如lm7805表示输出电压为正5V ,因为本设计中单片机和各个芯片的工作电压均为5V ,因而采用LM7805。

图6 LM7805图7 直流稳压源电路电源电路如图7所示,220V 市电通过变压器降压成12V 的交流电,经过整流桥整流,再经7805稳压到5V 。

C1、C2和C3具有滤波功能,使电流更加稳定,保证了系统的稳定运行。

2.4键盘电路本设计采用矩阵式键盘,又称行列式键盘,是将I/O 线的一部分作为行线,另一部分作为列线,按键设置在行线和列线的交叉点上,行列线分别连接到按键开关的两端,当键按下时,两导线连通。

这种设计能减少键盘与单片机I/O 接线的数目,只需要N 个行线和M 个列线就可以实现N ×M 个键的操作,在按键比较多的时候,通常采用这种方法。

其电路如图8所示:图8 矩阵式键盘电路图行线作为输入,通过上拉电阻接+5V ,被钳位在高电平状态。

列线作为输出,7805通过列线输出扫描码,通过行线读入行线状态来判断是哪一键被按下。

图示电路中各键的键值从第一行左起依次为11H、 12H、 14H、18H、21H、22H、24H、28H、41H、42H、44H、48H、81H、82H、84H、88H。

键盘各键值通过查键值表可以转换为相应的代码,代表不同的值。

本设计中要用到13个键,分别为0~9键用于输入六位密码,确认键‘#’用于输入密码完毕后确认,清除键‘CLR’用于想重新输入时清楚之前输入的密码,修改密码键‘CHG’用于输入密码验证正确后选择修改密码,剩余三个键未用,可以留待以后扩展功能,键盘如图9所示:图9 键盘2.5显示电路本系统设计的显示电路是为了给用户以提示而设置的。

考虑到节约单片机的口资源,本系统的显示采用串行显示的方式,只使用单片机的两个串行口P3.0(RXD)和P3.1(TXD),就可以完成单片机的显示功能。

本部分电路主要使用七段数码管和移位寄存器芯片74LS164。

单片机将要显示的数据信号传送到移位寄存器芯片74LS164寄存,再由移位寄存器控制数码图10 74LS164管脚图管的显示,从而实现移位寄存点亮数码管显示。

由于单片机的时钟频率达到12M,移位寄存器的移位速度相当快,所以我们根本看不到数据是一位一位传输的。

仿佛是全部数码管同时显示的一样。

74LS164是串行输入带锁存的8位移位寄存器,其管脚图见图10,真值表见表1当清除端(CLEAR)为低电平时,输出端(QA-QH)均为低电平。

串行数据输入端(A,B)可控制数据。

当 A、B 任意一个为低电平,则禁止新数据输入,在时钟端(CLOCK)脉冲上升沿作用下 Q0 为低电平。

当 A、B 有一个为高电平,则另一个就允许输入数据,并在 CLOCK 上升沿作用下决定 Q0 的状态. 表1 74LS164真值表74LS164主要特性:串行输入带锁存时钟输入,串行输入带缓冲异步清除最高时钟频率可高达36Mhz功耗:10mW/bit工作温度:0°C to 70°CVcc最高电压:7V输入最高电压:7V最大输出驱动能力:高电平:-0.4mA数码低电平:8mA图11 LED数码管显示电路显示电路如图11所示,每一片74LS164的CLR端均接Vcc。

从单片机串口输出的信号先送到第1片移位寄存器74LS164的AB端,由于移位脉冲的作用,使数据向右移最终从移到Q7脚,第1片的Q7脚接第2片的AB端,以此类推,在移位寄存器的移位作用下,第1个8位数据送到第6片74LS164,第2个8位数据送到第5片74LS164,以此类推,每一个八位数据出现在74LS164的并行输出端,每片74LS164的八个输出脚接七段数码管数码管的八个输入数据脚,七段数码管数码管根据74LS164上的数据状态显示相应的数字,从而达到显示的目的,移位寄存器74LS164还兼作数码管的驱动。

数码管按段数分为七段数码管和八段数码管,其外形及管脚图如图12所示,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。

共阳数码管是指将所有发光二极管的阳极接到一起形图12 七段共阳极数码管外形及管脚图成公共阳极(COM)的数码管。

共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。

当某一字段的阴极为高电平时,相应字段就不亮。

共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。

共阴数码管在应用时应将公共极COM接到地线GND 上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。

相关文档
最新文档