东北大学嵌入式课设——电子密码锁_第1页
东北大学嵌入式课设——电子密码锁_第2页
东北大学嵌入式课设——电子密码锁_第3页
东北大学嵌入式课设——电子密码锁_第4页
东北大学嵌入式课设——电子密码锁_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、嵌入式课程设计 东北大学信息学院 电子信息工程专业嵌入式系统电子密码锁课程设计报告题目:电子密码锁姓名: 学号:班级: 摘要随着现代社会信息化进程的加快,嵌入式系统被广泛的地应用于军事、家用、工业、商业、办公、医疗等社会各个方面,表现出很强的投资价值。从国际范围来看,作为数字化电子信息产品核心的嵌入式系统目前其硬件和软件开发工具市场已经突破2000亿美元,嵌入式系统带来的全球工业年产值更是达到了一万亿美元,随着全球经济的持续增长以及信息化的加速发展,嵌入式系统市场必将进一步增长。本次课程设计,使用基于ARM7TDMI内核的华邦W90P710处理器, 它提供了4K的指令缓存和4K的数据缓存,并具

2、有强大的外设资源,同时具有一个AC97控制器,一个双向通道GDMA,一个LCD控制器,两个24位定时器,它的外部总线接口控制器支持SDRAM、ROM/SRAM、FLASH存储器和I/O设备的方便接入,还具有串行通信和以太网接口,以适应通信网关和其他的应用场合。在人们对个人隐私等权益愈发注重的今天,个人信息及所有物的安全性不容忽视。而本次课程设计的题目基于华邦W90P710处理器的电子密码锁设计就是基于这一现状给出的具有使用性的设计。实现了密码设定、三次密码输入、显示电子相册的功能。 关键字:华邦W90P710微处理器、电子密码锁、嵌入式系统目 录目 录3一、题目设计意义及特点4 1.1 设计意

3、义及特点41.2 系统的主要功能4二、系统功能设计52.1 硬件设计及描述52.1.1系统功能模块整体52.1.2各模块作用及硬件连接图52.2 软件设计及描述82.2.1 程序流程框图82.2.2 源程序代码9 三、课程设计体会 .24 四、参考文献 .24一、题目设计意义及特点1.1 设计意义及特点(1)设计意义如今个人物品等问题开始暴露,传统的密码锁容易损坏、丢失,实用性、安全性很低,而电子密码锁因其绝对的精度使信息及物品的保密称为可能。此次题目具有很强的实际意义。另外,在老师对程序例子的讲解及自己的理解之后,通过查阅资料在原有程序上进行改写、融合和添加,设计出了电子密码锁,提高了自己的

4、程序阅读能力,并了解了嵌入式系统的开发流程,应用软件的使用方法。增强了自主学习能力,能与课本知识相融合,更加灵活的使用ARM变成语言。(2)特点电子密码锁与电子相册相结合,在登录成功后播放相册;具有密码设定及三次输入机会。1.2 系统的主要功能(1) 设置密码: LCD显示“请输入密码”,从键盘输入任意6位数字作为密码存入寄存 器,设置成功。(2)通过密码登陆系统: LCD显示“请输入密码”从键盘输入密码,比较键盘输入的密码与Flash 中是否相,每次按键则相应LED灯点亮; 如果密码正确,则LED灯全亮,LCD显示“密码正确”,并且开始切换 图片,播放电子相册; 如果第一次密码不正确,则LE

5、D灯闪烁,LCD显示“密码不正确,请重新输入”;如果第二次密码不正确,则LED灯闪烁,LCD显示“密码不正确,您还有一次机会,请重新输入”;如果第三次密码不正确,则LED灯闪烁,LCD显示“对不起,您已经连续三次输入密码错误,系统锁定”,锁定系统,无法进行任何操作。 (3)电子相册 显示“密码正确”后,自动播放电子相册,多张图片顺序播放。二、系统功能设计 2.1 硬件设计及描述 2.1.1系统功能模块整体 2.1.2各模块作用及硬件连接图 (1)华邦嵌入式处理器芯片W90P710 W90P710为此次课程设计的中心和运行平台。 它是基于ARM7TDMI内核的处理器,提供了4K的指令缓存和4K的

