基于51单片机的密码锁设计报告.docx
- 文档编号:5801630
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:19
- 大小:2.54MB
基于51单片机的密码锁设计报告.docx
《基于51单片机的密码锁设计报告.docx》由会员分享,可在线阅读,更多相关《基于51单片机的密码锁设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
基于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间隔亮灭显示
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 密码锁 设计 报告