单片机C语言程序设计课程设计-密码锁_第1页
单片机C语言程序设计课程设计-密码锁_第2页
单片机C语言程序设计课程设计-密码锁_第3页
单片机C语言程序设计课程设计-密码锁_第4页
单片机C语言程序设计课程设计-密码锁_第5页
已阅读5页,还剩30页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

课程设计()任务书

课程设计()题目:

单片机C语言程序设计课程设计

基本内容:利用实验室提供的实验仪器,自行选题设计一套硬件系统;采用单

片机C语言编写程序,使之成为完整的设备。

课程设计。专题部分:

题目:电子密码锁

基本内容:利用实验板上的LCD显示屏、24c02及8279等资源设计电子密码

锁系统,要求实现输入正确开锁,错误警告等相关功能。

学生接受课程设计()题目日期

第20周

指导教师签字:

20XX年7月18日

摘要

传统密码锁由于外形单一并容易人为损坏,以无法满足人们对安全日益增

长的需求。而电子密码锁因其具有使用方便,可靠性强,成本低廉,正逐步代替

传统密码锁,被广泛应用于安全领域。

本文设计了一种智能电子式密码锁,它以单片机为控制核心,配合输入模块,

显示模块及报警模块共同完成了密码服务。控制部分使用AT89c51单片机,其

价格低廉,功耗较低,配有足够的内部资源来完成电子密码锁的核心控制。使用

Intel公司的8279芯片,管理4*4键盘,作为密码输入及功能选择的输入模块。

显示模块利用RT12864LCD显示器,以更加友好的界面完成人机交互。而报警

模块利用led等及蜂鸣器提示密码输入情况,并完成危机报警功能。

电子密码锁功能丰富,正确输入密码时,可进入欢迎界面,进行功能选择,

如修改密码服务,可对原始通用密码进行修改,修改过程中需二次确认密码,两

次输入相同才可修改成功,防止了因用户手误造成无法再次进入系统。退出功能

保证用户在特殊情况卜.一键加锁,防止信息泄露。密码锁还配有三次报警功能和

超时报警功能,当三次输入错误或第一次输入错误后,5s内无法进入系统,密

码锁将进入自锁状态,防止他人暴力破解密码。

关键词:电子密码锁,单片机,24C02,LCD,RT12864Hz;

东北大学课程设计。目录

目录

参考文献

附录电子密码锁系统程序源代码

1

第1章绪论

1.1设计目的

(1)软件及硬件上进一步了解单片机的原理;

(2)掌握、运用C51语言编程,提升C51编程能力;

(3)熟练掌握RT12864液晶显示模块和8279键盘操作管理芯片;

(4)熟悉24co2掉电存储功能。

1.2设计意义

(1)深入了解了单片机C51语言的实际应用;

(2)通过独立思考,独立操作切实提高自己的编程能力;

(3)增强团队合作意识;

(4)运用所学知识发现问题、分析问题、解决问题;

1.3设计要求

根据实验室提供的实验箱、计算机等设备由我们自行设计了电子密码锁系

统,实现如下要求:

基本要求:采用24co2或IC卡,设置6位密码,最多比较3次,利用LED

灯显示密码输入正确与否。

(1)利用24co2或IC卡,设置6位密码;

(2)当密码输入正确后的密码后开锁,用红灯亮绿灯灭表示关锁,绿灯亮红

灯灭表示开锁;

(3)密码最多可以试输入三次,如果三次输入错误,红灯闪烁,并发报警警

报。

附加要求:

第一次输入密码与开锁的时间超过5s,红灯闪烁,并发报警警报。

-1-

第2章总体设计方案

2.1设计思路

本设计主要由单片机、4*4键盘、LCD液晶显示屏和密码存储等部分组成。

其中键盘用于输入数字密码和进行各种功能的实现。用户通过连接单片机的矩阵

键盘输入密码,后经过单片机对用户输入的密码与之前保存的密码进行对比,从

而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者蜂鸣报警电

路。

2.2系统设计总框图

图2.1系统设计总框图

・各模块功能如下

1、键盘输入控制模块:采用8279管理键盘输入,有效节省了I/O口的资源。

4*4键盘上的键分别用于密码输入和其他功能调月;

2、密码存储模块:芯片24co2用于完成密码的掉电存储,使密码断电后得

以保存;

3、LCD液晶显示模块:采用芯片RT12864Hz实现液晶显示功能,用于实

现友好的人机交互界面,提高了可读性,使用户对密码锁的运行情况一目了然;