6、数据缓存,并具有强大的外设资源,包括一个USB1.1主控制器,一个SD/SDIO主控制器,4个独立的UART接口,一个看门狗定时器,71个可编程I/O口,PS/2键盘控制器和高级中断控制器AIC,同时具有一个AC97控制器,一个双向通道GDMA,一个LCD控制器,两个24位定时器,它的外部总线接口控制器支持SDRAM、ROM/SRAM、FLASH存储器和I/O设备的方便接入,还具有串行通信和以太网接口,以适应通信网关和其他的应用场合。 (2)LCD显示模块 90P710试验板,使用的是AUO 3.0" TFT A030DL01(960x240, 8 位数据总线) 数字式TFT 液晶屏

7、,可以将video/OSD的原始图像数据显示到外部显示设备。TFT液晶屏的显示是对屏上每个像素点进行操作,通过向这些像素点配置不同的值,以显示不同的颜色,由于其内部没有缓存,所要显示的数据要随着时钟脉冲一点一点的传送过来。因此,它需要在中开辟出一片缓冲区,将要显示的数据先存放到的缓冲区中,即存在SDRAM 中,一般按照一维数组的形式进行存储,然后把存储数据的SDRAM的地址送给FIFO,然后送给颜色生成器,进而实现在屏幕上的显示;如果在屏上的定位显示,算出所要显示的内容在屏幕上的位置,然后在相应的SDRAM的地址内存入要显示的数据即可。 (3)键盘输入模块 通过外部键盘输入及软件编程实现键盘对

8、系统的控制(4)LED模块 2.2 软件设计及描述 2.2.1 程序流程框图主函数中,函数调用了KPI、USI、LCD、AC-97、LED初始化程序。第一次输入为设定密码,之后13次为密码匹配,成功则播放相册,否则三次后锁定密码锁。程序框图如下:NYYY 开始系统初始化 读取密码设定标志是否已设定密码设定密码写入FLASH是否超过三次密码锁锁定 输入密码密码是否正确 电子相册 结束NN 2.2.2 源程序代码主程序部分 #include <stdio.h>#include "710defs.h"#include "HB_it.h"#inclu

9、de "main.h"#include "lcd_pattern.h"extern int c;extern U8 shuru;extern U8 temp;extern U8 a6;extern U8 b6;extern int p; int main(void) /USI寄存器初始化 int cnt,i;U8 wchar1= "请输密码" U8 wchar2= "密码正确 " U8 wchar3= "密码错误 " U8 wchar4= "错误超过三次系统锁定" LCD_I

10、MAGE_T LCD_Size; LCD_LOCATION_T LCD_Location; LCDShowParameter LSP; LCD_Size.width = 480; LCD_Size.height = 240; LCD_Location.StartX = 0; LCD_Location.StartY = 0; LCD_Location.EndX = 960; LCD_Location.EndY = 240; printf("*USI测试程序*n");printf("*Flash型号W25P10*n");USIInit();/读器件IDpri

