作者: 赵晓玲 (辽宁机电职业技术学院,辽宁 丹东118002)
出处: 国外电子元器件
1 引 言
近几年来单片机技术飞速发展,各种新型号的单片机层出不穷,在家电、控制、仪表等领域起到了举足轻重的作用。MSP430是一款具有超低功耗、丰富的片内外围模块、软件对硬件灵活控制等特点的单片机,特别适用于由电池供电的应用。本文介绍了一种以MPS430单片机为控制核心的指纹保险柜的工作原理,重点讨论实现指纹保险柜功能的软件设计。
2 指纹保险柜的工作原理
指纹保险柜不用钥匙或密码,仅凭指纹实现保险柜的安全控制。指纹保险柜的原理图如图1所示。
图l中的"控制电路"部分为指纹门锁的控制中心。它从"指纹比对模块"部分取得指纹比对的结果数据,如指纹比对成功,"控制电路"向机械锁芯中的"动作部分"发出开锁的信号。同时监测动作的执行情况与锁的开/关状态。
除此以外,"控制电路"还可控制"指纹比对模块"部分进行指纹录入/删除,并对整个电路的工作状态进行管理控制,对错误进行报警等。
本指纹保险柜具有机械自动触发、锁定功能。一旦门被打开,就关断控制电路,其余工作交予机械部分管理。
3 系统软件设计
3.1 系统分析
系统分析是整个程序设计工作的基点,应根据系统功能进行结构化设计,即将整个程序分为若干个模块,通过主程序将各个模块有机地组织起来。指纹保险柜的系统程序主要由主程序、按键模块、控制模块、显示模块、计时模块和串口通讯模块组成。
下面以按键模块为例,分析该模块详细设计过程。
本指纹保险柜控制电路可存储30个指纹数据,其中包含1个管理者和29个普通用户的指纹数据。它们之间的管理关系为0号管理者管理普通用户群。0号管理者的指纹数据存储于固定的位置00,其他位置为普通用户位置。按键模块分为按键查询和按键管理两部分。
1)按键查询。保险柜具有4个按键,其中,上电键用于为系统加电;录入键用于控制电路执行录入指纹的功能,即将指纹以数据形式存入保险柜中:删除键用于控制电路执行删除数据指纹的功能:而全清键用于使控制电路执行删除全部数据指纹的功能。本模块应判断是否有按键按下,并判断出是哪一个按键按下。
2)按键管理。根据按键查询程序获得的按键值进行相应的动作处理。按下上电键时,蜂鸣器发出一声短促的鸣叫,表示系统已经加电的绿色电源指示灯亮。按下录入键时,窗口内的绿灯亮,表示处于录入数据指纹状态。正常情况下,一个指纹录入时应该划过取指器3次,每次划过后,绿色灯闪动一次,蜂鸣器鸣响一声。成功划过取指器3次后,绿色发光管闪亮,蜂鸣器长鸣一声,表示该指纹已经录入到指纹锁内。当用户手指划过取指器的速度过快、过慢或手指对窗口的压力不够时,蜂鸣器发出2声短鸣,表示此次手指划动不合格,不予记录,应该重新划动。超时无操作,指纹保险柜会自动断电。按下删除键时,窗口内的绿色与红色灯同时亮,表示进入删除数据指纹状态。然后输入要删除的指纹,比对通过后,红色灯熄灭,蜂鸣器鸣响一声,表示此时该指纹已经从指纹锁内删除。按下全清键不动,3秒钟后蜂鸣器发出一声长鸣,继续按全清键,直到发出3声长鸣,表示锁内存储的指纹已被全部清空。
3.2 软件流程
对于复杂系统的程序设计,应在系统分析基础上用直观、易懂的流程图表示程序结构的设计。按键管理模块的流程图如图2所示,其中指纹录入子模块的流程图如图3所示。
3.3 源程序
本系统的开发软件采用IRA公司的IAR Em-bedded Workbench集成开发环境,它可以编辑、汇编和编译汇编语言和C语言源文件,并且其汇编语言和C语言具有相同格式的头文件.给开发带来了很大的灵活性。C语言具有编程简单、可移植等优点。下面为按键管理模块中的部分代码。
函数名:managen_key(unsigned char key_flag)
功 能:按键管理
说 明:
调 用:baojing_beii(),send_comm_Uasrt0()
入口参数:uart_buf[],key_flag,template_number,key
返回值:无
void managen_key(unsigned char key_flag)
{
unsigned int j;
unsigned char i;
uart_r_num=0x0;
uart_r_flag=0x0;
j = 60000; //延时
do(j--);
while(j !=0);
switch(key_flag) //根据按键返回值进行不同的处理
{
... //其它按键的处理过程
case 0x5: //按键为全清键
{
LIGHT_OUT |= RED_LIGHT;
if(send_comm_Uasrt0(0x24,key-1)==0x1)//如果存储的指纹被清空
{
key=0x0; //设置数码管显示值"00"
init_led(); //调用初始化LED程序
led_num(key); //调用LED显示转换程序
tmeer_flash = 0x01; //调用启动定时程序使LED闪烁"00"
Timeer();
baojing_beii(0x1,0x10);//调用报警程序启动蜂响器
}
LIGHT_OUT &= ~RED_LIGHT;
break;
}
}
}