4、蜂鸣报警电路模块:通过LED灯和压电蜂鸣器,对输错密码和输入超时

实行报警;

5、复位电路:完成系统的复位;

-2-

6、时钟电路:用于单片机的起振;

7、内部定时模块:利用内部定时器TO完成设计的附加要求。

-3-

第3章硬件电路设计及简要描述

3.1硬件设计原理图

硬件设计原理图如图3.1:

图3.1硬件设计原理图

3.2内部资源的使用

此设计中我们使用了单片机内部定时计数器TO提供计时功能,判断密码

输入是否超时,如果超时,系统将锁死。

8279的IRQ端经反向器与89C51的外部中断INTO相连接,判断是否有按

键按下,如果有按键按下,则处理器去执行相应的操作。

P1的P1.2和P1.3用于模拟24co2的双线通讯接口,P1.0和P1.1连接红绿

指示灯,通过控制其亮灭及闪烁状态,辅助显示密码输入情况。P1.4连接蜂鸣器,

用于密码锁锁死时的报警功能。

3.3单片机外围电路

3.3.1复位电路的设计

复位是单片机的初始化操作。单片机启动运行时,都需要先复位,起作用是

使CPU和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作。

-4-

但是单片机本身不能自动进行复位,必须配合外部电路才能实现。该复位电路采

用按键电平复位电路,当单片机在运行中,按下复位键SO后松开,在RST引脚

持续出现24个振荡周期的高电平信号使单片机复位,实现上电开关复位的操作。

如图3.2所示

3.3.2时钟发生电路设计

时钟电路为单片机产生时序脉冲,单片机所有运算与控制过程都是在同一的

时序脉冲驱动下进行的,当采用内部时钟时,连接方法如图3.3所示,在晶振引

脚XTALK19脚)和XTAL2(18脚)之间接一个6MHZ晶振,两个引脚对地分别再

接入一个电容即可产生所需的时钟信号,电容我们选取30pFo

图3.3时钟发生电路图

-5-

3.4密码锁控制电路

3.4.1键盘管理芯片8279

为了节省I/O口资源,我们没有使用传统的行扫描法管理键盘,而选择了

8279控制芯片,由8279读入键盘键值,用键值来控制程序的执行。8279芯片是

一种通用的可编程键盘、显示接口器件,能完成对64位按键和16位LED显示

器的管理⑴,但本次设计中没有使用LED功能。8279有多种功能和多种工作模

式,其功能和模式靠设定命令字来确定。8279的命令字近10种,在使用8279

之前,借鉴了实验的相关程序⑵以本文设计中的接线是:IRQ接INTO,采用中

断方式,ALE接CLK,

Ui__

<s

cam

OUYAJ

CUiTAJ

IMI

:5M;

!kx

图3.4键盘管理电路图

8279各端口地址分配如下:

-6-

N279命令口0x2070

8279数据I】0x2071

按键的操作面板如图3,5所示,共计10个数字键和6个功能键。

图3.5密码锁操作面板

【0】-49110个数字键用来输入密码,另外6个功能键分别是:【A】设

置新密码键、【C】清零键、【E】确定键和【F】退出键。其中清零键的功能是清

除当前输入的密码后重新输入。确认键的功能是确认当前输入的密码。设置新密

码键的功能是当密码输入正确时,可以重新修改密码。退出键的功能是退出到密

码输入界面。

表3.1按键功能表

按键键名功能说明

0-9数字键输入密码

A设置新密码键选择重置密码

C清零键密码清零

E确认键确认

F退出键退出

-7-

3.4.2LCD显示电路

由RT12864Hz,按键和保护电阻组成的外部扩展电路。其工作过程是通过

单片机P3.6/WR和P3.7/RD接于RT12864,采用并行数据通讯模式。

VCC

RTI2JCM

\D0750

l)l11

l)lJ2

l)lJ3

DI94

l)l15

DI

16

DI7

l)l3

LEDA

RMCSIFDB

RAV(SID)~

E(CLK)2

DM74LSOOJ

图3.6液晶显不电路图

LCD显示器各端口地址分配如下:

-8-

LO)写命令字地址0x2070

LCDn数树地址0x2071

ICO送状赤字地址0x2072

LCD读数据地址0x2073

图3.7LCD显示器各端口地址分配

3.4.3密码存储电路

因为考虑到密码锁的实际应用,要求掉电时密码不会丢失,所以密码不储存

在单片机的RAM里,而是储存在外面扩展的EEPROM里,因此本文选用

