密码锁控制说明书

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课程设计报告课题名称:密码锁控制
学院:机电汽车工程学院
班级:机101-1
小组成员:
指导老师:
目录
第一章引言 (3)
第二章课程设计任务书 (3)
一、任务要求 (3)
二、单片机概述 (4)
第三章电路原理分析与设计…………………………………………
11
一、硬件设计思想…………………………………………………
11
二、部分硬件方案论述……………………………………………
11
1 键盘输入单元 (11)
2 显示单元 (13)
3 报警电路模块 (17)
4 晶振电路模块 (17)
5 复位电路模块 (18)
6 掉电存储单元 (19)
7 总框图设计与程序流程图 (20)
第四章程序设计………………………………………………………
22
第五章调试连接与测试………………………………………………
43
第六章小结……………………………………………………………
43
第七章参考文献………………………………………………………
43
第一章引言
单片机自二十世纪七十年代问世以来,以其极高的性能价格比受到人们的重视和关注,应用广泛,发展快。

由于其的优点多而突出,所以其的应用领域极广,几乎到了无孔不入的地步。

在我国广泛的应用于工业自动化控制、自动检测、智能仪表、智能家用电器、航空航天系统和国防军事、尖端武器等各个方面。

可以采用软硬件结合的办法提高系统的性能的控制技术为微控技术。

LCD 液晶显示器是Liquid Crystal Display 的简称,是20世纪70年代初发展起来的一种液晶显示器。

随着技术的发展其的分辨率、屏幕发光颜色等进入批量化合实用化。

随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲呢。

本系统由单片机系统、矩阵键盘、LCD显示和报警系统组成。

系统能完成开锁、报警、修改用户密码基本的密码锁的功能。

本文详细阐述了个模块的功能以及它们之间的联系。

第二章课程设计任务书
一、任务要求:
1、密码锁由4x4键盘和LCD显示器组成。

2、其基本功能为:(1)使用LCD显示器来显示密码输入的相关信息;(2)可以设置4位数字(0-9)密码;(3)内定另一组4位数字密码为‘1234’;(4)密码输入正确则继电器启动2s,密码输入错误则发出警报声。

程序执行后工作指示灯LED亮,表示程序开始执行,LCD 显示“PASSWORD A OR B KEY”,按下操作键A或B动作如下:操作键A:设置新的4位数字密码,操作键B:输入4位数字密码并做检查。

二、单片机概述
采用以8051为核心的单片机控制方案。

利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加调电存储、声光提示甚至添加遥控控制功能。

其原理如图所示。

图2-2单片机控制方案
1>、芯片8051有40条引脚,共分为端口线、电源线和控制线三类
·4并行I/O端口,每个端口有8条端口线,用于传送数据、地址。

·可编程串行通道
·5个中断源
·低功耗的闲置和掉电方式
·两个16位定时器、计数器
·片内振荡器和时钟脉冲
·4K内部RoM
·128内部RaM
2>、管脚说明
1)、、主电源引脚VCC和VSS
VCC——(40脚)接+5V电压;
VSS——(20脚)接地。

2)、外接晶体引脚XTAL1和XTAL2
XTAL1(19脚)接外部晶体的一个引脚。

在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器。

当采用外部振荡器时,对HMOS单片机,此引脚应接地;对CHMOS单片机,此引脚作为驱动端。

XTAL2(18脚)接外晶体的另一端。

在单片机内部,接至上述振荡器的反相放大器的输出端。

采用外部振荡器时,对HMOS单片机,该引脚接外部振荡器的信号,即把外部振荡器的信号直接接到内部时钟发生器的输入端;对XHMOS,此引脚应悬浮。

3)、控制或与其它电源复用引脚RST/VPD、ALE/PROG、PSEN和EA/VPP
①RST/VPD(9脚)当振荡器运行时,在此脚上出现两个机器周期的高电平将使单片机复位。

推荐在此引脚与VSS引脚之间连接一个约8.2k的下拉电阻,与VCC引脚之间连接一个约10μF的电容,以保证可靠地复位。

VCC掉电期间,此引脚可接上备用电源,以保证内部RAM的数据不丢失。

