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

上传人:b****1 文档编号:480754 上传时间:2023-04-29 格式:DOCX 页数:22 大小:2.54MB
下载 相关 举报
基于51单片机的密码锁设计报告.docx_第1页
第1页 / 共22页
基于51单片机的密码锁设计报告.docx_第2页
第2页 / 共22页
基于51单片机的密码锁设计报告.docx_第3页
第3页 / 共22页
基于51单片机的密码锁设计报告.docx_第4页
第4页 / 共22页
基于51单片机的密码锁设计报告.docx_第5页
第5页 / 共22页
基于51单片机的密码锁设计报告.docx_第6页
第6页 / 共22页
基于51单片机的密码锁设计报告.docx_第7页
第7页 / 共22页
基于51单片机的密码锁设计报告.docx_第8页
第8页 / 共22页
基于51单片机的密码锁设计报告.docx_第9页
第9页 / 共22页
基于51单片机的密码锁设计报告.docx_第10页
第10页 / 共22页
基于51单片机的密码锁设计报告.docx_第11页
第11页 / 共22页
基于51单片机的密码锁设计报告.docx_第12页
第12页 / 共22页
基于51单片机的密码锁设计报告.docx_第13页
第13页 / 共22页
基于51单片机的密码锁设计报告.docx_第14页
第14页 / 共22页
基于51单片机的密码锁设计报告.docx_第15页
第15页 / 共22页
基于51单片机的密码锁设计报告.docx_第16页
第16页 / 共22页
基于51单片机的密码锁设计报告.docx_第17页
第17页 / 共22页
基于51单片机的密码锁设计报告.docx_第18页
第18页 / 共22页
基于51单片机的密码锁设计报告.docx_第19页
第19页 / 共22页
基于51单片机的密码锁设计报告.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

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

《基于51单片机的密码锁设计报告.docx》由会员分享,可在线阅读,更多相关《基于51单片机的密码锁设计报告.docx(22页珍藏版)》请在冰点文库上搜索。

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

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

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

课程:

单片机原理

学院:

电子与信息工程学院

专业:

班级:

姓名:

学号:

指导老师:

完成日期:

目录

一、矩阵按键1

(1)按键接口1

(2)按键开关的抖动问题1

二、LCD1602液晶2

(1)1602液晶的介绍2

(2)液晶的读写时序介绍4

(3)1602液晶的指令介绍6

三、设计7

(1)输出密码后,显示LCD16027

(2)输出密码后,交替亮灭显示LED7

四、程序设计7

(1)主程序7

(二)LCD1602程序9

(3)矩阵键盘程序10

五、仿真截图12

(1)输出密码后,显示LCD160212

(2)输出密码后,交替亮灭显示LED15

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

一、矩阵按键

(1)按键接口

键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向单片机输入指令、地址和数据。

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

(2)按键开关的抖动问题

组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成的。

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

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

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

 

图 1图2按键抖动波形

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

硬件方法和软件方法。

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

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

而在检测到按键释放后(P1.0 为高)再延时 5-10 个毫秒,消除后沿的抖动,然后再对键值处理。

不过一般情况下,我们通常不对按键释放的后沿进行处理,实践证明,也能满足一定的要求。

当然,实际应用中,对按键的要求也是千差万别,要根据不同的需要来编制处理程序,但以上是消除键抖动的原则。

 

二、LCD1602液晶

(1)1602液晶的介绍

1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号的点阵型液晶模块。

它是由若干个5x7或者5x11的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。

首先我们来看一个主要技术参数表格,如表1所示。

表11602液晶主要技术参数

1602液晶,从它的名字我们就可以看出它的显示容量,就是可以显示2行,每行16个字符的液晶。

它的工作电压是4.5V~5.5V,对于这点我们设计电路的时候,直接按照5V系统设计,但是保证我们的5V系统最低不能低于4.5V。

在5V工作电压下测量它的工作电流是2mA,大家注意,这个2mA仅仅是指液晶,而它的黄绿背光都是用LED做的,所以功耗不会太小的,一二十毫安还是有的。

1602液晶一共16个引脚,每个引脚的功能,我们都可以在它的数据手册上获得。

而这些基本的信息,在我们设计电路和编写代码之前,必须先看明白,如表9-2所示。

表21602液晶引脚功能

液晶的电源1脚2脚以及背光电源15脚16脚,不用多说,正常接就可以了。

