基于89C51电子密码锁设计程序.docx

上传人:b****6 文档编号:8936607 上传时间:2023-02-02 格式:DOCX 页数:39 大小:25.34KB
下载 相关 举报
基于89C51电子密码锁设计程序.docx_第1页
第1页 / 共39页
基于89C51电子密码锁设计程序.docx_第2页
第2页 / 共39页
基于89C51电子密码锁设计程序.docx_第3页
第3页 / 共39页
基于89C51电子密码锁设计程序.docx_第4页
第4页 / 共39页
基于89C51电子密码锁设计程序.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

基于89C51电子密码锁设计程序.docx

《基于89C51电子密码锁设计程序.docx》由会员分享,可在线阅读,更多相关《基于89C51电子密码锁设计程序.docx(39页珍藏版)》请在冰豆网上搜索。

基于89C51电子密码锁设计程序.docx

基于89C51电子密码锁设计程序

/*=================================================================================

密码锁控制

==================================================================================/

/*连接线图:

---------------------------------------------------

|LCM-----51 |LCM-----51  | LCM------51|

|-----------------------------------------------|

|DB0-----P0.0|DB4-----P0.4|RS-------P2.0|

|DB1-----P0.1|DB5-----P0.5|RW-------P2.1|

|DB2-----P0.2|DB6-----P0.6|E--------P2.2|

|DB3-----P0.3|DB7-----P0.7|VLCD接1K电阻到GND|

---------------------------------------------------

接口说明:

1.P1口:

4x4矩阵键盘

2.P2.4工作指示灯

3.P2.5继电器控制端

4.P3.7蜂鸣器控制端

5.P3.324c02时钟端SCL

6.P3.424c02数据端SDA

/*接盘按键说明:

--------------------------------------------------

|1|2|3|A|

-------------

|4|5|6|B|

-------------

|7|8|9|C|

-------------

|*|0|#|D|

--------------------------------------------------

[注:

AT89S51使用12M晶振]

==========================定义与申明=============================================================*/

#include"regx52.h"

#include"string.h"

#include"intrins.h"

#defineucharunsignedchar

#defineuintunsignedint

//***********引脚定义引脚

#defineLCM_RSP2_0//数据/命令选择信号

#defineLCM_RWP2_1//读/写选择信号

#defineLCM_EP2_2//使能信号

#defineWLEDP2_4//工作指示灯

#defineRELP2_5//继电器

#defineBELLP3_7//蜂鸣器

#defineSCLP3_3//模拟I2C串行时钟控制

#defineSDAP3_4//模拟I2C串行数据传输

#defineLCM_DataP0//显示数据端口

#defineAddWr0xa0//"10100000B"器件地址选择及写标志

#defineAddRd0xa1//"10100001B"器件地址选择及读标志

//控制字格式:

/*-----------

1010A2A1A0R/W

-----------*/

/*注:

1.前4位为I2C总线特征编码:

1010

2.A2A1A0为24c02的地址

3.R/W=0:

表示写入;R/W=1:

表示读出*/

//***********变量定义

#defineBusy0x80//用于检测LCM状态字中的Busy标识

ucharCount,num;//计数器

uintcon_30m;//30min计数器

ucharcon_20s;//10s计数器

bitflag,mark,sign,mark0;//常用标志位

bitflag1;//Choice_menu()调用标志

bitsignx;//循环标志

bitmarkx;

//************数组定义

ucharcodeO_Password[]={0x30,0x30,0x30,0x30,0x30,0x30};//原始密码"000000"

uchardataN_Password[]={0x00,0x00,0x00,0x00,0x00,0x00};//新密码

uchardataT_Password[]={0x00,0x00,0x00,0x00,0x00,0x00};//输入密码暂存

//***********函数声明

voidStart(void);//开始总线函数

voidStop(void);//结束总线函数

ucharRead(void);//读一字节数据

bitSend(ucharData);//发送一字节数据

ucharReadCurrent(ucharAddress);//从指定处读出一字节

voidWriteCurrent(ucharData,ucharAddress);//在指定地址处写入一字节

voidReadFromROM(ucharData[],ucharAddress,ucharNum);//从指定地址读出Num个数据

voidWriteToROM(ucharData[],ucharAddress,ucharNum);//从指定地址写入Num个数据

ucharReadStatusLCM(void);//读状态

