数字式密码电子锁电路设计

更新时间:2023-12-25 14:48:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程设计任务书

学生姓名: 专业班级: 指导教师: 工作单位:

题 目: 数字式密码电子锁电路设计 初始条件:

本设计既可以使用集成电路和必要的元器件等。本设计也

可以使用单片机系统构建数字密码电子锁。自行设计所需工作电源。电路组成原理框图见图1,数字密码锁的实际锁体一般由电磁线圈、锁栓、弹簧和锁柜构成。当线圈有电流时,产生磁力,吸动锁栓,即可开锁。反之则不开锁。

图1 数字式电子锁电路原理框图

要求完成的主要任务: (包括课程设计工作量及技术要求,以及说明书撰写等具体要求)

1、课程设计工作量:1周。 2、技术要求:

①课程设计中,锁体用LED代替(如“绿灯亮”表示开锁,“红灯亮”表示闭锁)。 ②其密码为方4位(或8位)二进制代码(代码自设定)。

③开锁指令为串行输入码,当开锁密码与存储密码一致时,锁被打开。当开锁密码与存储密码不一致时,可重复进行,若连续三次未将锁打开,电路则报警并实现自锁。(报警动作为响1分钟,停10秒)

④选择电路方案,完成对确定方案电路的设计。计算电路元件参数与元件选择、并画出总体电路原理图,阐述基本原理。安装调试设计电路。

3、查阅至少5篇参考文献。按《武汉理工大学课程设计工作规范》要求撰写设计报告书。全文用A4纸打印,图纸应符合绘图规范。

时间安排:

1、 2012 年 7 月 1 日集中,作课设具体实施计划与课程设计报告格式的要求说明。 2、 2012 年 7 月 1 日,查阅相关资料,学习电路的工作原理。

2、 2012 年 7 月 2 日 至 2012 年 7 月 3 日,方案选择和电路设计。

2、 2012 年 7 月 4 日 至 2012 年 7 月 5 日,电路调试和设计说明书撰写。 3、 2012 年 7 月 6 日上交课程设计成果及报告,同时进行答辩。 课设答疑地点:鉴主14楼实验室。

指导教师签名: 年 月 日 系主任(或责任教师)签名: 年 月 日

1

摘要

本系统由单片机系统、矩阵键盘、LED显示和报警系统组成。系统能完成开锁、超时报警、超次锁定、声光提示、修改用户密码基本的密码锁的功能。依据实际的情况还可以添加管理员解密、调电存储、遥控功能。本系统成本低廉,功能实用

关键词:电子密码锁,单片机系统,液晶显示,密码检验

2

1.绪论

随着人们生活水平的提高,家庭防盗这一问题越来越引人注目,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的青睐。

设计本课题时构思了两种方案:一种是用以MSP430为主控芯片的单片机控制方案;另一种是用以74LS112双JK触发器构成的数字逻辑电路控制方案。考虑到数字电路方案电路复杂,控制度比较低,难以满足现在的安全需求,所以本设计采用前一种方案。

本次课程设计就是利用所学的数字电路知识,忽略复杂的实物锁体器件的驱动,简单模拟实现数字密码锁原理功能,从而复习相关知识,达到理论与实践相结合的目的。

2.设计内容及要求

2.1 设计的初始条件及主要任务

课程设计中,锁体用LED代替(如“绿灯亮”表示开锁,“红灯亮”表示闭锁)。 其密码为方4位(或8位)二进制代码(代码自设定)。

开锁指令为串行输入码,当开锁密码与存储密码一致时,锁被打开。当开锁密码与存储密码不一致时,可重复进行,若连续三次未将锁打开,电路则报警并实现自锁。(报警动作为响1分钟,停10秒)

选择电路方案,完成对确定方案电路的设计。计算电路元件参数与元件选择、并画出总体电路原理图,阐述基本原理。安装调试设计电路。

2.2 设计思路

本次的设计任务,运用集成逻辑器件组成的门电路也可以完成,但是考虑到输入信号的数量、逻辑判断的复杂度可以预知其数字逻辑电路会是相当复杂的。而运用具有可以写入程序,按程序完成相关逻辑判断、电平控制的单片机芯片则会大大降低系统的复杂度,因此基于单片机来完成此次设计成为了总体设计方案的首选。

