【毕业设计】58-基于51单片机的智能语音密码锁设计(原理工程+PCB工程+仿真工程+源代码+答辩论文+实物图)


typora-root-url: ./


请添加图片描述

资料要求

资料包含:毕业设计全套资料(精品)
原理图工程文件
原理图截图
PCB工程文件
仿真模型工程文件
源代码工程
仿真截图
实物图片
答辩论文低重复率文档,26009字
英文文献及翻译
任务书

任务书

主要研究内容:

掌握电子密码锁的原理、构造、以及运用51单片机设计出一款简易密码锁,实现相应的一些要求;掌握并且实际运用所学知识,将书中知识转化为实际能力;对密码锁的应用和未来的发展进行分析。

研究方法:

通过相关的书籍和网上资料,查阅相关资料,收集有用的信息。研究已有的设计,逐步完善自己的设计,同时咨询指导老师,以达到专业标准,顺利完成合格的设计。

要求:

设计一个具有设置数字密码任设、存储、画面显示、语言播报以及具有报警功能的密码锁。密码锁具有语言播报和状态显示功能。一次性只允许三次密码输入操作,支持密码修改。具有报警功能。

设计说明书

摘要

本次设计基于51单片机的智能语音密码锁设计,电子密码锁需要实现密码锁的开锁、解锁、以及更改密码等功能,再通过LED灯和蜂鸣器辅助表示其状态等功能。需要使用51单片机及其外围电路组成控制系统。单片机最小系统、LCD1602显示器、键盘、AT2402储存器、蜂鸣器、LED、语音模块、喇叭组合而成。

通过对当前关于锁的发展背景分析,确定系统功能实现。然后对系统的硬件与软件进行设计。整个系统是以模块化的形式设计电路的各个子电路为一个功能模块,最后汇总到一起组成的控制系统应用电路。软件设计同样是以模块化的形式编写程序,按照功能对软件驱动划分最后调用到主函数中。最后制作实物,通过对系统电路连接,并将程序导入到单片中,运行调试。

最后测试系统功能与系统稳定性,总结完成设计的相应功能,完成了本次的设计。

设计框架架构

前 言… 1

第一章 绪论… 2

第一节 电子密码锁的研究背景… 2

第二节 电子密码锁的研究现状及趋势… 3

一、研究现状… 3

二、研究趋势… 3

第三节 电子密码锁的研究意义… 4

第四节 论文主要研究内容… 5

第五节 本章小节… 6

第二章 电子密码锁的设计方案… 7

第一节 系统的设计功能分析… 7

第二节 元器件使用方案选择… 7

一、主控制器选择… 7

二、显示器件的选择… 8

第二节 电子密码锁的系统结构… 9

第三节 本章小结… 9

第三章 电子密码锁的硬件设计… 11

第一节 单片机最小系统… 11

第二节 矩阵按键电路… 12

第三节 AT24C02电路… 13

第四节 LCD1602显示器电路… 14

第五节 蜂鸣器及LED电路… 14

第六节 语音播报电路… 15

第六节 电源电路… 16

第七节 系统的总电路… 17

第八节 本章小结… 18

第四章 系统的软件设计… 19

第一节 编程软件的介绍… 19

第二节 主程序设计… 20

第三节 AT24C02程序设计… 21

第四节 矩阵键盘程序设计… 21

第五节 蜂鸣器报警及LED程序设计… 22

第六节 LCD1602显示程序设计… 23

第七节 语音播报程序设计… 24

第八节 本章小结… 25

第五章 实物制作与调试… 26

第一节 实物制作与调试… 26

第三节 功能测试… 28

第四节 本章小节… 34

结 论… 35

致 谢… 37

参考文献… 38

附 录… 40

一、英文原文… 40

二、英文翻译… 43

三、源代码… 46

设计说明书及设计文件