voidLCMInit(void);//LCM初始化

voidWriteDataLCM(ucharWDLCM);//写数据

voidWriteCommandLCM(ucharWCLCM,BuysC);//写指令

voidDisplayOneChar(ucharX,ucharY,ucharDData);//按指定位置显示一个字符

voidDisplayListChar(ucharX,ucharY,ucharcode*DData);//按指定位置显示一串字符

voidPasswordComparison(bitmark);//密码比较

voidScan_starnumber(void);

voidDelay5Ms(void);//5ms延时

voidDelay400Ms(void);//400ms延时

voidDelay1s(void);//1s延时

voidDelay_bell(void);//蜂鸣器发音延时

voidDelayMs(ucharms);//延时

ucharKey_scan(void);//按键扫描

ucharKey_switch(void);//按键转换函数

voidChoice_menu(void);//选择菜单界面

voidReset_success(void);//复位成功提示

voidPass_face(void);//密码输入提示

voidPassword_OK(void);//密码输入正确提示

voidWelcome_face(void);//欢迎界面

voidPassword_ERROR(void);//密码输入错误提示

voidPassword_importation(void);//密码输入

voidNewPassword_face(void);//输入新密码提示

voidNewPassword_again(void);//再次输入新密码提示

voidNewPassword_set(void);//新密码输入

voidNewPassword_set_again(void);//再次输入新密码

voidNewpassword_OK(void);//新密码设置成功提示

voidNewpassword_ERROR(void);//新密码设置失败提示

voidNewpassword_comparison(void);//新密码设置比较

voidBeep(void);//蜂鸣器发音

voidLed_hint(void);//LED工作指示

//==========================================主函数部分==================================================

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

函数名:

voidclearmen(void)

功能:

系统初始化

说明:

对系统用的标志位和定时器进行初始化

入口参数:

返回值:

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

voidclearmen(void)

{

flag1=1;//Choice_menu()调用标志

signx=1;//循环标志

flag=1;//调用输入新密码提示标志位

mark=1;//循环标志位

markx=1;

num=0;//按键错误计数器

WriteToROM(O_Password,0,6);

TH0=0x3C;TL0=0xB0;//50ms定时初值

TH1=0x3C;TL1=0xB0;//50ms定时初值

TMOD=0x11;ET0=1;TR0=0;ET1=1;TR1=0;EA=1;

}

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

函数名:

main()

功能:

主函数

说明:

对按键和显示进行控制

入口参数:

返回值:

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

voidmain(void)

{

ucharKey_value;

Delay400Ms();//启动等待,等LCM讲入工作状态

LCMInit();//LCM初始化

Delay400Ms();

clearmen();//系统初始化

while

(1)

{

P1=0xf0;

if(((P1&0xf0)!

=0xf0)&(flag1==1)&(num<3))//有键按下

{

Key_value=Key_switch();//按键扫描

if(Key_value!

=0)//的确有键按下

{

Choice_menu();//调用选择程序

flag1=0;//Choice_menu()调用标志

signx=1;//循环标志

}

while(signx==1)

{

TR0=0;//定时器0关,从先开始计时

TR0=1;//定时器0开

P1=0xf0;//P1口赋值,从而判断有无按键

if((P1&0xf0)!

=0xf0)

{

Key_value=Key_switch();//按键扫描

if(Key_value==65)//如果按键是"A",则输入密码

{

markx=1;//显示密码输入正确或错误提示

while(mark==1)

{

Password_importation();//密码输入

}

flag1=1;//Choice_menu()调用标志

signx=0;//循环标志

}

if(Key_value==66)//如果按键是"B",则输入新密码

{

markx=0;//不显示密码输入正确或错误提示

while(mark==1)//输入前比较秘密,密码正确进入新密码设置

{//密码错误退出密码设置

Password_importation();//密码输入

}

//-------------------------------

if(mark0!

=0)//mark0=1:

密码比较正确可以输入新密码

{//mark0=0:

密码比较错误不能输入新密码

mark=1;//进入循环标志

while(mark==1)

{

NewPassword_set();//新密码设置函数

}

mark=1;//进入循环标志

while(mark==1)

{

NewPassword_set_again();//再次输入密码

}

}

flag1=1;//Choice_menu()调用标志

signx=0;//循环标志

mark0=1;

flag=1;

}

if(Key_value==67)//如果按键是"C",则密码复位

{

markx=0;//不显示密码输入正确或错误提示

mark=1;//进入循环标志

while(mark==1)

{

Password_importation();

}

if(mark0!

=0)

{

Reset_success();

Delay1s();

Delay1s();

WriteToROM(O_Password,0,6);

sign=0;

WriteCurrent((uchar)sign,10);//存入标志位

Reset_success();

}

}

}

}

}

else

{

Welcome_face();//欢迎界面

mark=1;//循环标志

mark0=0;//是否输入新密码标志位

flag1=1;//Choice_menu()调用标志

WriteCommandLCM(0x0C,1);//关光标显示

sign=(bit)ReadCurrent(10);//密码比较标志位

}

if(num==3)//3次输入错误密码,系统锁定30min

{

ET1=1;TR1=1;//开定时器T1,定时30分钟

}

}

}