3脚叫做液晶显示偏压信号,大家注意到小黑块没有,当我们要显示一个字符的时候,有的黑点显示,有的黑点就不能显示,这样就可以实现我们想要的字符了。

我们这个3脚

就是用来调整显示的黑点和不显示的之间的对比度,调整好了对比度,就可以让我们的显示更加清晰一些。

在进行电路设计实验的时候,通常的办法是在这个引脚上接个电位器,也就是我们初中学过的滑动变阻器。

通过调整电位器的分压值,来调整3脚的电压。

而当产品批量生产的时候,我们可以把我们调整好的这个值直接用简单电路来实现,就如同在我们板子上,我们直接使用的是一个18欧的下拉电阻,市面上有的1602的下拉电阻大概1到1.5K也是比较合适的值。

4脚是数据命令选择端。

对于液晶,有时候我们要发送一些命令,让它实现我们想要的一些状态,有时候我们要发给它一些数据,让它显示出来,液晶就通过这个引脚来判断接收到的是命令还是数据,这个引脚我们接到了ADDR0上,通过跳线帽和P1.0连接在一起。

大家注意学会读手册,看到这个引脚描述里:

数据/命令选择端,而后跟了括号(H/L),他的意思就是当这个引脚是H(High)高电平的时候,是数据,当这个引脚是L(Low)低电平的时候是命令。

5脚和4脚用法类似,功能是读写选择端。

我们既可以写给液晶数据或者命令,也可

以读取液晶内部的数据或状态,就是控制这个引脚。

因为液晶本身内部有RAM,实际上我们送给液晶的命令或者数据,液晶需要先保存在缓存里,然后再写到内部的寄存器或者RAM中,这个就需要一定的时间。

所以我们进行读写操作之前,首先要读一下液晶当前状态,是不是在“忙”,如果不忙,我们可以读写数据,如果在“忙”,我们就需要等待液晶忙完了,再进行操作。

读状态是常用的,不过读液晶数据我接触的场合没怎么用过,大家了解这个功能即可。

这个引脚我们接到了ADDR1上,通过跳线帽和P1.1连接在一起。

6脚是使能信号,很关键,液晶的读写命令和数据,都要靠它才能正常读写。

7到14引脚就是8个数据引脚了,我们就是通过这8个引脚读写数据和命令的。

我们统一接到了P0口上。

来看一下开发板上的1602接口的原理图,如图3所示。

图31602液晶接口原理图

(2)液晶的读写时序介绍

1602液晶内部带了80个字节的显示RAM,用来存储我们发送的数据,它的结构如图4所示。

图41602内部RAM结构图

第一行的地址是0x00H到0x27,第二行的地址从0x40到0x67,其中第一行0x00到0x0F是与液晶上第一行16个字符显示位置相对应的,第二行0x40到0x4F是与第二行16个字符显示位置相对应的。

而每行都多出来一部分,是为了显示移动字幕设置的。

1602字符液晶是显示字符的,因此它跟ASCII字符表是对应的。

比如我们给0x00这个地址写一个‘a’,也就是十进制的97,液晶的最左上方的那个小块就会显示一个字母a。

此外,液晶内部有个数据指针,它指向哪里,我们写的那个数据就会送到相应的那个地址里。

液晶有一个状态字字节,我们通过读取这个状态字的内容,就可以知道1602液晶的一些内部情况,如表3所示。

表31602液晶状态字

这个状态字节有8个位,最高位表示了当前液晶是不是“忙”,如果这个位是1表示液晶正“忙”,禁止我们读写数据或者命令,如果是0,则可以进行读写。

而低7位就表示了当前数据地址指针的位置。

1602的基本操作时序,一共有4个,这些大家都不需要记住,但是都需要理解,因为我们现在不是为了应付考试,所以不需要你把手册背熟,但是你写程序的时候,打开手册要能看懂如何操作,还要再提醒一句,单片机读外部状态前,必须先保证自己是高电平哦。

我们这里要做1602液晶的程序,因此先把用到的总线接口做一个统一声明:

#defineLCD1602_DBP0

sbitLCD1602_RS=P1^0;

sbitLCD1602_RW=P1^1;

sbitLCD1602_E=P1^5;

①读状态:

RS=L,R/W=H,E=H。

这是个很简单的逻辑,就是说,我们直接写

