当前位置:文档之家› 东北大学嵌入式课程设计报告

东北大学嵌入式课程设计报告

嵌入式系统课程设计报告

姓名:

学号:

班级:

指导老师:佘黎煌老师

指导老师:邵闻飞老师

摘要

嵌入式系统应用广泛,涉及通信、网络消费电子产品、医疗仪器、汽车电子、工业控制、仪器仪表、航天军事等各个行业和领域。通信领域大量使用嵌入式系统,主要包括程控交换机,路由器,IP交换机,传输设备等。在消费电子产品领域,随着技术的发展,消费电子产品正向数字化和网络化方向发展。在医疗仪器,汽车电子,工业控制,仪器仪表等领域,随着医疗卫生,汽车,工业等各部门对智能控制需求的不断增长,需要对设备进行智能化,数字化改造,位嵌入式系统提供了很大的市场。就汽车电子系统而言,目前的大多数高档轿车每两拥有约50个嵌入式微处理器。嵌入式系统在应用数量上已经远远超过了各种通用计算机。可以说嵌入式产品“无处不在”。本次课程设计,使用基于华邦W90P710处理器的实验教学系统设计了一个电子密码锁。

关键字:华邦W90P710微处理器、UART、USI、FLASH、LCD,键盘

目录

1.绪论 (4)

1.1 课程设计的目的 (4)

1.2 课程设计的要求 (4)

1.3 课程设计的任务 (4)

1.4 课程设计的意义 (4)

2.应用试验箱开发电子密码锁系统 (5)

2.1 电子密码锁系统概述 (5)

2.2 题目意义 (5)

2.2.1 系统的主要功能 (5)

2.2.2 密码锁系统功能框图 (7)

2.2.3 LCD液晶显示模块 (7)

2.3 软件设计流程及主要函数描述 (8)

2.3.1 程序流程图 (8)

2.3.2 主要函数 (11)

3.程序设计中遇见的问题及解决的方法 (12)

4.课程设计体会 (12)

5.参考文献 (13)

1. 绪论

1.1课程设计目的

(1)通过设计加深对书本知识的理解;

(2)增强实践动手能力;

(3)培养综合设计能力。

1.2课程设计要求

(1)根据教师布置的题目自行选题;

(2)根据实验板提供的功能,自行设计功能模块,画出硬件原理图;

(3)画出软件流程图;

(4)采用C语言进行编程;

(5)编写完整的软件程序;

(6)调试、修改、完善;

(7)写出课程设计报告。

1.3课程设计任务

用华邦W90P710开发板实现电子密码锁。要求:

1、设置密码:从键盘输入任意6位数字作为密码,将这六位数字经过USI总线存储到Flash芯片中,设置密码完成。

2、通过密码登陆系统:

(1)、从键盘输入密码,比较键盘输入的密码与Flash中存储的密码是否相同。

(2)、如果密码正确,则LED灯点亮;如果密码不正确,则LED灯闪烁,而且如果连续三次输入密码错误则系统锁定,不允许再次输入密码。

1.4课程设计的意义

本次实训,在实验指导书中已经给出一些实例程序,其中包括已有实验程序:(1)启动代码程序;

(2)流水灯程序;

(3)键盘程序;

(4)外部中断程序;

(5)定时计数器程序;

(6)串口通信程序;

(7)实时时钟程序;

(8)USI程序;

(9)LCD显示程序;

通过对已有程序的理解,之后进行修改拼凑,在由华邦W90P710为核心器件的硬件系统上实现了具有一定功能的系统。通过设计,熟悉了ARM 开发系统,及开发流程,并深入了解了嵌入式系统的实际应用,能更深地理解课堂上所学的内容,使得单调的理论知识与实际联系起来,帮助我们更好的理解。

2. 应用实验箱开发电子密码锁系统

2.1电子密码锁系统概述

2.2题目意义

生活中,安全一直都是人们关心的话题。随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲呢。本次课程设计,我实现一款电子密码锁,既简单又适用。

2.2.1系统的主要功能

本系统的基本功能就是密码锁,如果用户是第一次使用则提示其先设定密码,要求输入两次以确认。成功设定密码后将密码通过USI写到FLASH中保存,并写入密码已设定的标志。如果用户不是是第一次使用则提示其输入密码,系统将比对设定好的密码及用户输入的密码,如果密码正确,则屏幕显示“密码正确”;若不正确则提示错误,同时LED闪烁,若连续三次错误,系统就自动锁定。

