基于51单片机的密码锁设计报告_第1页
基于51单片机的密码锁设计报告_第2页
基于51单片机的密码锁设计报告_第3页
基于51单片机的密码锁设计报告_第4页
基于51单片机的密码锁设计报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于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单片机的密码锁设计一、矩

2、阵按键(1)按键接口键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向单片机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。(2)按键开关的抖动问题组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成的。在下图 1、图2 中,当按键被按下时,P1.0 输入为高电平;当按键按下后,P1.0 输入为低电平。由于按键是机械触点,当机械触点断开、闭合时,会有抖动动,P1.0 输入端的波形如图2所示

3、。这种抖动对于人来说是感觉不到的,但对单片机来说,则是完全可以感应到的,因为单片机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对单片机而言,这已是一个“漫长”的时间。 图 1 图2 按键抖动波形为使 CPU 能正确地读出 P1 口的状态,对每一次按键只作一次响应,就必须考虑如何去除抖动,常用的去抖动的方法有两种:硬件方法和软件方法。单片机中常用软件法,因此,对于硬件方法我们不介绍。软件法,就是在单片机获得 P1.0 口为低的信息后,不是立即认定按键已被按下,而是延时 10 毫秒或更长一些时间后再次

4、检测 P1.0 口,如果仍为低,说明按键的确按下了,这实际上是避开了按键按下时的抖动时间。而在检测到按键释放后(P1.0 为高)再延时 5-10 个毫秒,消除后沿的抖动,然后再对键值处理。不过一般情况下,我们通常不对按键释放的后沿进行处理,实践证明,也能满足一定的要求。当然,实际应用中,对按键的要求也是千差万别,要根据不同的需要来编制处理程序,但以上是消除键抖动的原则。二、LCD1602液晶(1)1602 液晶的介绍1602 液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号的点阵型液晶模块。它是由若干个 5x7 或者 5x11

5、的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。首先我们来看一个主要技术参数表格,如表1所示。表1 1602液晶主要技术参数1602液晶,从它的名字我们就可以看出它的显示容量,就是可以显示2行,每行16个字符的液晶。它的工作电压是4.5V5.5V,对于这点我们设计电路的时候,直接按照5V系统设计,但是保证我们的5V系统最低不能低于4.5V。在 5V 工作电压下测量它的工作电流 是2mA,大家注意,这个2mA 仅仅是指液晶,而它的黄绿背光都是用LED 做的,所以功耗 不会太小的,

6、一二十毫安还是有的。1602 液晶一共 16 个引脚,每个引脚的功能,我们都可以在它的数据手册上获得。而这些基本的信息,在我们设计电路和编写代码之前,必须先看明白,如表 9-2 所示。表2 1602 液晶引脚功能液晶的电源 1 脚 2 脚以及背光电源 15 脚 16 脚,不用多说,正常接就可以了。3 脚叫做液晶显示偏压信号,大家注意到小黑块没有,当我们要显示一个字符的时候,有的黑点显示,有的黑点就不能显示,这样就可以实现我们想要的字符了。我们这个 3 脚就 是用来调整显示的黑点和不显示的之间的对比度,调整好了对比度,就可以让我们的显示更 加清晰一些。在进行电路设计实验的时候,通常的办法是在这个

7、引脚上接个电位器,也就是 我们初中学过的滑动变阻器。通过调整电位器的分压值,来调整 3 脚的电压。而当产品批量生产的时候,我们可以把我们调整好的这个值直接用简单电路来实现, 就如同在我们板子上,我们直接使用的是一个18 欧的下拉电阻,市面上有的1602的下拉电阻大概1到1.5K 也是比较合适的值。4 脚是数据命令选择端。对于液晶,有时候我们要发送一些命令,让它实现我们想要的一些状态,有时候我们要发给它一些数据,让它显示出来,液晶就通过这个引脚来判断接收到的是命令还是数据,这个引脚我们接到了 ADDR0 上,通过跳线帽和 P1.0 连接在一起。大家注意学会读手册,看到这个引脚描述里:数据/命令选

