电子密码锁实验报告

时间:2024.4.20

密码锁实验报告

一, 实验目的

1. 学习8051定时器时间计时处理、跑马灯、按键扫描及LED数码管显示的设计方法。

2. 设计任务及要求 利用实验平台上8个LED数码管,按键,跑马灯实现设置密码,密码锁的功能

二,实验要求

基本要求:

1:用4×4矩阵键盘组成0-9数字键及确认键和删除键。

2:可以自行设定或删除8位密码。

3:用5位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用绿色led发光二极管亮一秒钟做为提示,若密码不正确,禁止按键输入3秒,同时用红色led发光二极管亮三秒钟做为提示;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。

三,实验基本原理

利用单片机定时器完成计时功能,定时器0计时中断程序每隔0.05s中断一次并当作一个计数,设定定时1秒的中断计数初值为20。

为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要译码器,数据锁存器等较多硬件,可采用动态显示法实现LED显示,通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。

四,实验设计分析

针对要实现的功能,采用AT89S51单片机进行设计,AT89S51 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。这样,既能做到经济合理又能实现预期的功能。

在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。程序可分为闹钟的声音程序、时间显示程序、日期显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等。运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。

首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第二部分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。第三部分是软件部分:先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。第四部分是软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。第六部分是硬件实现部分:连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。最后进行功能扩展,在已经正确的设计基础上,添加额外的功能!

五,实验要求实现

A.电路设计

1. 整体设计

此次设计主要是应用单片机来设计电子密码锁,硬件部分主要分以下电路模块:显示电路用8个共阴数码管显示输入的密码,通过动态扫描进行显示,从而避免了译码器的使用,同时节约了I/0端口,使电路更加简单。跑马灯的红绿灯作指示灯,指示输入密码的正确与否。单片机采用AT89S52系列,这种单片机应用简单,适合电子密码锁设计。

电路的总体设计框架如下:

 

B.程序设计

B. 程序总体设计

本实验用汇编程序完成.

程序总的流程图如下:

                                         NO

        

   

YES

                                  

结合电路图,程序设计的整体思路为:

以下为在该工作方式下模式选择的按键方式,步骤如下:

1.各模块(CPU,数码管,跑马灯,键盘)接好线

2.第1到10个键代表0—9这十个数字

3.进行密码的设置。随意按下六个键(确保第一位密码不是0),并记住密码。然后按下第十二个键(重置密码键),即完成了密码的设置(此时数码管是不会亮的)

4.随意输入6个数,组成新“密码”,然后按下第10个键(确认键)。按下后,程序自动进行与原设密码进行对比。若密码正确,则绿灯亮1秒,然后熄灭。若密码不正确,则红灯亮3秒,且在这三秒内按下任何数字键无效,按下一个数字键后,会重新计时红灯再亮三秒,三秒后,才能重新输入密码

5.另外,第11个键是删除键,可进行数字的删除,重新输入

B.2.3主程序

主程序主要对按键进行扫描,以及判断定时和闹铃时间是否已到,若到则调用相关程序,该段程序如下:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

long int shu=1,shu1,aa=0,password;

uchar k=0,key=0,bz=0,dk=0,num2;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};

long int num,temp,num1;

void init();

void display();

void delay(uint z)                         //延时函数

{

     uint x,y;

     for(x=z;x>0;x--)

         for(y=110;y>0;y--);

}

void keyscan();                     

void main()

{

             init();

              while(1)

           {

            keyscan();

            display();

           }

}

void init()                                   //初始化函数

{

     num=17;

     P1=0xff;

     TMOD=0x01;

     TH0=(65536-50000)/256;

     TL0=(65536-50000)%256;

     EA=1;

     ET0=1;

     TR0=0;

}                                                     //键盘扫描函数

void keyscan()