2.1.3 创新特点

本设计添加了退格键,以便用户输入错误密码时可以退格清除。在设定密码阶段加上了重输密码以确认的功能,防止用户不小心设定了错误的密码。界面和操作更友好,更人性化。

2.2 硬件电路设计及描述

2.2.1实验箱硬件电路及原理框图

2.2.2密码锁系统功能框图

系统各个功能模块的概述:

1)嵌入式处理器模块:

此模块为本系统的重心,是程序运行的载体,同时这个模块也是我们这次课程设计的运行平台,我们所做的便是通过编写程序应用其自身的外设和资源。

2)按键输入模块:

通过键盘调实现密码输入。

3)LCD模块:

密码锁界面显示。

2.2.3LCD液晶显示模块

LCD控制器的主要目的是用于将video/OSD的原始图像数据显示到外部显示设备。它支持一般的小包RGB和小包YUV格式的原始数据,并且能够连接到一般的TFT LCD, STN LCD和电视编码器。可以支持LG的TFT屏,CASIO的TFT屏,以及STN LCD,支持VIDEO和OSD模式,这两种模式的设定有不同的寄存器控制,通过设定寄存器的设置可以实现不同的模式及功能。

W90P710试验板,使用的是AUO 3.0" TFT A030DL01(960x240, 8 位数据总线)数字式TFT液晶屏,可以将video/OSD的原始图像数据显示到外部显示设备。TFT 液晶屏的显示是对屏上每个像素点进行操作,通过向这些像素点配置不同的值,以显

示不同的颜色,由于其内部没有缓存,所要显示的数据要随着时钟脉冲一点一点的传

送过来。因此,它需要在中开辟出一片缓冲区,将要显示的数据先存放到的缓冲区中,即存在SDRAM中,一般按照一维数组的形式进行存储,然后把存储数据的SDRAM 的地址送给FIFO,然后送给颜色生成器,进而实现在屏幕上的显示;如果在屏上的定位显示,算出所要显示的内容在屏幕上的位置,然后在相应的SDRAM的地址内存入要显示的数据即可。

硬件图如下:

该模块由40个引脚与外界电路相连,由于本身没有寄存器,需要由W90P710提供的LCD控制寄存器来控制选择对应的液晶类型及显示形式,FIFO的使用、颜色的显示模式和时序的设置,并通过配置相应的的寄存器即可实现。

模块可以选择并行或串行方式与微控制器相连,通过配置寄存器、送入指令和数据,可对显示方式和显示内容作出选择。

2.3软件设计流程及主要函数描述

2.3.1程序流程图

主函数流程图:

LED工作流程Array

LED工作的代码:

for(i=0;i<5;i++)

{

EBILedSet(0xF0);

Delay(1000000);

EBILedSet(0x0f);

Delay(1000000);

}

if(++ti==3)

for(i=0;i<10;i++)

{

EBILedSet(0xFF);

Delay(1000000)

EBILedSet(0x81);

Delay(1000000);

}

2.3.2主要函数

int main(void)

{

LCD_IMAGE_T LCD_Size;

LCD_LOCATION_T LCD_Location;

LCD_Size.width = 480;

LCD_Size.height = 240;

LCD_Location.StartX = 0;

LCD_Location.StartY = 0;

LCD_Location.EndX = 960;

LCD_Location.EndY = 240;

LCDInit(); //LCD初始化

LCDShow(LCD_Size, LCD_Location);

LCDFIFOBufferSet(gImage_login); //装入背景图片LCDDisplayOn(); //开显示

KPIInit(); //键盘初始化

EBILedInit(); //LED初始化

USIInit(); //USI初始化

// USIRead_ID();

USIRead(0x0,2,pswSign); //从FLASH中读取0x0开始的

//两个“已设定密码”标志

if(pswSign[0]==0x00&& pswSign[1]==0x01) setFlg=1;

//如果两位分别是0x20,0x09则表示已经设定好密码,置setFlg为1 if(!setFlg) setPsw(); //如果未设定密码,则先调用设定密码函数

USIRead(0x10,6,psw2); //从FLASH中读取6位密码

inpPsw(); //调用输入密码函数

return 0;

}