本设计使用的是MSP430单片机,该单片机芯片功能齐全,体积小,性价比高,使用该芯片可以轻易完成该设计任务。配合上外围电路独立按键、1602液晶、蜂鸣器和LED

3

灯构成整个系统。实物电路体积小巧,结构精简。

设计从总体可以分为硬件与软件两个部分。在硬件部分中,由单片机最小系统、1602液晶显示模块、按键控制模块和声光报警模块几个部分构成,其相关控制关系如图2.1;在软件部分中,由按键键值读取、1602液晶显示函数、延时模块、密码读取模块、密码设置模块、密码比较模块、密码找回模块、声光状态模块等几部分组成。

系统整体框架图如下:

MSP430 Flash掉电存储 单片机 声光指示电路 独立按键控制电路 LCD1602显示电路 图2.2 系统整体框架图

3.模块硬件电路设计

3.1 单片机最小系统

此为一个单片机最小系统,其有P1~P6六组I/O口,可以进行相关的电平状态读取与控制操作。最小系统中使用了两个晶振,32768Hz的低速晶振和8MHz的高速晶振,为系统提供可选择的时钟源。由于MSP430单片机工作电压为3.3V,故最小系统中使用了输出3.3V的稳压电路。最小系统电路图如图3.1所示:

4

图3.1单片机最小系统

3.2 独立按键

本设计使用了三个独立按键进行电路设计控制,硬件结构简单,免去了矩阵键盘的大体积,通过程序控制可以通过独立按键输入2进制和10进制数,使用方便。其电路图如图3.2所示:

图3.2 独立按键电路

5

for(i = 0; i < 16; i++)

void LCD_Operation_Question() { uchar i;

Write_Com(0x80); for(i = 0; i < 16; i++) { Write_Date(table1_6[i]); } Write_Com(0x80+0x40); for(i = 0; i < 16; i++) { Write_Date(table2_0[i]); } }

void LCD_Operation_Answer(uchar i) { Write_Com(0x80+0x40+6+location); Write_Com(0x0f); Write_Date( i + 0x30); Write_Com(0x80+0x40+6+location); }

void LCD_Operation_Succeed() { uchar i;

Write_Com(0x80); for(i = 0; i < 16; i++) { Write_Date(table1_1[i]); } Write_Com(0x80+0x40); for(i = 0; i < 16; i++) { Write_Date(table2_7[i]); } }

void LCD_Operation_Congratulation() { uchar i;

Write_Com(0x80); for(i = 0; i < 16; i++) {

16

Write_Date(table1_9[i]); } Write_Com(0x80+0x40); for(i = 0; i < 11; i++) { Write_Date(table2_9[i]); } Write_Date(ps[0] + 0x30); Write_Date(ps[1] + 0x30); Write_Date(ps[2] + 0x30); Write_Date(ps[3] + 0x30); Write_Date(' '); }

void LCD_Operation_Bye() { uchar i;

Write_Com(0x80); for(i = 0; i < 16; i++) { Write_Date(table1_8[i]); } Write_Com(0x80+0x40); for(i = 0; i < 16; i++) { Write_Date(table2_3[i]); } }

/*****************************************************************/

void Reset() { errorcount = 0; lockflag = 0; unlockflag = 0; answerflag = 0; startflag = 0; errorflag = 0; succeedflag = 0; changeflag = 0; Write_Com(0x0c); }

