找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8341|回复: 6
打印 上一主题 下一主题
收起左侧

基于单片机和C语言的电子密码锁课程设计论文下载

[复制链接]
跳转到指定楼层
楼主
摘 要

电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。

本文以STC89C52单片机为核心器件,结合按键电路、LED数码管显示电路、报警指示电路和开锁机构,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的基本功能,其主要具有如下功能:

●密码通过键盘输入,若密码正确,则将锁打开

●密码输入错误,蜂鸣器将报警提示

●用户可以自由设定密码

本密码锁具有设计方法合理,简单易行成本低,安全实用等特点,具有一定的推广价值。


1 绪 论
随着人们生活水平的提高, 日常生活和工作中的住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存等一系列安全防盗问题变的尤其突出。传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,且人们常需携带多把钥匙, 使用极不方便, 一旦钥匙丢失安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁因具有安全性高、成本低、功耗低、易操作等优点,受到了广大用户的青睐。
现今常见的密码锁设计主要有两种方案,一种是中规模集成电路控制的方案,另一种是单片机控制的方案。对于采用集成电路控制的方案,其中的编码电子锁电路分为编码电路、控制电路、复位电路、解码电路、防盗报警电路、门铃电路,而电子锁主要由输入元件、电路(包括电源)以及锁体三部分组成。显然此种方案的物理实现结构较为复杂且重新设置密码、输入密码的操作过程也会给用户带来一定的不方便;而利用单片机控制的方案,由于单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加掉电存储、声光提示甚至添加遥控控制功能,但其也有一定的局限性,就在于其控制原理的复杂以及要求设计人员具有更加良好的程序设计能力,调试较为繁琐,否则程序一旦跑飞将造成意想不到的损失。通过对这两种方案的优缺点比较,再考虑到本人自己对单片机设计具有一定的基础,所以此次选择利用单片机来进行密码锁的设计。
本文以STC89C52单片机为核心器件,结合按键电路、LED数码管显示电路、报警指示电路和开锁机构,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的基本功能。系统能实现如下的功能:
(1)密码通过键盘输入,若密码正确,则将锁打开
(2)密码输入错误,蜂鸣器将报警提示
(3)用户可以自由设定密码
系统功能实用,成本低廉,具有一定的实用价值。

2 系统的总体设计和主要元器件介绍
2.1设计要求
  •        以STC89C52单片机为核心器件,结合按键电路、LED数码管显示电路、报警指示电路和开锁机构,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的以下基本功能:
  •        1)输入密码时不显示所输入的数字,有一定的防偷窥特点
  •        2)密码通过键盘输入,若密码正确,则显示灯发光,将锁打开
  •        3)密码输入错误,蜂鸣器将报警提示
  •        4)用户可以自由设定密码
  •        本密码锁具有设计方法合理,简单易行成本低,安全实用等特点,具有一定的推广价值。


2.2系统的总体思路设计

以STC89C52单片机为主控制单元,键盘为主要输入单元,结合开锁装置、报警器和显示器完成整个系统设计。

系统的运行过程大致如下:
假设初始状态为闭锁,此时整个系统只等待按键输入,数码管也不显示。每按下一个数据键(即每输入一个密码),数码管相应的显示一个“-”标志,当密码全部输入完成后,需按下确认键“#”,此时系统判断密码是否正确,正确则开锁(仿真中以继电器动作导致发光二级管点亮为标志),错误则报警,此后数码管熄灭继续等待按键;若按下密码重置键“*”,则需先输入原密码,正确后请输入新密码,输入密码过程中,数码管显示如上“-”。

2.3主要元器件介绍
2.3.1 STC89C52介绍


           STC89C52引脚图
本次毕业设计选用的是STC89C52,STC89C52是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的STC89C52是一种高效微控制器。STC89C52单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
AT89C51主要特性:
  • 与MCS-51 兼容
  • 4K字节可编程FLASH存储器
  • 寿命:1000写/擦循环