3. 调试设计中遇见的问题及解决的方法

首先我实现了密码锁最基本的功能:设置密码,输入正确密码允许进入,输入错误密码禁止进入,三次错误后密码锁锁定,以及相应的屏幕文字显示和LED灯相应变化。接下来我打算扩展密码锁的功能:

(1)当输入密码正确时显示图片。

(2)操作密码锁是可以作为电子相册。

1)问题:把多个工程的相关文件组合成一个工程时出现编译错误。

解决方法:分析各变量、函数所依赖的头文件,把缺失的加入到工程,把相同的定义去除。

2)问题:LCD无法显示汉字和显示图片失真。

解决方法:在调试运行时把汉字字库文件加载到内存即可显示汉字。把图片转换成字模时色彩选择“真彩”,字模数组大小为480*240。

4. 课程设计体会

在大学时候的第一次在书本之外,自己设计实现的小系统让我初步的了解嵌入式的前景。

这次小系统设计让我体会了一种学习方式,那就是实践和书本上的理论很不同,却又紧密相关,激发了我积极参与到实践中的热情,收获了实践的经验。

5. 参考文献

[1]张石,佘黎煌等.【嵌入式系统技术教程】.北京:人民邮电出版社,2009.3

[2]【嵌入式实验指导书】

程序的主要代码:MAIN .C

int main(void)