{

              P3=0xfe;

              temp=P3;

              temp=temp&0xf0;

              while(temp!=0xf0)

                   {

                       delay(5);

                       temp=P3;

                       temp=temp&0xf0;

                       while(temp!=0xf0)

                       {

                            temp=P3;

                            k++;

                        bz++;

                       switch(temp)

                            {

                                 case 0xee:num=0;

                                     break;

                                 case 0xde:num=1;

                                     break;

                                 case 0xbe:num=2;

                                     break;

                                 case 0x7e:num=3;

                                     break;

                            }

                       while(temp!=0xf0)

                            {

                                 temp=P3;

                                 temp=temp&0xf0;

                            }

                       }

                   }

              P3=0xfd;

              temp=P3;

              temp=temp&0xf0;

              while(temp!=0xf0)

                   {

                       delay(5);

                       temp=P3;

                       temp=temp&0xf0;

                       while(temp!=0xf0)

                       {

                            temp=P3;

                            k++;

                            bz++;

                       switch(temp)

                            {

                                 case 0xed:num=4;

                                     break;

                                 case 0xdd:num=5;

                                     break;

                                 case 0xbd:num=6;

                                     break;

                                 case 0x7d:num=7;

                                     break;

                            }

                       while(temp!=0xf0)

                            {

                                 temp=P3;

                                 temp=temp&0xf0;

                            }

                       }

                   }

              P3=0xfb;

              temp=P3;

              temp=temp&0xf0;

              while(temp!=0xf0)

                   {

                       delay(5);

                       temp=P3;

                       temp=temp&0xf0;

                       while(temp!=0xf0)

                       {

                            temp=P3;

                       switch(temp)

                            {

                                 case 0xeb:num=8,k++,bz++;

                                     break;

                                 case 0xdb:num=9,k++,bz++;

                                     break;

                                 case 0xbb:num=10,num2=10;

                                     break;

                                 case 0x7b:num=11;

                                     break;

                            }

                       while(temp!=0xf0)

                            {

                                 temp=P3;

                                 temp=temp&0xf0;

                            }

                       }

                   }

              P3=0xf7;

              temp=P3;

              temp=temp&0xf0;

              while(temp!=0xf0)

                   {

                       delay(5);

                       temp=P3;

                       temp=temp&0xf0;

                       while(temp!=0xf0)

                       {

                            temp=P3;

                       switch(temp)

                            {

                                 case 0xe7:num=12;

                                     break;

                                 case 0xd7:num=13;

                                     break;

                                 case 0xb7:num=14;

                                     break;

                                 case 0x77:num=15;

                                     break;

                            }

                       while(temp!=0xf0)

                            {

                                 temp=P3;

                                 temp=temp&0xf0;

                            }

                       }

                   }

                   if(key==0)                  //每输入一个数,执行一次

                   {

                       if(shu==k)

                       {

                        dk=k;

                        shu++;

                        if(num<10)            //只可以输入0--9

                        num1=10*num1+num;     //num1即为输入的密码的数值(由于程序的问题,密码的第一位不可以为零)

                       }

                   }

                   if(num2==10)               //确认键(接下来进行密码的对比)

                   {

                        shu1=num1;            //将输入数字赋给shu1

                        if(shu1==password)    //输入密码正确,执行下面语句

                        {

                        TR0=1;               //开定时器                                  

                        if(aa<=20)           //绿灯亮一秒

                             P1=0x7f;        //具体是不是绿灯亮需根据自己的跑马灯调整       

                          else

                          P1=0xff;             //一秒后熄灭

                        }                

                        else                   //密码输入错误,则执行下面语句

                        {

                        TR0=1;                //开启定时器

                        if(aa<=60)

                           {

                             key=1;             //禁止输入

                             P1=0xfb;          //红灯亮

                             if(dk==k)           //再次禁止输入

                               {

                                aa=0;           //重新计时,红灯亮三秒

                                TH0=(65536-50000)/256;

                             TL0=(65536-50000)%256;

                                 dk=99;          //使dk不等于k跳出此if语句                   

                               }

                             }

                        else                 

                             P1=0xff;          //大于3秒后,灯全灭

                             key=0;              //可以重新输入密码                      

                        }                                  

                   }

                   if(num==11)                  //删除键

                   {

                        num=20;

                        bz--;

                        num1=num1/10;

                     num2=0;

                     key=0;              

                   }                   

                   if(num==13)                 //重设密码

                   {

                     password=num1;

                     num=20;

                     num1=0;

                     num2=0;

                  bz=0;

                   }

}   

void timer0() interrupt 1                       //定时器

{                 

     TH0=(65536-50000)/256;

     TL0=(65536-50000)%256;

     aa++;

}

void display()                                  //显示程序

