标题:
单片机+1602+矩阵按键 门禁系统Proteus仿真程序
[打印本页]
作者:
陈润源home
时间:
2019-6-28 11:02
标题:
单片机+1602+矩阵按键 门禁系统Proteus仿真程序
此程序是基于清翔电子开发板编写的,已测试通过,此程序并目前只完成了密码锁功能,还没有完成用户房间号码比对,发这个帖子初衷是为了给正在学习密码锁的同学们一个思路,代码有详细注释,适合初学者借鉴,大神勿喷
疯狂提示:用户房间号的匹配使用138译码器
--------------------------------------------
| 第1列 第2列 第3列 第4列 |
|第1行 0 1 2 3 |
|第2行 4 5 6 7 | 初始密码:123456
|第3行 8 9 10 11 |
|第4行 12 13 14 15 |
------------------------------------------
1.密码只有6位 123456
2.按键10: 开锁按键:
输入6位密码后按下开锁按键,开始比对存储的密码,正确则打开电磁锁
否则提示错误次数,输错3次锁定键盘10S,并且报警,10S后才能重新输入
3.按键11: 上锁按键:
无论处于任何状态,按下上锁按键后,关闭电磁锁,清除输入的数值
4.按键12: 更改密码:
合法用户按下修改密码按键显示New Password提示用户输入新密码
否则显示No Rights !提示操作错误
5.按键13: 保存密码:
合法用户输入新密码后按下保存密码,显示 Saving...... 提示保存密码中.....
然后显示 save successful 提示保存成功
显示 ^_^ ^_^ ^_^ 提示更改密码成功
非法用户则显示No Rights ! 提示操作错误
6.按键14: 重新输入:
清除之前输入的密码或门牌号
7.按键15: 呼叫按键:
直接输入门牌号(3位)后按下呼叫按钮,蜂鸣器发出叮咚门铃声提示用户有访客
此时访客直接按下开锁键,开锁3S,3s后关闭
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
仿真.jpg
(175.21 KB, 下载次数: 96)
下载附件
2019-6-28 10:53 上传
单片机源程序如下:
#include<reg51.h>
#include<string.h>
#include<intrins.h>
#include"key.c"
#include"24c04.c"
#include"1602.c"
#include"beep.c"
#define uchar unsigned char
#define uint unsigned int
#define LCDIO P0 //液晶数据端口 P0
uchar buffer[6]={0}; //密码显示缓存
uchar DSY_BUFFER[16]=" "; //开机显示缓存
uchar Userpassword[6]={0}; //输入显示缓存
uchar code table2[]="123456"; //初始密码
bit flag=0,aa,hujiao; //用户蹲渊义定时溢出标志位
//hujiao:呼叫标志位
sbit led=P2^2; //电磁锁控制端
//-----------------------------------------------------------------
// 蜂鸣器子程序
//-----------------------------------------------------------------
void Beep()
{
uchar i;for (i = 0; i < 100; i++)
{ delayms(1); BEEP = ~BEEP; }
BEEP = 0;
}
//-----------------------------------------------------------------
//密码清除子程序
//-----------------------------------------------------------------
void clear_password( )
{ uchar i;
for(i=0;i<6;i++)
{
Userpassword[i]=' ';
}
for(i=0;i<16;i++)
{
DSY_BUFFER[i]=' ';
}
}
void init_all()
{
init();
init_lcd(); //1602初始化
Canshu_Init(); //报警初始化
Interrupt_Init(); //中断初始化
}
//-----------------------------------------------------------------
// 主函数
//-----------------------------------------------------------------
void main()
{
uchar temp,i=0,j=0,k=0;
uchar IS_valid_user; //合法用户
init_all();
delayms(5);
// aa=Sendstring(0xa0,1,table2,6); //往24c04写密码((第一次下载必须打开下载初始密码)
delayms(5);
aa=Recstring(0xa0,1,buffer,6); //从24c04读取密码
delayms(10);
P1=0x0f;
while(1)
{
if(P1!=0x0f)
{
temp=Keys_Scan(); //获取按键值
switch(temp)
{
case 0: case 1: case 2: case 3: case 4:
case 5: case 6: case 7: case 8: case 9:
if (i<=5) //密码限制在6位以内
{
Userpassword[i]=temp;
DSY_BUFFER[i]=temp+0x30; // 显示输入的密码
Display_String(DSY_BUFFER,0xc0);
delayms(100);
DSY_BUFFER[i]='*'; // 显示 * 替换刚刚显示的数字
Display_String(DSY_BUFFER,0xc0);
i++;
} hujiao=0;
break;
//按A键开锁
case 10:
if(hujiao==1) //如果有客人来访按下开锁键则直接开门
{
flag=1;i=0;led=0; //点亮LED(开门)
clear_password(); //清除输入的门牌号
Display_String("OPEN OK! ",0xc0);//显示门已打开
IS_valid_user = 1;; //合法用户标志位置1
delayms(2500);i=0;led=1; //开门时间为3S,3S后关闭
hujiao=0;flag=0;j=0; //关闭访客标志位
clear_password();IS_valid_user=0; //清密码显示位
}hujiao=0;
for(k=0;k<6;k++)
{
if(buffer[k]==(Userpassword[k]+48)) //如果显示缓存的数据与存储密码相同则开门
flag=1;
else
flag=0;
}
if (flag==1)
{ flag=0;i=0;led=0; //点亮LED(开门)
clear_password();
Display_String("OPEN OK! ",0xc0); //密码正确,显示打开
IS_valid_user = 1; j=0;
}
else
{
j++;led=1; //关闭LED
clear_password();
Display_String("error! Have try ",0xc0); //显示密码错误,请重新输入
write_com(0xcf);
write_date(0x30+j);
delayms(1000); //错误次数加1
if(j!=3)Display_String(DSY_BUFFER,0xc0); //清屏
IS_valid_user=0;
if(j==3) //只有三次输入机会
{
Display_String(" illegal user ",0xc0); //非法用户,开始报警
write_com(0xcf);
write_date(0x30+j);error=0; //报警7S
delayms(5000);j=0;error=1;
Display_String(DSY_BUFFER,0xc0); //输错3次关闭键盘7S
}
} i=0;
break;
case 11: led=1; //按B键上锁
clear_password();
Display_String(table,0x80); //显示Your Password
Display_String(DSY_BUFFER,0xc0); //清屏
i=0; hujiao=0; //访客标志位清零
IS_valid_user=0; //合法用户标志位清零
break;
case 12: //按C键设置新密码
if ( !IS_valid_user) //如果是合法用户则提示输入新密码
{
i=0;
Display_String("No rights ! ",0xc0); //非法用户按下则提示
delayms(1000); //操作错误
Display_String("Your Password...",0x80);
Display_String(" ",0xc0);
}
else
{
i=0;revise=1; //如果是合法用户则提示输入新密码
Display_String("New Password: ",0x80);
Display_String(" ",0xc0);
}hujiao=0; break;
case 13: if ( !IS_valid_user) //按D键保存新密码
{ i=0;
Display_String("No rights ! ",0xc0); //非法用户按下则提示操作错误
delayms(1000);
Display_String("Your Password...",0x80);
Display_String("Lock OK! ",0xc0); //提示关锁成功
}
else
{
i = 0; revise=0;
init();
delayms(5);
for(k=0;k<6;k++){ Userpassword[k]=Userpassword[k]+48;}
aa=Sendstring(0xa0,1,Userpassword,6); //存入新密码
delayms(5);
aa=Recstring(0xa0,1,buffer,6); //读出新密码
delayms(5);
clear_password(); //清除密码
Display_String(table,0x00);
Display_String(" Saving...... ",0xc0); //提示保存密码中......
delayms(2000);
Display_String("save successful ",0xc0); //第一行 显示保存成功
delayms(2000);
Display_String(" ^_^ ^_^ ^_^ ",0xc0); //提示用户更改密码成功
delayms(1000);
led=1; //等待8秒时间到关闭
clear_password(); //清密码
Display_String(table,0x80); //第0行 显示Your Password
Display_String(DSY_BUFFER,0xc0); //第一行 显示空
i=0;
IS_valid_user=0;
}hujiao=0; break;
case 14:i=0;hujiao=0; //按E键消除所有输入
clear_password();
Display_String(" ",0xc0);
break;
case 15: if(i==3) //呼叫,门牌号3位
{
hujiao=1;i=0;TR0 = 1;temp=0;
clear_password();
// Display_String(DSY_BUFFER,0xc0);
delayms(100);
}
else
{
j++;led=1; //关闭LED
clear_password();
Display_String("error! Have try ",0xc0); //显示密码错误,请重新输入
write_com(0xcf);
write_date(0x30+j);
delayms(1000);
IS_valid_user=0;
if(j!=3)Display_String(DSY_BUFFER,0xc0); //清屏
IS_valid_user=0;
if(j==3) //只有三次输入机会
{
Display_String(" illegal user ",0xc0); //非法用户,开始报警
write_com(0xcf);
write_date(0x30+j);error=0; //报警7S
delayms(5000);j=0;error=1;
Display_String(DSY_BUFFER,0xc0); //输错3次关闭键盘7S
}
}
break;
}
if(revise!=1)Display_String("Your Password...",0x80);
if(hujiao==0)Beep();delayms(100); P1=0xf0;
while(P1!=0xf0);
while(P1==0xf0);
}
}
}
复制代码
所有资料51hei提供下载:
门禁V1.0.7z
(44.41 KB, 下载次数: 180)
2019-6-28 11:01 上传
点击文件名下载附件
仿真+ C、bin文件
下载积分: 黑币 -5
作者:
陈润源home
时间:
2019-6-28 11:04
做实物时记得在 24c04时钟、数据端口加 4.7K~10K 的上拉电阻
作者:
小柯基斯基
时间:
2020-6-19 16:37
你好,楼主我想请教一个问题。按键10中的”输错密码三次锁定10s,并且报警,10秒后才能重新输入“。
如果改成锁定30秒 30秒后才能输入。应该要怎么改 在哪个位置改。
作者:
1351199239
时间:
2021-5-8 18:39
Proteus要7.5版本才能打开
作者:
sbhsc666
时间:
2023-6-15 17:17
做实物时记得在 24c04时钟、数据端口加 4.7K~10K 的上拉电阻
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1