您好,欢迎来到东饰资讯网。
搜索
您的当前位置:首页基于msp430的数字密码锁

基于msp430的数字密码锁

来源:东饰资讯网
基于msp430f149的数字密码锁

摘要

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

在本次萌芽计划电子设计制作中,我们采用TI公司生产的msp430作为主控芯片,结合外围的矩阵键盘输入、LCD显示、蜂鸣器报警和LED显示等,用C语言编写主控芯片程序,设计了一款可以数字字母混合密码输入,具有报警功能的数字密码锁。

关键词:数字密码锁 msp430 报警

1

目录

目录 .................................................................................................................................................. 2 第一章 系统方案设计与论证 ......................................................................................................... 3

方案比较 ................................................................................................................................... 3 方案设计与论证 ....................................................................................................................... 3 设计框图 ................................................................................................................................... 4 第二章 主要元器件介绍 ................................................................................................................. 4

Msp430f149 ............................................................................................................................... 4 LCD1602液晶显示器 ................................................................................................................ 7 LM7805....................................................................................................................................... 8 ASM1117-3.3 ........................................................................................................................... 10 第三章 系统硬件结构设计 ........................................................................................................... 12

单片机电路 ............................................................................................................................. 12 矩阵键盘电路 ......................................................................................................................... 12 复位单路 ................................................................................................................................. 13 LCD显示电路 .......................................................................................................................... 13 LED显示电路 .......................................................................................................................... 13 报警电路 ................................................................................................................................. 14 电源电路 ................................................................................................................................. 14 第四章 系统软件设计 ................................................................................................................... 14

主程序流程图 ......................................................................................................................... 14 功能按键软件设计 ................................................................................................................. 15 密码设置软件设计 ................................................................................................................. 16 第五章 实验分析 ........................................................................................................................... 17

测试方法 ................................................................................................................................. 17 测试分析 ................................................................................................................................. 18 第五章 总结 ................................................................................................................................... 18 附录 ................................................................................................................................................ 19

附录一 整体电路图 ............................................................................................................... 19 附录二 PCB封装图 .............................................................................................................. 20 附录三 部分程序 ................................................................................................................... 20

2

第一章 系统方案设计与论证

方案比较

方案一:以STCC52单片机为电子密码锁系统核心,使用4*4矩阵键盘作为数据输入方式,驱动LCD1602显示器提示程序运行过程和开锁的步骤,利用AT24C02芯片实现掉电存储。

方案二:以msp430f149单片机为电子密码锁系统核心,使用4*4矩阵键盘作为数据输入方式,驱动LCD1602显示器提示程序运行过程和开锁的步骤。

方案比较:msp430f149单片机性能比STCC52单片机高,且I/O口远多于STCC52单片机,方便更好的利用多余的I/O口 扩充其他功能。因此本次设计选

择方案二。

方案设计与论证

由于单片机种类繁多,各种型号都有其一定的应用环境,因此在选用时要多加比较,合理选择,以期获得最佳的性价比。一般来说在选取单片机时从下面几个方面考虑:性能、存储器、运行速度、I/O口、定时/计数器、串行接口、模拟电路功能、工作电压、功耗、封装形式、抗干扰性、保密性,除了以上的一些的还有一些最基本的比如:中断源的数量和优先级、工作温度范围、有没有低电压检测功能、单片机内有无时钟振荡器、有无上电复位功能等。在开发过程中单片机还受到:开发工具、编程器、开发成本、开发人员的适应性、技术支持和服务等等因素。基于以上因素本设计选用单片机msp430f149作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接LCD1602显示器用于显示作用。当用户需要开锁时,先输入密码,如果密码输入正确则开锁或设置新密码,不正确显示密码错误重新输入密码,当三次密码错误则发出报警;当用户需要修改密码时,先按下键盘设置键后输入新密码,新密码输入后再次输入新密码,两次输入一致则密码修改成功。

3

设计框图

第二章 主要元器件介绍

Msp430f149