4. 数据保留时间:10年
5. 全静态工作:0Hz-24MHz
6. 三级程序存储器锁定
7. 128×8位内部RAM
8.32可编程I/O线
9. 两个16位定时器/计数器
10.5个中断源
11.可编程串行通道
12. 低功耗的闲置和掉电模式
13. 片内振荡器和时钟电路

STC89C52单片机引脚:
VCC:供电电压。
  GND:接地。
  P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
  P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。
  P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
  P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
  P3口也可作为STC89C52的一些特殊功能口,如下表所示:
  口管脚 备选功能
  P3.0 RXD(串行输入口)
  P3.1 TXD(串行输出口)
  P3.2 /INT0(外部中断0)
  P3.3 /INT1(外部中断1)
  P3.4 T0(记时器0外部输入)
  P3.5 T1(记时器1外部输入)
  P3.6 /WR(外部数据存储器写选通)
  P3.7 /RD(外部数据存储器读选通)
  P3口同时为闪烁编程和编程校验接收一些控制信号。
  RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
  ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
  /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
  /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
  XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
  XTAL2:来自反向振荡器的输出。

振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
2.3.2 继电器介绍
继电器是一种电控制器件。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。
当输入量(如电压、电流、温度等)达到规定值时,继电器被所控制的输出电路导通或断开。输入量可分为电气量(如电流、电压、频率、功率等)及非电气量(如温度、压力、速度等)两大类。继电器具有动作快、工作稳定、使用寿命长、体积小等优点。广泛应用于电力保护、自动化、运动、遥控、测量和通信等装置中。
电磁继电器工作原理和特性:
图2.5 继电器原理图
电磁继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。这样吸合、释放,从而达到了在电路中的导通、切断的目的。对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。继电器一般有两股电路,为低压控制电路和高压工作电路。
2.3.3 LED数码管介绍
图2.6 数码管
LED数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。当数码管特定的段加上电压后,这些特定段就会发亮,以形成我们眼睛看到的样子。以“2”为例,应当是a亮b亮g亮e亮d亮f不亮c不亮dp不亮。LED数码管有一般亮和超亮等不同之分,也有0.5寸、1寸等不同的尺寸。小尺寸数码管的显示笔画常用一个发光二极管组成,而大尺寸的数码管由二个或多个发光二极管组成,一般情况下,单个发光二极管的管压降为1.8V左右,电流不超过30mA。发光二极管的阳极连接到一起连接到电源正极的称为共阳数码管,发光二极管的阴极连接到一起连接到电源负极的称为共阴数码管。常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
在本次实验中我们用的是四位一体的数码管,图如下:


3、硬件设计
3.1 单片机主控制模块(含晶振、复位基本工作电路)
图3.1 主控制模块







    • 键盘输入模块
图2.7 矩阵键盘
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成3*4=12个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。

按键功能介绍:
第一行自左至右依次是1,2,3键, 第二行自左至右依次是4,5,6键, 第三行自左至右依次是7,8,9键, 第四行自左至右依次是*,0,#键

表3.1 按键功能

按 键
键 名
功 能 说 明
0-9键
数 字 键
输 入 密 码
* 键
重 设 密 码 键
设 定 新 密 码
# 键
确认键
确认密码输入完毕



3.3 显示模块
                                 图3.3 显示模块

此设计中,使用了四个共阴极数码管,使用动态显示技术控制数码管。其4个位选信号与P2.0-P2.3相连,当其中某位为低电平时表示选中该位;8段段选信号与P0口相连,当其中某段为高电平时导通该段,特殊的,由于STC89C52的P0口的驱动能力较弱,不足以驱动数码管点亮,故在此又引入上拉电阻以驱动数码管。
关于上拉电阻有如下介绍:
  • 当TTL电路驱动CMOS电路时,如果电路输出的高电平低于CMOS电路的最低高电平(一般为3.5V), 这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。
    2、OC门电路必须加上拉电阻,以提高输出的高电平值。  
