嵌入式课程设计报告设计题目:电子密码锁、摘要随着科技和人们的生活水平的提高,实现防盗的问题也变得尤为突出,传统机械锁构造简单,电子锁的保密性高,使用灵活性好。
根据需要设计运用W90P170开发板,制作一款电子密码锁,密码锁通过键盘输入密码,通过在LCD的文字和图片显示当前密码锁的状态。
实现设置密码,密码验证,错误密码自锁、图片显示的功能。
目录一、选题意义及系统功能 (3)二、硬件设计及描述 (4)三、软件设计及描述 (5)四、程序代码 (6)五、课程设计体会 (11)六、运行结果 (12)七、心得体会 (12)八、参考文献 (13)九、附录 (13)一、选题意义及功能描述1、选题意义电子密码锁是通过密码输入来控制电路或是芯片工作,从而控制机械的开关闭合、开锁的电子产品。
随着科技提高和人们生活水平的提高,对电子密码锁的需求增加。
电子密码做较传统的机械锁安全性能更高。
特点如下:(1)保密性好,编程量大,随机开锁的成功率几乎为零。
(2)密码可变,用户可以随时改变密码,防止密码被盗,同时也可以避免人员的更替而使锁的密级下降。
(3)误码输入保护,输入密码多次错误是,系统进行自锁。
(4)无活动零件,不会磨损,寿命长。
(5)使用灵活性好,无需佩戴钥匙,操作简单。
2、功能描述基本功能:(1)从键盘输入任意6位数字作为密码,将这六位数字经过USI总线存储到Flash芯片中,设置密码完成。
(2)从键盘输入密码,比较键盘输入的密码与Flash中存储的密码是否相同。
(3)如果密码正确,则LED灯点亮;如果密码不正确,则LED灯闪烁,而且如果连续三次输入密码错误则系统锁定,不允许再次输入密码。
扩展功能:(1)首先显示“请输入密码:”,显示密码锁背景图片1。
(2)如果密码正确则显示“密码正确”,显示成功进入系统的背景图片2。
(3)如果密码不正确则显示“密码不正确,请重新输入:”(4)如果连续三次输入密码错误则显示“对不起,您已经连续三次输入密码错误,系统锁定”,显示图片1。
3、个人开发流程(1)了解开发板的硬件结构编写适应其硬件结构的程序。
(2)掌握并编写LCD显示文本和图片程序。
(3)通过EBI对外部LED灯进行控制。
(4)键盘键值读取,及密码锁密码比对,密码锁状态转换的程序编写。
二、硬件设计及描述1、LED灯模块CPU的数据总线低8位连接到锁存器74HC273的信号输入端,CPU外部总线接口(EBI)的nECS0片选信号连接到锁存器的锁存控制信号,当CPU 访问BANK0的任一地址空间是,数据总线的低八位的数据被锁存输出,作为控制8个LED等的发光状态的控制信号,当写入0xff是,8个LED灯都灭,写0x00,8个LED灯都亮。
硬件连接图如下。
2、KPI工作模块行列式键盘以矩阵形式排列,每个键有一常开触点,其两端分别于输出扫描线和输入状态线相连,键盘中有无键按下,是由列线扫描输出、读入行线状态来判断。
每个键都有一个键值和键号,通常将行、列按二进制顺序组合成酱汁,经过查表获得键号。
硬件连接图如下3、LCD工作模块该模块由40个引脚与外界电路相连,由于本身没有寄存器,需要W90P710提供的LCD控制寄存器来控制选择对应的液晶类型及显示形式,FIFO的使用,颜色的显示模式和时序的设置,并通过配置相应的寄存器就可实现。
四、软件设计及描述1、KPI模块设计实验中的GPIO为键盘模式,使用的是GPIO_CFG2,查找相应的寄存器进行设置,打开键盘中断,设定中断触发方式和优先级,扫描功能打开,时间约为100ms。
2、LCD显示模块初始化呢控制寄存器,设定lcd控制器和中断服务程序,并写到AIC中断向量表中。
关闭FIFO1和FIFO0,关闭绿的控制器,重置控制器,再讲显示的数据发送到缓存区中,根据时序的配置,从缓冲区中将数据读入液晶。
3、整体模块设计及程序流程图在主程序中进行按键初始化,在中断程序中实现,按键值的读取和存储,通过设定状态标志位,数组。
对存储的密码和输入的密码进行比较,判断对错从而改变状态标志位,在中短结束,回到主程序后通过识别状态标志位,显示相应的图形和文字。
五、程序代码(主要程序,函数部分见附录)1、main.c#include <stdio.h>#include "710defs.h" /*头文件声明*/#include "HB_it.h"#include "main.h"#include "lcd_pattern.h"extern U8 a[6];extern int p;extern U32 KeyValue;int main(void){U32 FLL;int cnt,i;U8 wchar[]= "设置密码";U8 wchar1[]= "请输密码";U8 wchar2[]= "密码正确";U8 wchar3[]= "密码错误";U8 wchar4[]= "对不起,您已经连续三次输入密码错误,系统锁定";LCD_IMAGE_T LCD_Size; /*声明结构体,结构体的具体定义在头文LCD_LOCATION_T LCD_Location; 件中*/LCDShowParameter LSP;LCD_Size.width = 480; /*定义lcd的显示的长宽像素值*/LCD_Size.height = 240;LCD_Location.StartX = 0; /*设定显示的起始坐标*/LCD_Location.StartY = 0;LCD_Location.EndX = 960;LCD_Location.EndY = 240;LCDInit(); /*初始化*/LCDShow(LCD_Size, LCD_Location);LCDFIFOBufferSet(BlackBoard); /*将要显示的图片存入缓存中,以便显示*/LCDDisplayOn(); /*显示图片*/KPIInit(); /*按键初始化*/printf("Please press keys.\n"); /*并通过串口输出此时的键值*/USIInit(); //读器件ID /*初始化flash芯片*/printf("读器件ID:");USIRead_ID(); //擦除扇区0printf("写使能:\n");USIWriteEnable();while(USICheckBusy());USISectorErease(0x0);EBILedInit(0x0);LSP.StartX = 8;LSP.StartY = 7;LSP.LibPlace = 0x400000;LSP.Color = 0x07ff;LSP.LetterChar = wchar1;LSP.LCDBuffer = BlackBoard;LCDOutputShow(LSP,4);EBILedSet(0x00);while(1){if(p==6){LCDInit();LCDShow(LCD_Size, LCD_Location);LCDFIFOBufferSet(BlackBoard);LCDDisplayOn();LSP.StartX = 8;LSP.StartY = 7;LSP.LibPlace = 0x400000;LSP.Color = 0x07ff;LSP.LetterChar = wchar1; /*正确密码*/ LSP.LCDBuffer = BlackBoard;LCDOutputShow(LSP,4);Delay(10000000);}if(p==1){LCDInit();LCDShow(LCD_Size, LCD_Location);LCDFIFOBufferSet(BlackBoard);LCDDisplayOn();LSP.StartX = 5;LSP.StartY = 5;LSP.LibPlace = 0x400000;LSP.Color = 0x07ff;LSP.LetterChar = wchar2; /*正确密码*/ LSP.LCDBuffer = BlackBoard;LCDOutputShow(LSP,22);Delay(10000000);}if(p==2){LCDInit();LCDShow(LCD_Size, LCD_Location);LCDFIFOBufferSet(BlackBoard);LCDDisplayOn();LSP.StartX = 5;LSP.StartY = 5;LSP.LibPlace = 0x400000;LSP.Color = 0x07ff;LSP.LetterChar = wchar3; /*密码错误*/LSP.LCDBuffer = BlackBoard;LCDOutputShow(LSP,4);Delay(10000000);}if(p==3){LCDInit();LCDShow(LCD_Size, LCD_Location);LCDFIFOBufferSet(BlackBoard);LCDDisplayOn();LSP.StartX = 5;LSP.StartY = 5;LSP.LibPlace = 0x400000;LSP.Color = 0x07ff;LSP.LetterChar = wchar4; /*请输密码*/ LSP.LCDBuffer = BlackBoard;LCDOutputShow(LSP,22);Delay(10000000);}}return 0;}2、中断服务程序void KPI_Handler(void){// U32 KeyValue, tmp;int cnt,sum=0;//int shuru;//int i;tmp = REG_KPISTATUS; //取按键值tmp &= 0x0000000f; //因为硬件连接关系,需要对按键进行处理if((tmp > 0x7) && (tmp < 0xC)){KeyValue = tmp - 4;}else if((tmp > 0x3) && (tmp < 0x8)){KeyValue = tmp + 4;}else{KeyValue = tmp;}printf("KPI interrupts. %x\n", KeyValue);if(c<6){a[c]=KeyValue;} /*将设置的密码放在数组中*/else if(c==6){USIWriteEnable();USIWrite(0x00, a); /*将设置的密码放在flash芯片中存储中*/printf("Succeed\n"); /*将设置密码结束,更新状态位*/Delay(100);P=6;}else if(c>6 && c<13){b[c-7]=KeyValue; /*输入密码*/}else if(c==13){USIRead(0x0,a); /*将输入密码放入在flash芯片中存储呢*/for(cnt=0;cnt<6;cnt++){if(a[cnt]==b[cnt]) /*比对密码*/sum++;}if(sum==6){printf("测试成功.....%d\n",sum); /*密码正确状态位为1*/p=1;}else{printf("测试失败.....%d\n",sum);p=2;}}else if(c>13 && c<20){b[c-14]=KeyValue;/*继续读取密码*/}else if(c==20)/*继续比对密码*/{USIRead(0x0,a);for(cnt=0;cnt<6;cnt++){if(a[cnt]==b[cnt])sum++;}if(sum==6){printf("测试成功.....%d\n",sum);p=1;}else{printf("测试失败.....%d\n",sum);p=3;}}else if(c>20 && c<27){b[c-21]=KeyValue;}else if(c==27)/*第三次比对*/{USIRead(0x0,a);for(cnt=0;cnt<6;cnt++){if(a[cnt]==b[cnt])sum++;}if(sum==6){printf("测试成功.....%d\n",sum);p=1;}else{printf("测试失败.....%d\n",sum);p=4;}}else/*这之后程序不再允许进行输入*/{printf("invalid operations\n");}c++;}六、实验结果截图(1)密码锁初始状态,显示设置密码,显示图片1。