MSP430是TI公司新开发的一类具有16位总线的带FLASH 的单片机,由于其性价比和集成度高,受到广大技术开发人员的青睐。它采用16位的总线,外设和内存统一编址,寻址范围可达K,还可以外扩展存储器。具有统一的中断管理,具有丰富的片上外围模块,片内有精密硬件乘法器、两个16位定时器、一个14路的12位的模数转换器、一个看门狗、6路P口、两路USART通信端口、一个比较器、一个DCO内部振荡器和两个外部时钟,支持8M 的时钟。由于为FLASH型,则可以在线对单片机进行调试和下载,且JTAG口直接和FET(FLASH EMULATION TOOL)的相连,不须另外的仿真工具,方便实用,而且可以在超低功耗模式下工作,对环境和人体的辐射小,测量结果为100mw左右的功耗(电流为14mA左右),可靠性能好加强电干扰运行不受影响,适应工业级的运行环境,适合与做手柄之类的自动控制的设备。

4

5

6

LCD1602液晶显示器

本设计采用LCD液晶显示屏显示。其具有体积小、功耗低、界面美观大方等优点,这里使用YB1602液晶屏,1602显示模块用点阵图形显示字符,显示模式分为2行16个字符。它具有16个引脚,其正面左起为第一脚,如下图所示:

第一脚GND:接地。 第二脚VCC:+5V电源。

第三脚VO:对比度调整端。使用时通过接一个10K的电阻来调节。 第四脚RS:寄存器选择信号线。 第五脚RW:读写信号线。

第六脚E:使能端,当E由高电平跳变为低电平时执行命令。

7

第7~14脚:8位数据线D0~D7。 第十五脚BLA:背光电源正极输入端。 第十六脚BLK:背光电源负极输入端。

操作控制表 操作 读状态 写指令 RS=0RW=0, RS=0输入 RW=1,E=1 冲 令码,E=H脉 E=H脉冲 , D0~7=指RW=1,E=1 D0~7=数据,RS=1,RW=0, ,RS=1,读数据 写数据 表3.6.1 LCD1602操作指令

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如'A’。 1602通过D0~D7的8位数据端传输数据和指令。

LM7805

电源电路采用普通可调电源供电,该电源不含稳压器,所以在设计中需要用稳压器进行稳压,我们选用LM7805来获得稳定的+5V直流电压,LM7805引脚排列和典型应用如下图:

8

LM7805引脚和典型应用

LM7805电气参数

9

ASM1117-3.3

本设计中msp430需采用3.3v电源供电,因此需用AMS1117-3.3将已稳压成5v的直流稳压成3.3v。AMS117-3.3 是一个正向低压降稳压器,在1A电流下压降为1.2V。

AMS1117引脚图

10

AMS1117电气参数

11

单片机电路

口接入单片机。

矩阵键盘电路

电部分和晶振部分。

第三章 系统硬件结构设计

单片机电路

以TI公司的msp430f149单片机为主控芯片,CPU电路十分简单,只需供

4*4矩阵键盘电路由16个轻触开关加上4个1k的上拉电阻构成,通过P1

12

矩阵键盘电路

复位单路

单片机在RESET端加一个大于20ms正脉冲即可实现复位,上电复位和按钮组合的复位电路如下:

复位电路

在系统上电的瞬间,RST与电源电压同电位,随着电容的电压逐渐上升,RST电位下降,于是在RST形成一个正脉冲。当人按下按钮K17时,使电容C7通过R8迅速放电,待K17弹起后,C7再次充电,实现手动复位。

LCD显示电路

本设计采用LCD1602液晶显示屏进行显示,可同时实现数字与字母混合密码的显示以及各种提示的显示。

LCD显示电路

LED显示电路

P2.0接红色LED灯,密码错误时显示;P2.4接绿色LED灯,密码正确开锁时显示;P2.6接蓝色LED灯,设置密码时显示。

13

LED显示电路

报警电路

按键时蜂鸣器会实时鸣叫;当密码三次输入错误时,长时间蜂蜜报警;密码输入正确时蜂鸣器产生提示音。

