标题:
51单片机六位密码锁程序源码
[打印本页]
作者:
cyfdc51
时间:
2018-7-10 19:24
标题:
51单片机六位密码锁程序源码
这是基于89c52的六位密码锁,在通过矩阵键盘来输入密码,也可以进行密码的修改,详情请下载附件。
单片机源程序如下:
/**********************密码锁**************************/
#include"lcd1602.h"
#include"jianpan.h"
#include"buzzer.h"
#include"relay.h"
#define uint unsigned int
void delay_ms(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
uchar password[]={14,10,6,13,9,5}; //用来装密码
main()
{
uchar num,i=0,j; //num为按键值,i为字符数,j数值比较变量
uchar input_number_test[10]; //装刚输入的密码
uchar wrongtimes=0; //用来记录输入错误次数
uchar input_number_length, //输入密码长度,
infact_number_length=6; //实际密码长度
bit Flag; //标志
bit huan=1; //进入密码修改模式的标志
buzzer_init(); //蜂鸣器初始化
relay_init(); //绿灯初始化
InitLCD(); //初始化液晶屏
Delay(10); //延时用于稳定,可以去掉
LCD_Clear(); //清屏
while(1) //主循环
{
Write_String(0,0," Welcome! ^_^ "); //写入第一行信息,主循环中不再更改此信息,所以在while之前写入
i=0;
Write_String(0,1,"Enter password");//写入第二行信息,提示输入密码
while (huan) //输入密码循环
{
num=KeyPro(); //看看键盘按下什么东西(没按下时输出0xff)
if(num!=0xff) //如果有值的话就执行下一步操作
{
if(i==0) //输入是第一个字符的时候需要把改行清空,方便观看密码
Write_String(0,1," "); //清除该行
if((i<6)&&(num!=0)) //如果输入的是前七位
{
input_number_test[i]=num;
LCD_Write_Char(i,1,'*'); //输入的密码用"*"代替
i++;
}
if(0==num) //删除键,按下0就删除
{
--i;
LCD_Write_Char(i,1,' ');
}
if(1==num) //修改密码程序开始阶段
{
huan=0;
i=0;
Write_String(0,1," "); //清除该行
}
/************************按下确认键,进行密码比较,查看密码是否正确******************/
if((15==num)||(i==9)) //输入按键值15或者密码输入到最大值6后按OK表示输入结束,需要进行比对
{
input_number_length=i; //计算输入密码长度
i=0; //计数器复位
if(input_number_length==infact_number_length) //长度相等则比较,否则直接输出错误
{
Flag=1; //比较位置1
for(j=0;j<infact_number_length;j++) //循环比较8个数值,如果有一个不等 则最终Flag值为0
Flag=Flag&&(input_number_test[j]==password[j]);//比较输入值和已有密码
}
if(!Flag)
{
Write_String(0,1," "); //清除该行
Write_String(0,1,"Wrong! Retry!"); //密码错误,提示重新输入
wrongtimes++; //连续输入错误,则次数累加
if(wrongtimes==3)
{
Write_String(0,1," "); //清除该行
Write_String(0,1,"Wrong 3 times!");
relay_work(); //
buzzer_work(); //蜂鸣器工作
while(1); //停止该位置,重启电源后才能输入,实际实用中则需要等到一定时间后才能再次输入?。
}
}
if(Flag) //如果比较全部相同,标志位置1
{
Write_String(0,1," "); //清除该行
Write_String(0,1,"Right!OPEN .*-*."); //密码正确
wrongtimes=0; //输入正确则次数清零,重新计数
Flag=0;
}
}
}
}
//********************进入密码修改模式程序**********************************************************************************************************
while (!huan) //修改密码循环
{
Write_String(0,0,"Enter old code:");
num=KeyPro(); //看看键盘按下什么东西(没按下时输出0xff)
if(num!=0xff) //如果有值的话就执行下一步操作
{
if(i==0) //输入是第一个字符的时候需要把改行清空,方便观看密码
Write_String(0,1," "); //清除该行
if((i<6)&&(num!=0)) //如果输入的是前七位
{
input_number_test[i]=num;
LCD_Write_Char(i,1,'*'); //输入的密码用"*"代替
i++;
}
if(0==num) //删除键,按下0就删除
{
--i;
LCD_Write_Char(i,1,' ');
}
if(2==num) //退出修改密码模式
{
huan=1;
break;
}
/***********************修改密码的程序******************/
if((15==num)||(i==9)) //输入按键值15或者密码输入到最大值6后按OK表示输入结束,需要进行比对
{
input_number_length=i; //计算输入密码长度
i=0; //计数器复位
if(input_number_length==infact_number_length) //长度相等则比较,否则直接输出错误
{
Flag=1; //比较位置1
for(j=0;j<infact_number_length;j++) //循环比较8个数值,如果有一个不等 则最终Flag值为0
Flag=Flag&&(input_number_test[j]==password[j]);//比较输入值和已有密码
}
if(!Flag)
{
Write_String(0,1," "); //清除该行
Write_String(0,1,"Wrong! Retry!"); //密码错误,提示重新输入
break;
}
if(Flag) //如果比较全部相同,标志位置1
{
Write_String(0,1," "); //清除该行
Write_String(0,0,"Enter new code"); //密码正确
wrongtimes=0; //输入正确则次数清零,重新计数
while(1)
{
num=KeyPro(); //看看键盘按下什么东西(没按下时输出0xff)
if(num!=0xff) //如果有值的话就执行下一步操作
{
if(i==0) //输入是第一个字符的时候需要把改行清空,方便观看密码
Write_String(0,1," "); //清除该行
if((i<6)&&(num!=0)) //如果输入的是前七位
{
password[i]=num;
LCD_Write_Char(i,1,'*'); //输入的密码用"*"代替
i++;
}
if(0==num) //删除键,按下0就删除
{
--i;
LCD_Write_Char(i,1,' ');
}
if((num==15))
{
Write_String(0,0,"Change succeeded");
Write_String(0,1," ");
delay_ms(1500);
huan=1;
Write_String(0,0," "); //清除该行
break;
}
}
}
}
}
}
}
}
}
复制代码
所有资料51hei提供下载:
密码锁.zip
(57.48 KB, 下载次数: 101)
2018-7-10 19:22 上传
点击文件名下载附件
密码锁程序
下载积分: 黑币 -5
作者:
是一片白
时间:
2019-6-3 15:08
刚好需要用到资料,感谢分享
作者:
恶法违法
时间:
2019-6-23 09:25
OK,,,,,
作者:
ViViliu
时间:
2019-12-10 21:04
有点棒
作者:
不周
时间:
2019-12-14 00:50
要是回复能给一点币就好了,急用着
作者:
MAFNMCHS
时间:
2019-12-14 21:02
赞美,感谢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1