嵌入式课程设计报告88032_第1页
嵌入式课程设计报告88032_第2页
嵌入式课程设计报告88032_第3页
嵌入式课程设计报告88032_第4页
嵌入式课程设计报告88032_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精品文档嵌入式课程设计报告设计题目:电子密码锁摘要随着科技和人们的生活水平的提高,飞现防盗的问题也变得尤为突出,传统机械锁构造简单,电子锁的保密性高,使用灵活性好。根据需要设计运用W90P170开发板,制作一款电子密码锁,密码锁通过键盘输入密码, 通过在LCD的文字和 图片显示当前密码锁的状态。实现设置密码,密码验证,错误密码自锁、图片显 示的功能。目录一、选题意义及系统功能 3二、硬件设计及描述 4三、软件设计及描述 5四、程序代码 6五、课程设计体会 11六、运行结果 12七、心得体会 12八、参考文献 13九、附录 13、选题意义及功能描述1、选题意义电子密码锁是通过密码输入来控制电路或

2、是芯片工作, 从而控制机械的开关 闭合、开锁的电子产品。 随着科技提高和人们生活水平的提高, 对电子密码锁的 需求增加。电子密码做较传统的机械锁安全性能更高。特点如下:(1) 保密性好,编程量大,随机开锁的成功率几乎为零。(2) 密码可变,用户可以随时改变密码,防止密码被盗,同时也可以避免人 员的更替而使锁的密级下降。(3) 误码输入保护,输入密码多次错误是,系统进行自锁。(4) 无活动零件,不会磨损,寿命长。(5) 使用灵活性好,无需佩戴钥匙,操作简单。2、功能描述 基本功能:(1) 从键盘输入任意 6 位数字作为密码,将这六位数字经过 USI 总线存储到 Flash 芯片中,设置密码完成。

3、(2) 从键盘输入密码,比较键盘输入的密码与 Flash 中存储的密码是否相同。(3) 如果密码正确,则LED灯点亮;如果密码不正确,则LED灯闪烁,而且如 果连续三次输入密码错误则系统锁定,不允许再次输入密码。扩展功能:(1) 首先显示“请输入密码:”,显示密码锁背景图片1。(2) 如果密码正确则显示“密码正确”,显示成功进入系统的背景图片2。(3) 如果密码不正确则显示“密码不正确,请重新输入:”(4) 如果连续三次输入密码错误则显示 “对不起, 您已经连续三次输入密码错 误,系统锁定”,显示图片 1。3、个人开发流程(1) 了解开发板的硬件结构编写适应其硬件结构的程序。(2) 掌握并编写

4、LCD显示文本和图片程序。(3) 通过EBI对外部LED灯进行控制。(4) 键盘键值读取,及密码锁密码比对,密码锁状态转换的程序编写、硬件设计及描述1、LED灯模块CPU勺数据总线低8位连接到锁存器74HC273勺信号输入端,CPU外部总线 接口(EBI)的nECS0片选信号连接到锁存器的锁存控制信号,当 CPU访问BANKO 的任一地址空间是,数据总线的低八位的数据被锁存输出,作为控制8个LED等的发光状态的控制信号,当写入 Oxff是,8个LED灯都灭,写0x00,8个LED 灯都亮。硬件连接图如下。VDDDO-D7 ixn DISPLAYLDLED.LEDSCDO3EEC1J7SOD31

5、913socrIJ5CWIT3QC7|H1771r- I- .1- I- i- i 1- F c r 玄 4 s c T B卵JRB5 RPIB1 欢迎3下载VDOonCSCUI4XT- Vin Vcut卜 GIN.D EN BP741711 GEM2、KPI工作模块行列式键盘以矩阵形式排列,每个键有一常开触点,其两端分别于输出扫描 线和输入状态线相连,键盘中有无键按下,是由列线扫描输出、读入行线状态来 判断。每个键都有一个键值和键号,通常将行、列按二进制顺序组合成酱汁,经 过查表获得键号。硬件连接图如下精品文档3、LCD工作模块该模块由40个引脚与外界电路相连,由于本身没有寄存器,需要 W9

