【毕业设计】58-基于51单片机的智能语音密码锁设计(原理工程+PCB工程+仿真工程+源代码+答辩论文+实物图)
详情请私信!
资料包含:毕业设计全套资料(精品)
原理图工程文件
原理图截图
PCB工程文件
仿真模型工程文件
源代码工程
仿真截图
实物图片
答辩论文低重复率文档,26009字
英文文献及翻译
任务书
需要资料请私信
任务书
主要研究内容:
掌握电子密码锁的原理、构造、以及运用51单片机设计出一款简易密码锁,实现相应的一些要求;掌握并且实际运用所学知识,将书中知识转化为实际能力;对密码锁的应用和未来的发展进行分析。
研究方法:
通过相关的书籍和网上资料,查阅相关资料,收集有用的信息。研究已有的设计,逐步完善自己的设计,同时咨询指导老师,以达到专业标准,顺利完成合格的设计。
要求:
设计一个具有设置数字密码任设、存储、画面显示、语言播报以及具有报警功能的密码锁。密码锁具有语言播报和状态显示功能。一次性只允许三次密码输入操作,支持密码修改。具有报警功能。
设计说明书
摘要
本次设计基于51单片机的智能语音密码锁设计,电子密码锁需要实现密码锁的开锁、解锁、以及更改密码等功能,再通过LED灯和蜂鸣器辅助表示其状态等功能。需要使用51单片机及其外围电路组成控制系统。单片机最小系统、LCD1602显示器、键盘、AT2402储存器、蜂鸣器、LED、语音模块、喇叭组合而成。
通过对当前关于锁的发展背景分析,确定系统功能实现。然后对系统的硬件与软件进行设计。整个系统是以模块化的形式设计电路的各个子电路为一个功能模块,最后汇总到一起组成的控制系统应用电路。软件设计同样是以模块化的形式编写程序,按照功能对软件驱动划分最后调用到主函数中。最后制作实物,通过对系统电路连接,并将程序导入到单片中,运行调试。
最后测试系统功能与系统稳定性,总结完成设计的相应功能,完成了本次的设计。
设计框架架构
设计说明书及设计文件
源码展示
#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;
}