欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    保险箱密码锁控制器.ppt

    • 资源ID:6084864       资源大小:903KB        全文页数:66页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    保险箱密码锁控制器.ppt

    7.4 接口定义,目 录,引 言,“决策”与“模块划分”侧重于软件,还未涉及到编程。当软件模块划分之后,接下来的工作就是定义归一化的接口规范了,而最后的工作才是编程。接口定义分为2部分:软件对外的接口和软件内部模块之间的接口。注意:接口并不仅仅是接口函数,还包括配置方法、相关的宏、变量、数据结构与使用方法。,目 录,7.4.1 密码的输出、存储与显示,密码的输出、存储与显示都使用ASC码表示,当存储密码时,则使用#表示密码已经结束。,目 录,7.4.2 应用层接口,应用层仅包含一个人机交互程序,主要用于实现如图所示的状态机。1.提供给上层的接口因为人机交互程序内聚性很强,所以将它规划为任务。人机交互函数:mainTask(),完成所有与人交互的工作。,图1 状态转换图,函数原型:void mainTask(void)输入参数与返回值:无,每一个汇编程序必须要有一个以HOME命名的段,否则编译时会出现警告。,“Start”为程序的标号。在二进制层面,标号的值就是存储器的地址,而标号又是引用存储器的值的别名,因此在语言层面 标号的值就是程序的地址。,2.使用的下层接口应用层实际上使用虚拟设备层操作实际的设备,则人机交互程序使用 虚拟显示器驱动显示信息 虚拟键盘驱动获得用户输入的信息 虚拟存储器驱动获得和保存密码 虚拟锁驱动开锁和关锁虚拟蜂鸣器驱动发出声音3.其他注意点人机交互程序堆栈数组名为GucMainTaskStk,人机交互程序为系统创建的第一个任务。,7.4.2 应用层接口,目 录,7.4.3 虚拟设备层接口,虚拟驱动用于屏蔽对象的控制细节,应用层就可以用统一的方法来实现,而无须关心具体是怎样实现的。当控制方法不一样时,则不必重新编写应用层的程序。虚拟设备层包含虚拟锁驱动,虚拟键盘驱动,虚拟显示器驱动,虚拟蜂鸣器驱动,虚拟存储器驱动。1.虚拟锁驱动(1)提供给上层的接口,extern char virLockInit(unsigned char ucIndex)-虚拟锁初始化 extern char virLockLock(unsigned char ucIndex)-关闭虚拟锁 extern char virLockUnlock(unsigned char ucIndex)-打开虚拟锁,(2)使用的下层接口 虚拟锁驱动使用锁驱动,7.4.3 虚拟设备层接口,2.虚拟键盘驱动(1)提供给上层的接口,需要注意的是,如果在给定时间内没有按键输入,则设备可能进入待机状态。因此,读按键的API(应用程序编程接口)需要给定一个等待按键的时间。,函数原型:char virKeyInit(void)/虚拟键盘模块初始化返回值:0-成功,-1-失败 函数原型:char virKeyGet(unsigned int uiDly)/获得按键的ASC码输入参数:uiDly-以毫秒为单位,设定最大等待时间,0为无穷等待返回值:=0-键的ASC码,-1-失败,(3)其它注意点 虚拟键盘驱动应当使用一个任务来实现,(2)使用的下层接口 虚拟键盘驱动使用键盘驱动,7.4.3 虚拟设备层接口,3.虚拟显示器驱动,(2)使用的下层接口,(1)提供给上层的接口,extern char virMemInit(void)-虚拟存储器驱动初始化 extern unsigned char viMemRead(unsigned int uiAddr,char*pcData,unsigned char ucLen)-获得存储中的数据,虚拟显示器驱动使用的是显示器驱动,4.虚拟存储器驱动,(1)提供给上层的接口,extern char virShowInit(void)-虚拟显示器模块初始化 extern char virShowPuts(char*pcStr)-虚拟显示器输出字符串 extern char virShowClr(void)-虚拟显示器清屏,7.4.3 虚拟设备层接口,(2)使用的下层接口 虚拟存储器驱动使用的是CAT1024驱动,输入参数::uiAddr-存储位置 ucLen-数据长度输出参数:piData-读到的数据返回值:读到的数据数目 extern char viMemWrite(unsigned int uiAddr,char*pcData,unsigned char ucLen)-保存数据到存储器中输入参数::uiAddr-存储位置 ucLen-数据长度 piData-存储的数据输出参数:无输出参数 返回值:写入的数据数目,7.4.3 虚拟设备层接口,5.虚拟蜂鸣器驱动,(1)提供给上层的接口,(2)使用的下层接口 虚拟蜂鸣器驱动使用蜂鸣器驱动,函数原型:char virBuzzerInit(void)/虚拟蜂鸣器初始化返回值:0-成功,-1-失败 函数原型:char virBuzzerTweet(unsigned char unMod)/控制蜂鸣器鸣叫输入参数:ucMod-鸣叫方式 VIR_BUZZER_STOP-停止鸣叫 VIR_BUZZER_SHORT-1声短鸣叫 VIR_BUZZER_TWO_SHORT-2声短鸣叫 VIR_BUZZER_LONg-1声长鸣叫返回值:0-成功,-1-失败,(3)其它注意点 虚拟蜂鸣器驱动应当使用一个任务来实现,目 录,7.4.4 设备驱动层接口,设备驱动层的驱动用于直接控制相应的物理设备,一般来说,设备设备驱动层的驱动只实现硬件的基本功能,其高级功能在虚拟设备层实现。设备驱动层分为:,锁驱动 键盘驱动 显示器驱动 蜂鸣器驱动 CAT1024驱动 I2C驱动,1.锁驱动接口,extern char phyLockInit(void)-锁初始化,返回值:0-成功,-1-失败 extern char phyLockLock(void)-关锁,返回值:0-成功,-1-失败 extern char phyLockUnlock(void)-开锁,返回值:0-成功,-1-失败,7.4.4 设备驱动层接口,2.键盘驱动接口,extern char zyKeyInit(void)-键盘模块始化,返回值:0-成功,-1-失败 extern char zyKeyGet(void)-获得瞬时按键状态(去抖前按键状态),不支持组 合键,返回值:0-成功,-1-失败,3.显示器驱动接口,extern char zyLedDisplayInit(void)-LED数码管驱动初始化,无输入参数,返回值:0-成功,-1-失败 extern void zyLedDisplayScan(void)-LED数码管扫描程序,=200HZ的频率调用,无输入参数和返回值 extern unsigned char GucZyLedDsipayShowBuf-显示缓冲区,7.4.4 设备驱动层接口,4.蜂鸣器驱动接口,extern char phyBuzzerInit(void)-蜂鸣器初始化,无输入参数,返回值:0-成功,-1-失败 extern char phyBuzzerTweet(unsigned int uiFreq)-蜂鸣器鸣叫,uiFreq:声音频率,返回值:0-成功,-1-失败 extern char phyBuzzerStop(void)-蜂鸣器停止鸣叫,无输入参数,返回值:0-成功,-1-失败 extern void isrTimer(void)_interupt 3-Timer1中断服务函数,通过翻转蜂鸣器管脚使蜂鸣器发声,5.CAT1024驱动接口,extern char _zyCat1024Init(void)-CAT1024初始化,返回值:0-成功,-1-失败 extern unsigned char _zyCat1024Write(unsigned char ucAddr,unsigned*pucData,unsigned char ucDataLen)-向CAT1024写数据,7.4.4 设备驱动层接口,输入参数:ucAddr-数据地址 ucDataLen-要写的数据长度 pucData-要写的数据返回值:已发送的数据字节数 extern unsigned char _zyCat1024Read(unsigned char ucAddr,unsigned*pucData,unsigned char ucDataLen)-从CAT1024中读数据输入参数::ucAddr-数据地址 ucDataLen-要读的数据长度输出参数:pucData-读到的数据 返回值:已读到的数据字节数,6.I2C驱动接口,extern void _zyI2cInit(void)-初始化I2C为主模式,返回值:0-成功,-1-失败 extern unsigned char _zyI2cWrite(unsigned char ucAddr,unsigned int uiRegAddr,unsigned char _ucRegAddrLen,unsigned char*pucData,unsigned char ucDataLen)-将数据写入I2C从器件,7.4.4 设备驱动层接口,输入参数:ucAddr-从机地址 uiRegAddr-寄存器地址 uiRegAddrLen-寄存器地址长度(单位为字节)ucDataLen-要写入的数据长度 pucData-要写入的数据返回值:已写入的数据字节数 extern unsigned char zyI2cWrite(unsigned char ucAddr,unsigned int uiRegAddr,unsigned char ucRegAddrLen,unsigned char*pucData,unsigned char ucDataLen)-从I2C从器件读数据输入参数:ucAddr-从机地址 uiRegAddr-寄存器地址 uiRegAddrLen-寄存器地址长度(单位为字节)ucDataLen-要读的数据长度 输出参数:pucData-读到的数据返回值:已读到的数据字节数,7.4.4 设备驱动层接口,值得注意的是:目前没有发现寄存器地址超过16位的器件,因此,寄存器地址可以用unsigned int类型变量来保存;大多数I2C从机寄存器地址为8位(一个字节),一部分位16位(两个字节),I2C标准没有规定寄存器地址的长度,因此,需要一个参数给出寄存器地址的长度;I2C支持7位地址模式和10位地址模式,但目前还没有发现仅支持10位地址模式的器件,因此,规划本驱动仅支持7位的地址模式。,7.5 编写代码,目 录,7.5.1 概述,1.简述 大多数开发人员将编写代码和调试放在第一步来做,在没有经验时,摸着石头过河也是一种很好的选择。前面的步骤就是给过河指定一条路线,当有了正确的路线之后,则过河就是一件容易的事情了。同理,有了前面的步骤且结果正确的话,则编写代码与调试同样也是一件轻松的事了,其所花的时间往往不足整个开发过程的1/3。,2.步骤 每个模块的开发其实也可以看作一个独立模块的嵌入式软件的开发,7.2节、7.3节和7.4节所制定的内容可以看作这个模块的限制条件。因此,每个模块的开发步骤可以遵循整个软件的开发步骤,同样按照决策、模块划分、接口定义、编写代码和测试验收5个步骤来进行。(1)决策 7.2节是针对整个软件的,不会将每个模块的所有决策都囊括进来。因此,一些遗漏的决策需要在编写代码之前决定好。(2)模块划分 如果这个模块本身 比较复杂,则可以在模块内部划分更小的模块。如果模块非常简单的话,则不必再划分模块。因此是否需要细分模块,由模块负责人决定。,7.5.1 概述,(3)接口定义 7.4 节已经制定了模块的外部接口,如果这个模块不再划分更小的模块,则不需要再制定接口定义。如果这个模块内部还有更小的模块,则还需要制定内部模块之间的接口。(4)编写代码 这是一个递归的过程,只要这个模块还需要划分更小的模块,则又要重复决策、模块划分、接口定义、编写代码与测试验收5个步骤。如果通过决策认为此模块不再需要划分更小的模块时那么可以真正的编写代码了。(5)决策验收 编写代码完成后,需要确定其是否到达要求,这就需要测试验收了,测试验收一般由更高一级的模块负责人执行。,3.关于调试 当模块划分和接口设计工作完成后,实际上模块的编程无先后关系。根据接口规范,模块可以分派给多人并行编写,分别测试、最后组装测试。比如,当编写完人机交互程序需要测试时,则可以利用成熟的UART驱动模拟大部分模块(如键盘和显示)。“保存密码”、“开锁”和“关锁”的控制都可以通过串口输出信息来模拟,而“获得密码”只需提供固定的数据即可,但是这样会增加很多测试代码。如果仅一个人编写代码,则可以采取自底向上的方法来编程,即先编写驱动层,再编写虚拟驱动层,最后编写应用层,这样测试代码相对会小很多。,目 录,7.5.2 可复用的驱动,由于前后接口方式完全一样,因此只需要直接使用4.3.3小节的键盘驱动、蜂鸣器驱动和显示器驱动以及4.3.2小节的锁驱动即可。,目 录,7.5.3 I2C驱动,I2C驱动在4.3.3小节I2C驱动的基础上,增加了用于互斥操作的信号量,其接口定义的使用7.4小节的接口定义。相对4.3.3小节的I2C驱动增加以下代码:,static TN_OS_SEM _GosI2c;/定义信号量/*Descriptions:初始化I2C为主模式*/char zyI2cInit(void)tnOsSemCreate(,7.5.3 I2C驱动,/*Descriptions:将数据写入I2C从器件*/unsigned char zyI2cWrite(unsigned char ucAddr,unsigned int uiRegAddr,unsigned char ucRegAddrLen,unsigned char*pucData,unsigned char ucDataLen)unsigned char ucRt;/返回值tnOsSemPend(/发送信号量return ucRt;,7.5.3 I2C驱动,/*Descriptions:从I2C从器件读数据*/static unsigned char zyI2cRead(unsigned char ucAddr,unsigned int uiRegAddr,unsigned char ucRegAddrLen,unsigned char*pucData,unsigned char ucDataLen)unsigned char ucRt;/返回值 tnOsSetPend(,目 录,7.5.4 CAT1024驱动,CAT1024驱动在4.3.3小节的基础上,增加了用于互斥操作的信号量,其接口定义使用7.4小节的接口定义。相对4.3.3小节的CAT1024驱动增加以下代码:,static TN_OS_SEM _GosCat1024;/定义信号量/*Descriptions:初始化CAT1024*/char zyCat1024Init(void)tnOsSemCreate(,7.5.4 CAT1024驱动,/*Descriptions:向CAT1024写数据*/unsigned char zyCat1024Write(unsigned char ucAddr,unsigned char*pucData,unsigned char ucDataLen)unsigned char ucRt;/返回值tnOsSemPend(/发送信号量return ucRt;,7.5.4 CAT1024驱动,/*Descriptions:从CAT1024中读数据*/static unsigned char zyCat1024Read(unsigned char ucAddr,unsigned char*pucData,unsigned char ucDataLen)unsigned char ucRt;/返回值tnOsSetPend(,目 录,7.5.5 虚拟键盘驱动,1.决策 由于物理键盘仅完成获得键盘瞬时状态的工作,获得的也是键值而不是ASC码。因此,虚拟键盘驱动需要完成以下工作:(1)键盘去抖;(2)键值与ASC码转换。键值与ASC码转换可以直接用语句实现,也可以通过查表实现,这里使用查表实现。至于表格的建立,可以对比硬件推理出来,也可以用程序测试出来,具体使用哪种方法,由编程者自己决定。而读键不能采取“长期等待”的方法,必须给出一个最长等待时间。因此,虚拟键盘驱动使用任务扫描键盘,并通过消息信箱发送键值。2.接口定义(1)使用7.4节指定的接口;(2)码表定义为char类型全局数组_GetKeyTable;(3)任务堆栈使用全局数组GucTaskStks;(4)消息邮箱使用全局变量GomKeyMsg,虚拟键盘驱动的全局变量定义详见程序清单7.1。(5)键盘扫描任务使用全局函数_taskKey()详见程序清单7.2。,7.5.5 虚拟键盘驱动,程序清单7.1 虚拟键盘全局变量定义(vir_key.c),函数原型:static void_taskKey(void)/无参数与返回值,32 statia code char_GcKeyTable=33#,0,*,9,8,7,6,5,4,3,2,1,034;35 36 static idata unsigned char _GucTaskKeyStks44;/分配任务堆栈37 static TN_OS_MSG _GomKeyMsg;/定义消息邮箱,(6)键盘扫描任务使用函数_taskKey(),其详细说明如下:,3.编写代码 虚拟键盘驱动按照接口定义,需要编写3个相关的函数,即_taskKey()、virKeyInit()和virKeyGet(),详见程序清单7.2。,7.5.5 虚拟键盘驱动,/*Descriptions:全局变量定义*/static code char _GcKeyTable=/按键转换表#,0,*,9,8,7,6,5,4,3,2,1,0;static idata unsigned char _GucTaskKeyStks44;/分配任务堆栈static TN_OS_MSG _GomKeyMsg;/定义消息邮箱/*Descriptions:虚拟键盘扫描任务函数*/static void _taskKey(void)char cOldKeyState;/键盘历史状态char cTmp1,cTmp2;,程序清单7.2 虚拟键盘驱动源码(vir_key.c),7.5.5 虚拟键盘驱动,cOldKeyState=-1;while(1)/*等待按键状态变化*/while(1)cTmp1=zyKeyGet();if(cTmp1!=cOldKeyState)break;tnOsTimeDly(TICKS_PER_SEC/100);/*去抖*/tnOsTimeDly(TICKS_PER_SEC/100);cTmp2=zyKeyGet();if(cTmp2=cTmp1)cOldKeyState=cTmp1;/*有按键按下,发送消息*/if(cTmp1=0),7.5.5 虚拟键盘驱动,cTmp1=_GcKeyTablecTmp1;/将键码转换为ASC码tnOsMsgPost(,7.5.5 虚拟键盘驱动,/*Descriptions:虚拟键盘获得按键函数*/char virKeyGet(unsigned int uiDly)unsigned int uiMsg;/获得的消息/*获得等待节拍数*/if(uiDly!=0)uiDly=uiDly/(1000/TICKS_PER_SEC);if(uiDly=0)uiDly=1;uiMsg=tnOsMsgPend(,目 录,7.5.6 虚拟蜂鸣器驱动,1.决策 据前面为虚拟蜂鸣器驱动给出的大部分信息,因此,只要再决定蜂鸣器频率就可以了,即蜂鸣器频率为8000Hz,并可配置。2.接口定义 虚拟蜂鸣器驱动的接口定义如下:(1)使用7.4节制定的接口;(2)定义一个用于配置蜂鸣器使用频率的宏,详见程序清单7.3。,程序清单7.3 虚拟蜂鸣器驱动配置(vir_buzzer_cfg.h),34/*35 鸣叫频率定义36*/37#define _ZY_BUZZER_HZ 800,(3)任务堆栈使用全局数组GucTaskKeyStks;(4)消息邮箱使用全局变量GomBuzzerMsg,与虚拟蜂鸣器驱动相关的全局变量定义详见程序清单7.4。,7.5.6 虚拟蜂鸣器驱动,程序清单7.4 虚拟蜂鸣器驱动全局变量定义(vir_buzzer.c),32 static idata unsigned char _GucTaskBuzzerStks44;/分配任务堆栈33 static TN_OS_MSG _GomBuzzerMsg;/定义消息邮箱,(5)虚拟蜂鸣器任务函数名为_taskBuzzer(),其详细说明如下:,函数原型:static void_taskBuzzer(void)/无参数与返回值,3.编写代码 虚拟蜂鸣器驱动按照接口定义,需要编写3个相关的函数,即_taskBuzzer()、virBuzzerInit()和virBuzzerTweet(),详见程序清单7.5。,程序清单7.5 虚拟蜂鸣器驱动代码(vir_buzzer.c),/*Descriptions:全局变量定义*/static idata unsigned char _GucTaskBuzzerStks44;/分配任务堆栈static TN_OS_MSG _GomBuzzerMsg;/定义消息邮箱,7.5.6 虚拟蜂鸣器驱动,/*Descriptions:虚拟蜂鸣器驱动任务函数*/static void _taskBuzzer(void)unsigned int uiMsg;/获得的消息while(1)uiMsg=tnOsMsgPend(,7.5.6 虚拟蜂鸣器驱动,phyBuzzerStop();tnOsTimeDly(TICKS_PER_SEC/10);break;case VIR_BUZZER_TWO_SHORT:phyBuzzerTweet(_ZY_BUZZER_HZ);tnOsTimeDly(TICKS_PER_SEC/10);phyBuzzerStop();tnOsTimeDly(TICKS_PER_SEC/10);phyBuzzerTweet(_ZY_BUZZER_HZ);tnOsTimeDly(TICKS_PER_SEC/10);phyBuzzerStop();tnOsTimeDly(TICKS_PER_SEC/10);break;case VIR_BUZZER_LONG:phyBuzzerTweet(_ZY_BUZZER_HZ);tnOsTimeDly(TICKS_PER_SEC/2);,7.5.6 虚拟蜂鸣器驱动,phyBuzzerStop();tnOsTimeDly(TICKS_PER_SEC/10);break;default:break;/*Descriptions:虚拟蜂鸣器驱动初始化函数*/char virBuzzerInit(void)if(tnMsgCreat(,7.5.6 虚拟蜂鸣器驱动,if(tnMsgCreat(_taskBuzzer,_GucTaskBuzzerStks)0)/创建任务return-1;return phyBuzzerInit();/*Descriptions:虚拟蜂鸣器鸣叫函数*/char virBuzzerTweet(unsigned char ucMod)tnOsMsgPost(,目 录,7.5.7 人机交互程序,其实,人交互程序与4.5小节的主程序非常相似,只是实现方法不同而已,其代码详见程序清单7.6,它与4.5小节的程序清单4.22的不同之处已经作加粗倾斜处理。,程序清单7.6 人机交互程序,/*Descriptions:打开保险箱*Returned value:0-密码输入正确 1-超时-1-密码输入错误*/static char _hmiBoxOpen(void)unsigned char i,j;char cTmp1;for(i=0;i3;i+)/*显示初始画面*/,7.5.7 人机交互程序,strcpy(_GcHmiBuf,-)virShowPuts(_GcHmiBuf);/*输入密码*/j=0;while(1)cTmp1=virKeyGet(15*1000);if(cTmp10)j-;_GcHmiBuffj=-;,7.5.7 人机交互程序,else_GcHmiBuffj=cTmp1;/保存输入的字符j+;if(cTmp1=#)/密码输入完毕break;/*第7个字符必须为#*/if(j=7,7.5.7 人机交互程序,/*检验密码*/virMemRead(USER_PASSWORD_ADDR,_GcPassword,7);if(_GcPassword0=(char)0 xff)/CAT1024未保存密码memcpy(_GcPassword,123456#,7);/默认密码为123456if(memcmp(_GcPassword,_GcHmiBuf,j)=0)/比较密码/*开锁*/virShowPuts(OPEN);virBuzzerTweet(VIR_BUZZER_LONG);virLockUnlock(0);return 0;/*密码错误*/if(i2)virShowPuts(error);virBuzzerTweet(VIR_BUZZER_TWO_SHORT);tnOsTimeDly(TICKS_PER_SEC*2);virKeyGet(1);/忽略延时时按下的键,7.5.7 人机交互程序,/*连续输入错误*/virShowClr();virBuzzerTweet(VIR_BUZZER_TWO_SHORT);tnOsTimeDly(0);/放弃CPU时间,让蜂鸣器任务运行virBuzzerTweet(VIR_BUZZER_TWO_SHORT);tnOsTimeDly(TICKS_PER_SEC*60);virKeyGet(1);/忽略延时时按下的键return-1;/*Decriptions:设置用户密码*/static char _hmiPasswordSet(void);unsigned char i;char cTmp1;,7.5.7 人机交互程序,virBuzzerTweet(VIR_BUZZER_LONG);tnOsTimeDly(0);virBuzzerTweet(VIR_BUZZER_SHORT);/*显示初始画面*/strcpy(_GcHmiBuf,-);virShowPuts(_GcHmiBuf);/*输入密码*/i=0;while(1)cTmp1=virKeyGet(0);if(cTmp1=*)/*为删除键if(i0)i-;_GcHmiBuffi=-;else_GcHmiBuffi=cTmp1;/保存输入的字符i+;,7.5.7 人机交互程序,if(cTmp1=#)/密码输入完毕if(i!=1)break;/*不允许输入空密码*/i-;continue;/*第7个字符必须为#*/if(j=7,7.5.7 人机交互程序,virMemWrite(USER_PASSWORD_ADDR,_GcPassword,7);/保存密码 virBuzzerTweet(VIR_BUZZER_LONG);tnOsTimeDly(TICKS_PER_SEC*2);virShowPuts(OPEN);return 0;/*Descriptions:人机交互程序*/void hmiTask(void)char cTmp1;zyI2cInit();virBuzzerInit();virKeyInit();virLockInit();virMemInit();virShowInit();,7.5.7 人机交互程序,virBuzzerTweet(VIR_BUZZER_LONG);while(1)virShowClr();/待机状态下显示/*等待用户输入#*/while(virKeyGet(0)!=#)virBuzzerTweet(VIR_BUZZER_SHORT);/*进入关锁状态*/if(_hmiBoxOpen()!=0)continue;/*进入开锁状态,等待输入*和#*/docTmp1=virKeyGet(0);if(cTmp1=*)_hmiPasswordSet();/进入设计密码状态while(cTmp1!=#),7.5.7 人机交互程序,/*返回待机状态*/virBuzzerTweet(VIR_BUZZER_SHORT);tnOsTimeDly(0);/放弃CPU时间,让蜂鸣器任务运行virBuzzerTweet(VIR_BUZZER_SHORT);virLockLock(0);,目 录,7.5.8 主程序,主程序是按照TinyOS51的要求编写的,详见程序清单7.7,程序清单7.7 主程序(main.c),#include#include.deviceled_displayled_display.h#include.devicebuzzerbuzzer.h#include.tiny_os_51tiny_os_51.h#include.tiny_os_51tiny_os_51_cfg.h/*外部函数声明*/extern void hmiTask(void);/*外部变量声明*/extern idata unsigned char GucHmiTaskStk;,7.5.8 主程序,/*Descriptions:定时器0中断处理函数*/void timer0ISR(void)_interrupt 1TL0=(65536-(OSC/12)/TICKS_PER_SEC)%256;TH0=(65536-(OSC/12)/TICKS_PER_SEC)/256;zyLedDiplayScan();tnOsTimeTick();/*Descriptions:初始化定时器0*/static void _timer0Init(void)TMOD=(TMODE,7.5.8 主程序,TH0=(65536-(OSC/12)/TICKS_PER_SEC)/256;TR0=1;ET0=1;TF0=0;/*Decriptions:系统主函数*/void main(void)tnOsInit();tnOsTaskCreate(hmiTask,GucHmiTaskStk);_timer0Init();tnOsStart();,7.6 测试、验收与小节,1.测试与验收 硬件与软件均完成后就可以组装测试了。经过项目组内部测试、外部测试和客户测试后,即可安装调试。待安装调试后,经过项目组内部测试、外部测试就可以交给客户验收了。待客户验收后就可以结项了,则项目圆满完成。2.小节 本书以一个虚拟的项目为例,通过对电子密码锁保险箱研发过程的描述,详细地阐述了基于前后台TinyOS51的研发过程与方法。虽然在功能上初步达到了使用说明的要求,以至于很多人陷入误区,以为通过编程实现了功能就误以为自己具有了开发产品的能力。而事实上,实际的项目远比本书的介绍还要复杂得多,比如,系统的可靠性、低功耗管理、电机控制与机械结构还有待于进一步解决。,The EndThank You,

    注意事项

    本文(保险箱密码锁控制器.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开