6、OP710! 供的LCD控制寄存器来控制选择对应的液晶类型及显示形式, FIFO的使用,颜 色的显示模式和时序的设置,并通过配置相应的寄存器就可实现。13Jre 13售 gEh T -F-Jk Ji. Jk.H-:1rwmuQjT- pir&v4N不任:4J-m-r0iP y5a- 芒I V-L电 I1 sZH3BACKLIGHTLCD四、软件设计及描述1、KPI模块设计实验中的GPIO为键盘模式,使用的是 GPI0_CFG2查找相应的寄存器进行 设置,打开键盘中断,设定中断触发方式和优先级,扫描功能打开,时间约为100ms2、LCD显示模块初始化呢控制寄存器,设定led控制器和中断服务程序,

7、并写到AIC中断向 量表中。关闭FIF01和FIF0O,关闭绿的控制器,重置控制器,再讲显示的数据 发送到缓存区中,根据时序的配置,从缓冲区中将数据读入液晶。3、整体模块设计及程序流程图在主程序中进行按键初始化,在中断程序中实现,按键值的读取和存储,通 过设定状态标志位,数组。对存储的密码和输入的密码进行比较, 判断对错从而 改变状态标志位,在中短结束,回到主程序后通过识别状态标志位, 显示相应的 图形和文字。五、程序代码(主要程序,函数部分见附录)1、main.c#i nclude #include 710defs.h /*头文件声明 */#include HB_it.h#i nclude

8、mai n. h#include lcd_pattern.hexter n U8 a6;exter n int p;extern U32 KeyValue;int main(v oid)U32 FLL;int cnt,i;U8 wchar= 设置密码;U8 wchar1=请输密码;U8 wchar2=密码正确;U8 wchar3=密码错误;5欢迎下载精品文档U8 wchar4= 对不起,您已经连续三次输入密码错误,系统锁定LCD_IMAGE_T LCD_Size; /* 声明结构体,结构体的具体定义在头文 LCD_LOCATION_T LCD_Location; 件中 */LCDShowPar

9、ameter LSP;7 欢迎9下载LCD_Size.width = 480; /*LCD_Size.height = 240;LCD_Location.StartX = 0; /*LCD_Location.StartY = 0; LCD_Location.EndX = 960; LCD_Location.EndY = 240;定义 lcd 的显示的长宽像素值 */设定显示的起始坐标 */初始化 */将要显示的图片存入缓存显示图片 */按键初始化 */并通过串口输出此时的键初始化 flash 芯片 */LCDInit(); /*LCDShow(LCD_Size, LCD_Location);L

10、CDFIFOBufferSet(BlackBoard); /* 中,以便显示 */LCDDisplayOn(); /*KPIInit(); /* printf(Please press keys.n); /* 值*/USIInit(); /读器件 ID /*printf( 读器件 ID:);USIRead_ID(); / 擦除扇区 0 printf(写使能 :n);USIWriteEnable(); while(USICheckBusy(); USISectorErease(0x0);EBILedInit(0x0);LSP.StartX = 8;LSP.StartY = 7;LSP.LibPl

11、ace = 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;LS

12、P.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; /*正确密码

13、*/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;LCDO

14、utputShow(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);