3、为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。  
4、在CMOS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降低输入阻抗, 提供泄荷通路。  
5、芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限增强抗干扰能力。
6、提高总线的抗电磁干扰能力。管脚悬空就比较容易接受外界的电磁干扰 。
7、长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。  

3.4 报警和开锁模块

图3.4 报警和开锁模块

报警模块由蜂鸣器、PNP三极管和单片机组成。选择一只压电式蜂鸣器,压电式蜂鸣器工作时约需要100mA驱动电流。特殊的,此处为加强驱动能力,选用三极管来放大电流驱动蜂鸣器。当STC89C52的P3.0口输出为低电平时,三极管导通,蜂鸣器产生蜂鸣音,STC89C52输出为高电平时,蜂鸣器不发声。
此处以继电器的动作来模拟锁的开闭。同样,为了增强驱动能力添加了PNP三极管以放大电流,当P3.1口为低电平时,三极管导通,此时继电器动作(锁开),灯亮;二极管具有续流作用以保护器件安全




4、软件设计

4.1系统框图

4.2 系统程序设计流程图

                                    图3.6 总程序流程图



4.2 系统程序设计
重要端口定义说明:
sbit buzzer=P3^0;
sbit relay=P3^1;
uchar code table[2]={0x40,0x00 }; //共阴极数码管编码 显示‘-’和 熄灭
uchar keyword[4]={1,1,1,1};
uchar keycmp[4];
uchar key=0,num=0,flg=0;

报警子程序:(通过控制buzzer端口的高低电平来控制三极管的通断,从而控制蜂鸣器)
void alarm()
     {              num=0;
                  buzzer=0;
                            delay(100);
                            buzzer=1;
              }


数码管显示子程序:
LED显示器工作方式有两种:静态显示方式和动态显示方式。静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高;动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些。
本设计使用动态显示方法。
void display()
     { uchar i,j,cs=0x7f;

                 for(i=num;i>0;i--)            
                   {
                    P0=table[0];
                    cs=_crol_(cs,1);
                    P2=cs;
                    delay(10);
                              }
                            for(j=4-num;j>0;j--)
                              {
                               P0=table[1];
                     cs=_crol_(cs,1);
                     P2=cs;
                     delay(10);
                              }
              }

按下确认键后执行功能子程序:(使用标志变量flg,根据其值来选择执行相应的功能)
  1. void ok()
  2.      {              uchar i=0;
  3.                  display(); // P0=(flg+1);delay(1000);
  4.                  if(flg==0)
  5.                     {
  6.                                              for(i=0;i<4;i++)
  7.                                               if(keyword[i]!=keycmp[i]) {alarm();break;}
  8.                                           if(num==4) {relay=0;num=0;}
  9.                               }
  10.                  if(flg==2)
  11.                     {
  12.                                num=0;
  13.                                for(i=0;i<4;i++) keyword[i]=keycmp[i];
  14.                                flg=0;
  15.                               }
  16.                  if(flg==1)
  17.                     {
  18.                               
  19.                                 for(i=0;i<4;i++)
  20.                                               if(keyword[i]!=keycmp[i]) {alarm();break;}
  21.                                           if(num==4)
  22.                                               {
  23.                                                           num=0;
  24.                                                           display(); // P0=0x07;delay(1000);
  25.                                                           flg=2;
  26.                                                         }
  27.                                             
  28.                               }
  29.                
  30.               }
复制代码


