一、项目背景及功能需求
1.1项目背景
智能门锁是一种智能化、高效、安全的门锁,它可以实现密码识别开锁方式,极大地提高了门锁的安全性和便利性。随着人们对安全性的要求越来越高,智能门锁已经成为了现代家庭和企业的必备设备。因此,本项目旨在设计一款基于STC15单片机的智能门锁,以满足人们对安全性和便利性的需求。
1.2 功能需求
从功能上来看,主要分为四个部分:显示时间、密码门锁、修改密码和计算器。其中显示时间可以实时获取当前时间日期;密码门锁不仅可以防盗,还能防止用户忘记带钥匙;修改密码可以让用户在密码泄露时及时更改密码;计算器为创新功能,可以进行一些简单的算术运算。其具体的功能架构如下:
用到的文件模块如下:
(1)显示学号:开始会显示“WelcomeSmartLock”和自己的学号
(2)显示时间:可以实时获取当前日期,星期,时间
(3)密码门锁:输入正确密码即可进行开锁,密码错误3次就会发出警报
(4)修改密码:当门锁打开时才能进行修改密码,修改的密码还需要确认重新输入一次,防止用户输错,只有当两次输入一样,才能进行密码的修改;
(5)计算器:可以进行简单的算数运算
(6)结尾有一个动画页面
二、实训环境
单片机开发板套件、Keil C51、STC-ISP
三、项目硬件搭建
3.1硬件设备
硬件部分包括单片机最小系统、矩阵按键、LCD1602、RTC、步进电机等模块,系统框图如下图所示。
3.2硬件连接电路图
3.3硬件搭建实物图
四、具体任务及内容
完成一个智能门锁,包括以下内容:首先使用软件STC-ISP自动生成所需要延时的秒数,完成延时模块的设计,然后进行LCD1062模块的配置,写好显示函数,可以再液晶屏上显示自己想要的内容;然后用取模软件生成想要的图像,使得液晶屏上能显示开锁和关锁的图像;然后完成4x4矩阵键盘的配置,能够识别哪个键盘按下,并且读入相应的信息;然后完成电机驱动模块的配置,由于单片机电压不足,于是需要引入该模块来调动电机,能够进行门锁的开关。然后进行IIC模块的配置,使得单片机能进行简单的通信;随后进行PCF8263模块的配置,能够进行时间的发送与接收,实时获取当前时间。
五、项目运行说明及截图
通过三天的努力,我成功实现了并创新了这次的智能门锁。智慧门锁从功能上来看,主要分为四个部分:显示时间,密码门锁,修改密码,计算器。其中显示时间可以实时读取显示当前时间;密码门锁只有输入正确密码才会开门,输错3次后会报警;修改密码只有开门后才有权限进行修改,并且需要输入两次一样的要修改的密码才会修改成功;计算器是附加的创新功能,可以进行简单的算术运算。
具体功能体现如下:
进入界面
时间显示界面
门锁界面
修改密码
(没开锁)
(已开锁)
计算器界面
动画界面
七、附录:(其他相关技术文档或程序实现源码)
main.c文件文章来源:https://www.toymoban.com/news/detail-766768.html
#include <stc15.h>
#include <string.h>
#include "LCD1602.h"
#include "delay.h"
#include "zimo.h"
#include "Key16.h"
#include "stepmotor.h"
#include "PCF8563.h"
#include "JiSuanQi.h"
#define uchar unsigned char
#define uint unsigned int
sbit beep=P3^7;
uint X=999;
uchar clear[]=" ";
uchar clearPwd[]=" ";
uchar show1[]="WelcomeSmartLock";
uchar show2[]="InputPassword";
uchar success_show[]="Success!";
uchar fail_show[]="Fail!";
uchar number[]="211071085";
extern unsigned char time_buf1[8];
extern unsigned char time_buf[8];
uchar PWD[]="888888";
uchar input_Pwd[8];
uchar oneInput[8];
uchar twoInput[8];
uchar JiSuan[10];
uint ans;
uchar clockFlag=0;
uint Motor_Num;
uchar my_input=0;
uchar index=0;
uchar pageFlag=0;
uchar Flag=0;//行
uchar FailNum=0;
void LCD_Show_closeClock();
void LCD_Show_openClock();
void LCD_Clear();
void openClock();
void close();
void LCD_Show_Time();
void Show_Xin();
void main()
{
P3M0=0x00;
P3M1=0x00;
LCD_Init();
// time_init();
LCD_Show_String(0,0,show1);
LCD_Show_String(3,1,number);
Delay1000ms();
LCD_Clear();
while(1)
{
my_input = KeyScan_4x4();
if(my_input=='/')
{
pageFlag=(pageFlag+1)%5;
LCD_Clear();
Delay200ms();
}
if(pageFlag==0)//页面1显示时间
{
LCD_Show_Time();
}
else if(pageFlag==1)//页面2显示门锁
{
if(clockFlag==0)
{
LCD_Show_closeClock();
LCD_Show_String(0,0,show2);
}
else if(clockFlag==1)
{
LCD_Show_openClock();
}
if('0'<=my_input && my_input<='9' && index<=7)
{
input_Pwd[index]=my_input;
LCD_Show_OneChar(index, 1, input_Pwd[index]);
Delay200ms();
LCD_Show_OneChar(index, 1, '*');
index++;
LCD_Show_OneChar(14, 1, index+'0');
}
if(my_input=='<' && index!=0)
{
index--;
input_Pwd[index]='0';
LCD_Show_OneChar(index, 1, ' ');
Delay200ms();
LCD_Show_OneChar(14, 1, index+'0');
}
if(my_input=='=')
{
LCD_Clear();
input_Pwd[index]='\0';
index=0;
if(strcmp(input_Pwd,PWD)==0 && clockFlag==0)
{
LCD_Show_String(0,0,success_show);
openClock();
Delay1000ms();
LCD_Clear();
clockFlag=1;
LCD_Show_openClock();
input_Pwd[0]='\0';
}
else
{
LCD_Show_String(0,0,fail_show);
FailNum++;
if(FailNum==3)
{X=999;
while(X--)
{
beep=0;
Delay500us();
beep=1;
Delay500us();
}
FailNum=0;
}
Delay1000ms();
LCD_Clear();
LCD_Show_closeClock();
LCD_Show_String(0,0,show2);
}
LCD_Show_OneChar(14, 1, index+'0');
}
if(my_input=='+' && clockFlag==1)
{
clockFlag=0;
LCD_Clear();
Delay200ms();
index=0;
close();
LCD_Show_String(0,0,show2);
input_Pwd[0]='\0';
LCD_Show_OneChar(14, 1, index+'0');
}
if(my_input=='C')
{
LCD_Show_String(0,1,clearPwd);
Delay200ms();
index=0;
LCD_Show_OneChar(14, 1, index+'0');
}
}
else if(pageFlag==2)//页面3显示修改密码
{
if(clockFlag==1)
{
// LCD_Show_String(0,0,"ChangePassword!");
// Delay1000ms();
LCD_Show_String(0,0,"ChangeP");
LCD_Show_String(0,1,"RepeatP");
LCD_Show_OneChar(7, Flag, ':');
if('0'<=my_input && my_input<='9' && index<=7)
{
oneInput[index]=my_input;
LCD_Show_OneChar(index+8, Flag, oneInput[index]);
Delay200ms();
LCD_Show_OneChar(index+8, Flag, '*');
index++;
}
if(my_input=='<' && index!=0)
{
index--;
oneInput[index]='0';
LCD_Show_OneChar(index+8, Flag, ' ');
Delay200ms();
}
if(my_input=='=')
{
Delay200ms();
Flag++;
oneInput[index]='\0';
if(Flag==2)
{
if(strcmp(oneInput,twoInput)==0)
{
strcpy(PWD,oneInput);
LCD_Clear();
LCD_Show_String(0,0,"ChangeSuccess!");
Delay1000ms();
LCD_Clear();
}
else
{
LCD_Clear();
LCD_Show_String(0,0,"DifferentResults!");
Delay1000ms();
LCD_Clear();
}
}
strcpy(twoInput, oneInput);
index=0;
}
}
else
{
LCD_Show_String(0,0," NoAuthority!");
}
}
else if(pageFlag==3)//页面4计算器
{
if(('0'<=my_input && my_input<='9')||(my_input=='+' || my_input=='-' || my_input=='x' || my_input=='='))
{
JiSuan[index]=my_input;
LCD_Show_OneChar(index, 0, JiSuan[index]);
index++;
JiSuan[index]='\0';
Delay200ms();
if(my_input=='=')
{
ans=Jfuntion(JiSuan);
LCD_Show_OneChar(0, 1, ans+'0');
}
}
if(my_input=='C')
{
LCD_Clear();
Delay200ms();
index=0;
}
if(my_input=='<' && index!=0)
{
index--;
JiSuan[index]='0';
LCD_Show_OneChar(index, 0, ' ');
Delay200ms();
}
}
else if(pageFlag==4)//页面5显示动画
{
Show_Xin();
}
}
}
void LCD_Clear()
{
LCD_Show_String(0,0,clear);
LCD_Show_String(0,1,clear);
}
void LCD_Show_closeClock()
{
LCD_Show_Customer(15,0,0,close_Clock);
LCD_Show_Customer(15,1,1,guan);
}
void LCD_Show_openClock()
{
LCD_Show_Customer(15,0,0,open_Clock);
LCD_Show_Customer(15,1,1,kai);
}
void close()
{
LCD_Show_closeClock();
Motor_Num=256;
while(Motor_Num--)
{
Motor_Drive41(0,5);
}
MotorStop();
}
void openClock()
{
Motor_Num=256;
LCD_Show_openClock();
while(Motor_Num--)
{
Motor_Drive41(1,5);
}
MotorStop();
}
void LCD_Show_Time()
{
//显示年份
uchar time_ge,time_shi;
get_time();
time_ge=time_buf1[1]%10;
time_shi=time_buf1[1]/10;
LCD_Show_OneChar(3,0,'2');
LCD_Show_OneChar(4,0,'0');
LCD_Show_OneChar(5,0,time_shi+'0');
LCD_Show_OneChar(6,0,time_ge+'0');
//显示月份
time_ge=time_buf1[2]%10;
time_shi=time_buf1[2]/10;
LCD_Show_OneChar(8,0,time_shi+'0');
LCD_Show_OneChar(9,0,time_ge+'0');
//显示日
time_ge=time_buf1[3]%10;
time_shi=time_buf1[3]/10;
LCD_Show_OneChar(11,0,time_shi+'0');
LCD_Show_OneChar(12,0,time_ge+'0');
//显示时
time_ge=time_buf1[4]%10;
time_shi=time_buf1[4]/10;
LCD_Show_OneChar(4,1,time_shi+'0');
LCD_Show_OneChar(5,1,time_ge+'0');
//显示分
time_ge=time_buf1[5]%10;
time_shi=time_buf1[5]/10;
LCD_Show_OneChar(7,1,time_shi+'0');
LCD_Show_OneChar(8,1,time_ge+'0');
//显示秒
time_ge=time_buf1[6]%10;
time_shi=time_buf1[6]/10;
LCD_Show_OneChar(10,1,time_shi+'0');
LCD_Show_OneChar(11,1,time_ge+'0');
//显示 : 和锁
LCD_Show_Customer(15,0,0,close_Clock);
LCD_Show_OneChar(6,1,':');
LCD_Show_OneChar(9,1,':');
//显示星期
time_ge=time_buf1[7];
time_ge+=(time_ge==0)?1:0;
LCD_Show_OneChar(14,0,time_ge+'0');
}
void Show_Xin()
{
uchar i;
for(i=0;i<15;i+=2)
{
LCD_Show_Customer(i,0,0,myZi);
LCD_Show_Customer(i+1,0,1,xin1_1);
LCD_Show_Customer(i,1,1,xin1_1);
LCD_Show_Customer(i+1,1,0,myZi);
}
Delay500ms();
for(i=0;i<15;i+=2)
{
LCD_Show_Customer(i,0,0,myZi2);
LCD_Show_Customer(i+1,0,1,xin1_2);
LCD_Show_Customer(i,1,1,xin1_2);
LCD_Show_Customer(i+1,1,0,myZi2);
}
Delay500ms();
}
如果后续需要用到本项目,可以私聊找我要配置驱动模块的文件文章来源地址https://www.toymoban.com/news/detail-766768.html
到了这里,关于基于STC15系列单片机的智能门锁的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!