当前位置:文档之家› 基于单片机的电子密码锁的设计

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

基于单片机的电子密码锁设计我国工业企业的自动化程度普遍较低,单片机产品有很大的应用空间,如机械行业80%以上的设备仍采用传统的继电器和接触器进行控制。

因此,单片机在我国的应用潜力远没有得到充分发挥。

我国大中型企业普遍采用了先进的自动化系统对生产过程进行控制,但绝大部分小型企业尚未应用自动化系统和产品对生产过程进行控制,以提高企业的经济效益和竞争实力。

基于单片机设计的电子密码锁,具有设计简单,操作方便的特点,该产品有很大的市场前景。

该设计运用Proteus等仿真软件仿真电子锁,解决了手工绘图慢的缺点,同时设计过程还引用了电子锁常用的标准件和常用件,尽量将所设计的电子锁标准化,这样就大大缩短了电子锁设计周期,进而缩短了新产品的开发周期并降低了电子锁的制造成本;增强了产品的竞争力,公司的整体实力也得到增强。

第一章概述1.1 设计目的1.通过本次课程设计进一步熟悉和掌握单片机的结构及工作原理,巩固和加深“单片机C语言”课程的基本知识,掌握电子设计知识在实际中的简单应用。

2.综合运用“单片机C语言”课程的技巧以及生产实际知识去分析和解决电子设计问题,进行电子设计的训练。

3.学习电子设计的一般方法,掌握AT89C51芯片以及简单的电子设计过程和运行方式,培养正确的设计思想和分析问题、解决问题的能力、特别是总体设计能力。

4.通过计算和绘制原理图、布局图和流程图,学会运用标准、规范、手册、图册、和查阅有关技术资料等,培养电子设计的基本技能。

1.2 设计要求1.若不小心输入错误数字,可以返回重新输入。

2.输入错误次数达到3次时,将锁定键盘一定时间。

3.可以更改密码。

4.显示解锁键盘余剩时间。

第二章系统的硬件结构设计2.1 实验原理主体电路:电子密码锁控制模块。

这部分电路主要由AT89C51单片机的I/O端口、定时计数器、外部中断扩展等组成。

本设计的P0端口为段码端口,P2端口为位码端口,P1和P3为键盘端口。

初始时红灯亮,绿灯灭,并且数码管无任何显示。

当输入数字时,数码管不会显示所输入的数字,但会显示出一横表示输入了数字,输入“返回”时可以返回上一步。

当输入了4个数字时,再按“确定”,若输入的密码正确,红灯灭,绿灯亮,输入“锁定”后可以重新上锁;若输入的密码不正确,红灯将会闪烁3次,之后重置输入的数字。

如果输入错误次数达到3次,键盘将会被锁定,红灯和绿灯均熄灭,无法输入任何数字,数码管显示1800并且开始倒数1800秒。

1800秒后,电子锁将会自动解锁。

若在电子锁解锁期间按“更改密码”可以改变密码,此时若按数字键时会显示输入的密码,输入“返回”可以返回上一步。

输入完毕后,按“确定”键绿灯将会闪烁3次表示更改密码完成。

本设计的程序中采用定时器中断的方式设计。

2.2.工作流程图流程如图2.2-1图2.2-1 工作流程图2.3 硬件设计2.3.1 单片机结构单片微机(Single-Chip Microcomputer)简称为单片机。

他在一块芯片上集中了中央处理单元CPU、随机存储器RAM、只读存储器ROM、定时/计数和多功能输入/输出I/O口,如并行I/O、串行口I/O和转换A/D等。

就其组成而言,一块单片机就是一台计算机,由于它具有体积小、功能强和价格便宜等优点,因而被广泛地应用于产品智能化和工业控制自动化上。

2.3.2 主要元器件选择如图2.3.2-1图2.3.2-1 主要元器件选择第三章控制系统的软件设计3.1 软件设计3.1.1 单片机中中断系统基本结构中断是一项重要的计算机技术,是处理正常工作与紧急状态的好办法,是实现人机实时交互的重要途径,在单片机应用系统中,终端技术得到了广泛应用。