当VCC主电源下掉到低于规定的电平,而VPD 在其规定的电压范围(5±0.5V)内,VPD就向内部RAM提供备用电源。

②ALE/PROG(30脚):当访问外部存贮器时,ALE(允许地址锁存)的输出用于锁存地址的低位字节。

即使不访问外部存储器,ALE 端仍以不变的频率周期性地出现正脉冲信号,此频率为振荡器频率的1/6。

因此,它可用作对外输出的时钟,或用于定时目的。

然而要注意的是,每当访问外部数据存储器时,将跳过一个ALE脉冲。

ALE端可以驱动(吸收或输出电流)8个LS型的TTL输入电路。

对于EPROM单片机(如8751),在EPROM编程期间,此引脚用于输入编程脉冲(PROG)。

③PSEN(29脚):此脚的输出是外部程序存储器的读选通信号。

在从外部程序存储器取指令(或常数)期间,每个机器周期两次PSEN 有效。

但在此期间,每当访问外部数据存储器时,这两次有效的PSEN 信号将不出现。

PSEN同样可以驱动(吸收或输出)8个LS型的TTL 输入。

④EA/VPP(引脚):当EA端保持高电平时,访问内部程序存储器,但在PC(程序计数器)值超过0FFFH(对851/8751/80C51)或1FFFH(对8052)时,将自动转向执行外部程序存储器内的程序。

当EA保持低电平时,则只访问外部程序存储器,不管是否有内部程序存储器。

对于常用的8031来说,无内部程序存储器,所以EA脚必须常接地,这样才能只选择外部程序存储器。

对于EPROM型的单片机(如8751),在EPROM编程期间,此引脚也用于施加21V的编程电源(VPP)。

4)、输入/输出(I/O)引脚P0、P1、P2、P3(共32根)
①P0口(39脚至32脚):是双向8位三态I/O口,在外接存储器时,与地址总线的低8位及数据总线复用,能以吸收电流的方式驱动8个LS型的TTL负载。

②P1口(1脚至8脚):是准双向8位I/O口。

由于这种接口输出没有高阻状态,输入也不能锁存,故不是真正的双向I/O口。

P1
口能驱动(吸收或输出电流)4个LS型的TTL负载。

对8052、8032,P1.0引脚的第二功能为T2定时/计数器的外部输入,P1.1引脚的第二功能为T2EX捕捉、重装触发,即T2的外部控制端。

对EPROM编程和程序验证时,它接收低8位地址。

③P2口(21脚至28脚):是准双向8位I/O口。

在访问外部存储器时,它可以作为扩展电路高8位地址总线送出高8位地址。

在对EPROM编程和程序验证期间,它接收高8位地址。

P2可以驱动(吸收或输出电流)4个LS型的TTL负载。

④P3口(10脚至17脚):是准双向8位I/O口,在MCS-51中,这8个引脚还用于专门功能,是复用双功能口。

P3能驱动(吸收或输出电流)4个LS型的TTL负载。

作为第一功能使用时,就作为普通I/O口用,功能和操作方法与P1口相同。

值得强调的是,P3口的每一条引脚均可独立定义为第一功能的输入输出或第二功能。

P3各口线的第二功能定义
口线引脚第二功能
P3.0 10 RXD(串行输入口)
P3.1 11 TXD(串行输出口)
P3.2 12 INT0(外部中断0)
P3.3 13 INT1(外部中断1)
P3.4 14 T0(定时器0外部输入)
P3.5 15 T1(定时器1外部输入)
P3.6 16 WR(外部数据存储器写脉冲)
P3.7 17 RD(外部数据存储器读脉冲)
2>、MCS-51单片机的片外总线结构
综合上面的描述可知,I/O口线都不能当作用户I/O口线。

除8051/8751外真正可完全为用户使用的I/O口线只有P1口,以及部分作为第一功能使用时的P3口。

如图,是MCS-51单片机按引脚功能分类的片外总线结构图。

由图我们可以看到,单片机的引脚除了电源、复位、时钟接入,用户I/O口外,其余管脚是为实现系统扩展而设置的。

这些引脚构成MCS-51单片机片外三总线结构,即:
①地址总线(AB):地址总线宽为16位,因此,其外部存储器直接寻址为64K字节,16位地址总线由P0口经地址锁存器提供8位地址(A0至A7);P2口直接提供8位地址(A8至A15)。