15、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 0x3) & (tmp 0x8)KeyValue = tmp + 4;elseKeyValue = tmp;printf(KPI interrupts. %xn, KeyValue);if(c6 & c13)bc-7=KeyValue; /*el

16、se if(c=13)USIRead(0x0,a); /* 呢*/for(cnt=0;cnt13 & c20)bc-14=KeyValue;/*else if(c=20)/* 继续比对密码 */ USIRead(0x0,a); for(cnt=0;cnt20 & c27) bc-21=KeyValue;else if(c=27)/* 第三次比对 */USIRead(0x0,a); for(cnt=0;cnt6;cnt+) if(acnt=bcnt) sum+;11 欢1。1迎下载精品文档if(sum=6)printf(”测试成功.dn,sum);p=1;elseprintf(测试失败.%dn,

17、sum);p=4;else/*这之后程序不再允许进行输入*/prin tf(i nv alid operati onsn ”);C+;六、实验结果截图(1)密码锁初始状态,显示设置密码,显示图片 1(2)设置密码后显示,输入密码(3)当连续输入错误的密码,系统显示密码错误,并且锁定系统 当输入密码正确时,显示图片2七、课程设计体会经过这次课程设计,我对arm芯片有了更深入的理解,同时在操作 W90P710 这款芯片开发板的过程中提高了动手能力。掌握了ADS集成开发环境及JTAG仿真器的使用。通过实践,不断更改调试程序的过程中,我对理论学习长得中断源 程序的编写、GPI0控制寄存器、中断寄存器的

18、控制、对库函数的调用有了更好 的理解和掌握。 同时也意识到自己的不足,学好汇编和 c语言基础是未来面向 硬件编程的重要基础,在c语言部分,指针的知识与应用还需加强。本次课程设 计的过程中体现出了 arm系列芯片较传统mcu的优势,接口丰富,内部存储资源 更充裕。但是本次课设主要是运用了芯片偏向 mcu的功能,并没有在芯片中加载 操作系统。Arm系列的学习才刚刚开始,仅在入门阶段,未来需要深入继续学习 嵌入式知识,使自己的技能更上一层楼。八、参考文献1 张毅坤,陈善久,裘雪红单片微型计算机原理及应用.西安电子科技大学出版社.2008年5月13欢2下载精品文档2 华成英,童诗白.模拟电子技术基础

19、.高等教育出版社 ,2007 年 8 月3 唐俊翟等 单片机原理与应用 冶金工业出版社, 2003.94 刘瑞新等 单片机原理及应用教程 机械工业出版社, 2003.75 吴国经等 单片机应用技术 中国电力出版社, 2004.16 李全利,迟荣强编著 单片机原理及接口技术 高等教育出版社, 2004.1 九、附录/* Function Name : LCDInit* Description : LCD 初始化* Input : None* Output: None* Return: None*/void LCDInit(void)REG_GPIO_CFG6 = 0x555555;REG_LCD

20、_LCDCON = 0x30c05;REG_LCD_FIFO1PRM = 0xa;REG_LCD_F1DREQCNT = 0x1e000f0;REG_LCD_FIFO1RELACOLCNT = 0x1e0; /LCD CLKREG_LCD_LCDTCON1 = 0x3b166;REG_LCD_LCDTCON2 = 0x3bf00f1;REG_LCD_LCDTCON3 = 0x105401;REG_LCD_LCDTCON4 = 0x20101;REG_LCD_LCDTCON5 = 0xe;/* Function Name : LCDShow* Description :设置LCD显示位置* In

21、put : None* Output: None* Return: None*void LCDShow(LCD_IMAGE_T Size, LCD_LOCATION_T Location) REG_LCD_F1DREQCNT = (Size.width 1);REG_LCD_DISPWINS = (Location.StartY 16) + Location.StartX;REG_LCD_DISPWINE = (Location.EndY 16) + Location.EndX; /* Function Name : LCDFIFOBufferSet* Description :指向LCD缓冲

22、区存取图像内容* Input :数组名称* Output: None* Return: None* */void LCDFIFOBufferSet(PUINT8 Buffer)REG_LCD_F1SADDR = (U32) Buffer;/* Function Name : LCDDisplayOn* Description :打开 LCD* Input : None* Output: None* Return: None* */void LCDDisplayOn(void)lcdIoctl(1, 1, 0);/* Function Name : LCDDisplayOff* Descript

23、ion :关闭 LCD* Input : None* Output: None* Return: None*/void LCDDisplayOff(void)lcdIoctl(1, 2, 0);/* Function Name : Delay* Description : 用于不精确延时* Input : 延时时间* Output: None* Return: None*/void Delay(U32 t)dot-;while(t);*Function Name : StringShow Description : 显示单个字符Input: LCDOutput: NoneReturn: Non