8、择端,而后跟了括号(H/L),他的意思就是当这个引脚是 H(High)高电平的时候,是数据,当这个引脚是 L(Low)低电平的时候是命令。5 脚和 4 脚用法类似,功能是读写选择端。我们既可以写给液晶数据或者命令,也可以 读取液晶内部的数据或状态,就是控制这个引脚。因为液晶本身内部有 RAM,实际上我们送给液晶的命令或者数据,液晶需要先保存在缓存里,然后再写到内部的寄存器或者RAM 中,这个就需要一定的时间。所以我们进行读写操作之前,首先要读一下液晶当前状态,是不是在“忙”,如果不忙,我们可以读写数据,如果在“忙”,我们就需要等待液晶忙完了,再进行操作。读状态是常用的,不过读液晶数据我接触的场

9、合没怎么用过,大家了解这个功 能即可。这个引脚我们接到了 ADDR1 上,通过跳线帽和 P1.1 连接在一起。6 脚是使能信号,很关键,液晶的读写命令和数据,都要靠它才能正常读写。7 到 14 引脚就是 8 个数据引脚了,我们就是通过这 8 个引脚读写数据和命令的。我们统一接到了P0口上。来看一下开发板上的1602接口的原理图,如图3所示。图3 1602 液晶接口原理图(2)液晶的读写时序介绍1602 液晶内部带了 80 个字节的显示 RAM,用来存储我们发送的数据,它的结构如图4所示。图4 1602内部RAM结构图第一行的地址是0x00H 到0x27, 第二行的地址从0x40 到0x67,

10、其中第一行0x00 到0x0F 是与液晶上第一行 16 个字符显示位置相对应的,第二行 0x40 到 0x4F 是与第二行 16 个字符显示位置相对应的。而每行都多出来一部分,是为了显示移动字幕设置的。1602 字符液晶是 显示字符的,因此它跟 ASCII 字符表是对应的。比如我们给 0x00 这个地址写一个a,也就是十进制的 97,液晶的最左上方的那个小块就会显示一个字母 a。此外,液晶内部有个数据指针,它指向哪里,我们写的那个数据就会送到相应的那个地址里。液晶有一个状态字字节,我们通过读取这个状态字的内容,就可以知道 1602 液晶的一些内部情况,如表3所示。表3 1602 液晶状态字这个

11、状态字节有 8 个位,最高位表示了当前液晶是不是“忙” ,如果这个位是 1 表示液 晶正“忙” ,禁止我们读写数据或者命令,如果是0,则可以进行读写。而低7 位就表示了当前数据地址指针的位置。1602 的基本操作时序,一共有4 个,这些大家都不需要记住,但是都需要理解,因为我们现在不是为了应付考试,所以不需要你把手册背熟,但是你写程序的时候,打开手册要能 看懂如何操作,还要再提醒一句,单片机读外部状态前,必须先保证自己是高电平哦。我们这里要做1602液晶的程序,因此先把用到的总线接口做一个统一声明:#define LCD1602_DB P0sbit LCD1602_RS = P10;sbit

12、LCD1602_RW = P11;sbit LCD1602_E = P15; 读状态:RS=L,R/W=H,E=H。这是个很简单的逻辑,就是说,我们直接写LCD1602_DB = 0xFF;LCD1602_RS = 0;LCD1602_RW = 1;LCD1602_E = 1;sta = LCD1602_DB;这样就把当前液晶的状态字读到了sta 这个变量中, 我们可以通过判断sta 最高位的值来了解当前液晶是否处于“忙”状态,也可以得知当前数据的指针位置。两个问题,一是如果 我们当前读到的状态是“不忙”,那么我们程序可以进行读写操作,如果当前状态是“忙”,那么我们还得继续等待重新判断液晶的状

13、态;问题二,大家可以看我们的原理图,流水灯、 数码管、点阵、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; /读完撤销使能,防止液晶输出数据干扰

14、P0总线 while (sta & 0x80);/bit7等于1表示液晶正忙,重复检测直到其等于0为止 读数据:RS=H,R/W=L,E=H。这个逻辑也很简单,但是读数据不常用,大家了解 一下就可以了,这里就不详细解释了。 写指令:RS=L,R/W=L,D0D7=指令码,E=高脉冲。 这个在逻辑上没什么难的,只是E=高脉冲这个问题要解释一下。 这个指令一共有4 条语句, 其中前三条语句顺序无所谓,但是E=高脉冲这一句很关键。实际上流程是这样的:因为 我们现在是写数据,所以我们首先要保证我们的E 引脚是低电平状态,而前三句不管我们怎么写, 1602 液晶只要没有接收到E 引脚的使能控制,