键盘扫描子程序:(运用矩阵键盘逐行逐列扫描法,一次检测各个按键)
键盘是单片机常用输入设备,在按键数量较多时,为了节省I/O口等单片机资源,一般采取扫描的方式来识别到底是哪一个键被按下。即通过确定被按下的键处在哪一行哪一列来确定该键的位置,获取键值以启动相应的功能程序。
查找哪个按键被按下的方法为:一个一个地查找。 先第一行输出0,检查列线是否非全高;否则第二行输出0,检查列线是否非全高;否则第三行输出0,检查列线是否非全高;如果某行输出0时,查到列线非全高,则该行有按键按下;根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。
  1. void keyscan()
  2.      {
  3.                  uchar temp1,temp2;
  4.                  P1=0xfe;//令第一列为低电平,检测第1列
  5.                  temp1=P1;
  6.                  if(temp1!=0xfe)
  7.                     {
  8.                                 delay(5);              //去抖
  9.                                              temp2=P1;
  10.                                           if(temp1==temp2)
  11.                                              {
  12.                                               switch(temp2)
  13.                                                               {
  14.                                                                       case 0xf6: if(num<4){key=1;keycmp[num]=key;num++;display();}
  15.                                                                                                                    else alarm();
  16.                                                                                                break;
  17.                                                                       case 0xee: if(num<4){key=4;keycmp[num]=key;num++;display();}
  18.                                                                                                                    else alarm();
  19.                                                                                                break;
  20.                                                                       case 0xde: if(num<4){key=7;keycmp[num]=key;num++;display();}
  21.                                                                                                                    else alarm();
  22.                                                                                                break;
  23.                                                                       case 0xbe: set();break;
  24.                                                                         }
  25.                                              }
  26.                               }
  27.                             while(temp1!=0xfe)              temp1=P1;//等待按键释放

  28.                  P1=0xfd;//检测第2列
  29.                  temp1=P1;
  30.                  if(temp1!=0xfd)
  31.                     {
  32.                                 delay(5);              //去抖
  33.                                              temp2=P1;
  34.                                           if(temp1==temp2)
  35.                                              {
  36.                                               switch(temp2)
  37.                                                               {
  38.                                                                       case 0xf5: if(num<4){key=2;keycmp[num]=key;num++;display();}
  39.                                                                                                else alarm();
  40.                                                                                                                    break;
  41.                                                                       case 0xed: if(num<4){key=5;keycmp[num]=key;num++;display();}
  42.                                                                                                else alarm();
  43.                                                                                                                    break;
  44.                                                                       case 0xdd: if(num<4){key=8;keycmp[num]=key;num++;display();}
  45.                                                                                                                    else alarm();
  46.                                                                                                break;
  47.                                                                       case 0xbd: if(num<4){key=0;keycmp[num]=key;num++;display();}
  48.                                                                                                                    else alarm();
  49.                                                                                                break;
  50.                                                                         }
  51.                                              }
  52.                               }
  53.                             while(temp1!=0xfd)              temp1=P1;//等待按键释放

  54.                             P1=0xfb;//检测第3列
  55.                  temp1=P1;
  56.                  if(temp1!=0xfb)
  57.                     {
  58.                                 delay(5);              //去抖
  59.                                              temp2=P1;
  60.                                           if(temp1==temp2)
  61.                                              {
  62.                                               switch(temp2)
  63.                                                               {
  64.                                                                       case 0xf3: if(num<4){key=3;keycmp[num]=key;num++;display();}
  65.                                                                                                                    else alarm();
  66.                                                                                                break;
  67.                                                                       case 0xeb: if(num<4){key=6;keycmp[num]=key;num++;display();}
  68.                                                                                                                    else alarm();
  69.                                                                                                break;
  70.                                                                       case 0xdb: if(num<4){key=9;keycmp[num]=key;num++;display();}
  71.                                                                                                                    else alarm();
  72.                                                                                                break;
  73.                                                                       case 0xbb: if(num==4) ok();
  74.                                                                                                else alarm();
  75.                                                                                                                    break;
  76.                                                                         }
  77.                                              }
  78.                               }
  79.                             while(temp1!=0xfb)              temp1=P1;//等待按键释放

  80.                  display();
  81.               }
复制代码


