您的位置 首页 新品

LCD1602密码锁规划

密码锁说明:(KT实验板调试成功)本密码锁是利用8051单片机的控制结合1602LCD,设计的一个微电脑LCD密码锁,可以用在需要密码输入的场合…

暗码锁阐明:(KT试验板调试成功)

本暗码锁是运用8051单片机的操控结合1602LCD,规划的一个微电脑LCD暗码锁,能够用在需求暗码输入的场合中,例如要当门禁用时,需求实践合作电子门锁。也能够规划在稳妥中做暗码锁操控中。本暗码锁运用的常识主要有:
1. 8051 4×4矩阵键盘扫描输入
2. 1602 LCD显现
3. 暗码比较处理的规划办法
4. 守时器的运用
5. 24cxxx的运用等

功用阐明:

1. 运用LCD显现器来显现暗码输入的相关音讯及提示
2. 能够设置6位数字(0-9)暗码
3. 内定另一组数字暗码为:000000
4. 暗码输入正确则继电器发动2s
5. 暗码输入正确或过错都有相应的声响提示
6. 暗码输入3次过错,体系将主动确定,30分钟内禁绝运用,30分钟后主动敞开
7. 暗码输入时,假如在10秒内没有按键,表明抛弃本次输入,则主动跳出暗码输入状况,进入欢迎界面
8. 能够修正暗码或用原始暗码
9. 断电后暗码依然存在(保存在24c02中)
10.具有按键复位功用

硬件衔接:

/*1602 LCD衔接线图:
—————————————————
| 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口: 4×4矩阵键盘
2. P2.4 作业指示灯
3. P2.5 继电器操控端
4. P3.7 蜂鸣器操控端
5. P3.3 24c02时钟端
6. P3.4 24c02数据端
/*接盘按键阐明:
————————————————–
| 1 | 2 | 3 | A |
– – – – – – – – – – – – –
| 4 | 5 | 6 | B |
– – – – – – – – – – – – –
| 7 | 8 | 9 | C |
– – – – – – – – – – – – –
| * | 0 | # | D |
————————————————–
注:A–表明输入暗码
B–表明设置新暗码
C–复位端口

附加阐明:

1. LCD1602驱动———–明皓
2. 4×4键盘扫描———–KT学习归纳试验源程序
3. 暗码比较原理———-8051单片机课程规划实训教材
4. 24C02的读写操作——-伟纳电子ME300B单片机开发体系演示程序

zhaojun 2007/10/1

zhaojun_xf@163.com

部分代码:

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

/*****************************************************
函 数 名:void clearmen(void)
功 能:体系初始化
说 明:对体系用的标志位和守时器进行初始化
进口参数:无
返 回 值:无
*****************************************************/
void clearmen(void)
{
flag1= 1; // Choice_menu()调用标志
signx= 1; // 循环标志
flag = 1; // 调用输入新暗码提示标志位
mark = 1; // 循环标志位
num = 0; // 按键过错计数器
TH0=0x3C;TL0=0xB0; // 50ms守时初值
TH1=0x3C;TL1=0xB0; // 50ms守时初值
TMOD=0x11;ET0=1;TR0=0;ET1=1;TR1=0;EA=1;
}

/*****************************************************
函 数 名:main()
功 能:主函数
说 明:对按键和显现进行操控
进口参数:无
返 回 值:无
*****************************************************/
void main(void)
{

uchar Key_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”,则输入暗码
{
while(mark==1)
{
Password_importation(); // 暗码输入
}
flag1=1; // Choice_menu()调用标志
signx=0; // 循环标志
}
if(Key_value==66) // 假如按键是”B”,则输入新暗码
{
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; // 循环标志
}
}
}
}
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分钟
}
}
}

//========================================== 暗码操控部分 ==================================================