②数据总线(DB):数据总线宽度为8位,由P0提供。

③控制总线(CB):由P3口的第二功能状态和4根独立控制线RESET、EA、ALE、PSEN组成。

下表列出各个子系列的配制情况供读则参考。

芯片种类片内存储器中断源定时/计数器串行口电源消耗(mA)制造工艺
ROM/EPROM RAM
8051(8751,8031) 4K 128 5 2 同、异步方式,8位或10位可程序控制 125 HMOS
8052(8752,8032) 8K 256 6 3 同、异步方式,8位或10位可程序控制 100 HMOS
80C51(87C51,80C31) 4K 128 5 2 同、异步方式,8位或10位可程序控制 24 CHMOS
80C52(87C52,80C32) 8K 256 7 3 同、异步方式,8位或10位可程序控制 24 CHMOS
8044(8744,8344) 4K 192 5 2 S.L.U 200 HMOS
3>、控制部件
控制部件是单片机的神经中枢,它包括时钟电路、复位电路、指令寄存器、译码以及信息传送控制部件。

它以主振频率为基准发出CPU的时序,对指令进行译码,然后发出各种控制信号,完成一系列定时控制的微操作,用来控制单片机各部分的运行。

其中有一些控制信号线能简化应用系统外围控制逻辑,如控制地址锁存的地址锁存信号ALE,控制片外程序存储器运行的片内外存储器选择信号EA,以及片外取指信号PSEN
第三章电路原理分析与设计
一、硬件设计思想
●键盘采用4×4矩阵式键盘,P1口作为键盘的输入口。

●显示采用LCD显示
●报警声音由P3.6引脚控制
●错误指示灯由P3.7引脚控制
●电源与接地要做好片内外以及强弱电的隔离。

二、部分硬件方案论述
1键盘输入单元:
这是用户使用时将密码输入单片机内的输入设备,具体结构构成见图:
采用16个按键开关,分别代表0~D14个数字输入键位,一个确认键和一个取消键。

采取矩阵式键位设计,此举为减少对单片机的I/O 口的使用,同时也是的我们键盘的的外形更好看,使用更人性化。

键盘的行线和列现分别接80C51单片机的P1.0~P1.7八个端口。

对键盘的识别方式我们采取行扫描法。

具体使用由编程由单片机完成。

逐行(或列)扫描查询法,是一种最常用的按键识别方法,介绍过程如下。

1>、判断键盘中有无键按下。

将全部行线置低电平,然后检测列线的状态。

只要有一列的电平为低,则表示键盘中有键被按下,
而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。

若所有列线均为高电平,则键盘中无键按下。

2>、判断闭合键所在的位置。

在确认有键按下后,即可进入确定具体闭合键的过程。

其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。

在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。

若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

图键盘输入单元
2 显示单元:
此设备是用户使用密码防盗锁的的显示装置,是实现人机交换的重要设备。

用户通过它来观看键位数字的信息,了解已输入的密码个数,单片机通过它告知用户操作的正确与否,对用户的操作进行提示和引导。

图LCD显示器的基本结构和原理
LCD显示电路
A
1B
2Q 03Q 14Q 25Q 36Q 41
0Q 511Q 612Q 713C L K 8
M R
9IC1
A 1B
2Q 03Q 14Q 25Q 36Q 410
Q 511Q 612Q 7
13
C L K 8
M R 9IC2
A 1
B
2Q 03Q 14Q 25Q 36Q 41
0Q 511Q 612Q 713C L K 8
M R
9IC3A 1
B
2Q 03Q 14Q 25Q 36Q 410
Q 511Q 612Q 713C L K 8
M R
9IC4
A 1B
2Q 03Q 14Q 25Q 36Q 41
0Q 511Q 612Q 7
13
C L K 8
M R
9IC5
A 1
B
2Q 03Q 14Q 25Q 36Q 41
0Q 511Q 612Q 713C L K 8
M R
9IC6
1
2HEA DER212
HEA DER1
vcc
a
b f
c g
d
e D P Y
1234567a b c d e f g 8d
p d p
9LED 0
a
b f c
g d
e D P Y
1234567a b c d e f g 8
d
p d p
9LED 1
a
b f
c g
d
e D P Y
1234567a b c d e f g 8d
p d p
9LED 2
a
b f
c g
d
e D P Y
1234567a b c d e f g 8d
p d p
9LED 3
a
b
f c g
d
e D P Y
1234567a b c d e f g 8
d
p d p
9LED 4
a
b
f c g
d
e D P Y
1234567a b c d e f g 8d
p d p
9
LED 5
C
d1
d2
d3
LCD 模组是由控制器,驱动器,显示器三部份所组成,而目前
市面上LCD 的模组驱动/控制器都是由日制的HD44780控制器晶片
(或是相容产品),因此外部接脚的功能也都相同,这个控制器的内部共
有80 个位元组可供储存由外部送进来的资料,因此使用此款控器的
LCD模组最多一次可显示80个字HD44780中储存显示资料的80个位元组,称之为Display DataRAM(DDRAM),DDRA的位址从00H~67H,共80个Byte。