AT24C02芯片单片机通过串口通信。AT24C02是ATMEL公司生产的I2C串行

EEPROM芯片画5],存储量为256字节。AT24C02的操作时序符合标准的12c规

范。通过SCLK(时钟线)和SDA(数据线)两线分别与89c51的P1.2和P1.3

相连,对芯片进行读写操作。SCLK为时号,SDA传送双向数据信号。

GND

图3.8掉电存储电路图

3.4.4蜂鸣报警电路

按照题目的要求,当连续三次密码输入错误时,系统蜂鸣报警,我们采用实

验板上的压电式蜂鸣器,当PL4输出低电平时,三极管导通,蜂鸣器发音。

-9-

图3.9蜂鸣报警电路图

3.5元件清单

本次设计所用元件见表3.2

表3.2元件清单

器件名称数量

89C5I1个

82791个

6MHz晶振1个

RT12864Hz1个

74ALS1381个

74LS2451个

74LS5731个

741so01个

74LS081个

AT24C021个

电阻若干

按键18个

-10-

第4章软件程序设计

4.1程序流程图

根据设计要求,我们设计了如下的流程图,满足用户在任何时刻按下任何键

均有反应。

图4.1主程序流程图

说明:以上流程图仅显示了该密码锁的主要功能,一些具体功能的实现在后

文子程序中将做具体讲解。

-11-

4.2系统初始化

系统的初始化包括如下方面:

1、8279的扫描模式为编码扫描;

2、内部定时/计数器TO的设定;

3、液晶显示屏模式的设定。

4.3按键识别设计

在系统初始化并读取密码完成后,液晶显示界面1"状态:closed任意键输入

密码”,提示用户可以输入密码。此时程序即不断的扫描按键,检查是否有任意

键被按下。如果有,则开始输入密码,此时液晶屏显示界面2“密码:"在输入密码

的时候,难免有输入错误的时候,我们特此设计了清零键,当输入密码时,检测

到清零键的按下,我们将清除所有输入的密码,然后重新进入界面2重新输入密

码,在六位密码输入结束后,我们也设计了确定键,当检测到确定键按下时,开

始密码比较。具体的流程图如4.2所示

图4.2按键识别流程图

-12-

图4.3界面1

图4.4界面2

4.45s定时设计

根据该设计的附加要求“第一次输入密码与开锁的时间超过5s,红灯闪烁,

并发报警警报。我组对此的理解是在密码输入错误之后,重新输入密码到开锁

的时间不超过5so

利用89c51内部的定时器TO,用中断方式进行管理,初值在系统初始化时

已经设置好,采用定时器方式1,每次定时25ms,设置变量time,每次定时中

断,time自加,当第一次密码输入错误后,便打开定时器中断,只有在5s内开

锁成功,中断才关闭,否则将红灯闪烁并蜂鸣报警,显示为界面3。

-13-

超时锁死

图4.5界面3

4.5密码修改设计

为了丰富电子密码锁的功能,我们在完成设计的基本要求之外,额外增添了

密码修改功能。即当用户密码输入正确后,可以进入界面4——功能选择模块,

按下A键便可修改密码,此时显示界面5“新密码:”输入6位密码后按确定键,

这时显示界面6“再次输入:”,需要再次输入密码进行确认,若两次输入密码一

致,则显示“Succeeded”新密码便改好了,若前后两次输入不一致,则显示“Type

Error”,然后返回到功能选择界面4。

图4.6界面4

-14-

图4.7界面5

图4.8界面6

耨三次错误

图4.9界面7

-15-

参考文献

[1].Intel8279datesheet

[2].张志,高大志,杨为民等.微控制器原理及接口技术实验教程[M].沈阳:东

北大学出版社,20XX.

[3].闻绍飞.C51单片机实验指导书[M].沈阳:东北大学出版社,2000.

[4].马忠梅,籍顺心.单片机的C语言应用程序设计[M].北京:北京航空航天

大学出版社,20XX.

[5].李朝青.单片机原理及接口技术[M].北京:北京航空航天大学出版社,20XX.

-16-

附录电子密码锁系统程序源代码

#include<reg51.h>

#include<absacc.h>

#include<intrins.h>

/****************

**/

#dcfincc8279XBYTE[0x2021]//8279命令端口

#define(18279XBYTE[0x20XX]Z/8279数据端口

#definewcadXBYTE[0x2070]//led写命令端口

#definewdadXBYTE[0x2071]〃lcd写数据端口

#definers_adXBYTE[0x2072]//led读状态端口