/*****************************************************
函 数 名:void NewPassword_set_again(void)
功 能:第2次输入暗码
说 明:第2次输入暗码并存入暂存器,再调用比较程序
进口参数:无
返 回 值:无
*****************************************************/
void NewPassword_set_again(void)
{
bit sign1;
uchar key_data;
P1=0xf0; // 判别是否有键按下
if(flag==1)
{
NewPassword_again(); // 显现暗码输入界面
Delay400Ms();
flag=0; // 调用输入新暗码提示标志位
Count=0; // 按键次数计数器置0
Delay400Ms();
}
if((P1&0xf0)!=0xf0) // 判别是否有键按下
{
key_data=Key_switch(); // 调用按键转化程序
if((key_data!=0)&(key_data!=65)&(key_data!=66)&(key_data!=67)&(key_data!=68)&(key_data!=35)&(key_data!=42))
{//按键不能为数字(0~9)以外.A B C D # *
Count++; // 按键次数器加1
Led_hint(); // 按键指示
Beep(); // 按一下键发一音
sign1=1; // 有键按下标志位
}
}
if((sign1==1)&(flag==0)) // 有键按下
{
Scan_starnumber(); // 在暗码显现区显现” ****** “
sign1=0; // 按键标志位清0
T_Password[Count-1]=key_data; // 按键值放入暗码暂存器
}
if(Count==6) // 6次按键则进行暗码比较
{
Count=0; // 计算清0,从先计数
flag =1; // 调用输入新暗码提示标志位
mark =0; // 循环标志位
WriteCommandLCM(0x0C,1); // 关光标显现
Newpassword_comparison(); // 新暗码设置比较
}
}

/*****************************************************
函 数 名:void Newpassword_comparison(void)
功 能:第2次输入暗码比较
说 明:对第一次输入的暗码与第2次输入的暗码进行比较
进口参数:无
返 回 值:无
*****************************************************/
void Newpassword_comparison(void)
{
uchar Number=0;
while((T_Password[Number]==N_Password[Number])&(Number<6))// 暗码比较
{
Number++; // 计数值加1
}
if(Number>=6) // 暗码正确
{
Newpassword_OK(); // 新暗码设置成功提示
WriteToROM(T_Password,0,6); // 暗码设置成功,则把暗码存入24c02中
sign =1; // 比较新暗码标志
WriteCurrent((uchar)sign,10); // 存入标志位
Delay400Ms();
Beep(); // 正确提示音
Delay400Ms();
Beep();
mark=0;
}
else // 暗码过错,报警
{
Newpassword_ERROR(); // 新暗码设置失利提示
num=0;
sign =0; // 比较旧暗码标志
Delay400Ms();
Beep();Beep();Beep(); // 过错提示音
Delay400Ms();
Beep();Beep();Beep();
Delay1s(); // 延时1s
mark=0;
}
}