15、它都不会来读总线上的信号的。当通过前三句准备好数据之后,E 使能引脚从低电平到高电平变化, 然后E 使能引脚再从高电平到低电平出现一个下降沿, 1602 液晶内部一旦检测到这个下降沿后, 并且检测到 RS=L, R/W=L,就马上来读取 D0D7 的数据, 完成单片机写1602 指令过程。归纳总结我们写了个E=高脉冲, 意思就是: E 使能引脚先从低拉高,再从高拉低,形成一个高脉冲。 写数据:RS=H,R/W=L,D0D7=数据,E=高脉冲。 写数据和写指令是类似的,就是把RS 改成H,把总线改成数据即可。(3)1602 液晶的指令介绍与单片机寄存器的用法类似, 1602 液晶在使用的时候,

16、我们首先要进行初始的功能配置,1602液晶有以下几个指令需要了解。 显示模式设置。写指令 0x38,设置 16x2 显示,5x7 点阵,8 位数据接口。这条指令对我们这个液晶来说是固定的,必须写 0x38,大家仔细看会发现我们的液晶实际上内部点阵是 5x8 的,还有一些 1602 液晶还兼容串行通信,用 2 个 IO 口即可,但是速度慢,我们这个液晶就是固定的 0x38 模式。 显示开/关以及光标设置指令。这里有 2 条指令,第一条指令,一个字节中 8 位,其中高 5 位是固定的 0b00001,低3位我们分别用 DCB 从高到低表示,D=1 表示开显示,D=0 表示关显示;C=1 表示显示光

17、标, 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 则仅仅是数据指针清

18、零,显示不清零。 RAM 地址设置指令该指令码的最高位为 1,低 7 位为 RAM 的地址,RAM 地址与液晶上字符的关系如上图4所示。通常,我们在读写数据之前都要先设置好地址,然后再进行数据的读写操作。三、设计要求按键输入6位密码,按下确认键后,运行结果。(1)输入密码后,显示LCD1602 上电时,LCD显示“Enter A Password-Mezer Chen Make”; 当每按下一位正确的字符时,相应的点亮一个LED; 当输完6位密码,按下确认按键后, LCD显示“It Is Right!”。(2)输入密码后,交替亮灭显示LED上电时,只有两个LED亮;当每按下一位正确的字符时,相

19、应的点亮一个LED;当输完6位密码,按下确认按键后,LED交替亮灭。四、程序设计(1) 主程序#include <reg52.h>#include "key.h"#include "lcd1602.h"#define u8 unsigned charextern u8 temp,key,i;u8 j=0,c=0x01;u8 b16="It Is Right!"u8 ru32="Enter A Password-Mezer Chen Make"u8 code password6=5,1,3,8,7,

20、9;a'/输入6位正确密码51387avoid main()lcd_init();for(i=0;i<16;i+)lcd_write_com(0x80+i);lcd_write_dat(rui);lcd_write_com(0x80+0x40+i);lcd_write_dat(rui+16);while(1)while(j<6)key_scan();if(passwordj=key)P2=c;c<<=1;j+;/第四行为密码确认键if(password5='a')P1=0xf7;/扫描第四行temp=P1;if(temp!=0xf7)/P2=0x

21、aa;for(i=0;i<16;i+)/LCD显示密码正确lcd_write_com(0x80+i);lcd_write_dat(bi);while(1);(二) LCD1602程序#include "lcd1602.h"void delay1(u8 k)while(k-);u8 i;void lcd_write_dat(u8 dat)RS=1;/数据RW=0;/写EN=1;P0=dat;delay1(1000);/空语句,延时1usEN=0;delay1(1000);void lcd_write_com(u8 com)/lcd1602写命令RS=0;/命令RW=0;

22、/写EN=1;P0=com;delay1(1000);/空语句,延时1usEN=0;delay1(1000);void lcd_init()lcd_write_com(0x38);lcd_write_com(0x08);/管显示lcd_write_com(0x01);/清0lcd_write_com(0x06);/地址指针自动加1lcd_write_com(0x0c);/开显示(3)矩阵键盘程序#include "key.h"u8 key=87,temp;void delay(u8 m)while(m-);void key_scan()P1=0xfe;/扫描第一行temp=P1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论