标题:
基于51单片机的密码锁代码
[打印本页]
作者:
longyanzhang
时间:
2019-12-28 11:50
标题:
基于51单片机的密码锁代码
2
、测试数据(表格)
输入数字
LED灯
蜂鸣器
液晶显示屏
000000(初始密码)
全亮
不响
code correct!
10000
不亮
响
code wrong!
30000
不亮
响
code wrong!
12345
顺次亮灭
响
code wrong!
wrong 3 times
lock the screen
3、数据分析和结论
从实验的数据来看,当密码正确时,LED灯全部亮,蜂鸣器不响,液晶显示屏上显示“code correct!”。当密码不正确时,LED灯不亮,蜂鸣器响,液晶显示屏上显示“code wrong!”。当三次输错密码时,LED灯顺次亮灭,蜂鸣器响,液晶显示屏上显示“code wrong! wrong 3 times lock the screen”屏幕上锁。
综上所述此简易密码锁完成了密码设置功能、密码输入开锁功能、输入错误报警功能、输入错误锁屏功能。
五、系统使用说明
1、系统外观及接口说明(实物照片)
程序写入后,下载程序到单片机,要给单片机断电(约1 秒即可),然后给单片机上电,上电之后,会把程序烧写到单片机内部。两条数据线把单片机和电脑USB接口连接。下面为系统外观及接口实物图。
2、系统操作使用说明
独立按键S1:选择按钮,可实现光标左右移动进而设置密码。
独立按键S2:选择按钮,可实现光标左右移动进而设置密码。
独立按键S3:确定按钮,以确定密码。
独立按键S4:加法按钮,可设置密码。
独立按键S5:减法按钮,可设置密码。
简易密码锁的初始密码为000000,用户可以对其进行重新设置。当用户输入密码时,若密码正确,LED灯全部亮,蜂鸣器不响,液晶显示屏上显示“code correct!”。当密码不正确时,LED灯不亮,蜂鸣器响,液晶显示屏上显示“code wrong!”。当三次输错密码时,LED灯顺次亮灭,蜂鸣器响,液晶显示屏上显示“code wrong! wrong 3times lock the screen”屏幕上锁。
单片机源程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit Key1 = P3^7;
sbit Key2 = P3^6;
sbit Key3 = P3^5;
sbit Key4 = P3^4;
sbit Key5 = P3^3;
sbit Key6 = P3^2;
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^2;
uchar K1num = 0; //控制主界面选项
uchar K2num = 0; //控制密码位数
uchar wrong_num = 0; //记录密码错误次数
uchar interface = 0; //各个界面的标志位 1.主界面2.输入密码3.设置密码4.重置密码
uchar code main1[] = {"1.input code"};
uchar code main2[] = {"2.reset code"};
uchar code input[] = {"input your code:"};
uchar code reset[] = {"input new code:"};
uchar code code_correct[] = {"code correct!"};
uchar code code_wrong[] = {"code wrong!"};
uchar code lockscreen1[] = {"wrong 3 times"};
uchar code lockscreen2[] = {"lock the screen"};
uchar code_display[] = {"000000"};
uchar code_true[] = {"000000"};
void keyscan(); //按键扫描函数
void KeyInit(); //按键初始化
void codeinit(); //显示密码初始化函数
void savecode(); //保存密码函数
char judgecode(); //判断密码函数
void delay(unsigned int ms); //延时函数
void write_date(unsigned char date); //写数据函数
void write_com(unsigned char com); //写指令函数
void LCD_init(); //屏幕初始化函数
void LCD_main(); //显示主界面
void LCD_inputcode(); //显示输入密码界面
void LCD_resetcode(); //显示重置密码界面
void LCD_setcode(); //显示设置密码界面
void LCD_codeture(); //显示密码正确界面函数
void LCD_codewrong(); //显示密码错误界面函数
void LCD_lockscreen(); //显示锁屏界面函数
//***************延时函数********************************
void delay(uint ms)
{
int i,j;
for(i = 0;i < ms; i++)
for(j = 0;j < 110;j++);
}
//***************显示密码初始化函数**********************
void codeinit()
{
int i;
for(i = 0; i < 6; i++)
code_display[i] = '0';
}
//***************保存密码函数**********************
void savecode()
{
int i;
for(i = 0; i < 6; i++)
code_true[i] = code_display[i];
}
//***************判断密码函数**********************
char judgecode()
{
int i;
for(i = 0; i < 6;i++)
{
if(code_true[i] != code_display[i])
break;
}
if(i < 6)
return '0';
else
return '1';
}
//***************按键初始化函数**********************
void KeyInit()
{
Key1 = 1; //给全部按键的io口赋高电平,等待检测
Key2 = 1;
Key3 = 1;
Key4 = 1;
Key5 = 1;
Key6 = 1;
}
//***************按键扫描函数**********************
void keyscan()
{
char x;
if(Key1 == 0 ) //Key1,菜单栏上下翻动按键
{
delay(5);
if(Key1 == 0)
{
K1num++;
while(!Key1);
if(K1num == 1) //当K1按键第一次被按下,菜单1闪烁
{
write_com(0x80); //设置光标位置,1
write_com(0x0f); //光标闪烁
// P2 = 0x0f; //测试用,下同
}
if(K1num == 2) //当K1按键第二次被按下,菜单2闪烁
{
write_com(0x80+0x40); //设置光标位置,2
write_com(0x0f);
// P2 = 0xf0;
}
if(K1num == 3) //当K1按键第三次被按下,计数清零
{
K1num = 0;
write_com(0x0c); //关闭光标闪烁
// P2 = 0xff;
}
}
}
if(Key2 == 0) //Key2,选择键
{
delay(10);
if(Key2 == 0)
{
while(!Key2);
switch(interface) //判断当前处于哪一个界面
{
case 1 : //主界面
{
if(K1num == 1)
{
K1num = 0; //key1计数清零
codeinit();
LCD_inputcode(); //进入输入密码界面
}
if(K1num == 2)
{
K1num = 0;
codeinit();
LCD_resetcode(); //进入重置密码界面
}
break;
}
case 2 : //输入密码界面
case 3 : //设置密码界面
case 4 : //重置密码界面
{
K2num ++;
if(K2num == 6)
K2num = 0;
write_com(0x80+0x40+K2num); //设置光标位置
write_com(0x0f);
break;
}
default:break;
}
}
}
if(Key3 == 0) //Key3,返回主界面键(确认键)
{
delay(10);
if(Key3 == 0)
{
while(!Key3); //等待按键释放
K2num = 0; //重置K2按键次数
if(interface == 2) //若处于输入密码界面
{
x = judgecode();
if(x == '1') //需判断密码是否正确
{
LCD_codeture();
P2 = 0; //灯亮代表门开
delay(2000);
P2 = 0xff;
LCD_main(); //返回主界面
}
else
{
LCD_codewrong();
delay(2000);
codeinit();
LCD_inputcode();
if(wrong_num >= 3) //错误三次锁死屏幕并报警
{
LCD_lockscreen();
while(wrong_num >= 3)
{
P2 = 0xf0;
delay(300);
P2 = 0x0f;
delay(300);
}
}
}
}
if(interface == 4) //若处于重置密码界面
{
savecode(); //需保存重置密码
codeinit();
write_com(0xc0); //关闭光标闪烁
LCD_main(); //返回主界面
}
}
}
if(Key4 == 0) //Key4,数值+1
{
delay(10);
if(Key4 == 0)
{
while(!Key4);
code_display[K2num] ++;
if( code_display[K2num] > '9' )
code_display[K2num] = '0';
if( code_display[K2num] < '0')
code_display[K2num] = '9';
if(interface == 2) //输入密码界面
LCD_inputcode();
if(interface == 4) //重置密码界面
LCD_resetcode();
}
}
if(Key5 == 0) //Key5,数值-1
{
delay(10);
if(Key5 == 0)
{
while(!Key5);
code_display[K2num] --;
if( code_display[K2num] > '9' )
code_display[K2num] = '0';
if( code_display[K2num] < '0')
code_display[K2num] = '9';
if(interface == 2) //输入密码界面
LCD_inputcode();
if(interface == 4) //重置密码界面
LCD_resetcode();
}
}
if(Key6 == 0)
{
delay(10);
if(Key6 == 0)
{
while(!Key6);
}
}
}
//***************写数据函数**********************
void write_date(uchar date)
{
RS = 1; //确认为写数据模式
delay(2);
P0 = date;
EN = 1;
delay(5);
EN = 0;
}
//***************写指令函数**********************
void write_com(uchar com)
{
RS = 0; //确认为写指令模式
delay(2);
P0 = com;
EN = 1;
delay(5);
EN = 0;
}
//***************LCD初始化函数**********************
void LCD_init()
{
RW = 0; //只用到写模式
EN = 0; //使能口赋低电平
write_com(0x38); //0011 1000 设置显示模式:16*2显示,八位数据接口
write_com(0x0c); //0000 1100 开显示,不显示光标
// write_com(0x0f); //0000 1111 开显示,显示光标,光标闪烁
write_com(0x06); //0000 0110 写一个字符地址指针+1
write_com(0x01); //0000 0001 清屏
}
//***************显示主界面函数**********************
void LCD_main()
{
int i;
interface = 1;
LCD_init();
write_com(0x80); //设定显示位置为第一行首
for(i = 0;i < 12;i++)
write_date(main1[i]);
write_com(0x80+0x40); //设定显示位置为第二行首
for(i = 0;i < 12;i++)
write_date(main2[i]);
}
//***************显示输入密码界面函数**********************
void LCD_inputcode()
{
int i;
interface = 2;
write_com(0x80); //设定显示位置为第一行首
write_com(0x01); //清屏
for(i = 0;i < 16;i++)
write_date(input[i]);
write_com(0x80+0x40); //地址指针指向第二行
for(i = 0;i < 6;i++)
write_date(code_display[i]);
write_com(0x80+0x40+K2num); //地址指针指向第二行
write_com(0x0f); //开光标闪烁
}
//***************显示重置密码界面函数**********************
void LCD_resetcode()
{
int i;
interface = 4;
write_com(0x80); //设定显示位置为第一行首
write_com(0x01); //清屏
for(i = 0;i < 15;i++)
write_date(reset[i]);
write_com(0x80+0x40); //地址指针指向第二行
for(i = 0;i < 6;i++)
write_date(code_display[i]);
write_com(0x80+0x40+K2num);
write_com(0x0f); //开光标闪烁
}
//***************显示设置密码界面函数**********************
void LCD_setcode()
{
// int i;
interface = 3;
}
//***************显示密码正确界面函数**********************
void LCD_codeture()
{
int i;
write_com(0x01);
write_com(0x0c); //关闭光标闪烁
write_com(0x80);
for(i = 0; i < 13;i++)
write_date(code_correct[i]);
}
//***************显示密码错误界面函数**********************
void LCD_codewrong()
{
int i;
wrong_num ++;
write_com(0x01);
write_com(0x0c); //关闭光标闪烁
write_com(0x80);
for(i = 0; i < 11;i++)
write_date(code_wrong[i]);
}
//***************显示锁屏界面函数**********************
void LCD_lockscreen()
{
int i;
write_com(0x01);
write_com(0x0c); //关闭光标闪烁
write_com(0x80);
for(i = 0; i < 13;i++)
write_date(lockscreen1[i]);
write_com(0x80+0x40);
for(i = 0; i < 15;i++)
write_date(lockscreen2[i]);
}
复制代码
所有程序51hei提供下载:
密码锁.zip
(39.13 KB, 下载次数: 42)
2019-12-28 11:50 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
Jwh123
时间:
2020-6-29 20:26
nice 感谢楼主的分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1