中断服务函数:(当通过机械手段关锁时,将通过外部中断的形式使程序初始化恢复原状态)
void Int0() interrupt 0
    {
                relay=1;
              }
整个系统的完整程序设计详见附录。




5、系统仿真设计

5.1 Proteus 软件介绍

Proteus软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。
在PROTEUS绘制好原理图后,调入已编译好的目标代码文件:*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。
  PROTEUS 是单片机课堂教学的先进助手。
  PROTEUS不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。
  它的元器件、连接线路等却和传统的单片机实验硬件高度对应。这在相当程度上替代了传统的单片机实验教学的功能,例:元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。
  课程设计、毕业设计是学生走向就业的重要实践环节。由于PROTEUS提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养学生实践精神、创造精神的平台
  随着科技的发展,“计算机仿真技术”已成为许多设计部门重要的前期设计手段。它具有设计灵活,结果、过程的统一的特点。可使设计时间大为缩短、耗资大为减少,也可降低工程制造的风险。相信在单片机开发应用中PROTEUS也能茯得愈来愈广泛的应用。
使用Proteus 软件进行单片机系统仿真设计,是虚拟仿真技术和计算机多媒体技术相结合的综合运用,有利于培养学生的电路设计能力及仿真软件的操作能力;在单片机课程设计和全国大学生电子设计竞赛中,我们使用 Proteus 开发环境对学生进行培训,在不需要硬件投入的条件下,学生普遍反映,对单片机的学习比单纯学习书本知识更容易接受,更容易提高。实践证明,在使用 Proteus 进行系统仿真开发成功之后再进行实际制作,能极大提高单片机系统设计效率。因此,Proteus 有较高的推广利用价值。

5.2 Proteus 仿真图

图5.1系统仿真图

实物照

布线图





总结

使用单片机制作的电子密码锁具有软硬件设计简单,易于开发,成本较低,安全可靠,操作方便等特点。本实训在设计之初认真分析了几种方案的优缺点,正是由于单片机的众多优良特性的吸引,最终从经济实用的角度出发,采用单片机STC89C52作为主控芯片,结合外围的键盘输入、显示、报警、开锁等电路,用C语言编写主控芯片的控制程序,设计了一款可以多次更改密码具有报警功能的电子密码锁。


参考文献:
[1]  于殿泓,王新年.单片机原理与程序设计实验教程[M].西安:西安电子科技大学出版社,2007,8.
[2]  赵文博,刘文涛.单片机语言C51程序设计[M].北京:人民邮电出版社,2005,10.
[3]  李爱秋.红外线遥控12位电子密码锁的设计[J]. 温州职业技术学院学报第8卷第一期,2008.
[4]  陈杰,黄鸿.传感器与检测技术[M].北京:高等教育出版社,2010,8.
[5]  周航慈. 单片机应用程序设计技术[M]. 北京:北京航空航天大学出版社,2011,2.
[6]  李朝青. 单片机原理及接口技术[M]. 北京:北京航空航天大学出版社, 2005,10.
[7]  孙育才. MCS-51系列单片微型计算机及其应用[M]. 东南大学出版社, 2004,6.
[8]  沈红卫. 单片机应用系统设计实力与分析[M]. 北京:北京航空航天大学出版社,2003.
[9]  徐爱钧, 彭秀华. 单片机高级语言C51应用程序设计[M].北京航空航天大学出版社,2006.
[10]  曾一江. 单片微机原理与接口技术[M]. 北京:科技出版社,2009,12.
[11]  康华光. 电子技术基础(模拟部分)[M]. 北京:高等教育出版社, 2004,4.



实训感想

紧张又繁忙的两周实训终于即将要结束了。在这两周的学习中,让我收获很多,也让我知道自己所学的专业必须要求自己一丝不苟,特别认真耐心完成每一条线路的连接,如果稍有大意就会使做出来的成品无法正常显示,导致功亏一篑。

