基于单片机的简易密码锁.docx

上传人:b****6 文档编号:5922421 上传时间:2023-01-02 格式:DOCX 页数:14 大小:172.42KB
下载 相关 举报
基于单片机的简易密码锁.docx_第1页
第1页 / 共14页
基于单片机的简易密码锁.docx_第2页
第2页 / 共14页
基于单片机的简易密码锁.docx_第3页
第3页 / 共14页
基于单片机的简易密码锁.docx_第4页
第4页 / 共14页
基于单片机的简易密码锁.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

基于单片机的简易密码锁.docx

《基于单片机的简易密码锁.docx》由会员分享,可在线阅读,更多相关《基于单片机的简易密码锁.docx(14页珍藏版)》请在冰豆网上搜索。

基于单片机的简易密码锁.docx

基于单片机的简易密码锁

基于单片机的简易密码锁

1、实验目的

1、熟悉程序的编译、下载方法和过程;

2、熟悉利用max7219驱动数码管显示;

3、熟悉AT89S51单片机的相关操作;

4、熟悉案件的基本功能;

2、实验内容

1、使用液晶显示模块LCD1602;

2、使用max7219驱动数码管显示;

3、使用简易密码锁及按键模块;

3、实验步骤

1、设计硬件电路,焊制电路板,连接相关电路;

2、观察给定程序所实现的功能;

3、按照设定的功能修改程序编译程序,下载并调试程序;

4、实验程序

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitBEEP=P3^4;//蜂鸣器

sbitACT=P3^0;//开锁器

sbitSET=P3^3;//设置密码指示灯

sbitINPUT=P3^1;//输入密码指示灯

sbitFLAG=P3^2;//密码错误指示灯

sbitwei1=P3^5;

sbitwei2=P3^6;

bitok_flag;

ucharpasswdnum;//密码位数

ucharpasswd[10];//密码

//constuchartab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};//数码管显示0~8

//constuchartab[]={0x20,0x76,0x11,0x14,0x46,0x84,0x80,0x36,0x00,0x04,~0x02,~0xc0,0xa1,~0x50,0x79,0x71};//段码控制

//constuchardispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//位选控制查表的方法控制

constuchartab[]={0xd7,0x84,0xe3,0xe6,0xb4,0x76,0x77,0xc4,0xf7,0xf6,0xf5,0x37,0x53,0xa7};//0~D段码控制

ucharinput;//密码输入次数

ucharchaopasswd[]={0,10,11,12,13,10,11,12,13,0,0};//超级密码

uintchaonum,time;

uintnum,su_flag;

voidbeep();

voidpasswd_set();

voidpasswd_in();

voidDELAY(uintnum);

/*********************************************************/

main()

{

P2=0xff;//送数码管显示

P0=0xff;

P1=0xff;//读取按键

input=1;

ok_flag=1;

passwdnum=1;

chaonum=1;

time=0;

ACT=1;

SET=0;

su_flag=0;

FLAG=1;

BEEP=0;

wei1=0;

wei2=1;

while(passwdnum<=8)

{

passwd_set();//等待设置密码

DELAY(500);

passwdnum++;

P0=0xff;

P1=0xff;

}

P0=0xff;

P1=0xff;

TMOD=0x01;

TH0=(65536-45872)/256;

TL0=(65536-45872)%256;

EA=1;

ET0=1;

TR0=1;

while(time!

=2)//2秒响铃

{

P2=tab[time+1];

beep();

}

time=0;

ET0=0;

TR0=0;

BEEP=0;

SET=1;

passwdnum=1;

while

(1)

{

while(input<=3)

{

INPUT=0;//输入指示灯亮

FLAG=1;

while(passwdnum<=8)

{

passwd_in();//等待输入密码

DELAY(500);

P0=0xff;

P1=0xff;

passwdnum++;

}

if(chaonum==9)

{

chaonum=1;

FLAG=1;

INPUT=1;//输入指示灯灭

//密码正确响铃1秒

TMOD=0x01;

TH0=(65536-45872)/256;

TL0=(65536-45872)%256;

EA=1;

ET0=1;

TR0=1;

while(time!

=1)

{

P2=tab[time+1];

beep();

}

time=0;

ET0=0;

TR0=0;

BEEP=0;

DELAY(500);

ACT=0;

//5秒

TMOD=0x01;

TH0=(65536-45872)/256;

TL0=(65536-45872)%256;

EA=1;

ET0=1;

TR0=1;

while(time!

=5)

{

P2=tab[time+1];

}

time=0;

ET0=0;

TR0=0;

BEEP=0;

ACT=1;

input=1;

passwdnum=1;

P0=0xff;

P1=0xff;

while(passwdnum<=8)

{

passwd_set();//等待设置密码

DELAY(500);

passwdnum++;

P0=0xff;

P1=0xff;

}

passwdnum=1;

ok_flag=1;

chaonum=1;

continue;

}

chaonum=1;

if(ok_flag==1&&input<=3)//密码正确

{

FLAG=1;

INPUT=1;//输入指示灯灭

TMOD=0x01;

TH0=(65536-45872)/256;

TL0=(65536-45872)%256;

EA=1;

ET0=1;

TR0=1;

while(time!

=1)

{

beep();

P2=tab[time+1];

}

time=0;

ET0=0;

TR0=0;

BEEP=0;

DELAY(500);

ACT=0;

//5秒

TMOD=0x01;

TH0=(65536-45872)/256;

TL0=(65536-45872)%256;

EA=1;

ET0=1;

TR0=1;

while(time!

=5)

{

P2=tab[time+1];

}

time=0;

ET0=0;

TR0=0;

ACT=1;

input=1;

passwdnum=1;

P0=0xff;

P1=0xff;

continue;

}

else

{

time=0;

FLAG=0;

ACT=1;

//5秒

TMOD=0x01;

TH0=(65536-45872)/256;

TL0=(65536-45872)%256;

EA=1;

ET0=1;

TR0=1;

while(time!

=5)

{

beep();

P2=tab[time];

}

time=0;

ET0=0;

TR0=0;

DELAY(500);

input++;

ok_flag=1;

passwdnum=1;

P0=0xff;

P1=0xff;

continue;

}

}

//密码错误处理代码

//密码错误3次响铃1分钟

TMOD=0x01;

TH0=(65536-45872)/256;

TL0=(65536-45872)%256;

EA=1;

ET0=1;

TR0=1;

wei1=1;

while(time!

=60)

{

BEEP=~BEEP;

wei2=0;

P2=tab[(time+1)%10];

DELAY(5);

wei2=1;

P2=0x00;

wei1=0;

P2=tab[(time+1)/10];

DELAY(5);

wei1=1;

P2=0x00;

}

BEEP=0;

time=0;

ET0=0;

TR0=0;

DELAY(500);

input=1;

ok_flag=1;

passwdnum=1;

P0=0xff;

P1=0xff;

}

}