24、e显示字符相关信息*/void StringShow(LCDShowParameter LCDShowPara)/ 用于取汉字点阵图U32 Offset = 0, Length = 0;U8 PBuffer32 = 0;/用于将汉字点阵图转化为LCD显示图U32 BitCounter = 8; /8U32 ByteCounter = 0; /32U32 temp;U8 ColorHigh, ColorLow;/ 用于在LCD上显示汉字U32 X = 0, Y = 0, Line = 0, Row = 0; U8 LBuffer512 = 0;Offset = (LCDShowPara.Lett

25、erChar0-0xa1) * 0x5e + (LCDShowPara.LetterChar1 - 0xa1) 5;for(Length = 0; Length 8); for(ByteCounter = 0; ByteCounter 32; ByteCounter+) BitCounter = 8;temp = PBufferByteCounter; for(BitCounter = 0; BitCounter 8; BitCounter+) if(temp & 0x80) = 0x80) LBuffer(ByteCounter 4) + (BitCounter 1) =ColorHigh;

26、LBuffer(ByteCounter 4) + (BitCounter 1) + 1= ColorLow; else LBuffer(ByteCounter 4) + (BitCounter 1) = 0x00;LBuffer(ByteCounter 4) + (BitCounter 1) + 1= 0x00; temp = 1; for(Row = 0; Row 16; Row+) for(Line = 0; Line 32; Line+)X = (LCDShowPara.StartX 5) + Line;Y = (LCDShowPara.StartY 4)+ Row;LCDShowPar

27、a.LCDBufferX + 960 * Y = LBufferLine + (Row 5);/* Function Name : LCDOutputShow* Description : 显示多字符并自动换行* Input : LCD 显示字符相关信息及字数* Output: None* Return: None*/void LCDOutputShow(LCDShowParameter LCDShowPara, U32 NUM)U32 temp;StringShow(LCDShowPara);for(temp=1; temp 29)LCDShowPara.StartY = LCDShowPa

28、ra.StartY + 1;LCDShowPara.StartX = 0;LCDShowPara.LetterChar = &LCDShowPara.LetterChar2; StringShow(LCDShowPara); /* Function Name : USIInit* Description :初始化USI,设置GPI0口为USI模式,配置SCLK串行时钟Input : NoneOutput: NoneReturn: None* */void USIInit(void)REG_GPIO_CFG5 = 0x000AA000; REG_USI_DIVIDER = 0x1; REG_US

29、I_CNTRL = 0x00000044; REG_USI_SSR=0x0; /* Function Name : USICheckBusy* Description : 检测 Flash 状态寄存器“忙”位* Input : None* Output: None* Return: None*/U8 USICheckBusy(void)REG_USI_Tx0 = 0x05; / 读状态寄存器命令REG_USI_CNTRL = 0x00000044; / 发送 8 位REG_USI_SSR = 0x1;/CS=0REG_USI_CNTRL = REG_USI_CNTRL | 0x01;启动发送

30、while(REG_USI_CNTRL & 0x1);/ 判断是否发送完成 while(1)REG_USI_Tx0 = 0xff;/ 发送 ff 提供接收时钟,把状态寄存器的数 据读回接收寄存器REG_USI_CNTRL = 0x00000044;/发送 8 位REG_USI_SSR=0x1;/CS=0REG_USI_CNTRL =REG_USI_CNTRL|0x0 启动发送 if(REG_USI_Rx0 & 0xff) & 0x01) != 0x01)/ 等待检测状态寄存 器的忙状态break;printf(Busy=0x%xn,REG_USI_Rx0);REG_USI_SSR=0x0; /