在这两周期间,我们这组做的是电子密码锁。两周,需要学的东西很多,而且有些东西,比如我们新学的三项软件,并不是在短时间就能掌握的,必需靠长时间的练习去把握,理解。所以任务对我们来说显得很重。但不知道为什么,学校只给我们排了两周的电工实习,而且还是这学期最后两周,实训结束马上就要考试,所以我们不得不一边做实训项目电子密码锁,一边为这学期的考试做准备。对于这样的安排我们全校的学生应该都只有两个字来形容我们此刻的心情——无语!希望学校能够尽快重视起实训时间的安排。所以两周下来,基本上就没有休息时间,只有一个 感觉,时间紧,任务重。

要完成这项工艺品,前面已经提过要用到我们新学的三项软件,我们需要先设计出电路图,用Proteus把电路图画出来,仿真电路,看电路是否能正常运行,如果不能正常运行就必须修改到正常运行为止,然后就要用到第二个软件——Keil,我们要在上面编写出我们所用的单片机C程序,之后生成HEX文件,最后就是要用到的最后一个软件,Altium Designer ,我们要用它制作PCB,这个PCB真的好难,不仅需要对这个软件足够了解,还要知道电路元器件的实际尺寸,因为我们需要对元器件做封装,为了保证元器件能插到电路板上,必须对元器件的实际尺寸有清楚的了解,这样封装才能做到位,才能保证实验的成功。然而,让我们更心酸的是在我们终于完成电路的pcb之后,自我感觉还是不错的时候,老师给我们狠狠泼了一盆凉水,接着就是我们三个埋头修改的身影,不幸的是接着我们又被吵了好多次,在此期间,我感触颇多,同时也让我学会了很多知识,尽管被老师吵了好多次,但是正是老师的批评指责,才让我们的pcb更加完美,在此,我要对每一位为我们是实训付出辛苦的老师说一声“谢谢您”。你们的无私奉献真的让我们很感动,真不愧是知识的传播者。

另外,在实训中我深切的体会到了团队的力量和与人沟通的重要性。从这次的实训中,我懂得了一个组要想成为一个优秀的组,最重要的是要团结,还有就是组员之间的信任以及沟通都是很必要的;这个组中的成员还要有一个共同的目标,有了共同的目标我们才能有目的的去完成作品。这次实训我体会最深的还有一个“累”字,它不仅仅是身体的疲惫,劳动的汗水;更多的是一种“苦尽甘来”的滋味,我会为我曾经“累”过而感到骄傲和满足。正是这种“累”让我发现了自身的不足,让我学会了更多的专业技能;也正是这种“累”让我懂得了责任和团队的意义。实训虽然结束了,但我们现在的学习并未结束,我们应该珍惜在学校的每一天,多学习,把自身的弱势和不足变成优势与特长,扫清我们就业道路上的绊脚石,为自己拥有一个美好的未来而加倍努力!

总而言之,这两周的实训让我整个人都变得很充实,让我增长了很多知识。更让坚定了我对本专业的信心,我相信自己会走好人生路上的每一步,跟希望像这样实训的活动能更多一些。

最后,再次希望学校能合理安排实训时间,毕竟实训是一次很重要的机会,对我们动手以及其它方面能力的提高都有极大的好处,谁都不想匆匆而过,谁都愿意认真对待。     

****

                                                 **************




附录2:   元器件清单
电子密码锁器件清单
单片机AT89C51             1片
30pf电容                   2个
10uf电解电容               1个
12MHZ晶振                                       1个
1k电阻                     5个
10k电阻                    1个
PNP三极管                  2个
按键                       12个
5v的5管脚继电器           1个
发光二极管                  1个
普通二极管                  1个
10k的8管脚排阻             1个
微型喇叭                    1个
4位一体共阳数码管           1个
管座(4位一体数码管用)     1个
管座(51单片机用)          1个