![请添加图片描述](https://img-blog.csdnimg.cn/direct/2837d352a31d4834a3f096a9371643a7.png)
![请添加图片描述](https://img-blog.csdnimg.cn/direct/734ff0ef9cda49099eb8f1aa7eecac5b.png)
![请添加图片描述](https://img-blog.csdnimg.cn/direct/617f435ea9d54ce5a40100d9aa154cb7.png)





### 源码展示

```C
#include <reg52.h>	         //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义	变量范围0~255
#define uint  unsigned int	 //无符号整型 宏定义	变量范围0~65535

uchar  i;		//变量
 
sbit relay = P2^2;  //继电器定义
sbit beep  = P3^3;  //蜂鸣器定义

sbit beiguan = P2^3;  //背光

uint flag_time;

uint flag_guan;

uchar dis_smg[7]={0};

uchar password[7]={0};	    //密码保存
uchar password_bj[7]={0};	//密码比较
uchar code password_r[6]  = {1,2,3,1,2,3} ;
uchar code password_gl[6] = {5,2,0,0,2,5} ;
uchar password_xg[6];	//密码修改
uchar flag_password;      //密码正确否
uchar flag_password_cichu1;//密码错误次数

uchar flag_200ms=1;     //200毫秒的变量
  
uchar menu_1,menu_i;

/***********************语音模块控制IO口的定义************************/
sbit  VBUSY = P3^4;	    //忙脚
sbit  VDATA = P3^5; 	//数据输入脚
sbit  VCS   = P3^6;     //片选脚
sbit  VCLK  = P3^7;	    //时钟脚  

sbit scl = P2^1;	//24c02信号引脚 
sbit sda = P2^0;    //24c02数据引脚 
 
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
	uint i,j;
	for(i=0;i<q;i++)
		for(j=0;j<120;j++);
}

/***********************语音模块子程序************************/
void Send_threelines(unsigned char addr) 
{
   unsigned char i;
 	VCS=0;		  //片选脚 低电平
     for(i=0;i<8;i++)   //8位的数据 要循环8次1位1位的写入
	{
		VCLK=0;		 //时钟脚 低电平
		if(addr&0x01 == 0x01)
		{
			VDATA=1;		 //数据输入脚 写数据1
		}
		else 
			VDATA=0;		 //数据输入脚 写数据0
		addr<<=1;	  //数据左移一位
		VCLK=1;		   //时钟脚   高电平
	}
	VCS=1;	    //片选脚 高电平
	while(VBUSY == 0);	  //忙等待
}
 
sbit rs=P2^5;	 //寄存器选择信号 H:数据寄存器  	L:指令寄存器
sbit rw=P2^6;	 //寄存器选择信号 H:数据寄存器  	L:指令寄存器
sbit e =P2^7;	 //片选信号   下降沿触发

/********************************************************************
* 名称 : delay_uint()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_uint(uint q)
{
	while(q--);
}

/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602指令函数
* 输入 : 输入的指令值
* 输出 : 无
***********************************************************************/
void write_com(uchar com)
{
 	rs=0;	     //写指令
	rw=0;	     //对1602写操作
	P0=com;	     //P0口对1602写指令数据 
	delay_uint(25);
	e=1;		 //e=1使能信号 
	delay_uint(100);   //延时一下等1602完成操作
	e=0;
}

/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{
 	rs=1;	     //写数据
	rw=0;	     //对1602写操作
	P0=dat;	 	 //P0口对1602写数据 
	delay_uint(25);
	e=1;		 //e=1使能信号 
	delay_uint(100);   //延时一下等1602完成操作
	e=0;	
}
 
/*********************光标控制***********************/
void lcd1602_guanbiao(uchar open_off,uchar add)
{
	if(open_off == 1)   //开光标
	{
		write_com(0x80+add);              //将光标移动到秒个位
		write_com(0x0f);                //显示光标并且闪烁
	}
	else 
	{
		write_com(0x0c);   //关光标
	}		
}

/***********************lcd1602上显示两位十进制数************************/
void write_lcd2(uchar hang,uchar add,uchar date)
{
 	if(hang==1)   
		write_com(0x80+add);		//1602写第一行的地址 
	else
		write_com(0x80+0x40+add);	//1602写第二行的地址 
 	write_data(0x30+date/10%10);	//显示十位数
	write_data(0x30+date%10);	    //显示个位数
}

/***********************lcd1602上显示这字符函数************************/
void write_string(uchar hang,uchar add,uchar *p)
{
	if(hang==1)   
		write_com(0x80+add);	   //1602写第一行的地址 
	else
		write_com(0x80+0x40+add);   //1602写第二行的地址 
	while(1)														 
	{
		if(*p == '\0')  break;	//\0字符串的结尾标志  break结束while循环 结束写字符
		write_data(*p);	    //写数据 
		p++;	            //指针地址加1  
	}	
}

/***********************lcd1602初始化设置************************/
void init_1602()
{
	write_com(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口 不检测忙信号
	write_com(0x0c);  //开显示 不显示光标
	write_com(0x06);  //当写一个字符是,地址指针加 1
	write_string(1,0," Password Lock  ");	
	write_string(2,0," Input:         ");
	lcd1602_guanbiao(1,7+0x40);  //开光标 第2行第7位显示光标
}


/***************启始信号 ***************************/
void start()
{
	sda = 1;
	scl = 1;
	sda = 0;
	scl = 0;
}

/****************结束信号 **************************/
void stop()
{
	sda = 0;
	scl = 1;
	sda = 1;
	scl = 0; 
}

/*****************检测应答*************************/
void ack()
{
	uchar i;
	sda = 1;   
	scl = 1;	
	while((i < 100) & (sda == 1))	i++;
	scl =0;
}

/*****************非应答*************************/
void no_ack()
{
	sda = 1;
	scl = 1;
	scl = 0;
}

/*****************写一个字节*************************/
void write_iic(uchar dat)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		scl = 0;
		dat <<= 1 ;
		sda = CY;
		scl = 1;
	}
	scl = 0;
}



猜你喜欢

转载自blog.csdn.net/cqtianxingkeji/article/details/135012113