/****************************Part:Flash****************************/ void Flash_Init() {

17

FCTL2 = FWKEY + FSSEL0 + FN4 + FN3; // MCLK/25 for Flash Timing Generator }

void Flash_Write() // Write 'bj' and 'waveform' to flash { uchar i;

uchar *Flash_ptr; // Flash pointer Flash_ptr = (uchar *) 0x1080; // Initialize Flash pointer FCTL1 = FWKEY + ERASE; // Set Erase bit FCTL3 = FWKEY; // Clear Lock bit *Flash_ptr = 0; // Dummy write to erase Flash segment FCTL1 = FWKEY + WRT; // Set WRT bit for write operation for(i = 0;i < 4;i++) { *Flash_ptr++ = ps[i]; } FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCK; // Set LOCK bit }

void Flash_Read() // Read 'bj' and 'waveform' from flash { uchar i;

uchar *Flash_ptrA; Flash_ptrA = (uchar *) 0x1080; // Initialize Flash segment A pointer FCTL1 = FWKEY; // Set Erase bit FCTL3 = FWKEY + LOCK; // Clear Lock bit for(i = 0;i < 4;i++) { ps[i] = *Flash_ptrA++; } }

/*****************************************************************/

void All_Init() {

Clock_Mode(); LCD_Ctrl_Dir = 0xff; LCD_Data_Dir = 0xff; Ab1; Blue1; Red1; P1IES = 0x0f; P1IE = 0x0f; P1IFG &= ~0x0f;

18

P1DIR = 0xf0; LCD_Init(); Flash_Init(); Timer_A_Init(); }

void main() { uchar i; All_Init(); LCD_Operation_Init(); Flash_Read(); for(i = 0;i < 4;i++) { if(ps[i]>2) { ps[i] = 0; } } _EINT(); while(1) { if(unlockflag == 1) { Blue0; Red1; } else { Blue1; Red0; } } }

#pragma vector=PORT1_VECTOR __interrupt void PORT1_ISR(void) {

P1IFG=0; uchar keytemp; keytemp = Key_In; keytemp &= 0x07; if(keytemp != 0x07) { Delayms(15);

// If there is external interrupt

19

if(keytemp != 0x07) { while(Key_In != 0x07); switch(keytemp) { case 0x06: if(busy == 0) { if(lockflag == 0 && unlockflag == 0 && answerflag == 0 && errorflag == 0) { function++; if(function == 1) { LCD_Operation_Find(); } if(function == 2) { function = 0; LCD_Operation_Init(); Reset(); } } if(lockflag == 1 && unlockflag == 0 && answerflag == 0 && errorflag == 0) { function++; if(function == 1) { LCD_Operation_Find(); } if(function == 2 ) { function = 0; if(succeedflag == 1) { LCD_Operation_Init(); Reset(); } else { LCD_Operation_Lock(); } } } } break;

20

password;

case 0x05:

if(function == 0 && errorflag == 0 )//Function=0:enter password;function=1:find

//function=1:change password { if(lockflag == 0 && unlockflag == 0 && answerflag == 0) { temp[location] = 0; LCD_Operation_Enter(); busy = 1; location++; LCD_Operation_Check(); } }

if(function == 1 && errorflag == 0) { if(lockflag == 1 && unlockflag == 0 && answerflag == 0) { LCD_Operation_Lock(); function = 0; } if(lockflag == 0 && unlockflag == 0 && answerflag == 0) { LCD_Operation_Init(); function = 0; } }

if(answerflag == 1 && startflag == 1 && errorflag == 0) { if(num == 0) { num = 10; }

num--;

LCD_Operation_Answer(num); }

if(answerflag == 1 && startflag == 0 && errorflag == 0) { LCD_Operation_Answer(num); startflag = 1; }

if(function == 2 && errorflag == 0) { if(changeflag == 1) {

21

if(sureflag == 0) { ps[location] = 0; LCD_Operation_Enter(); location++; if(location == 4) { location = 0; sureflag = 1; LCD_Operation_Makesure(); } } else { ps_1[location] = 0; LCD_Operation_Enter(); location++; } } else { LCD_Operation_Unlock(); function = 0; } } break; case 0x03:

if(function == 0 && errorflag == 0) { if(lockflag == 0 && unlockflag == 0 && answerflag == 0) { temp[location] = 1; LCD_Operation_Enter(); busy = 1; location++; LCD_Operation_Check(); } } if(answerflag == 1 && startflag == 1 && errorflag == 0) { num++; if(num == 10) { num = 0; }

22

LCD_Operation_Answer(num); }

if(answerflag == 1 && startflag == 0 && errorflag == 0) { LCD_Operation_Answer(num); startflag = 1; }

if(function == 1 && startflag == 0 && errorflag == 0) { LCD_Operation_Question(); answerflag = 1; }

if(function == 2 && errorflag == 0) {

if(changeflag == 1) { if(sureflag == 0) { ps[location] = 1; LCD_Operation_Enter(); location++; if(location == 4) { location = 0; sureflag = 1; LCD_Operation_Makesure(); } } else { ps_1[location] = 1; LCD_Operation_Enter(); location++; if(location == 4) { location = 0; sureflag = 0; } } } else { changeflag = 1; LCD_Operation_New();

23

} } break; } } } }