报警电路

电源电路

本设计采用9v电池供电,先由LM7805稳压至5v,再由ASM1117-3.3稳压到3.3v给电路供电。

电源电路

第四章 系统软件设计

主程序流程图

开始接上电源,程序进行初始化设置,然后在键盘上输入密码,此系统进行键盘扫描,密码错误3次出错报警,密码正确,选择开锁或修改密码,若要修改

14

密码时,需要两次确认新密码,确认后,密码修改成功,否则结束。

开始 初始化 输入密码 N N 密码正确? Y Y 开锁? N 修改密码? N 返回

主程序流程图

Y 修改程序 开锁程序 次数加1 次数>3? Y 报警程序 功能按键软件设计

在按键当中,有与转换、清除、开锁、设置的程序相对应的按键。

开始 键值=‘转换’? 15 转换程序

功能按键程序软件流程图

返回 键值=‘设置’? 设置程序 键值=‘开锁’? 开锁程序 键值=‘清除’? 清除程序 密码设置软件设计

开始按下设置键,输入新密码后,再次输入新密码,如果两次输入一样,则输入成功。如果两次输入的新密码不一样,则修改密码失败。

开始 16

密码设置软件流程图

设置成功 设置失败 两次输入一致? 再次输入 输入新密码 按下设置键 第五章 实验分析

测试方法

按下电源开关,屏幕显示”PASSWORD”,输入10位密码,屏幕实时显示密码,并伴有实时提示音,若密码错误,屏幕显示”ERROR“,随后显示”PASSWORD”,再次输入密码,密码三次输入错误,清屏,亮红灯并伴有长时间蜂鸣。

17

若输入密码正确,蜂鸣器产生提示音,屏幕显示”A_unlock B_set”,若按下开锁键,亮绿灯,显示”UNLOCK”;若按下设置键,亮黄灯,显示”NEW CODE”,输入10位新密码,显示”INPUT AGAIN”,再次输入新密码,若两次新密码输入一致,显示”SUCCEED”,若两次新密码输入不一致,则显示”FAILE”。

输入密码时,可通过清除键清除已输入密码,可通过转换键实现数字与字母和字母大小写之间的转换。

测试分析

测试结果与我们预想的一致,但由于程序中使用了go-to语句,使得输入不是很稳定,需要一定的反应时间。

第五章 总结

总的来说,这次“萌芽计划”对我们三个都是一个挑战,因为我们三人的基础都不一样,有的基本为零,而有的却早已参加了多次科创活动。对于萌芽而言,我们三个无论是谁都无法独自完成。这更挑战了我们的合作能力。在技术上,我们基础好的带动基础差的,尽可能的让他学会东西,基础好的也不断提升自己,用更高端的技术来实现功能。通过这次竞赛,我们三个都提高了很多,这次的萌芽计划也为我们日后的科创道路打下了厚实的基础。当然,我们也有很多不足之处,比如说粗心大意,导致我们浪费了很多工程和时间,还有因为懒惰,是我们没有做到尽善尽美。但有了这次经历,我想我们三个在以后会做的越来越好。

18

附录

附录一 整体电路图

19

附录二 PCB封装图

附录三 部分程序

#include #include \"Keypad.h\" #include \"cry1602.h\" #include \"子程序集.h\"

//引用外部变量的声明

extern unsigned char key_val; extern unsigned char key_Flag; extern unsigned char BACK;

//宏定义(也许不这么叫,看二级) typedef unsigned char uchar; typedef unsigned int uint;

uchar Code_C[10] = {0};

uchar Code_D[10] = {0,1,2,3,4,5,'a','a','a','a'};//这是密码哦

/********************主函数********************/ void main(void)

20

