东北大学嵌入式课程设计报告.docx
《东北大学嵌入式课程设计报告.docx》由会员分享,可在线阅读,更多相关《东北大学嵌入式课程设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
东北大学嵌入式课程设计报告
嵌入式系统课程设计报告
姓名:
张阳
学号:
20082723
班级:
电子0803
摘要
嵌入式系统应用广泛,涉及通信、网络消费电子产品、医疗仪器、汽车电子、工业控制、仪器仪表、航天军事等各个行业和领域。
通信领域大量使用嵌入式系统,主要包括程控交换机,路由器,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.3LCD液晶显示模块…………………………………………………………………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格式的原始数据,并且能够连接到一般的TFTLCD,STNLCD和电视编码器。
可以支持LG的TFT屏,CASIO的TFT屏,以及STNLCD,支持VIDEO和OSD模式,这两种模式的设定有不同的寄存器控制,通过设定寄存器的设置可以实现不同的模式及功能。
W90P710试验板,使用的是AUO3.0"TFTA030DL01(960x240,8位数据总线)数字式TFT液晶屏,可以将video/OSD的原始图像数据显示到外部显示设备。
TFT液晶屏的显示是对屏上每个像素点进行操作,通过向这些像素点配置不同的值,以显示不同的颜色,由于其内部没有缓存,所要显示的数据要随着时钟脉冲一点一点的传送过来。
因此,它需要在中开辟出一片缓冲区,将要显示的数据先存放到的缓冲区中,即存在SDRAM中,一般按照一维数组的形式进行存储,然后把存储数据的SDRAM的地址送给FIFO,然后送给颜色生成器,进而实现在屏幕上的显示;如果在屏上的定位显示,算出所要显示的内容在屏幕上的位置,然后在相应的SDRAM的地址内存入要显示的数据即可。
硬件图如下:
该模块由40个引脚与外界电路相连,由于本身没有寄存器,需要由W90P710提供的LCD控制寄存器来控制选择对应的液晶类型及显示形式,FIFO的使用、颜色的显示模式和时序的设置,并通过配置相应的的寄存器即可实现。
模块可以选择并行或串行方式与微控制器相连,通过配置寄存器、送入指令和数据,可对显示方式和显示内容作出选择。
2.3软件设计流程及主要函数描述
2.3.1程序流程图
主函数流程图:
LED工作流程
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主要函数
intmain(void)
{
LCD_IMAGE_TLCD_Size;
LCD_LOCATION_TLCD_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();//调用输入密码函数
return0;
}
3.调试设计中遇见的问题及解决的方法
首先我实现了密码锁最基本的功能:
设置密码,输入正确密码允许进入,输入错误密码禁止进入,三次错误后密码锁锁定,以及相应的屏幕文字显示和LED灯相应变化。
接下来我打算扩展密码锁的功能:
(1)当输入密码正确时显示图片。
(2)操作密码锁是可以作为电子相册。
1)问题:
把多个工程的相关文件组合成一个工程时出现编译错误。
解决方法:
分析各变量、函数所依赖的头文件,把缺失的加入到工程,把相同的定义去除。
2)问题:
LCD无法显示汉字和显示图片失真。
解决方法:
在调试运行时把汉字字库文件加载到内存即可显示汉字。
把图片转换成字模时色彩选择“真彩”,字模数组大小为960*240。
4.课程设计体会
在大学时候的第一次在书本之外,自己设计实现的小系统让我初步的了解嵌入式的前景。
这次小系统设计让我体会了一种学习方式,那就是实践和书本上的理论很不同,却又紧密相关,激发了我积极参与到实践中的热情,收获了实践的经验。
5.参考文献
[1]张石,佘黎煌等.嵌入式系统技术教程.北京:
人民邮电出版社,2009.3
[2]嵌入式实验指导书
程序的主要代码:
MAIN.C
intmain(void)
{
U8np=0,ti=0,i;
U8pswSign[2],setFlg=0,reFlg=0;
U8psw[6],psw2[6];
U8ast[]="********************";
U8prmpt1[]="请设定密码:
";
U8prmpt2[]="请重输确认:
";
U8prmpt3[]="两次密码不符!
请重新输入:
";
U8prmpt4[]="密码设定成功!
";
U8prmpt5[]="请输入密码:
";
U8prmpt6[]="密码错误!
请重新输入:
";
U8prmpt7[]="密码正确!
";
U8prmpt8[]="对不起,您已经连续三次输入密码错误,系统锁定!
";
LCD_IMAGE_TLCD_Size;
LCD_LOCATION_TLCD_Location;
LCDShowParameterLSP,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.StartX=12;
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.StartX=8;
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;
}
}
}
elseif(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;
elsepsw[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);
EBILedS