/**********************************************************/

voidpasswd_in()

{

ucharkey;

while(P0==0xff&&P1==0xff);

DELAY(10);

while(P0==0xff&&P1==0xff);

if(P0!

=0xff)

{

key=P0;

beep();

switch(key)

{

case0xfe:

P2=tab[1];break;//1

case0xfd:

P2=tab[2];break;

case0xfb:

P2=tab[3];break;

case0xf7:

P2=tab[4];break;

case0xef:

P2=tab[5];break;

case0xdf:

P2=tab[6];break;

case0xbf:

P2=tab[7];break;

case0x7f:

P2=tab[8];break;//8

}

}

if(P1!

=0xff)

{

key=P1;

beep();

switch(key)

{

case0xfe:

key=10;P2=tab[10];break;//a

case0xfd:

key=11;P2=tab[11];break;

case0xfb:

key=12;P2=tab[12];break;

case0xf7:

key=13;P2=tab[13];break;//d

}

}

if(key==chaopasswd[passwdnum])

{

chaonum++;

}

if(key!

=passwd[passwdnum])

{

ok_flag=0;

}

}

/**********************************************************/

voidpasswd_set()

{

ucharkey;

while(P0==0xff);

DELAY(10);

while(P0==0xff);

key=P0;

beep();

switch(key)

{

case0xfe:

passwd[passwdnum]=key;P2=tab[1];break;//1

case0xfd:

passwd[passwdnum]=key;P2=tab[2];break;

case0xfb:

passwd[passwdnum]=key;P2=tab[3];break;

case0xf7:

passwd[passwdnum]=key;P2=tab[4];break;

case0xef:

passwd[passwdnum]=key;P2=tab[5];break;

case0xdf:

passwd[passwdnum]=key;P2=tab[6];break;

case0xbf:

passwd[passwdnum]=key;P2=tab[7];break;

case0x7f:

passwd[passwdnum]=key;P2=tab[8];break;//8

}

}

/**********************************************************/

voidbeep()//响铃1秒钟

{

uinti,j;

for(i=0;i<10;i++)

{

for(j=0;j<110;j++);

BEEP=~BEEP;

}

BEEP=0;//关闭蜂鸣器

}

voidDELAY(uintnum)//延时num毫秒钟

{

uinti,j;

for(i=0;i

for(j=0;j<110;j++);

}

voidT0_time()interrupt1

{

TH0=(65536-45872)/256;

TL0=(65536-45872)%256;

num++;

if(num==20)

{

num=0;

time++;

}

}

五、程序编写中遇到的问题与解决方法

在这次实验的整个设计以及实际操作过程,我从中学习到了很多知识,当然在整个设计过程中出现了很多问题。

其中,困扰了我最久也是最让我担心的一个问题是:

在仿真通过的前提下,将程序烧写到单片机后,发现自己做的板子出现的程序跑飞的情况。

用万用表测试后发现并没有出现短路或者断路,然后借用创新实验室的数字示波器,对电路板的每个模块进行检测。

发现是晶振出现了问题,12MHz的晶振在工作时只有3KHz的频率,这样明显不能让单片机工作,最后,在更换了两个晶振后,单片机也终于可以正常工作了。

其次,在制作板子之前的打印工作时,考虑到需要将PCB转印上去造成电路图镜像了一次,但是忽略了焊接时是在反面进行了又一次镜像,所以在打印时也镜像了一次,这样就相当于镜像了三次,结果第一次做出的板子是镜像的。

造成的直接后果是单片机两排管脚全部反掉了,也意味着板子的报废,做了一次无用功。

当然还有一些其他的小问题,都是可以及时的进行改正的。

通过这次课设,除了对51单片机有了更加深入的了解外,还提高了自己的动手实践能力,对整个制板过程有了一个非常熟悉的了解。

6、心得体会

实验是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。

因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。

回顾起此次单片机实验,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说三极管PNP管脚不懂怎么放置,不懂分得二极管的正负极,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。

这次实验终于顺利完成了,在设计中遇到了很多编程问题,最后在梁强老师的辛勤指导下,终于游逆而解。

同时,在梁强老师的身上我学得到很多实用的知识,在次我表示感谢!

同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!

 

原理图

仿真图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1