{

    if(bz==0)                                  //没有输入时,数码管全熄灭

     {

    P0=0x00;

    P2=0xff;

    }

     if(bz==1)                                 //输入一位时,一个数码管亮

     {

     P0=0xff;

     P2=0xfe;

     delay(5);

     }

     if(bz==2)                                 //输入两位时,两个数码管亮

     {

     P0=0xff;

     P2=0xfe;

     delay(5);

    

     P0=0xff;

     P2=0xfd;

     delay(5);

     }

     if(bz==3)                                 //***********

     {

     P0=0xff;

     P2=0xfe;

     delay(5);

    

     P0=0xff;

     P2=0xfd;

     delay(5);

    

     P0=0xff;

     P2=0xfb;

     delay(5);

     }

     if(bz==4)                               //****************

     {

     P0=0xff;

     P2=0xfe;

     delay(5);

    

     P0=0xff;

     P2=0xfd;

     delay(5);

    

     P0=0xff;

     P2=0xfb;

     delay(5);

    

     P0=0xff;

     P2=0xf7;

     delay(5);

     }

     if(bz==5)

     {

     P0=0xff;

     P2=0xfe;

     delay(5);

    

     P0=0xff;

     P2=0xfd;

     delay(5);

    

     P0=0xff;

     P2=0xfb;

     delay(5);

    

     P0=0xff;

     P2=0xf7;

     delay(5);

    

     P0=0xff;

     P2=0xef;

     delay(5);

     }

   if(bz==6)

   {

     P0=0xff;

     P2=0xfe;

     delay(5);

    

     P0=0xff;

     P2=0xfd;

     delay(5);

    

     P0=0xff;

     P2=0xfb;

     delay(5);

    

     P0=0xff;

     P2=0xf7;

     delay(5);

    

     P0=0xff;

     P2=0xef;

     delay(5);

   

     P0=0xff;

     P2=0xdf;

     delay(5); 

   }

   if(bz==7)

   {

     P0=0xff;

     P2=0xfe;

     delay(5);

    

     P0=0xff;

     P2=0xfd;

     delay(5);

    

     P0=0xff;

     P2=0xfb;

     delay(5);

    

     P0=0xff;

     P2=0xf7;

     delay(5);

    

     P0=0xff;

     P2=0xef;

     delay(5);

   

     P0=0xff;

     P2=0xdf;

     delay(5);

     P0=0xff;

     P2=0xbf;

     delay(5);

    }

    if(bz==8)

   {

     P0=0xff;

     P2=0xfe;

     delay(5);

    

     P0=0xff;

     P2=0xfd;

     delay(5);

    

     P0=0xff;

     P2=0xfb;

     delay(5);

    

     P0=0xff;

     P2=0xf7;

     delay(5);

    

     P0=0xff;

     P2=0xef;

     delay(5);

   

     P0=0xff;

     P2=0xdf;

     delay(5);

     P0=0xff;

     P2=0xbf;

     delay(5);

     P0=0xff;

     P2=0x7f;

     delay(5);

}  

}             C. 程序调试及仿真

本程序通过Keil单片机开发平台实现程序的编译,链接,生成HEX文件。程序再编译过程中可以发现错位,并及时改正,在设计时非常重要,使错误被扼杀在摇篮中。

通过Keil和硬件仿真平台Proteus的联合,可以将设计效果仿真出来,根据效果,有目的的改变设计,优化程序。

c.1 利用Keil软件实验过程截图:

1,建一个工程,并设定与Proteus仿真相关的参数

2,c语言程序,并生成HEX文件

c.2利用Proteu画原理图:

五.实验总结及感想

学习单片机是我们小学期的任务,刚接到课题的时候有点迷茫,感觉单片机这种东西,很高深不是几天就能够学好的,信心不足。可是之后我们以小组为单位,以小组学习的方式一同学习,共同分享探讨学习单片机,发现单片机并没有想象的那么难。它是以keil为软件平台,以AT89S52单片机为硬件平台,经过编程控制单片机实现各种功能。

一分耕耘一分收获,我们搜索了大量的资料,网上的教学视频,图书馆的单片机的教程等等。对单片机渐渐有了柳暗花明又一村的效果,也收集了大量关于密码锁的资料。随着涉猎的点滴积累,我对电子密码锁的设计方案已经慢慢酝酿而成。有了方向和不少知识储备后,在接下来的几天,几乎每天都有突破,虽然有时只是一句程序的修改或诞生,但那种收获的感觉很暖人心。通过自主学习,从实践中真正学到了知识,也认识到了自己的学习能力的缺陷,对今后的学习积累了经验。同时,也对单片机功能的强大有了更深的理解,产生了浓厚的兴趣。每一次的进步,即使是小小的跑马灯按照自己的意愿亮了,受自己控制了,也让自己颇有成就感。因为,付出获得了收获是人生之快事。

当然在实践中也遇到了不少的问题,接下来总结一下,共同探讨:

1.按键问题

在密码锁的设计中,按密码的功能选择是通过按键开关实现的。实际在按按键时,有时按键反应太快,按一次,跳了几下,很是纠结。后来通过学习知道开关可以通过使用软件消抖和硬件消抖来避免这种情况发生。后来,我采取了软件消抖。硬件消抖并不适合,板子已经固定无法使用硬件消抖,所以,在编程时多了几行代码(延时函数等)成功解决了这个问题。在实际电路调试中,按键反应没有出现过于灵敏的问题,基本可控制。