//=================================================24c02部分函数========================================

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

函数名:

voidStart(void)

功能:

开始总线函数

说明:

启动I2C总线,即发送I2C起始条件

入口参数:

返回值:

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

voidStart(void)

{

SDA=1;//发送起始条件的数据信号

SCL=1;

_nop_();

_nop_();

SDA=0;//发送起始信号

_nop_();//起始条件锁定时间大于4us

_nop_();

_nop_();

_nop_();

SCL=0;//钳住I2C总线准备发送或接受数据

}

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

函数名:

voidStop(void)

功能:

结束总线函数

说明:

结束I2C总线,即发送I2C结束条件

入口参数:

返回值:

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

voidStop(void)

{

SDA=0;//发送结束条件的数据信号

_nop_();

_nop_();

SCL=1;//发送I2C总线结束信号

_nop_();//结束条件锁定时间大于4us

_nop_();

_nop_();

_nop_();

SDA=1;

}

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

函数名:

bitSend(ucharData)

功能:

发送一字节数据

说明:

向24c02中写入数据

入口参数:

Data

返回值:

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

bitSend(ucharData)

{

uchari;

bitack_bit;

for(i=0;i<8;i++)//循环移入8个位

{

SDA=(bit)(Data&0x80);

_nop_();

SCL=1;

_nop_();

_nop_();

SCL=0;

Data<<=1;

}

SDA=1;//读取应答

_nop_();

_nop_();

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

ack_bit=SDA;

SCL=0;

returnack_bit;//返回AT24Cxx应答位

}

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

函数名:

voidWriteCurrent(ucharData,ucharAddress)

功能:

在指定地址Address处一个数据Data

说明:

在指定地址处写入一字节的数据

入口参数:

Data,Address

返回值:

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

voidWriteCurrent(ucharData,ucharAddress)

{

Start();

Send(AddWr);

Send(Address);

Send(Data);

Stop();

DelayMs(10);//写入周期

}

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

函数名:

voidWriteToROM(ucharData[],ucharAddress,ucharNum)

功能:

在指定地址Address处写入Num个数据Data[]

说明:

在指定地址处写入一字节的数据

入口参数:

Data[],Address,Num

返回值:

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

voidWriteToROM(ucharData[],ucharAddress,ucharNum)

{

uchari;

uchar*PData;

PData=Data;

for(i=0;i

{

Start();

Send(AddWr);

Send(Address+i);

Send(*(PData+i));

Stop();

DelayMs(10);//写入周期

}

}

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

函数名:

ucharRead(void)

功能:

读一字节数据

说明:

从24c02中读出数据

入口参数:

返回值:

Read_data

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

ucharRead(void)

{

unsignedchari,Read_data;

Start();

Send(AddRd);

for(i=0;i<8;i++)

{

SCL=1;

Read_data<<=1;

Read_data|=(uchar)SDA;

SCL=0;

}

Stop();

return(Read_data);

}

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

函数名:

ucharReadCurrent(ucharAddress)

功能:

从指定地址读一字节数据

说明:

从24c02中读出数据

入口参数:

Address

返回值:

Read()

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

ucharReadCurrent(ucharAddress)

{

Start();

Send(AddWr);

Send(Address);

returnRead();

}

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

函数名:

voidReadFromROM(ucharData[],ucharAddress,ucharNum)

功能:

从24C02中读出一字节的数据

说明:

在指定地址读取

入口参数:

Data[],Address,Num

返回值:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1