1. 背景与意义
随着人们生活水平和安全意识的提高,对锁的要求也越来越高,既要安全可靠,又要便捷方便。随着智能化时代的到来,传统锁已不能满足人们的生活需求,于是电子密码锁由此产生。当前密码锁已经盛行,但在电路设计上的成本高昂,因此,我们价格便宜的芯片设计了一个密码锁控制系统。
2. 系统功能
本系统设计是基于AT89C52单片机开发平台实现的门禁系统。AT89C52具有价格便宜,低电压、高性能 CMOS 8 位微处理器等优势,采用 AT89C52 单片机为控制核心,在相应的软件控制下可以完成要求的功能,主要实现功能包括矩阵按键控制实现密码输入、密码设置和密码初始化功能,8位数码管显示密码输入界面。具体而言,初始界面为密码输入界面,当输入密码正确, LED亮模拟开门,密码错误超过三次,蜂鸣器报警;通过按键将界面调整为密码设置界面,首先,需要输入初始密码,密码正确,界面跳转到输入新密码界面,反之,密码错误三次则蜂鸣器报警,持续3s,密码输入过程可以通过退出键退出,返回密码输入界面;其次,设置完成新密码,通过确认键保存密码,返回密码输入界面。本项目使用Keil5软件来实现程序的编写,编译之后生成hex文件。另外,我们通过Protues软件来模拟仿真我们的设计的系统,将生成的hex文件加载到AT89C52单片机中运行。
系统主要由六个部分组成,即AT89C52主控芯片、显示模块、蜂鸣器报警模块、LED提示模块、AT24C02存储模块和矩阵按键模块组成。
3. 元件清单
1) 7SEG-CA (8位共阳数码管)
2) AT89C52
3) RESPACK-8 (10k)
4) 有源蜂鸣器
5) LED
6) CRYSTAL (12MHz)
7) 电阻 *11(300欧、10k、1k)
8) 电容 *2(20pf)
9) 独立按键 *16
10) 74HC138
11) 74HC02
12) 74HC573
13) AT24C02
4. 系统设计
主要由主程序和密码存储模块、按键控制模块、显示模块、报警提示模块等子程序组成,其中主程序的功能是初始化系统的工作参数和循环调用各个功能模块子程序。软件设计构图如下:
4.1 密码输入及更改功能
如图4.1为4×4矩阵键盘的功能界面,正如图中所示,0~9为密码输入值,有密码设置、密码复位、退出和确认按键。图4.2为密码设置流程图,程序执行过程如下:当按下设置密码按键,进入到密码输入界面,密码验证标识符为C。此时,需要验证原始密码,当密码验证成功,进入新密码输入界面,新密码标识符为E,成功输入六位新密码后,按下确认键保存新密码,随即切换到初始密码输入界面,模拟界面如图4.3所示。
4.2 报警及提示功能
如图4.4为报警流程图,报警功能存在两个阶段。第一阶段,当在初始密码输入界面,输入密码错误三次,则启动报警,报警持续3秒,报警结束后退回到初始密码输入界面。第二阶段,进入设置界面,需要验证原始密码,输入密码错误三次同第一阶段出错情况一致,报警结束退回到密码验证界面。通过图4.5模拟启动报警。另外,在初始密码输入界面,当输入密码正确,则开门,通过如图4.6的LED变亮模拟。
4.3 密码保存及复位功能
图4.7为密码保存流程图,进入密码设置界面,密码验证成功后,输入新密码,按下确认按键,则切换到初始密码输入界面,保存当前输入密码。将密码写入到AT24C02中保存,在下一次启动密码锁时自动读取上次存取密码,如图4.8为AT24C02模拟电路;当忘记设置密码时,可以通过矩阵键盘上的复位键将密码初始化。
5. 部分主代码
//基于AT89C52门禁系统
#include "include.h"
#include "common.h"
int menu_change=0;
void menu(int change)
{
switch(change)
{
case 0:dat[0]=dat[1]=11;break;
case 1:dat[0]=13;dat[1]=10;break;
case 2:dat[0]=10;dat[1]=12;break;
default:break;
}
Key_disp();
}
//********显示程序**********//
#include "display.h"
u8 table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xc6,0x86};
u8 dat[]={10,10,10,10,10,10,10,10};
void Display()
{
static u8 disps;
P2=P2&0x1f|0xe0;
P0=0xff;
P2&=0x1f;
P2=P2&0x1f|0xc0;
P0=1<<disps;
P2&=0x1f;
P2=P2&0x1f|0xe0;
P0=table[dat[disps]];;
P2&=0x1f;
if(++disps==8)
disps=0;
}
void menu(int change)
{
switch(change)
{
case 0:dat[0]=dat[1]=11;break;
case 1:dat[0]=13;dat[1]=10;break;
case 2:dat[0]=10;dat[1]=12;break;
default:break;
}
Key_disp();
}
//********按键功能程序**********//
#include "key.h"
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
u8 key_press,key_re,key_van;
u8 MiMa_init[]={6,5,4,3,2,1};
u8 i,Key,key_bit;
bit Key_R,QR_flag,SZ_flag,init_flag=0;
u8 Keydats[6];
u8 K;
extern int menu_change;
u8 Read_Key()
{
P1=0xf0;
if((P14==0)|(P15==0)|(P16==0)|(P17==0)) key_press++;
else key_press=0;
if(key_press==5)
{
key_press=0;
key_re=1;
for(i=0;i<4;i++)
{
P1=0xff;
P1&=~(0x01<<i);
if(P14==0) key_van=4*i+4;
else if(P15==0) key_van=4*i+3;
else if(P16==0) key_van=4*i+2;
else if(P17==0) key_van=4*i+1;
}
}
P1=0xf0;
if((key_re==1)&&(P14==1)&&(P15==1)&&(P16==1)&&(P17==1))
{
key_re=0;
Key_R=1;
return key_van;
}
return 0xff;
}
void Key_Deal()
{
if(Key_flag)
{
Key_flag=0;
K=Read_Key();
}
switch(K)
{
case 1:Key=0;key_bit++;break;
case 2:Key=1;key_bit++;break;
case 3:Key=2;key_bit++;break;
case 4:Key=3;key_bit++;break;
case 5:Key=4;key_bit++;break;
case 6:Key=5;key_bit++;break;
case 7:Key=6;key_bit++;break;
case 8:Key=7;key_bit++;break;
case 9:Key=8;key_bit++;break;
case 10:Key=9;key_bit++;break;
case 11:Key=10;key_bit+=0;break;
case 12:Key=11;key_bit+=0;break;
case 13:Key=12;key_bit+=0;break;
case 14:Key=13;key_bit+=0;break;
case 15:Key=14;key_bit+=0;break;
case 16:Key=15;key_bit+=0;break;
}
K=0xff;
}
void Key_Stor()
{
if((Key_R)&&(Key<10))
{
Keydats[key_bit-1]=Key;
}
if(key_bit>=6) key_bit=6;
if(key_bit<0) key_bit=0;
}
void Key_temp()
{
if(Key_R)
{
Key_R=0;
if((Key==14)&&(key_bit==6)) //确认
{
QR_flag=1;
}
if((Key==10)&&(key_bit==0)) // 设置
{
SZ_flag=1;menu_change=2;
}
if((Key==15)&&(SZ_flag)) //退出
{
SZ_flag=0;key_bit=0;
menu_change=0;
}
if((Key==11)&&(key_bit==0))//复位
{
for(i=0;i<6;i++)
{
Write_At24c02(i,MiMa_init[i]);
Delay10ms();
}
}
}
}
void main()
{
u8 i;
Timer0_init();
Buzz=0;LED=0;
for(i=0;i<6;i++)
{
Write_At24c02(i,MiMa_init[i]);
Delay10ms();
}
while(1)
{
Key_Deal();
Key_Stor();
Key_temp();
SZ_disp();
MiMa_Deal();
NEW_MiMa();
menu(menu_change);
Display();
}
}
6. 基于单片机门禁系统C语言程序和仿真自取
代码自取:完整C语言代码文件
仿真:Proteus仿真
7. 相关作品
请关注专栏:毕业设计作品
🤞🤞🤞文章来源地址https://www.toymoban.com/news/detail-810205.html文章来源:https://www.toymoban.com/news/detail-810205.html
创作不易,请伸出您发财的小手,打赏下博主,谢谢。
🤞🤞🤞
到了这里,关于基于单片机的门禁系统(C语言代码+Proteus仿真电路)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!