LCD1602_DB=0xFF;

LCD1602_RS=0;

LCD1602_RW=1;

LCD1602_E=1;

sta=LCD1602_DB;

这样就把当前液晶的状态字读到了sta这个变量中,我们可以通过判断sta最高位的值来了解当前液晶是否处于“忙”状态,也可以得知当前数据的指针位置。

两个问题,一是如果我们当前读到的状态是“不忙”,那么我们程序可以进行读写操作,如果当前状态是“忙”,那么我们还得继续等待重新判断液晶的状态;问题二,大家可以看我们的原理图,流水灯、数码管、点阵、1602液晶都用到了P0口总线,我们读完了液晶状态继续保持LCD1602_E是高电平的话,1602液晶会继续输出它的状态值,输出的这个值会占据了P0总线,干扰到流水灯数码管等其它外设,所以我们读完了状态,通常要把这个引脚拉低来释放总线,这里我们用了一个do...while循环语句来实现。

LCD1602_DB=0xFF;

LCD1602_RS=0;

LCD1602_RW=1;

do{

LCD1602_E=1;

sta=LCD1602_DB;//读取状态字

LCD1602_E=0;//读完撤销使能,防止液晶输出数据干扰P0总线

}while(sta&0x80);

//bit7等于1表示液晶正忙,重复检测直到其等于0为止

②读数据:

RS=H,R/W=L,E=H。

这个逻辑也很简单,但是读数据不常用,大家了解一下就可以了,这里就不详细解释了。

③写指令:

RS=L,R/W=L,D0~D7=指令码,E=高脉冲。

这个在逻辑上没什么难的,只是E=高脉冲这个问题要解释一下。

这个指令一共有4条语句,其中前三条语句顺序无所谓,但是E=高脉冲这一句很关键。

实际上流程是这样的:

因为我们现在是写数据,所以我们首先要保证我们的E引脚是低电平状态,而前三句不管我们怎么写,1602液晶只要没有接收到E引脚的使能控制,它都不会来读总线上的信号的。

当通过前三句准备好数据之后,E使能引脚从低电平到高电平变化,然后E使能引脚再从高电平到低电平出现一个下降沿,1602液晶内部一旦检测到这个下降沿后,并且检测到RS=L,R/W=L,就马上来读取D0~D7的数据,完成单片机写1602指令过程。

归纳总结我们写了个E=高脉冲,意思就是:

E使能引脚先从低拉高,再从高拉低,形成一个高脉冲。

④写数据:

RS=H,R/W=L,D0~D7=数据,E=高脉冲。

写数据和写指令是类似的,就是把RS改成H,把总线改成数据即可。

(3)1602液晶的指令介绍

与单片机寄存器的用法类似,1602液晶在使用的时候,我们首先要进行初始的功能配置,1602液晶有以下几个指令需要了解。

①显示模式设置。

写指令0x38,设置16x2显示,5x7点阵,8位数据接口。

这条指令对我们这个液晶来说是固定的,必须写0x38,大家仔细看会发现我们的液晶实际上内部点阵是5x8的,

还有一些1602液晶还兼容串行通信,用2个IO口即可,但是速度慢,我们这个液晶就是固定的0x38模式。

②显示开/关以及光标设置指令。

这里有2条指令,第一条指令,一个字节中8位,其中高5位是固定的0b00001,低3位我们分别用DCB从高到低表示,D=1表示开显示,D=0表示关显示;C=1表示显示光标,C=0表示不显示光标;B=1表示光标闪烁,B=0表示光标不闪烁。

第二条指令,高6位是固定的0b000001,低2位我们分别用NS从高到低表示,其中N=1表示读或者写一个字符后,指针自动加1,光标自动加1,N=0表示读或者写一个字符后指针自动减1,光标自动减1;S=1表示写一个字符后,整屏显示左移(N=1)或右移(N=0),以达到光标不移动而屏幕移动的效果,如同我们的计算器输入一样的效果,而S=0表示写一个字符后,整屏显示不移动。

③清屏指令。

固定的,写入0x01表示显示清屏,其中包含了数据指针清零,所有的显示清零。

写入0x02则仅仅是数据指针清零,显示不清零。

④RAM地址设置指令

该指令码的最高位为1,低7位为RAM的地址,RAM地址与液晶上字符的关系如上图4所示。