31、CS=1 return 0;/* Function Name : USIWriteEnable* Description : 写使能,在写数据到 flash 存储器或者擦除操作时前 要加上写使能* Input : None* Output: None* Return: None*/void USIWriteEnable(void)REG_USI_Tx0 = 0x06;/ 写使能命令 REG_USI_CNTRL = 0x00000044; REG_USI_SSR = 0x1;/CS=0 REG_USI_CNTRL = REG_USI_CNTRL | 0x01;/ 启动发送 while(REG_U

32、SI_CNTRL & 0x1);/ 等待发送结束 REG_USI_SSR = 0x0;/CS=1/* Function Name : USIRead* Description : 从 Flash 读一个字节* Input: None* Output: None* Return: None*/void USIRead(U32 R_addr,U8 *Read_buff)U32 Read_cnt;U8 Rx_temp;/ 传送 8 位命令REG_USI_Tx0 = 0x03;/ 读数据命令REG_USI_CNTRL = 0x00000044;REG_USI_SSR = 0x1;REG_USI_CNT

33、RL = REG_USI_CNTRL | 0x01; while(REG_USI_CNTRL&0x1);/ 传送 24 位地址REG_USI_Tx0 = R_addr;REG_USI_CNTRL = 0x000000c4;REG_USI_CNTRL = REG_USI_CNTRL | 0x01; while(REG_USI_CNTRL & 0x1);/ 读出 flash 某一页的数据for(Read_cnt = 0; Read_cnt 6; Read_cnt+)REG_USI_Tx0 = 0xff;REG_USI_CNTRL = 0x00000044;REG_USI_CNTRL = REG_U

34、SI_CNTRL | 0x01; while(REG_USI_CNTRL & 0x1); Rx_temp=REG_USI_Rx0;*(Read_buff+) =Rx_temp;printf(Addresstt0x%x: tt%dn,Read_cnt,Rx_temp);REG_USI_SSR=0x0;printf( 接收完成 n);/* Function Name : USIWrite* Description : 向 Flash 写一个字节* Input : None* Output: None* Return: None*/void USIWrite(U32 W_addr, U8 *W_bu

35、ff)U16 Write_cnt;/ 传送 8 位命令REG_USI_Tx0 = 0x02;/ 写命令REG_USI_CNTRL = 0x00000044;REG_USI_SSR = 0x1;REG_USI_CNTRL = REG_USI_CNTRL | 0x01; while(REG_USI_CNTRL & 0x1);/ 传送 24 位地址REG_USI_Tx0 = W_addr;REG_USI_CNTRL = 0x000000c4;REG_USI_CNTRL = REG_USI_CNTRL | 0x01; while(REG_USI_CNTRL & 0x1);/ 传送 8 位数据 for(

36、Write_cnt=0;Write_cnt6;Write_cnt+) REG_USI_Tx0 = *(W_buff+); REG_USI_CNTRL = 0x00000044; REG_USI_CNTRL = REG_USI_CNTRL | 0x01; while(REG_USI_CNTRL & 0x1);REG_USI_SSR = 0x0; while(USICheckBusy(); / 检测是否写完 printf( 写数据完成 n);/* Function Name : USIRead_ID* Description : 正确的 ID=0xEF10* Input : None* Output: None* Return: None*/void USIRead_ID(void)U8 instruction_code = 0x90;/读 ID 命令U32 Device_ID;REG_USI_SSR = 0x1;REG_USI_CNTRL = 0x00000004;REG_USI_Tx0 = instruction_code 24;REG_USI_CNTRL = REG_USI_CNTRL | 0x01; while(REG_USI_CNTRL & 0x1);REG_USI_Tx0 = 0xffff;/ 提供读数据时钟 REG_USI_CNTRL = REG

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论