单片机密码锁实验报告文档格式.docx
《单片机密码锁实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《单片机密码锁实验报告文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
1:
用4×
4矩阵键盘组成0-f数字键及。
2:
可以自行设定或删除8位密码,
3:
用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则显示PASS,若密码显示错误时,显示ERR.
4:
自由发挥其他功能.
5:
要求有单片机硬件系统框图,电路原理图,软件流程图。
三.实验基本原理:
这个密码锁的功能是使用矩阵键盘中的十六个键输入密码0到F还有,输入的同时在八位数码管上显示用户所输入的密码,未输入的位置用横杆填补表述未输入。
当输入的密码超出设置的位数时,数据溢出,清零。
用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则显示pass,若密码不正确,则显示err;
模拟密码锁,密码固化到ROM不能通过按键输入更改。
四.实验设计分析:
1.设计思想:
1.本系统采用单片机AT89S51作为核心元件的一款具有本机开锁,加锁,修改密码和错误2.报警的电子密码锁。
3.电子密码锁的原理是:
从键盘输入一组密码,CPU把该密码和设置密码比较,对则将锁打开,错则要求重新输入,并记录错误次数,如果三次错误,则被强制锁定并报警。
初步设计思路如下:
1.输入密码用矩形键盘,数字键,字母键。
2.LED数码管显示输入密码,但是只是输出显示符号8。
采用动态扫描输出。
3.输入密码错误时显示ERR,密码正确时显示PASS。
软件的设计主要包括矩形键盘键值的读取、LED动态扫描输出程序、密码判断程序。
电子密码锁工作的主要过程是LED数码管显示密码啊。
通过键盘输入密码,按下确认键后判断密码的正确性,正确显示PASS,错误显示ERR。
程序将分为主程序和中断服务子程序。
主程序负责键盘键值读取,密码判断和开锁,中断服务子程序主要是负责LED数码管显示。
根据程序功能,程序主要分为以下几部分:
1.键盘键值读取程序
键盘键值读取程序包括键盘扫描、消除抖动、键译码等内容。
按键的识别主要有两种方法:
行反转法和行扫描法。
因为键盘为机械开关,容易引入抖动。
为了消除抖动干扰,在程序中要加入消除抖动的部分。
2)LED数码显示程序
LED数码显示器是一种应用很普遍的显示器。
程序主要负责把要显示的数字或字母对应的显示码送到相应的LED显示管。
有多位需要同时显示时,可以采用动态刷新的方法,就可以得到稳定的输出。
循环显示8个数码管,可以实现稳定的数字显示。
中断服务程序只负责数据的输出显示,主程序根据所处的状态修正显示数据。
3)密码判断程序
密码判断程序放在主程序中,有按键时读取,当确定键按下时作出判断。
在程序中设置6字节的空间存放设定的密码和8字节存放键盘输入的数据。
根据读取的键盘数据和预先设定的密码逐位比较就可以判断输入密码的正确性。
2.密码显示与开锁
当密码输出时候,显示屏上逐步显示密码,逐一显示。
4.密码错误报警
当用户键入正确密码并按下“确认”键时,屏幕清零会显示PASS。
当用户键入错误密码按下“确认”时,屏幕清零会显示ERR。
五.实验要求实现:
1.电路设计:
2.主流程图:
3.4x4键盘行列式键盘原理电路图:
每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N×
M个按键的键盘。
本设计发射部分采用4x4键盘,接收部分采用4x4键盘。
键盘扫描时,首先由I/O口低四位输出高电平,高四位输出低电平,假若有键按下,那么在I/O口低四位即可读出低电平,接着延时消抖,再具体判断是何键按下。
4.显示模块
五.总电路设计如下
六.程序
#include<
reg52.h>
//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换
#defineKeyPortP1
sbitLATCH1=P2^2;
//定义锁存使能端口段锁存
sbitLATCH2=P2^3;
//位锁存
unsignedcharcodedofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};
//显示段码值0~F
unsignedcharcodedofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//分别对应相应的数码管点亮,即位码
unsignedcharTempData[8];
//存储显示值的全局变量
unsignedcharcodepassword[8]={1,2,3,4,5,6,7,8};
//可以更改此密码做多组测试
voidDelayUs2x(unsignedchart);
//us级延时函数声明
voidDelayMs(unsignedchart);
//ms级延时
voidDisplay(unsignedcharFirstBit,unsignedcharNum);
//数码管显示函数
unsignedcharKeyScan(void);
//键盘扫描
unsignedcharKeyPro(void);
voidInit_Timer0(void);
//定时器初始化
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
unsignedcharnum,i,j;
unsignedchartemp[8];
bitFlag;
Init_Timer0();
while
(1)//主循环
{
num=KeyPro();
if(num!
=0xff)
if(i==0)
for(j=0;
j<
8;
j++)//清屏
TempData[j]=0;
}
if(i<
8)
temp[i]=dofly_DuanMa[num];
//把按键值输入到临时数组中
=i;
j++)//通过一定顺序把临时数组中
//的值赋值到显示缓冲区,从右往左输入
TempData[7-i+j]=temp[j];
i++;
//输入数值累加
if(i==9)//正常等于8即可,由于我们需要空一个用于清屏,
//清屏时的按键不做输入值
i=0;
Flag=1;
//先把比较位置1
j++)//循环比较8个数值,
//如果有一个不等则最终Flag值为0
Flag=Flag&
&
(temp[j]==dofly_DuanMa[password[j]]);
//比较输入值和已有密码
if(Flag)//如果比较全部相同,标志位置1
TempData[0]=0x3f;
//"
o"
TempData[1]=0x73;
p"
TempData[2]=0x79;
E"
TempData[3]=0x54;
n"
//说明密码正确,输入对应操作显示"
open"
}
else
TempData[0]=0x79;
TempData[1]=0x50;
r"
TempData[2]=0x50;
//否则显示"
Err"
}
}
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
voidDelayUs2x(unsignedchart)
{
while(--t);
mS延时函数,含有输入参数unsignedchart,无返回值
0~255这里使用晶振12M,精确延时请使用汇编
voidDelayMs(unsignedchart)
while(t--)
//大致延时1mS
DelayUs2x(245);
显示函数,用于动态扫描数码管
输入参数FirstBit表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
voidDisplay(unsignedcharFirstBit,unsignedcharNum)
staticunsignedchari=0;
DataPort=0;
//清空数据,防止有交替重影
LATCH1=1;
//段锁存
LATCH1=0;
keyPort=dofly_WeiMa[i+FirstBit];
//取位码
LATCH2=1;
//位锁存
LATCH2=0;
DataPort=TempData[i];
//取显示数据,段码
if(i==Num)
定时器初始化子程序
voidInit_Timer0(voi