通常,我们在读写数据之前都要先设置好地址,然后再进行数据的读写操作。

三、设计

要求按键输入6位密码,按下确认键后,运行结果。

(1)输入密码后,显示LCD1602

1上电时,LCD显示“EnterAPassword-MezerChenMake”;

2当每按下一位正确的字符时,相应的点亮一个LED;

③当输完6位密码,按下确认按键后,LCD显示“ItIsRight!

!

!

”。

(2)输入密码后,交替亮灭显示LED

①上电时,只有两个LED亮;

②当每按下一位正确的字符时,相应的点亮一个LED;

③当输完6位密码,按下确认按键后,LED交替亮灭。

四、程序设计

(1)主程序

#include

#include"key.h"

#include"lcd1602.h"

#defineu8unsignedchar

externu8temp,key,i;

u8j=0,c=0x01;

u8b[16]="ItIsRight!

!

!

";

u8ru[32]="EnterAPassword-MezerChenMake";

u8codepassword[6]={5,1,3,8,7,'a'};//输入6位正确密码51387a

voidmain()

{

lcd_init();

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

{

lcd_write_com(0x80+i);

lcd_write_dat(ru[i]);

lcd_write_com(0x80+0x40+i);

lcd_write_dat(ru[i+16]);

}

while

(1)

{

while(j<6)

{

key_scan();

if(password[j]==key)

{

P2=~c;

c<<=1;

j++;

}

}

//第四行为密码确认键

if(password[5]=='a')

{

P1=0xf7;//扫描第四行

temp=P1;

if(temp!

=0xf7)

{

//P2=0xaa;

for(i=0;i<16;i++)//LCD显示密码正确

{

lcd_write_com(0x80+i);

lcd_write_dat(b[i]);

}

while

(1);

}

}

}

}

(二)LCD1602程序

#include"lcd1602.h"

voiddelay1(u8k)

{

while(k--);

}

u8i;

voidlcd_write_dat(u8dat)

{

RS=1;//数据

RW=0;//写

EN=1;

P0=dat;

delay1(1000);//空语句,延时1us

EN=0;

delay1(1000);

}

voidlcd_write_com(u8com)//lcd1602写命令

{

RS=0;//命令

RW=0;//写

EN=1;

P0=com;

delay1(1000);//空语句,延时1us

EN=0;

delay1(1000);

}

voidlcd_init()

{

lcd_write_com(0x38);

lcd_write_com(0x08);//管显示

lcd_write_com(0x01);//清0

lcd_write_com(0x06);//地址指针自动加1

lcd_write_com(0x0c);//开显示

}

(3)矩阵键盘程序

#include"key.h"

u8key=87,temp;

voiddelay(u8m)

{

while(m--);

}

voidkey_scan()

{

P1=0xfe;//扫描第一行

temp=P1;

if(temp!

=0xfe)//判断第一行是否有按键按下

{

delay(7000);//去抖

temp=P1;//重新赋值

if(temp!

=0xfe)//再次确认

switch(temp)

{

case0xee:

key=0;break;

case0xde:

key=1;break;

case0xbe:

key=2;break;

case0x7e:

key=3;break;

}

}

P1=0xfd;//扫描第二行

temp=P1;

if(temp!

=0xfd)//判断第二行是否有按键按下

{

switch(temp)

{

case0xed:

key=4;break;

case0xdd:

key=5;break;

case0xbd:

key=6;break;

case0x7d:

key=7;break;

}

}

P1=0xfb;//扫描第三行

temp=P1;

if(temp!

=0xfb)//判断第三行是否有按键按下

{

switch(temp)

{

case0xeb:

key=8;break;

case0xdb:

key=9;break;

case0xbb:

key='a';break;

case0x7b:

key='b';break;

}

}

}

 

五、仿真截图

(1)输入密码后,显示LCD1602

图5上电显示lcd

图6按键按下3时第3个led亮

图7按键按下a时第6个led亮

图8按键按下确认后lcd显示

(2)输入密码后,交替亮灭显示LED

图9上电显示led

图10按键按下3时第3个led亮

图11按键按下6时led亮

图12按键按下确认后led间隔亮灭显示

 

六、输入密码后,LED交替亮灭实际图

图13上电显示led

图14按键按下3时第3个led亮

图15按键按下a时第6个led亮

图16按键按下确认后led间隔亮灭显示

 

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2