标题:
51单片机密码锁通过1602显示,继电器模拟状态
[打印本页]
作者:
天才小壮
时间:
2020-5-31 23:42
标题:
51单片机密码锁通过1602显示,继电器模拟状态
根据设定好的密码, 采用六个按键实现密码的输入功能
当密码输入完后,按确认键验证,正确之后,锁就打开
如果输入的三次的密码不正确, 就锁定按键 3 秒钟
同时发出报警声,直到没有按键按下 5秒后
才打开按键锁定功能否则在 5 秒钟内仍有按键按下,就重新锁
电路原理图如下:
TIM图片20200531233900.png
(65.04 KB, 下载次数: 26)
下载附件
2020-5-31 23:40 上传
单片机源程序如下:
#include "lcd1602.h"
#include "delay.h"
#include "eeprom.h"
#include "keyboard.h"
#include "code.h"
#include<intrins.h>
#include<string.h>
#define uint unsigned int
#define uchar unsigned char
uchar Timer=0; //中断计数器
#define uchar unsigned char
/********************按键处理函数***********************/
uchar Count=0; //开锁次数
uchar k=0; //数组累加
uchar Wrong=0; //错误次数
uchar Sure_temp,Cancel_temp;//保存按下确认键和取消键P1的值
uchar num=0; //按键次数
//确认键处理 按键检测
uchar code Key_Table[]={0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77};
uchar Buffer[]={0,0,0,0,0,0}; //按键数值缓存数组
uchar Buffer_Reset[]={0,0,0,0,0,0}; //重置密码缓存
uchar Passedword[]={0,0,0,0,0,0};//密码数组 (这里开始出厂密码为比赛日期201657)
uchar code Count_Table[]="123456789";
//声光报警
void Alarm()
{
uchar i;
Red=0;
for(i=0;i<120;i++)
{
Beep=~Beep;
Delay(2);
}
}
//警报
void Warning()
{ uchar i;
for(i=0;i<2;i++)
{ for(i=0;i<20;i++)
{
Beep=~Beep;
Delay(20);
}
}
}
void Sure_Key()
{
uchar flag;
uchar i;
write_com(0x80); //第一行0x80+0x00
write_data(Count_Table[Count++]); //显示输入次数
Delay(200);
if(Count>=10){P0=0XC0;Count=0;}
for(i=0;i<6;i++)
{
if(Buffer[i]==Passedword[i]){flag=1;continue;}
else {flag=0;break;}
}
//结果处理
if(flag==1){k=0;Green=0;Wrong=0;Lamp=0;Red=1;write_com(0x80+0x40);for(i=0;i<16;i++)write_data('\0');Delay(200);} //正确绿灯亮,锁打开
else {k=0;Alarm();Wrong++;Green=1;Lamp=1;write_com(0x80+0x40);for(i=0;i<16;i++)write_data('\0');Delay(200);} //错误则声光报警
if(Wrong==3) {Sure_temp=P1;TR0=1;Wrong=0;} //错误三次则锁定键盘3秒钟
}
//取消键处理
void Cancel_Key()
{
uchar i;
k=0;
for(i=0;i<6;i++)Buffer[i]=0;Delay(100);
write_com(0x80+0x40);
for(i=0;i<16;i++)write_data('\0');
}
//锁定键
void Lock()
{
uchar i;
k=0;Alarm();Green=1;Lamp=1;Delay(200);
Cancel_Key();
}
//清屏键
void Clear_Lcd()
{
k=0;Cancel_Key();
write_com(0x01);
}
//重置键
void Reset_Key()
{
uchar i;
k=0;
write_com(0x10);
write_string("Input Passedword:");
}
//重置确认键
void Reset_Sure_Key()
{
uchar i,flag;
for(i=0;i<6;i++){if(Buffer[i]==Passedword[i]){flag=1;continue;} else {flag=0;break;}}//输入老密码并判断
if(flag==1) {write_com(0x01);write_string("Input Newword:");Cancel_Key();}
else {Reset_Key();}
}
//重置保存
void Reset_Save()
{
uchar i;
k=0;
for(i=0;i<6;i++) Write_Random_Address_Byte(i,Buffer[i]); //老密码正确再保存新密码
for(i=0;i<6;i++)Passedword[i]=Random_Read(i);
write_com(0x01);write_string("Succeed!");Delay(1000);write_com(0x01);
}
/**************************按键扫描函数***********************************/
//按键扫描
void Key_Play()
{
uchar i=0;
uchar num;
uchar temp;
uchar Key,c;
P1=0xf0;
if(P1!=0xf0)
{
Delay(5);
if(P1!=0xf0)
{
temp=P1;
P1=0x0f;
Key=temp|P1;
for(i=0;i<16;i++)
if(Key==Key_Table[i]) {num=i;break;}
Buffer[k++]=num;
switch(num)
{
case 10:Sure_Key();break; //确认
case 11:Cancel_Key();break; //取消
case 12:Reset_Key();break; //重置
case 13:Reset_Sure_Key();break;//重置确认
case 14:Reset_Save();break; //上锁
case 15:Lock();; //清屏
}
write_com(0x80+0x40); //第二行0x80+0x40
for(i=0;i<k;i++)
write_data('*');
}
do{ //等待按键抬起
temp=P1;
temp=temp&0x0f;
}
while(temp!=0x0f);
}
}
//************************主函数************************//
void main()
{
uchar i;
lcd_initial();
write_com(0x10);
write_string(" XM:MaZhuang ");
//write_com(0x80); //第一行0x80+0x00
write_data(Count_Table[1]);
write_data(Count_Table[2]);
Delay(1000);
P0=0x3f;//次数默认为0 0011 1111
P2=0XFF;//初始全关 1111 1111
TMOD=0X01;//0000 0001
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1; //密码错误定时器中断0
for(i=0;i<6;i++)Passedword[i]=Random_Read(i);
while(1)
{
Key_Play();
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
源程序下载,注意不含仿真图,暂时不公开:
密码锁(终极).zip
(78.06 KB, 下载次数: 42)
2020-5-31 23:40 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
yyx0127
时间:
2020-6-7 10:31
下载了也不得捏?咋搞啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1