{

uchar Tishi[] = {\"PASSWORD:\

uchar PROX[] = {\"XINXIN & LULU &\ uchar PROX_1[] = {\"JUNJUN......\ uchar Fin[] = {\"THIEF...THIEF..\

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

LcdReset(); //初始化LCD Init_Keypad(); //初始化键盘端口 P6DIR |= BIT7; //蜂鸣器P6.7 P6OUT |= BIT7;

P2DIR |= 0xff; //P2.0红灯-用于报警以及按键;P2.4绿灯-用于解锁、开锁;P2.6蓝灯-用于设置 P2OUT |= 0xff;

loop:DispNChar(0,0,15,PROX);

DispNChar(2,1,12,PROX_1); //嘿嘿 Delay400ms();

LcdWriteCommand(0x01,1);

DispNChar(3,0,9,Tishi); //显示提示文字

Code_CIN_1();

//子程序1 向数组C输入十位数字字母组合(最开始输入密码时)

Comp();

//子程序2 逐个比较数组C和数组D的元素

Delay200ms();//用于显示延迟,否则看不到最后一位

Unlock_j();

//对比较结果进行分析判断,然后运行

if(BACK <= 3) //密码输入错误小于三次再次输入

goto loop; //程序有些不稳,需要慢慢按(GOTO的弊端) else {

LcdWriteCommand(0x01,1); //大于三次后报警 DispNChar(0,0,16,Fin);

BACK = 0; //计数清零 Buz_E();//报警; Delay400ms(); Delay400ms();

LcdWriteCommand(0x08,1); //之后会白屏,嘿嘿 } }

21

/*********************************************************************** *****函数名称:向C数组中输入十位密码 输入密码阶段 *****返回值:暂无 *****功能:

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

void Code_CIN_1(void) {

uchar Clear_1[] = {\"PASSWORD:\ uint i,p,ref = 1; uchar fact,key;

for(i = 0, p = 0; i <= 9;) //十位密码 {

Key_Event();

if(key_Flag == 1) {

key_Flag = 0;

fact = key_val;//这样会比较好

switch(fact) //逻辑1-10用于实际0-9(需要key的转换) 逻辑4为开锁键,只有密码正确有效,其余无效 {

case 1:

Buz_O();//按键声

if(ref == 1) //关系着数字与字母的转换(字母包含大小写)1为数字,2为小写,三为大写 {

key = 1;Disp1Char(3+i,1,0x30+key);//显示对应的是ACSSI码 Code_C[p] = key; i++;p++; }

else if(ref == 2) {

key = 0x31;Disp1Char(3+i,1,0x30+key);

Code_C[p] = 0x30+key; //比较的时候是16进制的对应码 i++;p++; }

else if(ref == 3) {

key = 0x11;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; }

22

break; case 2:

Buz_O(); if(ref == 1) {

key = 2;Disp1Char(3+i,1,0x30+key); Code_C[p] = key; i++;p++; }

else if(ref == 2) {

key = 0x32;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; }

else if(ref == 3) {

key = 0x12;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; } break; case 3:

Buz_O(); if(ref == 1) {

key = 3;Disp1Char(3+i,1,0x30+key); Code_C[p] = key; i++;p++; }

else if(ref == 2) {

key = 0x33;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; }

else if(ref == 3) {

key = 0x13;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; } break; case 5:

23

Buz_O(); if(ref == 1) {

key = 4;Disp1Char(3+i,1,0x30+key); Code_C[p] = key; i++;p++; }

else if(ref == 2) {

key = 0x34;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; }

else if(ref == 3) {

key = 0x14;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; } break; case 6:

Buz_O(); if(ref == 1) {

key = 5;Disp1Char(3+i,1,0x30+key); Code_C[p] = key; i++;p++; }

else if(ref == 2) {

key = 0x35;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; }

else if(ref == 3) {

key = 0x15;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; } break; case 7:

Buz_O(); if(ref == 1)

24

{

key = 6;Disp1Char(3+i,1,0x30+key); Code_C[p] = key; i++;p++; }

else if(ref == 2) {

key = 0x41;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; }

else if(ref == 3) {

key = 0x21;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; } break; case 9: Buz_O(); if(ref == 1) {

key = 7;Disp1Char(3+i,1,0x30+key); Code_C[p] = key; i++;p++; }

else if(ref == 2) {

key = 0x42;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; }

else if(ref == 3) {

key = 0x22;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; } break; case 10: Buz_O(); if(ref == 1) {

key = 8;Disp1Char(3+i,1,0x30+key);

25

Code_C[p] = key; i++;p++; }

else if(ref == 2) {

key = 0x43;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; }

else if(ref == 3) {

key = 0x23;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; } break; case 11: Buz_O(); if(ref == 1) {

key = 9;Disp1Char(3+i,1,0x30+key); Code_C[p] = key; i++;p++; }

else if(ref == 2) {

key = 0x44;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; }

else if(ref == 3) {

key = 0x24;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; } break; case 14: Buz_O(); if(ref == 1) {

key = 0;Disp1Char(3+i,1,0x30+key); Code_C[p] = key; i++;p++;

26

}

else if(ref == 2) {

key = 0x45;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; }

else if(ref == 3) {

key = 0x25;Disp1Char(3+i,1,0x30+key); Code_C[p] = 0x30+key; i++;p++; } break;

case 4:break;//这两个键需正确后再用 case 8:break; case 12:

if(i < 9)//。。。失误失误 {

Buz_O(); Delay5ms(); Buz_O();//提醒

DispNChar(0,0,16,Confirm_0); DispNChar(3,0,10,Confirm_1); Delay200ms();

DispNChar(0,0,16,Confirm_0); DispNChar(3,0,9,Clear_1); } break; case 13:

Buz_O(); //转换按键 ref++; if(ref > 3) {ref = 1;} break; case 15:

Buz_O(); //清除程序

LcdWriteCommand(0x01,1); DispNChar(3,0,9,Clear_1); for(i = 0,p = 0; p <= 9;p++)

{Code_C[p] = 0;} //同时数组也得清 break;

case 16:break; //扩展呗,有时间继续加 default:

27

break;//到时添加延时程序。 } } } }

/***************************************************8 *****函数名:比较程序 *****返回值:A

*****功能:俩数组进行比较

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

#include #include \"Keypad.h\" #include \"cry1602.h\"

void Comp(void) {

uint p; uint S,Q;

for(p = 0;p <= 9;p++) {

S = Code_C[p]; Q = Code_D[p]; if(S == Q) {A = 1;} else

{A = 0;break;}//一个标志位,到时好比较 } }

/********************************开锁程序******************************** ***** 函数名:Unlock_j ***** 返回值:无

*****功能:比较输入判断密码是否正确,然后进行提示

****************************************************************************/ void Unlock_j(void) {

uchar Tishi_0[] = {\"WELCOME-@-\ uchar Tishi_1[] = {\"ERROR\

uchar Tishi_2[] = {\"A_unlock B_set\ uchar Tishi_3[] = {\"UNLOCK-@-\

28

uint p,i,R;

if(A == 1)//密码正确 {

LcdWriteCommand(0x01,1); DispNChar(3,0,10,Tishi_0); DispNChar(0,1,15,Tishi_2); Delay5ms();

Buz_R();//正确提示音 三声短促鸣叫 BACK = 0;

for(p = 0;p <= 9;p++)//对比数组C清空 {

Code_C[p] = 0; }

for(i = 0;i <= 5;) {

Key_Event();//再次扫描,选择功能开锁或设置密码 if(key_Flag == 1) {

key_Flag = 0;

R = key_val; if(R == 4) {

Buz_O();

LcdWriteCommand(0x01,1); DispNChar(3,1,9,Tishi_3); i++;//开锁 Delay5ms(); Buz_R(); }

if(R == 8) {

Buz_O(); Set();

i++;//修改密码 } } } }

else//密码错误 {

LcdWriteCommand(0x01,1); DispNChar(4,0,8,Tishi_1);

29

Delay200ms();

BACK++;//错误计数标志位 } }

30

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuoyibo.cn 版权所有 湘ICP备2023022426号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务