基于STC15系列单片机的智能门锁

这篇具有很好参考价值的文章主要介绍了基于STC15系列单片机的智能门锁。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、项目背景及功能需求

1.1项目背景

智能门锁是一种智能化、高效、安全的门锁,它可以实现密码识别开锁方式,极大地提高了门锁的安全性和便利性。随着人们对安全性的要求越来越高,智能门锁已经成为了现代家庭和企业的必备设备。因此,本项目旨在设计一款基于STC15单片机的智能门锁,以满足人们对安全性和便利性的需求。

1.2 功能需求

从功能上来看,主要分为四个部分:显示时间、密码门锁、修改密码和计算器。其中显示时间可以实时获取当前时间日期;密码门锁不仅可以防盗,还能防止用户忘记带钥匙;修改密码可以让用户在密码泄露时及时更改密码;计算器为创新功能,可以进行一些简单的算术运算。其具体的功能架构如下:

单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件

用到的文件模块如下:

单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件

(1)显示学号:开始会显示“WelcomeSmartLock”和自己的学号

(2)显示时间:可以实时获取当前日期,星期,时间

(3)密码门锁:输入正确密码即可进行开锁,密码错误3次就会发出警报

(4)修改密码:当门锁打开时才能进行修改密码,修改的密码还需要确认重新输入一次,防止用户输错,只有当两次输入一样,才能进行密码的修改;

(5)计算器:可以进行简单的算数运算

(6)结尾有一个动画页面

二、实训环境

单片机开发板套件、Keil C51、STC-ISP

三、项目硬件搭建

3.1硬件设备

硬件部分包括单片机最小系统、矩阵按键、LCD1602、RTC、步进电机等模块,系统框图如下图所示。

3.2硬件连接电路图

单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件

 单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件

单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件

 3.3硬件搭建实物图

单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件

四、具体任务及内容

完成一个智能门锁,包括以下内容:首先使用软件STC-ISP自动生成所需要延时的秒数,完成延时模块的设计,然后进行LCD1062模块的配置,写好显示函数,可以再液晶屏上显示自己想要的内容;然后用取模软件生成想要的图像,使得液晶屏上能显示开锁和关锁的图像;然后完成4x4矩阵键盘的配置,能够识别哪个键盘按下,并且读入相应的信息;然后完成电机驱动模块的配置,由于单片机电压不足,于是需要引入该模块来调动电机,能够进行门锁的开关。然后进行IIC模块的配置,使得单片机能进行简单的通信;随后进行PCF8263模块的配置,能够进行时间的发送与接收,实时获取当前时间。

五、项目运行说明及截图

通过三天的努力,我成功实现了并创新了这次的智能门锁。智慧门锁从功能上来看,主要分为四个部分:显示时间,密码门锁,修改密码,计算器。其中显示时间可以实时读取显示当前时间;密码门锁只有输入正确密码才会开门,输错3次后会报警;修改密码只有开门后才有权限进行修改,并且需要输入两次一样的要修改的密码才会修改成功;计算器是附加的创新功能,可以进行简单的算术运算。

具体功能体现如下:

进入界面

单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件

时间显示界面

单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件

门锁界面

单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件

修改密码

(没开锁)

单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件

(已开锁)

 单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件

计算器界面

单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件

动画界面

单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件

七、附录:(其他相关技术文档或程序实现源码)

单片机stc15系统设计,单片机课程设计,单片机,嵌入式硬件

main.c文件

#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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微机课设 | 基于STC15单片机的简易数字密码锁设计

    在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。在安全技术防范领域,具有防盗报警功能的

    2024年02月04日
    浏览(56)
  • 53、基于STC15W单片机的温度计(DS18B20)(Proteus仿真+程序)

          本设计由STC15W4K32S4单片机+DS18B20温度传感器+1602液晶显示模块+串口模块组成。 1、主控制器是STC15W4K32S4单片机 2、DS18B20温度传感器采集温度,精度0.1摄氏度 3、1602液晶显示温度。 4、测温范围-55~110摄氏度,误差±0.1℃ 5、温度值发送至串口助手显示。 Proteus软件: Proteus

    2024年02月03日
    浏览(67)
  • STC15单片机-低功耗设计

    STC15省电模式(数据手册有介绍) STC15系列单片机可以运行3种省电模式以降低功耗,它们分别是: 低速模式 , 空闲模式 和 掉电模式 。 正常工作模式下,STC15系列单片机的典型功耗是2.7mA ~7mA,而掉电模式下的典型功耗是0.1uA,空闲模式下的典型功耗是1.8mA 低速模式由时钟分

    2024年02月05日
    浏览(84)
  • 【STC15单片机】动态数码管

    目录 点亮一位数码管 动态数码管 100s倒计时 动态数码管封装代码 段选:选中哪一位数码管 位选:选中的数码管要显示的内容 这是我对段选位选的理解,就是选中某个位置,赋值字形码,显示想要的图形 如果只想让第一个数码管显示,就只需要让com1 = 1即可,其他comx都=0 如

    2024年02月13日
    浏览(45)
  • 【STC15单片机】简单的矩阵键盘代码

    单片机型号说明:IAP15F2K61S2 新建工程时单片机型号选择 STC15F2K60S2 51单片机矩阵键盘代码 本程序烧写到51单片机应该是正常使用的,手头没有51开发板了,暂时没测试 这个程序烧写到15单片机,前两列按键不能正常使用 只需要在判断第一列按键那部分程序,前面加上P42 = 0;

    2024年02月05日
    浏览(79)
  • STC15F100E单片机模拟串口

    STC15F100系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,新一代8051单片机,指令代码完全兼容传统8051,但是速度快6-12倍。 内部集成R/C时钟,5MHz~35MHz宽范围可设置,可以省掉外部晶振。 内部集成复位电路,可省掉外部复位电路。 6个通用I/O口,支持四种模式:准双

    2024年02月20日
    浏览(45)
  • STC15W104 8脚单片机串口下载程序

    单片机串口下载是一种常见的单片机程序下载方式,它通过串口线连接单片机的串口引脚和电脑的串口接口实现。下面是单片机串口下载的基本原理和操作方法: 确定下载模式:大多数单片机芯片都支持串口下载模式,需要在程序中设置下载模式。 连接串口:使用串口线连

    2024年02月13日
    浏览(44)
  • 免费开源51单片机个人课程设计--基于stc89c52及红外遥控的测温智能电风扇

    51单片机个人课程设计–基于stc89c52及红外遥控的测温智能电风扇 个人学校的课程设计-智能电风扇,包含proteus原理图与源代码。 代码部分由我个人写的也有普中实验中的代码块。 3.1 硬件设计 主要器件: 单片机 AT89C52 红外接收 HS0038 LCD1602 温度测量 DS18B20 驱动集成芯片 L298

    2023年04月10日
    浏览(58)
  • stc89C51系列单片机介绍

    STC89C51 是一款基于 8051 内核的高性价比单片机,由国内的 STC 微电子公司生产。STC89C51 系列单片机的特点是具有高速运行、丰富的外设接口、广泛的应用领域等优点。本文将从以下几个方面介绍 STC89C51 系列单片机。 STC89C51 系列单片机基于 80C51 内核,具有 1T 和 2T 两种不同的时

    2024年02月01日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包