#dcfincrdadXBYTE[Ox2073]//led读数据端11

J***********************************VariableStatement********.

sbitg_led=P1A0;〃绿灯

sbitr_lcd=P1A1;〃红灯

sbitSCL=P1A2;//24c()2时钟线

sbitSDA=P1A3;//24c02数据线

sbitalm=PlA4;//蜂鸣报警

unsignedcharbdataflag=Oxff;〃标志位变量

sbitkey_flag=flagA7;〃按键标志

sbitenter_flag=flagA6;//enter键标志

sbitperrflag=flagA5;〃密码错误标志

sbitterr_flag=flagA2;〃输入错误标志

sbitclrflag=flagA4;〃清除标志

sbitrc_flag=flagA3;〃返回退出标志

unsignedcharxdatapsave[6];〃存储的密码数组

unsignedcharxdatapinput[6];〃输入的密码数组

unsignedcharerr_nuin=O;〃密码输入错误次数

signedcharp_num=O;〃密码位数

unsignedcharerr;〃密码比较差值

unsignedcharbdatastatus;//led状态

sbitbusy=statusA7;//led忙状态

bdatachardata;//24c02读写数据

sbith_bit=_dataA7;//24c02读写数据高位

sbitl_bit=_dataAO;//24c02读写数据地位

unsignedchar;//8279读入键值

unsignedinttime=O;〃定时器中断计数

J***********************************FunctionStatement********

voidiniint(void);

-17-

voidini_8279(void);

voidIni_all(void);

voiddislst(void);

voidcstart(void);

voidcstop(void);

voidack(void);

voidsmove(chara);

voiddelay(inttime);

unsignedcharrd24c02(chara);

voidwr_24c()2(chara,charb);

voidledbusy(void);

voidinilcd(void);

voidpos(unsignedcharx,unsignedchary);

voiddis(unsignedcharx,unsignedchary,unsignedchar*s);

voidclr(void);

voidperr(void);

voiddiscntcr(void);

voidprst(void);

voidtmcrr(void);

voidread_key(unsignedchar*sr,unsignedcharx,unsignedchary,unsignedchar*s,unsignedchar

pos);

voidp_cinpr(unsignedchar*pwI,unsignedchar*pw2,unsignedcharflag);

voidintO(void)interrupt0using1

{

c8279=0x50;//读取FIFIRain命令

=d8279&0x0f;〃读取键值

if(=0x0c)

enter_flag=O;〃读入的是enter键

if(==0x0c)

clr_flag=();〃读入的是清除键

key_flag=0;

}

voidintTO(void)internipt1using2

