基于单片机的简易密码锁设计

上传人:平*** 文档编号:10276276 上传时间:2017-10-07 格式:DOC 页数:21 大小:197.28KB
返回 下载 相关 举报
基于单片机的简易密码锁设计_第1页
第1页 / 共21页
基于单片机的简易密码锁设计_第2页
第2页 / 共21页
基于单片机的简易密码锁设计_第3页
第3页 / 共21页
基于单片机的简易密码锁设计_第4页
第4页 / 共21页
基于单片机的简易密码锁设计_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《基于单片机的简易密码锁设计》由会员分享,可在线阅读,更多相关《基于单片机的简易密码锁设计(21页珍藏版)》请在金锄头文库上搜索。

1、基于单片机的简易密码锁设计学校:专业:姓名:敬告本文是作者实现更复杂功能硬件设计中的一小部分,只是涉及到了密码锁的实现设计,供大家学习研究,读者可根据自己需要增加相应的功能,本文只针对初学者,硬件工程师请绕道而行。本文主要包含 STC89C52RC 单片机,4*4 的矩阵键盘,AT24C02 存储器,LCD1602 液晶显示器。中间的一些变量数组的定义,读着可自行调整,作者是需要别的功能定义过的变量重复利用。芯片什么的就不介绍了,自己去网上查。另外,本设计作者在单片机开发板上测试通过,相应功能都能实现,如果读者没有实现功能,肯定哪一步未做好,需要回去检查。主要功能:密码有两套,命名为出门密码和

2、管理员密码,想要修改密码,必须通过管理员密码,还一个修改时间按键功能是作者需要显示系统时间,修改系统时间的作用。读者如不需要,可以删除相关代码,不影响整体功能。两套密码分别存储在不同的地方,在程序里可以清楚的区别开来。输入出门密码时,错误则提醒再次输入,直到正确为止,三次错误则转到相应代码,如错误提示音。当修改密码时,输入管理员密码,与输入出门密码一样,直到通过为止,三次错误执行相应代码,验证通过后输入新的密码,两次一样则通过,不一样则失败。电路图如下:在矩阵键盘模块,可能横纵接线画错,即使这样连接也不用怕,可以自己测试,根据实际情况来调整按键的顺序,如按最左上角按键,找到返回的组合码,即可修

3、改返回的数值。按键功能如下: 1 2 3 a4 5 6 b7 8 9 cF 0 e d其中确认键的功能此处未用到,其他按键的功能,读者可根据自己的需要进行调整,接下来就是关键部分了,程序的源代码,本次设计是基于 C 语言,采用 KEIL 软件编写完成。本次设计还包含了一些小功能,退格键,返回键,长时间不操作自动返回。#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include#include#define CHECK_BUSY#define KeyPort P1sbit RS = P24; /定义端口 sbit RW = P25;sbit EN = P26

4、;sbit SDA=P27; /模拟 I2C 数据传送位sbit SCL=P23; /模拟 I2C 时钟控制位#define RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1#define DataPort P0/*-函数的声明-*/void DelayMs(unsigned char t);void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char D

5、ata);void LCD_Write_Com(unsigned char com);void LCD_Write_Data(unsigned char Data);void LCD_Clear(void);void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s);void LCD_Init(void);void DelayUs2x(unsigned char t);unsigned char KeyScan(void);unsigned char KeyPro(void);unsigned char Che

6、ckCode(unsigned char *s);bit ack;/-AT24C02 的函数声明 -/void Start_I2c();void Stop_I2c();void SendByte(unsigned char c);unsigned char RcvByte();void Ack_I2c(void);void NoAck_I2c(void);bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);bit IRcvStr(unsigned char sla,unsign

7、ed char suba,unsigned char *s,unsigned char no);/*-判忙函数-*/bit LCD_Check_Busy(void) #ifdef CHECK_BUSYDataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET;return (bit)(DataPort & 0x80);#elsereturn 0;#endif/*-写入命令函数-*/void LCD_Write_Com(unsigned char com) / while(LCD_Check_Busy(); /忙则等待DelayMs(5);RS

8、_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR;/*-写入数据函数-*/void LCD_Write_Data(unsigned char Data) /while(LCD_Check_Busy(); /忙则等待DelayMs(5);RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_();EN_CLR;/*-清屏函数-*/void LCD_Clear(void) LCD_Write_Com(0x01); DelayMs(5);/*-写入字符串函数-*/void LCD_Write_String(u

9、nsigned char x,unsigned char y,unsigned char *s) while (*s) LCD_Write_Char(x,y,*s); s +; x+; /*-写入字符函数-*/void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); LCD_Write_Data( Data); /*-初始化函数-*/void LCD_Init(void) LCD

10、_Write_Com(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/*-uS 延时函数,含有输入参数 unsigned char t,

11、无返回值unsigned char 是定义无符号字符变量,其值的范围是0255 这里使用晶振 12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS -*/void DelayUs2x(unsigned char t) while(-t);/*-mS 延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0255 这里使用晶振 12M,精确延时请使用汇编-*/void DelayMs(unsigned char t)while(t-)/大致延时 1mSDelayUs2x(245);DelayUs2x(245);/*-启动总线-*/void Start_I2c()SDA=1; /发送起始条件的数据信号_nop_();SCL=1;_nop_(); /起始条件建立时间大于 4.7us,延时_nop_();_nop_();_nop_();_nop_(); SDA=0; /发送起始信号_nop_(); /起始条件锁定时间大于 4_nop_();_nop_();_nop_();_nop_(); SCL=0; /钳住 I2C 总线,准备发送或接收数据_nop_();_nop_();/*-结束总线-*/void Stop_I2c()SDA=

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号