第4章保险箱密码锁控制器目录概述准备工作硬件驱动设计虚拟驱动设计主程序设计直流电机及其功率接口概述4.1概述4.1.1保险箱锁芯机械结构4.1.2锁芯机械结构锁芯机械结构锁芯机械结构密码锁控制器4.1.3密码锁控制器密码锁的控制器核心电路包括单片机、E2PROM存储器、蜂鸣器、电机驱动、对外接口。对外接口包括键盘接口、显示器接口、电机接口与行程开关接口以及内部与外部电源接口。密码锁工作原理4.1.4密码锁工作原理1.结构密码锁由控制电路、机械结构与单片机3部分组成,控制电路实现电机输出控制、锁舌位置检测、用户键盘输入、数码管显示与蜂鸣器声音提示等硬件平台。机械机构实现将电机转换为机械运动,机械运动即锁舌的伸出与缩进(关锁与开锁)。单片机实现密码输入获取、密码的存储、密码对比、输出显示、电机控制与驱动蜂鸣器等软件功能,也是锁得大脑。密码锁工作原理2.基本功能在保险箱锁闭合状态下,用户可以通过键盘输入密码。若输入密码正确,则单片机输出控制信号驱动电机转动,带动锁舌缩进动作。当单片机收到行程开关检测到锁舌已经缩进到位的信号,则立即停止电机转动,锁舌停止在完全缩进状态,即将锁打开。同时数码管显示开锁成功,蜂鸣器提示操作成功。若输入密码错误,则数码管显示密码错误,蜂鸣器报警提示,电机停转。在保险箱锁打开状态下,当用户按下锁闭合按钮,则单片机输出控制电机转动,带动锁舌伸出动密码锁工作原理作;当单片机收到行程开关检测到锁舌已经伸出到位的信号,则立即让电机停止转动,锁舌处于完全伸出状态,即锁以经上锁。在保险箱锁打开状态下,当用户按下修改密码按钮,则锁进入修改密码状态,用户通过键盘输入新的密码,再次按下修改密码按钮,保持新的密码,即修改密码成功。目录概述准备工作硬件驱动设计虚拟驱动设计主程序设计直流电机及其功率接口准备工作4.2准备工作主要完成3件事1.最主要的就是确定产品的最终规格;包括如何使用、产品寿命、尺寸、成本、估计售价与待机时间等。2.对产品进行概要设计;估计产品在技术上的可行性。3.制定研发计划(在此不深入讨论)。使用说明4.2.2使用说明本章重在实现电子密码保险箱的最基本功能:正常开锁、正常关锁和修改密码。1.正常开锁(1)在待机状态(屏幕全灭)情况下,按‘#’键即唤醒电脑板,屏幕显示“------”,输入正确的1-6位密码,接着按‘#’键确认。出厂默认密码“123456”;(2)如果密码正确,则蜂鸣器长鸣一声,屏幕显示“open”,同时保险箱打开;(3)如果密码不正确,则蜂鸣器短鸣两声,屏幕显示“error”,然后屏幕显示“------”,等待用户重新输入密码。使用说明(4)如果连续3次输入错误密码,则蜂鸣器短鸣4声,显示屏全灭,一分钟内禁止开锁;(5)删除数字操作:在密码输入过程中,按一次“*”可删除一个数字,按照输入相反方向顺序删除;(6)每按一次数字键,则蜂鸣器叫一声,屏幕显示该数字,表示数字已输入;(7)如果15秒内为输入,则电脑板进入待机状态。2.正常关锁在开锁状态下,按“#”键关锁,保险箱锁住,电脑板进入待机状态。使用说明3.更改密码(1)正常开锁;(2)在开锁状态,当输入“*”时,则进入密码设置状态,屏幕显示“------”;(3)输入1~6位密码,按“#”确认,蜂鸣器长鸣一声,则表示密码设置成功。两秒钟后屏幕显示“open”,此时可正常关锁;(4)每按一次数字键,则蜂鸣器叫一声,屏幕显示该数字,表示数字已输入。硬件概要设计4.2.3硬件概要设计根据研发团队的实际情况和项目的总目标进行决策,其具体情况如下:1.决策(1)电子密码锁对控制器性能要求不高,且80C51售价便宜,同时研发团队熟悉80C51,因此研发进度和研发成本有保证;(2)选用已有的3×4矩阵键盘作为输入,成本低廉,且经过验证,因此,更有利于提高研发进度和质量。(3)选用6位数码管作为显示输出,由于成本低廉,且经过验证,因此,更有利于提高研发进度和质量。硬件概要设计(4)选用已有的无源蜂鸣器电路用于声音提示,相对有源蜂鸣器来说,无源蜂鸣器更加灵活,且成本低廉,经过验证,因此,更有利于提高研发进度和质量。(5)选用CAT1025电路用于存储密码,成本低廉,且经过验证,因此,更有利于提高研发进度和质量。(6)第一版先暂时选用市售带驱动的锁模块,目的在于加快开发进度,让产品快速上市,为更低成本的第二版争取时间。(7)选用已有的电源电路给系统供电,由于成本合适,经过验证,因此,更有利于提高研发进度和质量。硬件概要设计2.硬件框图根据决策可以画出产品的硬件框图。决策中除了锁驱动电路外,其它电路都是成熟电路,不需要详细分析。而根据锁模块的说明书可知,电机的动作完全由锁模块控制,仅需要一个COMS/TTL电平的IO即可驱动,低电平开锁,高电平关锁。软件概要设计4.2.4软件概要设计1.概述C语言是模块化编程语言,软件概要设计一个重要的工作就是模块划分。而针对嵌入式系统软件来说,因为硬件资源少,可能还需要对模块进行资源分配。2.模块划分产品会不断升级,硬件也会不断改进。为了使软件具有更大的适应性,可将软件划分为硬件驱动层、虚拟设备层和应用层3大模块,每个大模块又可分为几个小模块。软件概要设计(1)硬件驱动层硬件驱动层直接驱动硬件,根据本项目实际情况,可划分为:延时驱动、锁驱动、键盘驱动、蜂鸣器驱动、显示器驱动、I2C驱动与CAT1025驱动7个子模块。(2)虚拟驱动层虚拟驱动层是按照应用层需要的逻辑驱动组成,比如,键盘和显示器都是通过扫描来实现的。为了节省IO,可以利用技巧让键盘和显示器公用一些IO口,并将键盘和显示器合并为人机交互模块。虽然硬件驱动为人机交互驱动,但虚拟驱动依然为虚拟键盘驱动和软件概要设计虚拟显示驱动,因此,应用层模块无需改变即可在新的硬件上使用。根据项目的实际情况,虚拟驱动可划分为:虚拟锁驱动、虚拟键盘驱动、虚拟蜂鸣器驱动、虚拟显示器驱动与虚拟存储器驱动5个子模块。(3)应用层应用层用于直接实现产品功能。根据本项目的实际情况,应用层对外只有一个模块:人机交互模块。当然,内部还可以划分为几个模块,供内部自己使用。软件概要设计3.资源分配由于RAM的分配由C编译器自动完成,因此资源分配主要是80C51片内外设的分配。又由于IO的分配是由硬件决定的,因此,资源分配不包括IO部分。通过分析硬件驱动层可知,延时驱动和蜂鸣器驱动必须使用定时器,而显示驱动最好也使用定时器。由于80C51只有两个定时器,因此让蜂鸣器驱动使用定时器1,延时驱动使用定时器0。而其它驱动由于使用IO或不使用任何片外资源,因此无需分配资源。目录概述准备工作硬件驱动设计虚拟驱动设计主程序设计直流电机及其功率接口延时驱动4.3硬件设计4.3.1延时驱动1.概述本项目有很多程序需要使用延时程序,比如,使用虚拟键盘驱动键盘。而且,在某些情况下,既要延时又要进行其它操作,比如,若在15秒内无键按下,则进入待机状态。因此,必须建立延时驱动,否则不好编写其它模块。那么,不妨以2.2.4小节介绍的“定时器中断延时程序”的实现原理设计延时驱动。延时驱动2.规划其它模块可能用到两种延时方式,分别为直接延时和延时的同时还可以干别的事情。由此本驱动具有3个函数接口,一个用于直接延时,一个指示延时开始,一个判断延时是否结束。再加上设备的初始化和中断服务程序,本驱动至少需要为其它软件提供5个函数。可将延时驱动程序划分为3个文件,即分别为delay.h、delay.c、delay_cfg.h。delay.h为驱动对外接口,其它程序只要包含此文件,即可使用此驱动了,而delay.c为实现驱动的代码。delay_cfg.h为驱动配置文件,用于配置使用的硬件等信息。延时驱动延时驱动配置文件(delay_cfg.h)26#include8051.h27#include”..\led_display\led_display.h”2829#ifndef_DELAY_CFG_H30#define_DELAY_CFG_H32/********************************************************************************33定义“延时”时调用的函数34********************************************************************************/35#defineDELAY_HOOK()zyLedDisplayScan()37/********************************************************************************38获得指令周期,以毫秒为单位,公式为“(晶振频率/12)uiDly/1000”但应简化,以避免计算溢出39********************************************************************************/40#defineDELAY_CYCLES(uiDly)((((11059200ul/200)*(uiDly))/(1000/200))42#endif//BUZZER_CFG_H延时驱动延时驱动接口(delay.h)26#ifndef_DELAY_H27#define_DELAY_H2829#ifdef_cplusplus30extern”C”{31#endif//_cplusplus33/********************************************************************************35**Description:延时初始化40********************************************************************************/41externchardelayInit(void);//返回值:0—成功,-1—失败43/********************************************************************************45**Description:毫秒延时开始50********************************************************************************/51externchardelayMsStart(unsignedintuiDly);//uiDly:以毫秒为延时单位延时驱动53/********************************************************************************55**Description:检查延时是否结束60********************************************************************************/61externchardelayMslsEnd(void);//返回值:1—结束,0—还在延时63/********************************************************************************65**Description:毫秒延时70********************************************************************************/71externchardelayMs(unsignedintuiDly);//uiDly:以毫秒为单位的延时时间73/********************************************************************************