基于单片机AT89C52智能密码锁设计毕业论文文档格式.docx
《基于单片机AT89C52智能密码锁设计毕业论文文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机AT89C52智能密码锁设计毕业论文文档格式.docx(14页珍藏版)》请在冰点文库上搜索。
第二章 系统的设计要求及方案
2.1系统设计要求
设计一款能设定密码的电子智能密码锁。
1、能输入6位数字密码,每输入一个密码显示为*,不显示密码,能删除并重新输入。
2、具有2次输入确认功能。
3、具有掉电以后密码不丢失,3次输入错误报警的功能,给出LED发光报警。
第三章 系统主要芯片介绍
3.1单片机AT89C52的介绍与其功能特点一、单片机AT89C52的介绍
ATMEL公司的AT89C52是一种高效微控制器,为很多嵌入式控制系统提
供了一种灵活性高且价廉的方案。
它的片内Flash存储器允许在系统内改编程序或用常规的非易失性的存储器编程器来编程,同时已经具有三级存储器保密的性能。
在众多的51系列单片机中,要算ATMEL公司的AT89C52单片机最实用。
片内8K程序存储器是采用Flash工艺的,这种工艺下的存储器用户可以用电方式瞬间擦除、改写。
所以说这种单片机对开发设备要求很低,开发时间也大大缩短。
写入单片机的程序还可以加密,这又很好的保护了所有劳动者的成果。
[3]
二、单片机AT89C52的功能与特点
(1)AT89C52的功能描述
(2)AT89C52具有以下几个特点:
①兼容MCS51指令系统·
8k可反复擦写(>
1000次)FlashROM
②32个双向I/O口·
256x8bit内部RAM;
③3个16位可编程定时/计数器中断·
时钟频率0-24MHz;
④2个串行中断·
可编程UART串行通道;
⑤2个外部中断源·
共8个中断源;
⑥2个读写中断口线·
3级加密位;
⑦低功耗空闲和掉电模式·
软件设置睡眠和唤醒功能;
AT89C52单片机为40引脚芯片
VCC:
电源电压GND:
地
P0口:
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口,作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端口。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址
(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,
P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号校验期间,P1接收低8位地址。
表3-1为P1口第二功能。
表3-1 P1口第二功能
P2口:
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动
4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流I。
在访问8位地址的外部数据存储器(如执行:
MOVX@Ri 指令)时,P2口线上的内(也即特殊功能寄存器,在整个访问期间不改变。
Flash编程或校验时,P2也接收高位地址和其它控制信号。
[4]
P3口:
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写入“1”时,它们被内
部上拉电阻拉高并可作为输入端口。
作输入端口时,被外部拉低的P3口将用上拉电阻输出电流I。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,P3口的第二功能如下表3-2。
表3-2 P3口的第二功能
RST:
复位输入。
当振荡工作时,RST引脚出现两个机器周期上高电平将使单片机复位。
WDT益出将使该引脚输出高电平,设置SFR AUXR 的
DISRTO位(地址8EH)可打开或关闭该功能。
DISRTO位缺省为RESET输出高电平打开状态。
PSEN:
程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。
当访问外部数据存储器,高有两次有效的
PSEN信号。
EA/VPP:
外部访问允许。
欲使CPU公访问外部程序存储器(地址
0000H-FFFFH),EA端必须保持低电平(接地)。
需注意的是:
如果加密位
LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接VCC端),
CPU则执行内部程序存储器中的指令。
Flash存储器编程时,该引脚加上+12V的编程电压VPP。
XTAL1:
振荡器反相放大器及内部时钟发生器的输入端。
3.3AT89C52内部芯片结构
特殊功能寄存器:
特殊功能寄存器的片内空间分存如下图3-2所示。
这些地址并没有全部占用,没有占用的地址不可使用,读这些地址将得到一个随意的数值。
而写这些地址单元将不能得到预期的结果。
中断寄存器:
各中断允许控制位于IE寄存器,5个中断源的中断优先级控制位于IP寄存器。
双时钟指针寄存器:
为方便地访问内部和外部数据存储器,提供了两个16位数据指针寄存储器:
PD0位于SFR区块中的地址82H、83H和DP1位于地址
84H、85H,当SFR中的位DPS=0时选择DP0,而DPS=1时选择DP1。
在使用前初始化DPS。
电源空闲标志:
电源空闲标志(POF)在特殊功能寄存储器SFR中PCON的第4位(PCON.4),电源打开时POF置“1”,它可由软件设置睡眠状态并不为复
位所影响。
存储器结构:
MCS-51单片机内核采用程序存储器和数据存储器空间分开的结构,均具有64KB外部程序和数据的寻址空间。
程序存储器:
如果EA引脚接地(GND),全部程序均执行外部存储器。
在
AT89C52,假如接至VCC(电源+),程序首先执行从地址0000H-0FFFH(4KB)内部程序存储器,再执行地址为
1000H-FFFFH(60KB)的外部程序存储器。
数据存储器:
在AT89C52的具有128字节的内部RAM,这128字节可利用直接或间接寻址方式访问,堆栈操作可利用间接寻址方式进行,128字节均可设置为堆栈区空间。
[5]
看门狗定时器(WDT):
WDT是为了解决CPU程序运行时可能进入混乱或死循环而设置,它由一个14bit计数器和看狗复位SFR(WDTRST)构成。
外部复位时,WDT默认为关闭状态,要打开WDT,必按顺序将01H和0E1H写到
WDTRST寄存器,当启动了WDT,它会随晶体振荡器在每个机器周期计数,除硬件复位或WDT溢出复位外没有其它方法关闭WDT,当WDT溢出,将使RST引脚输出高电平的复位脉冲。
3.4LCD1602的介绍
液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。
1602型
LCD可以显示2行16个字符,有8位数据总线D0-D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。
(1)接口信号说明:
(2)1602型LCD主要技术参数:
显示容量:
16×
2个字符
芯片工作电压:
4.5—5.5V工作电流:
2.0mA(5.0V)模块最佳工作电压:
5.0V
字符尺寸:
2.95×
4.35(W×
H)mm
(3)1602型LCD基本操作程序如下表所示:
第四章 系统硬件设计
本系统硬件部分由键盘输入部分、复位部分、LCD显示部分、LED显示部分、晶振部分、开锁部分组成。
4.1键盘输入模块
4.2电路复位部分
4.3LED显示部分
本系统的LED显示部分主要由两个LED组成,其中D1代表开锁信号,当密码两次都正确时,D1会闪亮一下;
D2代表密码错误,当三次输入错误时,
D2亮,且上锁。
4.4晶振部分
AT89C52引脚XTAL1和XTAL2与晶体振荡器及电容C2、C1按图4-5所示方式连接。
晶振、电容C1/C2及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容C1、C2的容量有关,但主要由晶振频率决定,范围在0~33MHz之间,电容C1、C2取值范围在5~30pF之间。
根据实际情况,本设计中采用12MHZ做为系统的外部晶振。
电容取值为30pF。
4.5开锁部分
4.6系统总原理图及PCB电路板
第五章系统软件设计
本系统软件设计由主程序、初始化程序、LCD显示程序、键盘扫描程序、键功能程序、密码设置程序等组成。
主要程序设计流程图如下所示:
5.1程序流程图
一、程序总流程框图二、密码设计流程图
三、开锁流程图
5.2程序代码设计一、主程序1:
#include<
reg51.h>
#defineucharunsignedchar#defineuintunsignedintuchar
jian[16]={0xe7,0xee,0xde,0xbe,0xed,0xdd,0xbd,0xeb,0xdb,0xbb,0x7e,0x7d,0x7b,0x77,0xb7,0xd7};
ucharUsers[6]={0,1,2,3,4,5};
//用户密码
ucharFu_hao=0;
//符号输出控制位ucharU_Interrupt=0;
//中断标志位
ucharTxet=0;
uchartimer_1=0;
ucharcode table4[]="
Isexiting!
"
;
ucharcode table7[]="
inputnewcode"
ucharcodetable12[]="
Timeistoolong"
sbitlcden=P3^4;
sbitlcdrs=P3^5;
sbitWarning=P3^1;
//报警指示灯sbitLock=P3^0;
//开锁指示灯主程序2:
voidmain()
{
ucharkey=0;
init();
Warning=0;
timer_1=0;
Lock=0;
TMOD=0x10;
//T1方式1(16位TH1=(65535-50000)/256;
//50msTL1=(65535-50000)%256;
EA=1;
//开CPU中断
ET1=1;
//开T0,T1中断
TR1=0;
//暂停中断while
(1)
key=keyscan();
if(key==11)Change_Code();
//设置键按下
if(key==12)Users_Code();
//开锁键按下,进入用户模式
}
二、中断服务程序:
timer1()interrupt3using2
ucharj;
Txet++;
//50ms自加
if(Txet==400) //30s时间到
write_com
(1);
for(j=0;
j<
16;
j++)
write_data(table12[j]);
//显示"
Warning=1;
//超时报警timer_1=1;
//停止中断Txet=0;
U_Interrupt=1;
Delay(2000);
write_com
(1);
TH1=(65535-50000)/256;
//重装计数初值TL1=(65535-50000)%256;
三、密码设计程序:
voidShe_zhi(void)
ucharNew,Wei,Zhi,bb[6],cc[6],i,k,j;
ucharcode table8[]="
inputnewagain"
ucharcode table9[]="
Successfully!
ucharcode table10[]="
Inputiserror!
ucharcode table11[]="
putenteragain"
New=0;
Wei=0;
Fu_hao=0;
for(k=0;
k<
6;
k++)
bb[k]=0;
cc[k]=0;
14;
write_data(table7[j]);
//清屏显示table7[]="
while
(1)
Zhi=keyscan();
if(Zhi>
=0&
&
Zhi<
=9) //0~9密码按键
Xian_shi(0);
//显示*号if(New==0)
bb[Wei++]=Zhi;
//存输入数值if(New==1)
cc[Wei++]=Zhi;
continue;
if(Zhi==15) //删除键按下
Xian_shi
(1);
//清除*号
//重新存输入数值Fu_hao=0;
continue;
if(Zhi==10||Zhi==11||Zhi==12) continue;
if(Zhi==14) //直接按下退出键退出
Txet=0;
12;
write_data(table4[j]);
//显示"
Isexiting"
Delay(2000);
//延迟2s后清屏
//下次重新存数值
Fu_hao=0;
//符号位归零,以便下一次输入显示return;
if(Zhi==13) //确定键按下
New++;
if(New==1) //第一次输入完新密码后,在输入一次
15;
write_data(table8[j]);
//清屏显示table8[]="
if(New==2) //第二次输入完成,比较两次是否一样
for(k=0;
k++)if(bb[k]!
=cc[k])break;
if(k>
=6) //两次输入一样
13;
write_data(table9[j]);
//请屏显示table9[]="
for(j=0;
Users[j]=bb[j];
//更改用户密码Delay(2000);
//更改密码成功,暂停中断,重新计时TR1=0;
return;
//跳出循环
if(k<
6) //两次输入新密码不一样
error!
write_com
(1);
write_data(table10[j]);
//第一行显示table10[]="
Inputis
write_com(0x80+0x40);