0《嵌入式系统》课程设计报告题目院系:机电学院学生姓名:任专业:班级:111指导教师:完成时间:2014-10-171目录1系统总体方案设计………………………………………………………12硬件电路设计………………………………………………………….32.1键盘电路设计……………………………………………………….32.2LCD1206显示电路…………………………………………………42.3响应电路……………………………………………………………53软件设计………………………………………………………………63.1软件设计思路……………………………………………………….63.2子程序……………………………………………………………….74系统调试………………………………………………………………105心得体会………………………………………………………………116参考文献………………………………………………………………12附录…………………………………………………………………13(1)源程序……………………………………………………………….13(2)硬件原理图………………………………………………………….162摘要:随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。但是这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。而且指纹识识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。加上其成本较高,一定程度上限制了这类产品的普及和推广。鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。关键词:4×4矩阵键盘;stm32;密码锁;LCD160211系统总体方案设计1.1采用数字电路控制其原理方框图如图1-1所示。图1.1数字密码锁电路方案密码锁电路包含:键盘输入、密码修改、密码检测、开锁电路、执行电路、键盘输入次数锁定电路。1.2采用一种是用以stm32为核心的控制方案利用其灵活的编程设计及其控制的准确性,不但能实现基本的密码锁功能,还能添加调电存储、声光提示甚至添加遥控控制功能。其原理如图1.2所示。图1.2stm32控制方案开锁控制电路Stm32串口显示电路矩阵键盘控制指示电路输入错误锁定键盘密码修改电路键盘输入密码校验电路开锁电路执行电路正确2通过比较以上两种方案stm32有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级,所以我们采用后一种方案。初步设计思路如下:基于以上思路,本次设计使用stm32设计,其主要具有如下功能:密码通过键盘输入,若密码正确,则将锁打开。电子密码锁的设计主要由三部分组成:4×4矩阵键盘接口电路、密码锁的控制电路、输出八段显示电路。密码锁设计的关键问题是实现密码的输入、清除、更改、开锁等功能:(1)密码输入功能:按下一个数字键,一个“-”就显示在最右边的数码管上,同时将先前输入的所有“-”向左移动一位。(2)密码清除功能:当按下清除键时,清除前面输入的所有值,并清除所有显示。(3)开锁功能:当按下开锁键,系统将输入与密码进行检查核对,如果正确锁打开,否则不打开。输入密码用矩形键盘,包括数字键和功能键。LCD1602显示输入密码。打开电源后,显示器显示“000000”,设原始密码为“12345”,只要输入此密码便了开门。这样可预防停电后再来电时无密码可用。按“C”键,清除显示器为“000000”。欲重新设定密码,先输入密码在案“*”。输入密码,再按“D”键。若密码与设定密码相同,则开门。否则显示器清为“000000”。软件的设计主要包括键盘键值的读取,LCD显示程序,密码比较程序。32硬件电路设计2.1键盘电路设计使用矩阵键盘,所以本设计就采用行列式键盘。其原理如图2.1sw1SW1sw2SW1sw3SW1sw4SW1sw5SW1sw6SW1sw7SW1sw8SW1sw9SW1sw10SW1sw11SW1sw12SW1sw13SW1sw14SW1sw15SW1sw16SW1图2.1矩阵键盘每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N×M个按键的键盘。在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就要识别哪一个按键按下。对键的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。具体的功能设计如表2.1:表2.1按键功能按键键名功能说明1-9键数字键输入密码*键重设密码键设定新密码D键确定键比较密码#键清除键使显示器清零42.2LCD1206显示电路现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。3.3.1接口信号说明1602型LCD的接口信号说明如表3-3所示:表3-31602型LCD的接口信号说明⑵管脚功能1602采用标准的16脚接口,其中:第1脚:VSS为电源地第2脚:VCC接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。第7~14脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。指令集1602通过D0~D7的8位数据端传输数据和指令。显示模式设置:(初始化)00110000[0x38]设置16×2显示,5×7点阵,8位数据接口;显示开关及光标设置:(初始化)500001DCBD显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)000001NSN=1(读或写一个字符后地址指针加1&光标加1),N=0(读或写一个字符后地址指针减1&光标减1),S=1且N=1(当写一个字符后,整屏显示左移)s=0当写一个字符后,整屏显示不移动数据指针设置:数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)其他设置:01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)。图2.21602显示电路2.3响应电路在本次设计中,基于节省材料的原则,暂时用发光二极管代替,发光管亮,表示开锁;灭,表示没有开锁。电路图如3.3所示。当P2.0口输VSS1VCC2VO3RS4RW5E6D07D18D29D310D411D512D613D714BZ15BF16LCD160211602GNDRWQ1VCCVCCRSGNDGNDGNDVCCC212JP222PINRWED0D1D2D3D4D5D6D7VCCVCCVOC36出低电平时,二极管发光,表示开锁。图2.3响应电路3软件设计3.1软件设计思路电子密码锁工作的主要过程是LCD显示器提示开始输入密码,通过键盘输入密码,同时LCD显示密码输入情况,按下确认键后判断密码的正确性,作出开锁处理。密码的设定,假设预设的密码为123456共6位密码。由于采用两个按键来完成密码的输入,那么其中一个按键为功能键,另一个按键为数字键。在输入过程中,首先输入密码的长度,接着根据密码的长度输入密码的位数,直到所有长度的密码都已经输入完毕;或者输入确认功能键之后,才能完成密码的输入过程。进入密码的判断比较处理状态并给出相应的处理过程。主要的设计实施过程:首先,选购电子元器件。第二步,使用DXP设计硬件电路原理图,并设计PCB图完成人工布线。第三步,使用KeiluVision4软件编写C语言程序、仿真、软件调试。第四步,使用PROTEUSLED2R1RES2VCCVCCLED1LEDR2VCCVCCGNDV1R4BUZZERC1R3GNDVCCVCC7软件进行模拟软、硬件调试。最后,联合软、硬件调试电路板,完成本次毕业设计。3.2子程序设计(1)键盘扫描子程序如下:#ifndef_KEY_H#define_KEY_H#includestm32f10x.hvoidDelay(__IOuint32_tnCount);intkey(void);#endif#includestm32f10x.h#includekey.hvoidInitKey(void){GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_Init(GPIOA,&GPIO_InitStructure);}8intkey(void){intKeyVal=0;//u16WriteVal=0;GPIO_Write(GPIOA,(GPIOA-ODR&0xfff0|0xf));if((GPIOA-IDR&0x00f0)==0x0000)return-1;else{Delay(0xfffff);if((GPIOA-IDR&0x00f0)==0x0000)return-1;}GPIO_Write(GPIOA,(GPIOA-ODR&0xfff0|0x1));switch(GPIOA-IDR&0x00f0){case0x0010:KeyVal=15;break;case0x0020:KeyVal=11;break;case0x0040:KeyVal=7;break;case0x0080:KeyVal=3;break;}GPIO_Write(GPIOA,(GPIOA-ODR&0xfff0|0x2));switch(GPIOA-IDR&0x00f0){case0x0010:KeyVal=14;break;case0x0020:KeyVal=10;break;case0x0040:KeyVal=6;break;case0x0080:KeyVal=2;break;9}GPIO_Write(GPIOA,(GPIOA-ODR&0xfff0|0x4));switch(GPIOA-IDR&0x00f0){case0x0010:KeyVal=13;break;case0x0020:KeyVal=9;break;case0x0040:KeyVal=5;break;case0x0080:KeyVal=1;break;}GPIO_Write(GPIOA,(GPIOA-ODR&0xfff0|0x8));switch(GPIOA-IDR&0x00f0){case0x0010:KeyVal=1