在LCD 上Show出资料DDRAM位址与可供显示位置的对应图
至于CPU如何将资料送给LCD显示的方法,是将欲显示的字元的ASCII 码写到LCD内部的DDRAM,LCD就会将这个自在其对应的位置显示出来.例如,若想在LCD 的左上角处(位址00h),显示’A’.就将ASCII码-41H,送到DDRAM 的00H 位址.
例:
3 报警电路模块:
此设备用于输出按键声、开锁提示声、操作错误提示声及报警声;由P3.6输出脉冲驱动喇叭发声,电路如图:
图报警电路模块
此模块为单片机提供时钟频率
图晶振电路
此模块用于实现密码锁的密码重置,复位电路接单片机的RST引脚,但复位键按下时,低电平使单片机复位,从而实现密码锁密码的重置。

图复位电路模块
6掉电存储单元
SCK:串行时钟端;
SDA:串行数据端,串行发送接收的数据从此引脚一位接一位输出输入
WP:写保护,当WP为高电平时存储器只读,当WP为低电平时,存储器可读可写。

AT24C02的WP引脚为测试脚,可接地处理。

A0,A1,A2:片选或块选。

7整体程序设计和程序流程
图总框图设计
1>、程序分为主程序和中断服务程序两个主要部分,主程序完成变量和单片机特殊功能寄存器的初始化后,进入一个循环结构。

在循环中,首先判断有无按键按下,若有则判断是数字键还是功能键,根据按键的情况执行相应的功能。

然后根据密码是否正确的判断情况,执行相应的操作。

循环中最后需要显示的内容通过动态扫描子在液晶显示器上显示。

中断服务程序需要实现待机计时5秒。

单片机采用MCS51系列的单片机8051作为主要主控制器,外围电路器件包括液晶显示驱动、蜂鸣器的驱动输出、独立式键盘和发光二极管的输出等。

2>、程序主要包括以下几个模块
1)、主程序模块——主要完成初始化、设置中断向量、检查有无按键按下、以及调用显示等等。

2)、键盘扫描及识别子程序——键盘采用查询方式,放于主程序中,当没有按键按下时,单片机循环主程序,当按键按下时便转向相应的子程序处理,处理结束后返回。

3)、掉电存储服务程序——当比较密码的时候,需要读取AT24C02程序,将存储于芯片内的数据读到RAM中,然后和输入密码相比较,当修改密码时需要把密码保存于24C02中。