下面详细介绍单片机中断系统基本结构、与中断相关的特殊寄存器的设置及中断应用系统编程方法。

当CPU查询到系统有中断请求时,如果系统处于中断允许状态,CPU将停止当前的工作,相应中断请求,转向中断服务,中断服务完成后,返回源程序继续执行当前任务,这叫单片机中断。

能让CPU产生中断的信号源叫中断源。

8051单片机有INT0、INT1、T0、T1、TI、RI 六个中断源,但是只有EX0、ET0、EX1、ET1、ES五个向量,下面简要介绍六个中断源。

INT0、INT1:外部中断源,右P3.2和P3.3引脚输入。

具有低电平和脉冲两种出发方式,在每个机器周期的S5P2采样引脚信号,如有效则由硬件将它的中断请教标志IE置1,请求中断.当CPU响应中断时,由硬件复位。

T0、T1:定时/计数器中断,当定时/计数器产生溢出时,置位中断请求标志TF请求中断处理。

RI、TI:串行中断,RI是接受,TI为发送。

单片机串行口接受到一个字符后RI置1,发送完一个字符TI置1。

值得注意的是,RI、TI在响应中断后,必须由用指令将其复位。

3.1.2 中断响应CPU在执行程序的过程中,在每个机器周期的S5P2对中断位置位按中断优先级进行查询,一旦查询到有中断请求,CPU只要不在执行同级或高级的中断服务程序和当前指令(RETI指令或访问IE、IP的指令除外)执行完毕两种情况,则响应中断。

如果当前正在执行的指令是RETI或访问IE、IP的指令,则当前指令执行完毕后,CPU才可响应中断。

中断响应时间可以从中断信号被查询开始算起,中断响应时间在以下三种情况,响应还会更长:①CPU正在执行一个比响应的中断源优先级相当或更高的中断源的中断服务程序,此时必须等到中断服务程序执行完毕才可中断响应。

②正在执行的当前指令不是在最后一个机器周期,只有指令执行完后才响应中断。

③如果当前执行的是RETI或访问IE、IP的指令,则当前指令执行完毕后,CPU需再执行一条指令才可以中断响应,因此附加等待响应时间不会超过5个机器周期。

3.1.3 中断入口:单片机响应中断后,将转向特定的入口进行中断服务,单片机的中断入口地址如下表3.1.3-1表3.1.3-1单片机中断入口地址表从表中可以看出,两相邻中断源的入口地址间隔为8个单元。

这意味着如果要把中断源对应的中断服务程序从入口地址开始存放,则程序的长度不能超过8个字节,否则会影响到下一个中断源的入口地址的使用。

而通常情况下,中断服务程序的长度不止8个字节,因此,常见的处理方法是:在入口地址处存放一条无条件转移指令,通过这条转移指令转向对应的中断服务程序入口,中断服务程序以RETI为结束。

3.1.4 中断请求的撤销CPU响应中断请求,在中断返回(RETI)之前,该中断请求应被撤除,否则会引发另一次中断。

定时/计数器中断请求撤销:CPU在响应中断之后,由硬件自动清除中断请求标志TF。

外部中断请求撤销:如果采用脉冲触发方式,CPU在响应中断后,由硬件自动清除中断请求标志IE;对于电平触发方式的外部中断请求,中断标志的撤销是自动的,由于造成中断请求的低电平继续存在,所以在响应中断后再次会产生中断请求,为此响应中断后要撤销外部信号。

3.1.5 每秒钟的设定延时方法可以右两种,一种是利用MCS-51内部定时器溢出中断来确定1秒的时间,另一种是采用软延时的方法。

3.1.6 计数器初值计算定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL中的。

我们可以把计数器记满为零所需的计数值设定为C和计数初值设定为TC可得到如下计算公式:TC=M-C。

