2、测试数据(表格) 输入数字 | | | | 000000(初始密码) | | | | 10000 | | | | 30000 | | | |
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)
|