基于89C51电子密码锁设计程序.docx
《基于89C51电子密码锁设计程序.docx》由会员分享,可在线阅读,更多相关《基于89C51电子密码锁设计程序.docx(39页珍藏版)》请在冰豆网上搜索。
![基于89C51电子密码锁设计程序.docx](https://file1.bdocx.com/fileroot1/2023-2/1/935d8dd4-1dee-4828-aec6-f3a178468cc4/935d8dd4-1dee-4828-aec6-f3a178468cc41.gif)
基于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
返回值:
无
**************