(

TH0=(65536-50000)/256;

TL()=(65536-5()OOO)/256;〃定时初值,100ms

time++;〃定时中断计数

if(time=100)〃计数100次,到达10s

{

ET0=0;

tm_err();

-18-

,*********************»******interruptEnable***********************************

内部资源初始化程序*

*****************************************************************************;

voidiniint(void)

EA=1;

EXO=I;

ETO=1;〃开中断

TMOD=OxOI;〃定时器模式

TH0=(65536-50000)/256;

TL0=(65536-50000)/256;〃定时器初值

PTO=1;〃中断优先级,TO最高

Initializing************************************

整体初始化程序*

京******************************京********率*****************京*京******************

**/

voidIniall(void)

|

clr();

inijcd();//led初始化

ini_8279();//8279初始化

ini_int();〃内部资源初始化

keyflag=1;〃按键标志位初始化

**拿************************孝*******

,**********车********京*》*******,1enu1Display

显示初始界面*

**********************«******************************************************/

voiddisIst(void)

dis(0』状态:closed");〃调用字符串显示程序

dis(0,2J任意键输入密码”);

***********************************

显示姓名

-19-

********察********木************************************************************J

voiddisname(void)

{dis(O』J");〃调用字符串显示程序

dis(0,2,",");

/*****************************8279Initializing*****今******************************

8279初始化

*****************木*************************************************本**********/

voidini_8279(void)

{

c8279=0x00;//编码扫描方式

/*********************»**********)“0)Sfd************************************

24C02启动程序*

voidcstart(void)

|

SCL=0;

_nop_();

SDA=1;

_nop_();

SCL=1;

_nop_();

SDA=0;

_nop_();

SCL=0;

_nop_();〃两线产生下降沿

,*********************************)4C0)stop************************************

*24c02停止程序

************************************************»*****************************/

voidc_stop()

SCL=0;

,nop_();

SDA=0;

_nop_();

SCL=1;

-20-

_nop_();

SDA=1;〃两线产生上升沿

_nop_();

SCL=O;

_nop_();

j*********************》*******RespondFunction****x*****************************

*24co2应答等待程序*

*****************************************************************************/

voidack()

while(SDA);〃等待24co2应答

SCL=0;

_nop_();

24c02串行输出移位程序*

a:移位写入的字符*

******************************************************************************/

voidsmove(chara)

(

dataunsignedchari;

_data=a;

fbr(i=0;i<8;i++)//8位逐位写入

{

SCL=0;

SDA=h_bit;

SCL=1;

_data=_data*2;〃左移一位

}

SCL=0;

_nop_();

SCL=1;

_nop_();〃上升沿

,*********************»*******De]avFunction************************************

延迟程序

******************************************************************************/

voiddclay(unsigncdinttime)

inti;

-21-

fbr(i=O;i<=time;i++)

i=i;

/*********************»*****ReadDataFrom24C02*******************************

*从24c()2读数据*

*******************************************************************************

*/

unsignedcharrd_24c02(chara)

dataunsignedchari,mand;

c_start();〃启动24co2

mand=0xa();

smove(niand);〃送写入指令

ack();〃等待应答

s_movc(a);〃写入寄存糊号

ack();

c_start();

mand=0xa1;

sinove(mand);〃送读取指令

ack();

SDA=1;

for(i=0;i<8;i++)〃逐位读取数据

_data=_data*2;〃左移一位

SCL=0;

_nop_();

SCL=1;

_nop_();

l_bit=SDA;〃最低位写入

c_stop();

rcturn(_data);〃返回读取的数据

)

,*******************京*》*****WriteDatato24co2**********************************

*送24c02数据

******孝***************冬*本******拿************木*************拿********木*京********/

voidwr_24c02(chara,charb)

unsignedchardatamand;

cstart();〃启动24c02

-22-

mand=OxaO;

sinove(mand);〃写入指令

ack();

s_move(a);〃写入寄存器号

ack();

sinove(b);〃写入数据

ack();

c_stop();

_nop_();

}

*宰************************LCDbusyfunction***********************************

*LCD忙状态检测程序

************************************************》*****************************/

voidlcdbusy(void)

{

do

{

status=rs_ad;〃读取LCD状态,最高位判断是否忙

}

while(busy);

/*********************才*********LCDInitializing**********************************

LCD初始化

**********************冬**********木*********************************************

*♦/

voidinilcd(void)

{

ledbusy();

wc_ad=0x30;

ledbusy();

wc_ad=0x()C;

ledbusy();

wc_ad=0x()1;

lcd_busy();

wc_ad=0x02;

lcd_busy();

-23-

,*********************LQPDisplayPositionFunction*******************************

*LCD显示位置指令写入程序*

*x:字符串显示位置x坐标;y:字符串显示位置y坐标*

*******************************************************************************

**

voidpos(unsignedcharx,unsignedchary)

unsignedchartemp;

switch(y)〃判断显示的行数

case1:

temp=0;

break;

case2:

tcmp=2;

break;

case3:

temp=1;

break;

case4:

tcmp=3;

ledbusy();

wc_ad=0x80+temp*0x08+x;〃计算指令代码,写入位置指令

/*********************»*********LCDDisplayFunction****************************

*LCD显示程序*

*x:字符串显示位置x坐标;y:字符串显示位置y坐标

*S:显示的字符串

**************************本****************************************************

**/

voiddis(unsignedcharx,unsignedchary,unsignedchar*s)

pos(x,y);〃显示位置指令写入

lcd_busy();

while(*s!=O)〃字符串是否结束

wd_ad=*s;〃写入一个字符

s++;〃指向下一个字符

-24-

/*********************»**********LCDClearFunction******************************

*LCD屏幕清除程序*

*******************************************************************************

**/

voidclr(void)

(

wc_ad=0x01;

lcd_busy();〃写入清除命令,等待写入结束

密码错误服务程序

**********************拿********************************************************

**/

voidperr(void)

clr();

g_lcd=1;

r_led=0;〃密码错误,绿灯灭,红灯亮

dis(2,2,"failed");〃输入错误

delay(0x6000);

clr();

if^err_num!=2)

dis((),2,"PleaseRcEntcr1'):〃如果没到3次输入,提示宜新输入

delay(0x6000);

clr();

/*********************»*************TimcQut**********************************

*超时服务程序*

*超时,系统锁死”

******************************************************************************/

voidtm_err(void)

charj;

clr();

-25-

dis(2,2,”超时锁死)〃显示超时

alm=O;〃蜂鸣报警

fbr(j=0J<=5;j++)〃红灯闪烁,持续报警

{

r_lcd=-r_lcd;

delay(0x2a00);

}

alm=l;〃报警结束

EA=O;〃关中断

whilc(l);〃系统自锁死

J********************************We\QScreen*********************************

*欢迎界面显示程序*

*用户选择功能*

*******************************************************************************

**/

voiddiscntcr(void)

dis(O,l,“状态:open");

dis(0,2,”A:修改密码

dis(0,3,”F:锁闭)

,*********************»***********PasswordReset**"****************************

密码重置程序:*

***************木*************************************************************

**/

voidprst(void)

(

unsignedcharxdatapinputs[6];〃临时存取确认的密码

key_flag=l;

clr();

业(。1”新密码:");〃显示界面,输入新密码

read_key(pinpul,O,l,"新密码:",2);〃第一次读密码

while(enterflag);〃等待确认

cntcr_flag=1;

clr();〃清屏

由5(1,1,"再次输入:");〃显示界面,确认密码

read_key(pinputs,1,1J再次输入:”,2);〃第二次读确认密码

-26-

while(enterflag);〃等待确认

cntcr_flag=1;

p_cmpr(pinputs,pinput,l);〃比较两次输入密码

if(terr_flag==O)〃正确

{

fbr(pnum=O;pnum<=5;pnum")

{

wr_24c02(p_num,pinput[p_num]);〃存入新密码

dclay(500);

}

clr();

dis(l,2,"Succeeded");〃成功更改

delay(OxaOOO);

}

else〃两次输入不同

{

clr();

dis(1,2,"Error");〃输入错误

delay(OxaOOO);〃显示延迟

clr();〃清屏

terr_flag=O;

密码读取程序:*

s:界面显示字符串;x:界面显示位置x坐标;y:界面显示位置y坐标*

sr:密码存储位置;pos:显示密码星号起始位置x坐标*

**********************&********************************************************

**/

voidread_key(unsignedchar*sr,unsignedcharx,unsignedchary,unsignedchar*s,unsignedchar

pos)

(

fbr(p_num=0;p_num<=5;p_nuni++)〃逐位读取密:码

(

key_flag=l;〃按键标志位置为

if(enter_fiag==l)〃如果上次输入不是enter键

(

while(key_flag);//等待数字键

-27-

key_flag=1;

if(p_num%2==0)〃显示星号

dis(pos+p_num/2,2,"*");

else

dis(pos+p_num/'2,2,

}

sr[p_num]=;〃读入一位密码

if(clr_flag==O)〃如果是清零键

(

clr();〃清屏

dis(x,y,s);//重新显示界面

clr_flag=I;

p_num=-l;〃密码重新逐位输入

密码比较程序:*

pwl:密码I数组;pw2:密码2数组;

*flag:标志位(():输入密码1:重置密码)*

*************************************************************;

**/

voidp_cmpr(unsignedchar*pwl,unsignedchar*pw2,unsignedcharflag)

fbr(p_nuni=0;p_nuin<=5;p_nuin-H-)

{

crr=pwI[p_num]-pw2[p_num];〃密码逐位比较

if(err==0)〃密码正确

{

iRflag==0)〃输入密码正确,相应标志位清零

perr_flag=O;

else〃确认密码正确,相应标志位清零

terrflag=O;

)

else〃密码错误

{

if!flag==O)〃输入密而错误,相应标志位置位

pcrr_flag=1;

else〃确认密码错误,相应标志位置位

terr_flag=l;

-28-

主程序

*******************************************************************************

voidmain(void)

(

char1;

Ini_all();//初始化

reflag=O;

dis_name();〃显示姓名

key_flag=l;

whilc(kcyflag);

kcy_flag=l;

clr();

while(re_flag==O)

{

g_led=I;

r_led=0;

time=0;//定时中断计数清零

for(p_num=0;p_nuni<=5;p_num++)〃读取6位存储的密码

(

psave[p_num]=rd_24c02(p_num);〃读取24c02中的密码

dclay(500);

}

dis_lst();//显示初始界面

kcy_flag=1;

while(key_flag);〃任意键按下

kcy_flag=l;

clr(X//有键按下,清屏,进入下一界面

fbr(err_num=0;en_num<=2;eir_num-H-)〃最多3次重新输入

(

dis(0,2J密码:");〃提示输入密

温馨提示

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

评论

0/150

提交评论