#pragma vector = TIMERA0_VECTOR __interrupt void TA0_ISR(void) {

_DINT(); ms++; if(ms == 500) { s++; ms = 0; if(s <= 120) { if(s%2 == 1) { Ab0; } else { Ab1; } } else { Ab1; } if(s >= 140) { s = 0; } } _EINT(); }

// There is two vector in timer bj,

// TIMERA0_VECTOR is owned by CCR0

24

2.coded_lock.h头文件

/*------------------------------------------------------------------------------ ** Created by: Xu Yuanchun ** Created date: 2012.06.02 ** Version: V1.0

** Descriptions: The coded_lock.h of trick lock

*******************************************************************************/ #ifndef _coded_lock_h #define _coded_lock_h

/*********Define for keys********/ #define Key_Dir P1DIR #define Key_Out P1OUT #define Key_In P1IN #define Key_1 (P1IN & 0x06) // Select the function #define Key_2 (P1IN & 0x05) // Increase to change #define Key_3 (P1IN & 0x03) // Decrease to change /********************************/

/*********Define for LCD*********/ #define LCD_Ctrl_Dir P3DIR #define LCD_Ctrl_Port P3OUT #define LCD_Data_Dir P2DIR #define LCD_Data_Port P2OUT #define LCD_RS BIT0 #define LCD_EN BIT1

#define LCD_RES_RS LCD_Ctrl_Port &= ~LCD_RS #define LCD_SET_RS LCD_Ctrl_Port |= LCD_RS #define LCD_RES_EN LCD_Ctrl_Port &= ~LCD_EN #define LCD_SET_EN LCD_Ctrl_Port |= LCD_EN /********************************/

#define Ab0 LCD_Ctrl_Port &= ~BIT2 #define Ab1 LCD_Ctrl_Port |= BIT2 #define Blue0 LCD_Ctrl_Port &= ~BIT4 //0代表亮,1代表灭 #define Blue1 LCD_Ctrl_Port |= BIT4 #define Red0 LCD_Ctrl_Port &= ~BIT5 #define Red1 LCD_Ctrl_Port |= BIT5 /********Function declare********/ void Delayms(uint); void LCD_Init();

void Write_Com(uchar); void Write_Date(uchar); #include \

25

#endif

3.LCD1602.c文件

/*------------------------------------------------------------------------------ ** Created by: Xu Yuanchun ** Created date: 2012.06.02 ** Version: V1.0

** Descriptions: The LCD1602.c of trick lock

*******************************************************************************/

void Write_Com(uchar com) // Write command {

LCD_RES_RS; LCD_RES_EN; LCD_Data_Port=com; Delayms(5); LCD_SET_EN; Delayms(5); LCD_RES_EN; }

void Write_Date(uchar date) // Write data { LCD_SET_RS; LCD_RES_EN; LCD_Data_Port=date; Delayms(5); LCD_SET_EN; Delayms(5); LCD_RES_EN; }

void LCD_Init() // Initialize { LCD_RES_EN; Write_Com(0x38); //设置16*2显示,5*7点阵,8位数据接口 Write_Com(0x0c); //设置开显示,不显示光标 Write_Com(0x06); //写一个字符后地址指针加1 Write_Com(0x01); //显示清零,数据指针清零 }

26

27

本科生课程设计成绩评定表

姓 名 专业、班级 徐元春 性 别 男 电子科学与技术电子1003班 课程设计题目: 数字式密码电子锁电路设计 课程设计答辩或质疑记录: 问题一:你的电路硬件框架? 答:我所设计的电路中使用了单片机芯片AT89C52作为主控芯片,外围器件有矩阵键盘,1602液晶,蜂鸣器和LED灯。 问题二:电路能否记忆设定密码?如何实现? 答:可以。我在电路中使用AT89C52自带的E2PROM作为电路的存储模块,存储当前的密码。 问题三:如果三次密码错误会出现什么现象? 答:程序中设置了一个标志变量,当三次密码错误,标志变量置位,不能再次输入密码。 成绩评定依据: 最终评定成绩(以优、良、中、及格、不及格评定)

指导教师签字:

年 月 日

28

本文来源:https://www.bwwdw.com/article/7kcx.html

Top