/*****************************************************
函 数 名:void NewPassword_set(void)
功 能:新暗码设置
说 明:修正暗码
进口参数:无
返 回 值:无
*****************************************************/
void NewPassword_set(void)
{
bit sign1;
uchar key_data;
P1=0xf0; // 判别是否有键按下
if(flag==1)
{
NewPassword_face(); // 显现暗码输入界面
Delay400Ms();
flag=0; // 调用输入新暗码提示标志位
Count=0; // 按键次数计数器置0
Delay400Ms();
}
if((P1&0xf0)!=0xf0) // 判别是否有键按下
{
key_data=Key_switch(); // 调用按键转化程序
if((key_data!=0)&(key_data!=65)&(key_data!=66)&(key_data!=67)&(key_data!=68)&(key_data!=35)&(key_data!=42))
{//按键不能为数字(0~9)以外.A B C D # *
Count++; // 按键次数器加1
Led_hint(); // 按键指示
Beep(); // 按一下键发一音
sign1=1; // 有键按下标志位
}
}
if((sign1==1)&(flag==0)) // 有键按下
{
Scan_starnumber(); // 在暗码显现区显现” ****** “
sign1=0; // 按键标志位清0
N_Password[Count-1]=key_data; // 按键值放入暗码暂存器
}
if(Count==6) // 6次按键则进行暗码比较
{
Count=0; // 计算清0,从先计数
flag =1; // 调用输入新暗码提示标志位
mark =0; // 循环标志位
WriteCommandLCM(0x0C,1); // 关光标显现
}
}
/*****************************************************
函 数 名:void Password_importation(void)
功 能:暗码输入
说 明:输入暗码并调用暗码比较函数进行比较
进口参数:无
返 回 值:无
*****************************************************/
void Password_importation(void)
{
bit sign1;
uchar key_data;
P1=0xf0; // 判别是否有键按下
if(((P1&0xf0)!=0xf0)&(flag==1)) // 有键按下,且是第一次
{
key_data=Key_switch();
if(key_data!=0)
{
Pass_face(); // 显现暗码输入界面
Delay400Ms();
flag=0; // 调用暗码输入提示标志位
Count=0; // 输入暗码个数计数器置0
Delay400Ms();
}
}
if((P1&0xf0)!=0xf0) // 判别是否有键按下
{
key_data=Key_switch(); // 调用按键转化程序
if((key_data!=0)&(key_data!=65)&(key_data!=66)&(key_data!=67)&(key_data!=68)&(key_data!=35)&(key_data!=42))
{//按键不能为数字(0~9)以外.A B C D # *
Count++; // 按键次数器加1
Led_hint(); // 按键指示
Beep(); // 按一下键发一音
sign1=1; // 有键按下标志位
}
}
if((sign1==1)&(flag==0)) // 有键按下
{
Scan_starnumber(); // 在暗码显现区显现” ****** “
sign1=0; // 按键标准位清0
T_Password[Count-1]=key_data; // 按键值放入暗码暂存器
}
if(Count==6) // 6次按键则进行暗码比较
{
Count=0; // 计算清0,从先计数
flag =1; // 调用暗码输入提示标志位
mark =0; // 循环标志位
WriteCommandLCM(0x0C,1); // 关光标显现

if(sign==0)
PasswordComparison(0); // 输入按键与原始暗码比较
else PasswordComparison(1); // 输入按键与新暗码比较
}
}

/*****************************************************
函 数 名:void Scan_starnumber(void)
功 能:显现暗码位为星号
说 明:在暗码显现区显现 ” ****** “
进口参数:无
返 回 值:无
*****************************************************/
void Scan_starnumber(void)
{
switch(Count) // 在相应的当地显现”*”
{
case 1:DisplayOneChar(5,1,42);break; //—–*———–//
case 2:DisplayOneChar(6,1,42);break; //——*———-//
case 3:DisplayOneChar(7,1,42);break; //——-*———//
case 4:DisplayOneChar(8,1,42);break; //——–*——–//
case 5:DisplayOneChar(9,1,42);break; //———*——-//
case 6:DisplayOneChar(10,1,42);break; //———-*——//
} //—–*******—–//
}

/*****************************************************
函 数 名:void PasswordComparison(bit mark)
功 能:暗码比较程序
说 明:对输入暗码进行比较
进口参数:mark:当mark=1时,对原始暗码进行比较;当mark=0时,对原始暗码进行比较
返 回 值:无
*****************************************************/
void PasswordComparison(bit mark1)
{
uchar Number=0;
if(mark1==0) // 输入按键与原始暗码比较
{
while((T_Password[Number]==O_Password[Number])&(Number<6)) // 暗码比较
{
Number++; // 计数值加1
}
}
else // 输入按键与新暗码比较
{
ReadFromROM(N_Password,0,6);
while((T_Password[Number]==N_Password[Number])&(Number<6)) // 暗码比较
{
Number++; // 计数值加1
}
}
if(Number>=6) // 暗码正确
{
mark0=1; // 进入新暗码设置
Password_OK(); // 调用暗码输入正确提示函数
REL=0; // 继电器敞开,即暗码锁敞开
Delay400Ms();
Beep();Beep(); // 正确提示音
Delay400Ms();
Beep();Beep();
Delay1s(); // 延时2s
Delay1s();
REL=1; // 继电器封闭,即暗码锁敞开
mark=0; // 退出循环
num=0;
}
else // 暗码过错,报警
{
mark0=0; // 新暗码输入操控位
Password_ERROR(); // 调用暗码输入过错提示函数
Delay400Ms();
Beep();Beep();Beep();Beep(); // 过错提示音
Delay400Ms();
Beep();Beep();Beep();Beep();
Delay1s(); // 延时1s
mark=0; // 退出循环
num++; // 暗码过错输入计数器
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/275838.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部