3.2 实验程序#include<reg51.h>#include<intrins.h>#define INT8U unsigned char#define INT16U unsigned intsbit red=P3^6;//定义红灯,即锁定状态sbit green=P3^7;//定义绿灯,即解锁状态sbit k1=P1^0;//定义数字键“1”sbit k2=P1^1; //定义数字键“2”sbit k3=P1^2; //定义数字键“3”sbit k4=P1^3; //定义数字键“4”sbit k5=P1^4; //定义数字键“5”sbit k6=P1^5; //定义数字键“6”sbit k7=P1^6; //定义数字键“7”sbit k8=P1^7; //定义数字键“8”sbit k9=P3^0; //定义数字键“9”sbit k0=P3^1; //定义数字键“0”sbit ka=P3^2;//定义“返回”键sbit kb=P3^3;//定义“确定”键sbit kc=P3^4;//定义“更改密码”键sbit kd=P3^5;//定义“锁定”键INT8U mod=1,i,error,j,change,state,right;//定义初始模式、位码、错误次数、取反次数、更改密码模式、按键状态、密码是否相等INT16U t=0,poi=1800,tt=0;//定义定时、倒计时数、时间累计INT8U code DSY_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};//定义段码INT8U array[]={0,0,0,0};//保存数位分解结果的数组INT8U nico_A[]={0,0,0,0};//密码A数组INT8U nico_B[]={0,0,0,0};//密码B数组void INT_TO_4Digit(INT16U n)//数位分解函数{array[0]=0;while(n>=1000){array[0]++;n-=1000;}array[1]=0;while(n>=100){array[1]++;n-=100;}array[2]=0;while(n>=10){array[2]++;n-=10;}array[3]=n;}void DSY_Show() interrupt 1//T0中断函数{TH0=-1000/256;//1ms定时TL0=-1000%256;if(k1==0||k2==0||k3==0||k4==0||k5==0||k6==0||k7==0||k8==0||k9==0||k0== 0) state=1;//若任意数字键按下,state=1if(k1!=0&&k2!=0&&k3!=0&&k4!=0&&k5!=0&&k6!=0&&k7!=0&&k8!=0&&k9!=0& &k0!=0&&state==1) state=2;//若无数字键按下,且按键状态为1时,按键状态更改为2if(ka==0&&state==0) state=3;//若“返回”键按下,且按键状态为0,按键状态更改为3if(ka!=0&&state==3) state=4;//若“返回键”没有按下,且按键状态为3,按键状态更改为4if(nico_A[0]!=nico_B[0]||nico_A[1]!=nico_B[1]||nico_A[2]!=nico_B[2]||nico_A[3] !=nico_B[3]) right=1;//若密码A数组任一位不等于密码B数组,即密码不相等if(nico_A[0]==nico_B[0]&&nico_A[1]==nico_B[1]&&nico_A[2]==nico_B[2]&&nico_ A[3]==nico_B[3]) right=2;//若密码A数组与密码B数组完全相等,即密码相等if(ka==0||kb==0||kc==0||kd==0) tt=0;//如果“返回”、“确定”、“更改密码”、“锁定”任意一键按下,时间累计清零switch(mod)//选择模式{case 1:if(change==0) {red=0;green=1;}//若不是在更改密码模式,红灯亮,绿灯灭if(change==1&&state==4) {change=0;mod=5;state=0;}//若在更改密码状态,且按键模式为4时,变为输入密码状态,且模式变为5,按键状态变为1P0=0xFF;//关闭段码if(k1==0) nico_B[0]=1;//若按下数字键“1”,密码B的第0位为1if(k2==0) nico_B[0]=2;if(k3==0) nico_B[0]=3;if(k4==0) nico_B[0]=4;if(k5==0) nico_B[0]=5;if(k6==0) nico_B[0]=6;if(k7==0) nico_B[0]=7;if(k8==0) nico_B[0]=8;if(k9==0) nico_B[0]=9;if(k0==0) nico_B[0]=0;if(t++==1000) {t=0;tt++;}//定时1秒,然后t清零,时间累计+1 if(tt==1800) {tt=0;error=0;}//半小时内无任何操作,错误次数清零if(state!=2) return;//如果按键状态不为2,返回tt=0;//时间累计清零state=0;//按键状态变为0mod=2;//模式变为2break;//退出本次循环case 2:if(change==1)//若为更改密码状态,会显示数字{P0=0xFF;//关闭段码P2=(1<<0);//输出位码P0=DSY_CODE[nico_B[0]];//输出段码}if(change==0)//若为输入密码状态,会显示一横{P0=0xFF;P2=(1<<0);P0=DSY_CODE[10];}if(state==4) {mod=1;state=0;}//若按键状态为4,模式变为1,且按键状态变为1if(k1==0) nico_B[1]=1;if(k2==0) nico_B[1]=2;if(k3==0) nico_B[1]=3;if(k4==0) nico_B[1]=4;if(k5==0) nico_B[1]=5;if(k6==0) nico_B[1]=6;if(k7==0) nico_B[1]=7;if(k8==0) nico_B[1]=8;if(k9==0) nico_B[1]=9;if(k0==0) nico_B[1]=0;if(t++==1000) {t=0;tt++;}if(tt==1800) {tt=0;error=0;}if(state!=2) return;tt=0;state=0;mod=3;break;case 3:if(change==1){P0=0xFF;P2=(1<<i);P0=DSY_CODE[nico_B[i]];}if(change==0){P0=0xFF;P2=(1<<i);P0=DSY_CODE[10];}i=(i+1)%2;//i的输出结果在0、1之间循环if(state==4) {mod=2;state=0;}if(k1==0) nico_B[2]=1;if(k2==0) nico_B[2]=2;if(k3==0) nico_B[2]=3;if(k4==0) nico_B[2]=4;if(k5==0) nico_B[2]=5;if(k6==0) nico_B[2]=6;if(k7==0) nico_B[2]=7;if(k8==0) nico_B[2]=8;if(k9==0) nico_B[2]=9;if(k0==0) nico_B[2]=0;if(t++==1000) {t=0;tt++;} if(tt==1800) {tt=0;error=0;} if(state!=2) return;tt=0;state=0;mod=4;break;case 4:if(change==1){P0=0xFF;P2=(1<<i);P0=DSY_CODE[nico_B[i]]; }if(change==0){P0=0xFF;P2=(1<<i);P0=DSY_CODE[10];}i=(i+1)%3;if(state==4) {mod=3;state=0;} if(k1==0) nico_B[3]=1;if(k2==0) nico_B[3]=2;if(k3==0) nico_B[3]=3;if(k4==0) nico_B[3]=4;if(k5==0) nico_B[3]=5;if(k6==0) nico_B[3]=6;if(k7==0) nico_B[3]=7;if(k8==0) nico_B[3]=8;if(k9==0) nico_B[3]=9;if(k0==0) nico_B[3]=0;if(t++==1000) {t=0;tt++;}if(tt==1800) {tt=0;error=0;} if(state!=2) return;tt=0;state=0;mod=5;break;case 5:if(change==1){P0=0xFF;P2=(1<<i);P0=DSY_CODE[nico_B[i]];}if(change==0){P0=0xFF;P2=(1<<i);P0=DSY_CODE[10];}i=(i+1)%4;if(ka==0||kb==0||kc==0||kd==0) t=0;//如果“返回”、“确定”、“更改密码”、“锁定”任意一键按下,定时清零if(change==1&&kb==0&&green==0){nico_A[0]=nico_B[0];nico_A[1]=nico_B[1];nico_A[2]=nico_B[2];nico_A[3]=nico_B[ 3];mod=8;}//若在更改密码状态且绿灯亮时按下确定,密码B会代入密码A,且模式变为8if(state==4&&red==0||state==4&&green==0&&change==1) {mod=4;state=0;}//若在按键状态为4且红灯亮时或者按键状态为4,绿灯亮且为更改密码状态时,模式变为4,按键状态变为1if(kb==0&&right==2&&red==0) {red=1;green=0;error=0;}//若在密码相同且红灯时按下“确定”,红灯灭,绿灯亮,错误次数清零if(kd==0&&green==0&&change==0) mod=1;//若在绿灯亮且在输入密码状态时按下“锁定”键,模式变为1if(kb==0&&right==1&&red==0) mod=6;//若在密码不相等且红灯时按下“确定”,模式变为6if(kc==0&&green==0&&change==0) {mod=1;change=1;}//若在绿灯且输入密码状态时按下“更改密码”,模式变为1,且变为更改密码状态if(kb==0&&error==2&&right==1&&red==0) {red=1;green=1;mod=7;}//若在错误次数为2,且密码不相等并且红灯亮时按下确定键,红灯绿灯均熄灭并且模式变为7if(t++==1000) {t=0;tt++;}if(tt==1800) {tt=0;error=0;}break;case 6:P0=0xFF;P2=(1<<i);P0=DSY_CODE[10];i=(i+1)%4;if(t++!=500) return;//定时500mst=0;red=~red;j++;//t归0,红灯取反,j=j+1if(j!=6) return;//如果没有取反6次,返回j=0;error++;//取反次数归0,累计1次错误次数mod=1;break;case 7:INT_TO_4Digit(poi);P0=0xFF;P2=(1<<i);P0=DSY_CODE[array[i]];i=(i+1)%4;if(t++!=1000)return;//定时1秒t=0;poi--;//每过1秒,倒计时数减1if(poi!=0)return;//如果倒计时数不等于0,就返回error=0;mod=1;poi=1800;//错误次数清零,模式变为1,倒计时数变为1800 break;case 8:P0=0xFF;P2=(1<<i);P0=DSY_CODE[10];i=(i+1)%4;if(t++!=500) return;t=0;green=~green;j++;if(j!=6) return;j=0;change=0;mod=5;break;}}void main(){TMOD=0X01;//T0工作于方式1IE=0x82;//使能T0中断TR0=1;//启动T0while(1);//主程序无限延时,定时器中断持续触发}第四章控制系统的运行与调试4.1 系统仿真4.1.1 元件位置摆放,如图4.1.1-1图4.1.1-1 元件摆放图4.1.2 各个元件的连线标号,如图4.1.2-1图4.1.2-1(1)连线标号图图4.1.2-1(2)连线标号图图4.1.2-1(3)连线标号图4.2 图文说明★★★初始密码为0000 ★★★开始时,红灯亮,绿灯灭,数码管无任何显示,电子锁为锁定状态当按下任意一个数字键时,数码管会显示一横表示已经输入了一个数字按下“返回”键时,可以返回上一步当按下四个数字键时,再按下“确定”,如果输入的密码错误,红灯会闪烁3次,并且累计1次错误次数然后返回初始状态如果输入密码错误次数在半小时内达到3次,红灯和绿灯均熄灭,并且数码管显示1800,每过一秒减少1倒计时结束后,电子锁将返回初始状态,并且将错误次数清零若输入的密码正确,红灯灭,绿灯亮,错误次数清零,电子锁进入解锁状态若在电子锁解锁状态时按下“锁定”键,电子锁将重新上锁,进入锁定状态若在解锁状态按下“更改密码”,电子锁将进入更改密码模式若在更改密码模式时按下“返回”,电子锁将返回开锁状态在更改模式输入数字键,数码管会显示数字输入“返回”,可以返回上一步在输入四个数字后再按“确定”,绿灯会闪烁3次,表示密码已经更改完成,然后返回开锁状态总结在本设计中,本人使用了涉及I/O控制,包括LED、数码管、按键等程序设计,使用了使用外部中断与定时计数器程序设计。

相关主题