嵌入式课程设计报告

上传人:tia****g98 文档编号:108310072 上传时间:2022-06-15 格式:DOC 页数:24 大小:4.31MB
返回 下载 相关 举报
嵌入式课程设计报告_第1页
第1页 / 共24页
嵌入式课程设计报告_第2页
第2页 / 共24页
嵌入式课程设计报告_第3页
第3页 / 共24页
点击查看更多>>
资源描述
嵌入式课程设计报告 设计题目:电子密码锁 、 摘要 随着科技和人们的生活水平的提高,实现防盗的问题也变得尤为突出,传统机械锁构造简单,电子锁的保密性高,使用灵活性好。根据需要设计运用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 #include 710defs.h /*头文件声明*/#include HB_it.h#include main.h#include lcd_pattern.hextern U8 a6;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(); /擦除扇区0 printf(写使能: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 0x3) & (tmp 0x8)KeyValue = tmp + 4;elseKeyValue = tmp;printf(KPI interrupts. %xn, KeyValue);if(c6 & c13) bc-7=KeyValue; /*输入密码*/ else if(c=13) USIRead(0x0,a); /*将输入密码放入在flash芯片中存储呢*/ 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+; if(sum=6) printf(测试成功.%dn,sum); p=1; else printf(测试失败.%dn,sum); p=4; else/*这之后程序不再允许进行输入*/ printf(invalid operationsn); c+; 六、实验结果截图 (1)密码锁初始状态,显示设置密码,显示图片1。 (2)设置密码后显示,输入密码。 (3)当连续输入错误的密码,系统显示密码错误,并且锁定系统。 (4)当输入密码正确时,显示图片2。七、课程设计体会 经过这次课程设计,我对arm芯片有了更深入的理解,同时在操作W90P710这款芯片开发板的过程中提高了动手能力。掌握了ADS集成开发环境及JTAG仿真器的使用。通过实践,不断更改调试程序的过程中,我对理论学习长得中断源程序的编写、GPIO控制寄存器、中断寄存器的控制、对库函数的调用有了更好的理解和掌握。 同时也意识到自己的不足,学好汇编和c语言基础是未来面向硬件编程的重要基础,在c语言部分,指针的知识与应用还需加强。本次课程设计的过程中体现出了arm系列芯片较传统mcu的优势,接口丰富,内部存储资源更充裕。但是本次课设主要是运用了芯片偏向mcu的功能,并没有在芯片中加载操作系统。Arm系列的学习才刚刚开始,仅在入门阶段,未来需要深入继续学习嵌入式知识,使自己的技能更上一层楼。 八、参考文献1张毅坤,陈善久,裘雪红. 单片微型计算机原理及应用.西安电子科技大学出版社.2008年5月2 华成英,童诗白. 模拟电子技术基础.高等教育出版社,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_LCDCON = 0x30c05; REG_LCD_FIFO1PRM = 0xa; REG_LCD_F1DREQCNT = 0x1e000f0; REG_LCD_FIFO1RELACOLCNT = 0x1e0; /LCD CLK REG_LCD_LCDTCON1 = 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 = (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 : 数组名称* 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 : 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) do t-; while(t);/* Function Name : StringShow* Description : 显示单个字符* Input : LCD显示字符相关信息* Output : None* Return : None*/void StringShow(LCDShowParameter 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 + (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; 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; LCDShowPara.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 = LCDShowPara.StartY + 1; LCDShowPara.StartX = 0; LCDShowPara.LetterChar = &LCDShowPara.LetterChar2; StringShow(LCDShowPara); /* Function Name : USIInit* Description : 初始化USI,设置GPIO口为USI模式,配置SCLK串行时钟* Input : None* Output : None* Return : None*/void USIInit(void) REG_GPIO_CFG5 = 0x000AA000; REG_USI_DIVIDER = 0x1; REG_USI_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;/启动发送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|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 : 写使能,在写数据到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 : 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_CNTRL = 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_USI_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_buff) 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(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_USI_CNTRL | 0x01;while(REG_USI_CNTRL & 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_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);/* 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; /*
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 中学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!