{

U8 np=0,ti=0,i;

U8 pswSign[2],setFlg=0,reFlg=0;

U8 psw[6],psw2[6];

U8 ast[]="********************";

U8 prmpt1[]= "请设定密码:";

U8 prmpt2[]= "请重输确认:";

U8 prmpt3[]= "两次密码不符!请重新输入:";

U8 prmpt4[]= "密码设定成功!";

U8 prmpt5[]= "请输入密码:";

U8 prmpt6[]= "密码错误!请重新输入:";

U8 prmpt7[]= "密码正确!";

U8 prmpt8[]= "对不起,您已经连续三次输入密码错误,系统锁定!";

LCD_IMAGE_T LCD_Size;

LCD_LOCATION_T LCD_Location;

LCDShowParameter LSP,LSP0,LSP1,LSP2,LSP3,LSP4,LSP5,LSP6,LSP7,LSP8

LCD_Size.width = 480;

LCD_Size.height = 240;

LCD_Location.StartX = 0;

LCD_Location.StartY = 0;

LCD_Location.EndX = 960;

LCD_Location.EndY = 240;

LSP.StartY = 4;

LSP.LibPlace = 0x400000;

LSP.Color = 0x0;

LSP.LetterChar = ast;

LSP.LCDBuffer = BlackBoard;

LSP0.StartX = 12;

LSP0.StartY = 4;

LSP0.LibPlace = 0x400000;

LSP0.Color = 0x07ff;

LSP0.LetterChar = ast;

LSP0.LCDBuffer = BlackBoard;

LSP1.StartX = 5;

LSP1.StartY = 4;

LSP1.LibPlace = 0x400000;

LSP1.Color = 0x07ff;

LSP1.LetterChar = prmpt1;

LSP1.LCDBuffer = BlackBoard;

LSP2.StartX = 5;

LSP2.StartY = 6;

LSP2.LibPlace = 0x400000;

LSP2.Color = 0x07ff;

LSP2.LetterChar = prmpt2;

LSP2.LCDBuffer = BlackBoard;

LSP3.StartX = 8;

LSP3.StartY = 8;

LSP3.LibPlace = 0x400000;

LSP3.Color = 0x07ff;

LSP3.LetterChar = prmpt3;

LSP3.LCDBuffer = BlackBoard;

LSP4.StartY = 8;

LSP4.LibPlace = 0x400000;

LSP4.Color = 0x07ff;

LSP4.LetterChar = prmpt4;

LSP4.LCDBuffer = BlackBoard;

LSP5.StartX = 5;

LSP5.StartY = 4;

LSP5.LibPlace = 0x400000;

LSP5.Color = 0x07ff;

LSP5.LetterChar = prmpt5;

LSP5.LCDBuffer = BlackBoard;

LSP6.StartX = 8;

LSP6.StartY = 8;

LSP6.LibPlace = 0x400000;

LSP6.Color = 0x07ff;

LSP6.LetterChar = prmpt6;

LSP6.LCDBuffer = BlackBoard;

LSP7.StartX = 8;

LSP7.StartY = 8;

LSP7.LibPlace = 0x400000;

LSP7.Color = 0x07ff;

LSP7.LetterChar = prmpt7;

LSP7.LCDBuffer = BlackBoard;

LSP8.StartX = 4;

LSP8.StartY = 8;

LSP8.LibPlace = 0x400000;

LSP8.Color = 0x07ff;

LSP8.LetterChar = prmpt8;

LSP8.LCDBuffer = BlackBoard;

/******************************************************************/

USIInit();

USIRead_ID();

USIRead(0x0,2,pswSign);

if(pswSign[0]==0x20 && pswSign[1]==0x07) setFlg=1;

LCDInit();

LCDShow(LCD_Size, LCD_Location);

LCDFIFOBufferSet(BlackBoard);

LCDDisplayOn();

KPIInit();

EBILedInit();

EBILedSet(0x00);

if(!setFlg)

{

LCDOutputShow(LSP1,6);

LCDOutputShow(LSP2,6);

}

while(!setFlg)

{

if(keyFlg)

{

keyFlg=0;

if(keyValue==0x0e)

{

if(np==6)

{

if(reFlg)

{

for(i=0;i<6;i++)

if(psw[i]!=psw2[i]) break;

if(i<6)

{

LCDOutputShow(LSP3,13);

np=0;

reFlg=0;

LSP0.StartX = 12;

LSP0.StartY = 4;

LSP.StartX = 12;

LSP.StartY = 6;

LCDOutputShow(LSP,6);

LSP.StartY = 4;

LCDOutputShow(LSP,6);

}

else

{

LSP.StartX = 5;

LSP.StartY = 4;

LCDOutputShow(LSP,14);

LSP.StartX = 5;

LSP.StartY = 6;

LCDOutputShow(LSP,14);

LSP.StartX = 8;

LSP.StartY = 8;

LCDOutputShow(LSP,14);

LCDOutputShow(LSP4,7);

Delay(1000000);

USIWriteEnable();

while(USICheckBusy());

USISectorErease(0x10);

USIWriteEnable();

USIWrite(0x10,6,psw);

Delay(100000);

pswSign[0]=0x20;

pswSign[1]=0x07;

USIWriteEnable();

USIWrite(0x0,2,pswSign);

Delay(100000);

setFlg=1;

}

}

else

{

np=0;

reFlg=1;

LSP0.StartX = 12;

LSP0.StartY = 6;

LSP.StartY = 6;

}

}

}

else if(keyValue==0x0f)

{

if(np>0)

{

np--;

LSP0.StartX--;

LSP.StartX=LSP0.StartX;

LCDOutputShow(LSP,1);

}

}

else

{

if(np==6) continue;

if(reFlg) psw2[np++]=keyValue;

else psw[np++]=keyValue;

LCDOutputShow(LSP0,1);

LSP0.StartX ++;

}

}

}

USIRead(0x10,6,psw2);

LSP.StartX = 8;

LSP.StartY = 8;

LCDOutputShow(LSP,14);

LCDOutputShow(LSP5,6);

np=0;

LSP0.StartX = 12;

LSP0.StartY = 4;

LSP.StartY = 4;

while(1)

{

if(keyFlg)

{

keyFlg=0;

if(keyValue==0x0e)

{

if(np==6)

{

for(i=0;i<6;i++)

if(psw[i]!=psw2[i]) break;

if(i<6)

{

LCDOutputShow(LSP6,11);

np=0;

LSP0.StartX = 12;

LSP0.StartY = 4;

LSP.StartX = 12;

LSP.StartY = 4; LCDOutputShow(LSP,6);

for(i=0;i<5;i++)

{

EBILedSet(0xF0);

Delay(1000000);

EBILedSet(0x0f);

Delay(1000000);

if(++ti==3)

{

for(i=0;i<10;i++)

{

EBILedSet(0xFF);

Delay(1000000);

EBILedSet(0x81);

Delay(1000000);

}

LSP.StartX = 8;

LSP.StartY = 8;

LCDOutputShow(LSP,14);

LCDOutputShow(LSP8,23);

while(1)

for(i=0;i<5;i++)

{

EBILedSet(00000001); Delay(100000);

相关主题
文本预览
相关文档 最新文档