c51电子密码锁程序代码终稿学位论文Word格式.docx
《c51电子密码锁程序代码终稿学位论文Word格式.docx》由会员分享,可在线阅读,更多相关《c51电子密码锁程序代码终稿学位论文Word格式.docx(39页珍藏版)》请在冰豆网上搜索。
#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)
功能:
系统初始化
说明:
对系统用的标志位和定时器进行初始化
入口参数:
无
返回值:
无
*****************************************************/
{
flag1=1;
signx=1;
flag=1;
//调用输入新密码提示标志位
mark=1;
//循环标志位
markx=1;
num=0;
//按键错误计数器
WriteToROM(O_Password,0,6);
TH0=0x3C;
TL0=0xB0;
//50ms定时初值
TH1=0x3C;
TL1=0xB0;
TMOD=0x11;
ET0=1;
TR0=0;
ET1=1;
TR1=0;
EA=1;
}
main()
主函数
对按键和显示进行控制
voidmain(void)
{
ucharKey_value;
Delay400Ms();
//启动等待,等LCM讲入工作状态
LCMInit();
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;
signx=1;
}
while(signx==1)
{
TR0=0;
//定时器0关,从先开始计时
TR0=1;
//定时器0开
P1=0xf0;
//P1口赋值,从而判断有无按键
if((P1&
=0xf0)
{
Key_value=Key_switch();
if(Key_value==65)//如果按键是"
A"
则输入密码
{
markx=1;
//显示密码输入正确或错误提示
while(mark==1)
{
Password_importation();
}
flag1=1;
signx=0;
//循环标志
if(Key_value==66)//如果按键是"
B"
则输入新密码
{
markx=0;
//不显示密码输入正确或错误提示
while(mark==1)//输入前比较秘密,密码正确进入新密码设置
{//密码错误退出密码设置
}
//-------------------------------
if(mark0!
=0)//mark0=1:
密码比较正确可以输入新密码
{//mark0=0:
密码比较错误不能输入新密码
mark=1;
//进入循环标志
{
NewPassword_set();
//新密码设置函数
}
mark=1;
//进入循环标志
while(mark==1)
{
NewPassword_set_again();
//再次输入密码
}
}
flag1=1;
signx=0;
mark0=1;
flag=1;
if(Key_value==67)//如果按键是"
C"
则密码复位
{
markx=0;
//不显示密码输入正确或错误提示
mark=1;
Password_importation();
}
=0)
Reset_success();
Delay1s();
sign=0;
WriteCurrent((uchar)sign,10);
//存入标志位
Reset_success();
}
}
else
Welcome_face();
mark=1;
mark0=0;
//是否输入新密码标志位
flag1=1;
WriteCommandLCM(0x0C,1);
//关光标显示
sign=(bit)ReadCurrent(10);
//密码比较标志位
if(num==3)//3次输入错误密码,系统锁定30min
ET1=1;
TR1=1;
//开定时器T1,定时30分钟
//=================================================24c02部分函数========================================
voidStart(void)
开始总线函数
启动I2C总线,即发送I2C起始条件
SDA=1;
//发送起始条件的数据信号
SCL=1;
_nop_();
SDA=0;
//发送起始信号
//起始条件锁定时间大于4us
SCL=0;
//钳住I2C总线准备发送或接受数据
voidStop(void)
结束总线函数
结束I2C总线,即发送I2C结束条件
//发送结束条件的数据信号
//发送I2C总线结束信号
//结束条件锁定时间大于4us
bitSend(ucharData)
发送一字节数据
向24c02中写入数据
Data
uchari;
bitack_bit;
for(i=0;
i<
8;
i++)//循环移入8个位
SDA=(bit)(Data&
0x80);
_nop_();
SCL=1;
SCL=0;
Data<
<
=1;
//读取应答
ack_bit=SDA;
returnack_bit;
//返回AT24Cxx应答位
voidWriteCurrent(ucharData,ucharAddress)
在指定地址Address处一个数据Data
在指定地址处写入一字节的数据
Data,Address
Start();
Send(AddWr);
Send(Address);
Send(Data);
Stop();
DelayMs(10);
//写入周期
voidWriteToROM(ucharData[],ucharAddress,ucharNum)
在指定地址Address处写入Num个数据Data[]
Data[],Address,Num
uchar*PData;
PData=Data;
for(i=0;
i<
Num;
i++)
Start();
Send(AddWr);
Send(Address+i);
Send(*(PData+i));
Stop();
DelayMs(10);
//写入周期
ucharRead(void)
读一字节数据
从24c02中读出数据
Read_data
unsignedchari,Read_data;
Send(AddRd);
i++)
Read_data<
Read_data|=(uchar)SDA;
return(Read_data);
ucharReadCurrent(ucharAddress)
从指定地址读一字节数据
Address
Read()
returnRead();
voidReadFromROM(ucharData[],ucharAddress,ucharNum)
从24C02中读出一字节的数据
在指定地址读取
**