附录1:      
总程序:
  1. #include

  2. #include

  3. #define uint unsigned int

  4. #define uchar unsigned char

  5. sbit buzzer=P3^0;

  6. sbit relay=P3^1;

  7. uchar code table[2]={0x40,0x00 }; //共阴极数码管编码 显示'-'和 熄灭

  8. uchar keyword[4]={1,1,1,1};

  9. uchar keycmp[4];

  10. uchar key=0,num=0,flg=0;

  11. //==============================延迟程序 延时x毫秒

  12. void delay(uint x)

  13.      {

  14.                  uint i,j;

  15.                  for(i=x;i>0;i--)

  16.                      for(j=110;j>0;j--);

  17.                 }

  18. //==============================报警程序

  19. void alarm()

  20.      {              int i;            

  21.                             num=0;

  22.                             for(i=0;i<3;i++)

  23.                                           {            

  24.                                 buzzer=0;

  25.                                           delay(120);

  26.                                           buzzer=1;

  27.                                           delay(120);

  28.                                           }

  29.               }

  30. //==============================数码管显示程序

  31. void display()

  32.      { uchar i,j,cs=0x7f;

  33.                  for(i=num;i>0;i--)            

  34.                    {

  35.                     P0=table[0];

  36.                     cs=_crol_(cs,1);

  37.                     P2=cs;

  38.                     delay(10);

  39.                               }

  40.                             for(j=4-num;j>0;j--)

  41.                               {

  42.                                P0=table[1];

  43.                      cs=_crol_(cs,1);

  44.                      P2=cs;

  45.                      delay(10);

  46.                               }

  47.               }

  48. //==============================密码重置程序

  49. void set()

  50.       {

  51.                   num=0;

  52.                             display();

  53.                             flg=1;

  54.                 }

  55. //==============================确认键程序

  56. void ok()

  57.      {              uchar i=0;

  58.                  display(); // P0=(flg+1);delay(1000);

  59.                  if(flg==0)

  60.                     {

  61.                                              for(i=0;i<4;i++)

  62.                                               if(keyword[i]!=keycmp[i]) {alarm();}

  63.                                           if(num==4) {relay=0;num=0;}

  64.                               }

  65.                  if(flg==2)

  66.                     {

  67.                                num=0;

  68.                                for(i=0;i<4;i++) keyword[i]=keycmp[i];

  69.                                flg=0;

  70.                               }

  71.                  if(flg==1)

  72.                     {

  73.                               

  74.                                 for(i=0;i<4;i++)

  75.                                               if(keyword[i]!=keycmp[i]) {alarm();break;}

  76.                                           if(num==4)

  77.                                               {

  78.                                                           num=0;

  79.                                                           display(); // P0=0x07;delay(1000);

  80.                                                           flg=2;

  81.                                                         }

  82.                                             

  83.                               }

  84.                

  85.               }

  86. //==============================键盘扫描程序

  87. void keyscan()

  88.      {

  89.                  uchar temp1,temp2;

  90.                  P1=0xfe;//令第一列为低电平,检测第1列



  91. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整论文下载(word格式 可编辑):
基于单片机和C语言的电子密码锁.doc (3.84 MB, 下载次数: 83)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:211258 发表于 2017-6-14 22:26 | 只看该作者
非常好
回复

使用道具 举报

板凳
ID:211258 发表于 2017-6-15 17:12 | 只看该作者
谢谢分享!收藏了!
回复

使用道具 举报

地板
ID:212728 发表于 2017-12-17 16:00 | 只看该作者
下载查看了,程序没问题,问就是初始密码还要自己设定吗?
回复

使用道具 举报

5#
ID:212728 发表于 2017-12-17 16:04 | 只看该作者
论文里有很多错的,比如共阳数码管,应该是共阴
回复

使用道具 举报

6#
ID:212728 发表于 2017-12-17 17:28 | 只看该作者
无法使用,程序有编写错误,谨慎下载
回复

使用道具 举报

7#
ID:634141 发表于 2019-11-24 20:33 | 只看该作者
不错,谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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