2.密码设定问题

这也是该程序的一个缺陷,就是输入的第一个数字密码不能是0,否则会出错。因为在编程中把输入的密码看成是一个多数字(这是从计算器的实现移植过来的方法),比较容易实现。所以造成了这样的缺陷。要是把密码看成是一组数组,就可以成功解决这个问题,由于时间的原因,就没去实践了。

以上便是此次学习的一些心得。虽然在学习中遇到了不少问题,基本上都找到了相应的解决之道,也还存在未解决的问题。不过整个实验的过程就是一个解决问题的过程,每天都解决一些问题,我的实验也就解决了,当然结果不重要,功利化的追求结果,会使人浮躁,还是享受那份疑难迎刃而解的快感吧!

更多相关推荐:
电子密码锁设计报告

电子技术课程设计题目名称:电子密码锁重庆大学电气工程学院20XX年6月电子密码锁摘要:本文的电子密码锁是利用数字电子技术中基于JK触发器的锁存电路实现主电路的密码的修改和检测功能,再通过555定时器和一些基本的…

电子综合实验报告_电子密码锁_华电 附完整电路图

课程设计综合实验报告20xx20xx年度第1学期报告最后附有电路图下载地址名称电子技术综合实验题目院系电气与电子工程学院班级电气09级学号学生姓名指导教师樊冰设计周数1成绩日期20xx年1月8日课程课程设计综合...

电子密码锁实验报告(华北电力大学)1

课程设计综合实验报告20xx20xx年度第1学期名称电子技术综合实验题目院系电气与电子工程学院班级信息1002学号学生姓名指导教师李月乔设计周数1成绩日期20xx年12月26日课程课程设计综合实验报告一课程设计...

电子技术实验报告密码锁设计

中国石油大学胜利学院电子技术课程设计总结报告题目电子密码锁设计学生姓名徐连杰学号20xx07013137系别信息与计算科学系专业年级20xx级自动化专业1班指导教师王心刚20xx年6月23日一设计任务与要求1电...

南邮电子密码锁设计实验报告

电子密码锁设计实验报告摘要密码锁又称电子锁它的主要功能是1用数字方式输入开锁密码输入密码正确时开锁2如果密码有误或者输入时间过长则发出报警信号目录第一章系统结构与技术指标11系统功能结构12性能和电气指标13设...

数电实验报告 电子密码锁设计

实验报告实验十四电子密码锁设计与实现341实验目的与设计要求目的1学习4位数值比较器CC14585和74LS85的功能2掌握电子密码锁的工作原理及综合实验技能要求1电路可以由主持人预置16种不同的开锁密码并能够...

电子电路课程设计密码锁(满分实验报告)

1电子电路课程设计报告密码锁设计报告摘要本系统是由键盘和报警系统所组成的密码锁系统完成键盘输入开锁超时报警输入位数显示错误密码报警复位等数字密码锁的基本功能关键字数字密码锁GAL16V828C64解锁与报警12...

单片机课程设计报告--电子密码锁

电子密码锁一课题概述在日常生活和工作中住宅与部门的安全防范单位的文件档案财务报表以及一些个人资料的保存多以加锁的办法来解决若使用机械式钥匙开锁人们常需携带多把钥匙使用极不方便且钥匙丢失后安在日常生活和工作中住宅...

毕业论文实践报告----智能电子密码锁设计

毕业设计论文报告题目智能电子密码锁设计院别专业班级姓名学号xxxxxxx指导教师xxx20xx年4月无锡科技职业学院毕业论文中文摘要在日常的生活和工作中住宅与部门的安全防范单位的文件档案财务报表以及一些个人资料...

华电数电实验报告(电子密码锁)

课程设计综合实验报告20xx20xx年度第1学期名称电子技术综合实验题目院系核科学与工程学院班级核电1004班学号学生姓名指导教师设计周数1成绩日期20xx年1月18日电子密码锁电子技术综合实验任务书一目的与要...

改装密码锁实验报告

北京邮电大学电路综合实验报告实验题目带音乐的密码锁学生姓名班级小班学号同组姓名EMAIL目录一先前准备流水灯数码管二设计目的用途功能三硬件设计四软件设计五实验器材六实验结果及截图七分工情况八实验总结和心得体会九...

密码锁的设计与测试_实验报告

数电实验实验报告20xx级通信工程专业3班姓名汪冰滢学号1362310308日期20xx年4月2日

电子密码锁实验报告(19篇)