4)、显示子程序——包括关闭状态显示子程序(dis-A)、开锁状态显示子程序(DIS-B)、密码输入及修改状态显示子程序(DIS-C)、密码输入错误报警状态子程序(DIS-D).
程序流程图
使用到的元器件列表
元器件规格和型号数量
单片机8051 1
LCD显示器LM016L 1
蜂鸣器SPEAKER 1
晶体振荡器CRYSTAL 1
可擦除存储芯片24C02C 1
按键开关BUTTON 16
电容CAP 3
电阻RES 4
发光二极管LED-RED,LED-GREEN 2
滑动变阻器POT 1
非门NOT 1
三极管Transistors 1
第四章程序设计
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
int pw_error,audio_out,cnt_state;
void key_scan();
uchar count0,count1,count3,num,n=0,temp,a,j,count4; uchar mima[4]; //初始密码存储区
uchar tab_key[50]; //输入密码存储区
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
bit enterflag; //确认键按下与否的标志
bit mimaflag; //密码正确与否的标志
bit xiugaiflag; //修改密码标志
bit enter1flag; //修改密码确认键标志
sbit red=P3^7;
sbit bell=P3^6;
sbit rs=P2^0;
sbit rw=P2^1;
sbit lcden=P2^2;
sbit green=P3^2;
sbit scl=P3^4;
sbit sda=P3^5;
uchar code table1[]="input the passco";
uchar code table2[]="de: --------";
uchar code table3[]="*";
uchar code table4[]="right (^_^) ";
uchar code table5[]="error!!!";
uchar code table6[]="define the passc";
uchar code table7[]="ode: --------";
uchar code table8[]="code is new";
uchar code table9[]="PASSWORD A OR B KEY";
//*********************************键盘消抖函数****************************
void delay1()
{ ;; }
void delay2(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//****************************e^2room的初始化*******************************
void start() //开始信号
{
sda=1;
delay1();
scl=1;
delay1();
sda=0;
delay1();
}
void stop() //停止
{
sda=0;
delay1();
scl=1;
delay1();
sda=1;
delay1();
}
//****************************应答信号*************************************
void respond()
{
uchar i;
scl=1;
delay1();
while((sda==1)&&(i<250))i++;
scl=0;
delay1();
}
//**********************************写字节操作函数*****************************
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<4;i++)
{
temp=temp<<1; //保持最高位,左移到进位CY
scl=0;
delay1();
sda=CY;
delay1();
scl=1;
delay1();
}
scl=0;
delay1();
sda=1;//总线释放
delay1();
}
//**********************************读字节操作函数**************************
uchar read_byte()
{
uchar i,k;
scl=0;
delay1();
sda=1;
delay1();
for(i=0;i<4;i++)
{
scl=1;
delay1();
k=(k<<1)|sda; //或运算,放到最低位
scl=0;
delay1();
}
return k;
}
//***********************************写地址函数***************************
void write_add(uchar address,uchar date)
{
start();
write_byte(0xa0);
respond();
write_byte(address);
respond();
write_byte(date);
respond();
stop();
}
//************************************读地址函数********************************
uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);
respond();
write_byte(address);
respond();
start();
write_byte(0xa1);
respond();
date=read_byte();
stop();
return date;
}
//**************************LCD1602的初始化********************************
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//*****************************密码比较函数*****************************************
bit mimacmp()
{
bit flag;
uchar i;
for(i=0;i<4;i++)
{
if(mima[i]==tab_key[i])
flag=1;
else
{
flag=0;
i=4;
}
}
return(flag); //返回flag
}
////**************************LCD显示函数开始**********************************************
void lcd_display()
{
uchar i=0;
write_com(0x80+0x40+4);
for(i=0;i<n;i++)
{
write_date(table3[0]);
}
}
//***********************************键盘功能分配函数群开始*********************************
//** 0 ** 4 ** 8 **修改(clr) **
//** 1 ** 5 ** 9 **修改密码键(a)**
//** 2 ** 6 ** 确认(en)**修改确认密码键(b)**
//** 3 ** 7 **
void key_manage1()
{
tab_key[n]=0;
n++;
if(xiugaiflag==1)
{
mima[count4]=0;
count4++;
}
}
void key_manage2() {
tab_key[n]=1;
n++;
if(xiugaiflag==1)
{
mima[count4]=1;
count4++;
}
}
void key_manage3() {
tab_key[n]=2;
n++;
if(xiugaiflag==1)
{
mima[count4]=2;
count4++;
}
}
void key_manage4() {
tab_key[n]=3;
n++;
if(xiugaiflag==1)
{
mima[count4]=3;
count4++;
}
}
void key_manage5() {
tab_key[n]=4;
n++;
if(xiugaiflag==1)
{
mima[count4]=4;
count4++;
}
}
void key_manage6() {
tab_key[n]=5;
n++;
if(xiugaiflag==1)
{
mima[count4]=5;
count4++;
}
}
void key_manage7() {
tab_key[n]=6;
n++;
if(xiugaiflag==1)
{
mima[count4]=6;
count4++;
}
}
void key_manage8() {
tab_key[n]=7;
n++;
if(xiugaiflag==1)
{
mima[count4]=7;
count4++;
}
}
void key_manage9()
{
tab_key[n]=8;
n++;
if(xiugaiflag==1)
{
mima[count4]=8;
count4++;
}
}
void key_manage10()
{
tab_key[n]=9;
n++;
if(xiugaiflag==1)
{
mima[count4]=9;
count4++;
}
}
//**********************************确认键*********************************************************** *
void key_manage11()
{
enterflag=1; //确认键按下
if(n==4) //只有输入4个密码后按确认才做比较
mimaflag=mimacmp();
else
mimaflag=0;
if(enterflag==1)
{
enterflag=0;
n=0;
//用FFFF清除已经输入的密码
for(count3=0;count3<4;count3++)
{
delay(5);
tab_key[count3]=0x0f;
}
TR1=1; //打开计数器
count1=0; //定时器1由50MS累计到1S所用的计数器 if(mimaflag==1)
{
a=0;
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table4[count3]); //密码正确,显示RIGHT,绿灯亮
green=0;
delay(5);
}
delay(1000);delay(1000);delay(1000);delay(1000);delay(1000) ;
write_com(0x01);write_com(0x80);
for(count3=0;count3<20;count3++)
{write_date(table9[count3]);}
}
else
{
n=0;
red=0;
// bell=~bell;
// delay(100) ;
a++;
if(a==3)
{
// for(count3=0;count3<8;count3++) //ffffffff清除密码
// {
// delay(5);
// tab_key[count3]=0x0f;
// }
write_com(0x01);
write_com(0x80);
for(count3=0;count3<9;count3++)
{
write_date(table5[count3]); //密码错误,显示 error,红灯亮
}
// {
green=1;
pw_error=0; //密码错误指示灯亮
bell=0; //长鸣声报警
delay(60000);
delay(60000);
delay(60000);
delay(60000);
delay(60000);
delay(60000);
delay(60000);
delay(60000);
delay(60000);
bell=1;
//-------------
TR1=1; //打开定时器计时
cnt_state=2; //下一状态处于15秒计时的状态 // }
delay(5);
// }
TR1=0;
}
}
}
}
void key_manage12()
{
tab_key[n]=11;
n++; //密码计数清零
}
//****************************************************取消键********************************************
void key_manage13()
{
n=0; //密码计数清零
write_com(0x80); //指针所指位置
for(count3=0;count3<16;count3++)
{
write_date(table1[count3]); //第一行显示INPUT THE PASSPORD:
delay(5);
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
write_date(table2[count3]); //开机显示--------
delay(5);
tab_key[count3]=0x0f; //用FFFF清除已经输入的密码}
}
//*******************************************修改密码键**********************************
void key_manage14()
{
uchar aa=0;
n=0;
xiugaiflag=1;
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table6[count3]); //显示define the password delay(5);
tab_key[count3]=0x0f; //用FFFF清除已经输入的密码
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
write_date(table7[count3]); //显示--------
delay(5);
}
TR0=1;
}
//********************************************修改密码键的确认键*****************************
void key_manage15()
{
n=0;
enter1flag=1;
if(enter1flag==1)
{
enter1flag=0;
count4=0;
for(count3=0;count3<16;count3++)
{
tab_key[count3]=0x0f; //用FFFF清除已经输入的密码
}
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table8[count3]);
delay(100);
}
TR1=1;
count1=0;
}
}
void key_manage16()
{
tab_key[n]=15;
n++;
}
//**********************************************定时器1的50MS,共延时1秒***********************
void time_1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(count1<20)
{
count1++;
}
else //计时到1S
{
TR1=0;
count1=0;
mimaflag=0;
red=1;
bell=1;
//显示FFFF
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table1[count3]); //显示PASSWORD A OR B KEY delay(5);
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
write_date(table2[count3]); //开机显示FFFF
delay(5);
}
}
}
//*************************************************定时0********************************************
void time_0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(count4<4)
{
key_scan();
}
else
{
TR0=0;
count4=0;
}
}
//初始化函数
void init() ////////////////////////////////////////// {
uchar i;
lcden=0;
write_com(0x38); //打开显示模式设置
write_com(0x0c); //打开显示,光标等等设置未零
write_com(0x06); //当读或写一个字符后地址指针加一,且光标加一,当写一个字符后整频显示左移
write_com(0x01); //清零指令
write_com(0x80); //指针所指位置
count0=0; //初始没有密码输入,故为零
enterflag=0; //没有确认键按下
mimaflag=0; //密码正确与否键先置零
red=1; //红灯不亮
//****************密码存入EPROM中******************************
sda=1;
delay(5);
scl=1;
delay(5);
for(i=0;i<8;i++)
{
write_add(i,8);
delay2(100);
}
for(i=0;i<8;i++)
{
mima[i]=read_add(i);
delay(5);
}
}
void main()
{
TMOD=0x11; //T0,T1工作方式1
TH0=(65536-2000)/256;
TL0=(65536-2000)%256; //T0初始化2MS
TH1=(65536-50000)/256;
TL1=(65536-50000)%256; //T1初始化50MS
TR1=0;
ET1=1;
EA=1;
TR0=0;
ET0=1;
rw=0;
init();
write_com(0x80); //指针所指位置
for(count3=0;count3<16;count3++)
{
write_date(table1[count3]); //第一行显示INPUT THE PASSPORD:
delay(5);
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
write_date(table2[count3]); //开机显示FFFF
delay(5);
}
while(1)
{
key_scan(); //调用键盘扫描函数
lcd_display();
}
}
//***************************************************键盘扫描函数开始******************************
void key_scan()
{
//*********扫描第一行**********
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:
key_manage1();
break;
case 0xde:
key_manage2();
break;
case 0xbe:
key_manage3();
break;
case 0x7e:
key_manage4();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
//**************************************************扫描第二行*********************************
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:
key_manage5();
break;
case 0xdd:
key_manage6();
break;
case 0xbd:
key_manage7();
break;
case 0x7d:
key_manage8();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
//**************************************************扫描第三行****************************
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:
key_manage9();
break;
case 0xdb:
key_manage10();
break;
case 0xbb:
key_manage11();
break;
case 0x7b:
key_manage12();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
//******************************************************扫描第四行*************************************
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:
key_manage13();
break;
case 0xd7:
key_manage14();
break;
case 0xb7:
key_manage15();
break;
case 0x77:
key_manage16();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
}
/** 0 ** 4 ** 8 **修改(clr) **
** 1 ** 5 ** 9 **修改密码键(a)**
** 2 ** 6 ** 确认(en)**修改确定密码键(b)**
** 3 ** 7 **/
第五章调试连接与测试
硬件调试方案:在设计平台中,将单片机的P1.01-P1.7分别与8个独立式键盘通过插线连接起来,将P2.0-P2.2分别与LCD液晶显示
器的控制引脚连接起来,P3.6与蜂鸣器的输入连接起来。

将编程输入软件调试。

第六章小结
通过这两周的学习,我感觉有很大的收获:首先通过学习使自己对课本上的知识可以应用于实际,使得理论与实际相结合,加深自己对课本知识的更好理解,并且在图书馆和网络中查阅资料,增加了许多课外知识,能对所学的软件学以致用。

这次课程设计让我充分认识到团队合作的重要性,只有分工协作才能保证整个项目的有条不絮。

让我树立了对知识的运用信心,并且提高了自己的动手实践操作能力,相信会对以后的学习工作有很大的帮助!虽然本次设计做的不是很顺畅,但是设计过程中所学到的东西是这次最大的收获和财富,使我终身受益!
参考文献
1、《新编单片机原理及应用》汪贵平李登峰龚贤武雷旭编著机械工业出版社
2、胡汉才,《单片机原理及其接口技术》,清华大学出版社,2004
3、康华光,《电子技术基础》,高等教育出版社,2001
4、蔡美琴,《MCS-51单片机原理与应用》高等教育出版社,1992
5、何利民,《单片机应用系统设计》,北京航空航天大学,1996
6、胡宴如,《模拟电子技术第一版》,高等教育出版社,2000。

相关文档
最新文档