11、ntf("读器件ID:");USIRead_ID(); /擦除扇区0printf("写使能:n");USIWriteEnable();while(USICheckBusy();USISectorErease(0x0); for(cnt=0;cnt<6;cnt+) acnt =cnt;/发送数据初始化 LCDInit(); LCDShow(LCD_Size, LCD_Location); LCDFIFOBufferSet(BlackBoard); LCDDisplayOn(); LSP.StartX = 8; LSP.StartY = 7; LSP.

12、LibPlace = 0x400000; LSP.Color = 0x07ff; LSP.LetterChar = wchar1; LSP.LCDBuffer = BlackBoard; LCDOutputShow(LSP,4); KPIInit();printf("Please press keys.n"); while(1) if(p=1) LSP.StartX = 8; LSP.StartY = 7; LSP.LibPlace = 0x400000; LSP.Color = 0x07ff; LSP.LetterChar = wchar2; LSP.LCDBuffer

13、= BlackBoard; LCDDisplayOn(); LCDOutputShow(LSP,4); EBILedInit(0x01); LCDFIFOBufferSet(BlackBoard);temp = (U32)BlackBoard1;Delay(6000000);LCDFIFOBufferSet(BlackBoard);temp = (U32)BlackBoard;Delay(6000000); LCDFIFOBufferSet(BlackBoard1);temp = (U32)BlackBoard1;Delay(6000000);LCDFIFOBufferSet(BlackBoa

14、rd1);temp = (U32)BlackBoard1;Delay(6000000); if(p=2) LSP.StartX = 8; LSP.StartY = 7; LSP.LibPlace = 0x400000; LSP.Color = 0x07ff; LSP.LetterChar = wchar3; LSP.LCDBuffer = BlackBoard; LCDOutputShow(LSP,4); EBILedInit(0x01);Delay(0x80000);EBILedInit(0x00);Delay(0x80000); if(p=3) LSP.StartX = 8; LSP.St

15、artY = 7; LSP.LibPlace = 0x400000; LSP.Color = 0x07ff; LSP.LetterChar = wchar4; LSP.LCDBuffer = BlackBoard; LCDOutputShow(LSP,10); EBILedInit(0x01);Delay(0x80000);EBILedInit(0x00);Delay(0x80000); return 0;/* Function Name : KPIInit* Description : KPI初始化* Input : None* Output : None* Return : None*/v

16、oid KPIInit(void) REG_GPIO_CFG2 |= 0x000aaaaa; /将GPIO设置为KPI模式 REG_GPIO_CFG2 &= 0xfffaaaaa; REG_AIC_SCR29 = 0x00000045; /将KPI中断设置为高电平有效,优先级为5REG_AIC_MECR = 0x20000000;REG_KPICONF = 0x00142fff;/* Function Name : USIInit* Description : 初始化USI,设置GPIO口为USI模式,配置SCLK串行时钟* Input : None* Output : None* R

17、eturn : None*/void USIInit(void) REG_GPIO_CFG5 = 0x000AA000; REG_USI_DIVIDER = 0x1; REG_USI_CNTRL = 0x00000044; REG_USI_SSR=0x0;/* Function Name : Delay* Description : 用于不精确延时* Input : 延时时间* Output : None* Return : None*/void Delay(U32 t) do t-; while(t);/* Function Name : USICheckBusy* Description

18、: 检测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;/启动发送while(REG_USI_CNTRL & 0x1);/判断是否发送完成while(1)REG_USI_Tx0 = 0xff;/发送ff提供接收时钟,把状态寄存器的

19、数据读回接收寄存器REG_USI_CNTRL = 0x00000044;/发送8位REG_USI_SSR=0x1;/CS=0REG_USI_CNTRL =REG_USI_CNTRL|0x01;/启动发送if(REG_USI_Rx0 & 0xff) & 0x01) != 0x01)/等待检测状态寄存器的忙状态break;printf("Busy=0x%xn",REG_USI_Rx0); REG_USI_SSR=0x0; /CS=1 return 0;/* Function Name : USIWriteEnable* Description : 写使能,在写数

20、据到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_USI_CNTRL & 0x1);/等待发送结束 REG_USI_SSR = 0x0;/CS=1/* Function Name : USIRe

21、ad* 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_CNTRL = REG_USI_CNTRL | 0x01;while(REG_USI_CNTRL&0x1);/传送24位地址REG_USI_Tx0

22、= 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_USI_CNTRL | 0x01;while(REG_USI_CNTRL & 0x1);Rx_temp=REG_USI_Rx0;*(R

23、ead_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_buff) U16 Write_cnt;/传送8位命令REG_USI_Tx0 = 0x02;

24、/写命令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(Write_cnt=0;Write_cnt<6;Write_cnt+) REG_USI_T

25、x0 = *(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 USIR

26、ead_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_USI_CNTRL | 0x01;while(REG_USI_CN

27、TRL & 0x1); Device_ID = REG_USI_Rx0;REG_USI_SSR = 0x0;printf("Device_ID=0x%xn", Device_ID & 0xffff);/* Function Name : chip_erease()* Description : * Input : None* Output : None* Return : None*/void USISectorErease(U32 Erea_addr) USIWriteEnable(); REG_USI_Tx0 = 0xD8;/扇区擦除命令 REG_USI

28、_CNTRL = 0x00000044; REG_USI_SSR=0x1; REG_USI_CNTRL = REG_USI_CNTRL|0x01; while(REG_USI_CNTRL & 0x1); REG_USI_Tx0 = Erea_addr; REG_USI_CNTRL = 0x000000C4; REG_USI_CNTRL = REG_USI_CNTRL | 0x01; while(REG_USI_CNTRL & 0x1); REG_USI_SSR = 0x0; while(USICheckBusy();/等待检测是否擦除结束 printf("擦除完成.n

29、");/* Function Name : Write_disable()* Description : OK* Input : None* Output : None* Return : None*/void USIWriteDisable(void) REG_USI_Tx0 = 0x04;/禁止写命令REG_USI_CNTRL = 0x00000044;REG_USI_SSR = 0x1; REG_USI_CNTRL = REG_USI_CNTRL | 0x01; while(REG_USI_CNTRL & 0x1); REG_USI_SSR = 0x0; /* Func

30、tion Name : EBILedInit* Description : LED的初始化* Input : LED的状态值* Output : None* Return : None*/void EBILedInit(U8 Value) REG_EXT0CON = EBI_EXT0_VALUE; EBILedSet(Value);/* Function Name : EBILedSet* Description : 用于控制LED的亮灭* Input : LED的状态值* Output : None* Return : None*/void EBILedSet(U8 Value) (VPin

31、t(EBILED_ADDRESS) = Value;/* Function Name : LCDInit* Description : LCD初始化* Input : None* Output : None* Return : None*/void LCDInit(void) REG_GPIO_CFG6 = 0x555555; REG_LCD_LCDCON = 0x30c05; REG_LCD_FIFO1PRM = 0xa; REG_LCD_F1DREQCNT = 0x1e000f0; REG_LCD_FIFO1RELACOLCNT = 0x1e0; /LCD CLK REG_LCD_LCDT

32、CON1 = 0x3b166; REG_LCD_LCDTCON2 = 0x3bf00f1; REG_LCD_LCDTCON3 = 0x105401; REG_LCD_LCDTCON4 = 0x20101; REG_LCD_LCDTCON5 = 0xe;/* Function Name : LCDShow* Description : 设置LCD显示位置* Input : None* Output : None* Return : None*/void LCDShow(LCD_IMAGE_T Size, LCD_LOCATION_T Location) REG_LCD_F1DREQCNT = (

33、Size.width <<15 ) + Size.height; REG_LCD_FIFO1RELACOLCNT = (Size.width >> 1); REG_LCD_DISPWINS = (Location.StartY << 16) + Location.StartX; REG_LCD_DISPWINE = (Location.EndY << 16) + Location.EndX;/* Function Name : LCDFIFOBufferSet* Description : 指向LCD缓冲区存取图像内容* Input : 数组名称

34、* 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* Description : 关闭LCD* Input

35、 : None* Output : None* Return : None*/void LCDDisplayOff(void) lcdIoctl(1, 2, 0);/* Function Name : Delay* Description : 用于不精确延时* Input : 延时时间* Output : None* Return : None*/* Function Name : StringShow* Description : 显示单个字符* Input : LCD显示字符相关信息* Output : None* Return : None*/void StringShow(LCDSho

36、wParameter LCDShowPara) /用于取汉字点阵图 U32 Offset = 0, Length = 0; U8 PBuffer32 = 0; /用于将汉字点阵图转化为LCD显示图 U32 BitCounter = 8; /8 U32 ByteCounter = 0; /32 U32 temp; U8 ColorHigh, ColorLow; /用于在LCD上显示汉字 U32 X = 0, Y = 0, Line = 0, Row = 0; U8 LBuffer512 = 0; Offset = (LCDShowPara.LetterChar0-0xa1) * 0x5e + (

37、LCDShowPara.LetterChar1 - 0xa1) << 5; for(Length = 0; Length < 32; Length+) PBufferLength = (* (unsigned int volatile *)(LCDShowPara.LibPlace + Offset + Length); ColorLow = (U8)(0x00ff & LCDShowPara.Color); ColorHigh = (U8)(0xff00 & LCDShowPara.Color >> 8); for(ByteCounter = 0

38、; ByteCounter < 32; ByteCounter+) BitCounter = 8; temp = PBufferByteCounter; for(BitCounter = 0; BitCounter < 8; BitCounter+) if(temp & 0x80) = 0x80) LBuffer(ByteCounter << 4) + (BitCounter << 1) = ColorHigh; LBuffer(ByteCounter << 4) + (BitCounter << 1) + 1 = ColorLow; else LBuffer(ByteCounter << 4) + (BitCounter << 1) = 0x00; LBuffer(ByteCounter << 4) +

温馨提示

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

评论

0/150

提交评论