嵌入式课程设计报告.docx

上传人:b****5 文档编号:5847487 上传时间:2023-01-01 格式:DOCX 页数:28 大小:330.12KB
下载 相关 举报
嵌入式课程设计报告.docx_第1页
第1页 / 共28页
嵌入式课程设计报告.docx_第2页
第2页 / 共28页
嵌入式课程设计报告.docx_第3页
第3页 / 共28页
嵌入式课程设计报告.docx_第4页
第4页 / 共28页
嵌入式课程设计报告.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

嵌入式课程设计报告.docx

《嵌入式课程设计报告.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计报告.docx(28页珍藏版)》请在冰豆网上搜索。

嵌入式课程设计报告.docx

嵌入式课程设计报告

河海大学计算机与信息学院(常州)

课程设计报告

 

题目嵌入式系统项目设计

专业、学号0862510129

授课班号277704

学生姓名严维锋

同组学生孙维广陶贵华

指导教师梁瑞宇

完成时间2011年6月

课程设计(报告)任务书

(理工科类)

Ⅰ、课程设计(报告)题目:

基于LCD的电子时钟实验

Ⅱ、课程设计(论文)工作内容

学习LCD与ARM的LCD的控制器的接口原理,掌握内置LCD控制器驱动编写方法和RTC控制方法,在可行性分析的基础上实现以下功能:

1、编写程序实现电子时钟功能,通过实验系统的LCD将时间显示出来;

2、仿照给定图形在LCD上显示类似的时钟界面;

3、动态显示当前的时间,包括:

年、月、日、时、分、秒,时针,分针、秒针必须为动态实时指示当前的时间。

一、课程设计目标

1、培养综合运用知识和独立开展实践创新的能力;

2、培养学生的编程能力、用计算机解决实际问题的能力。

3、培养学生遇到问题,解决问题的能力。

二、研究方法及手段应用

1、将任务分成若干模块,查阅相关论文资料,分模块调试和完成任务;

2、实验设备有L-ARM-830教学实验箱,PentiumII以上的PC机,仿真器电缆;

3、PC操作系统WIN98或WIN2000或WINXP,ARMSDT2.5或ADS1.2集成开发环境,仿真器驱动程序;

4、本实验使用实验教学系统的CPU板,在进行本实验时,LCD电源开关、音频的左右声道开关、AD通道选择开关、触摸屏中断选择开关等均应处在关闭状态。

三、课程设计预期效果

1、完成实验环境搭建;

2、分模块调试和编译;

3、组合并完善程序;

4、联合仿真软件运行程序;

5、液晶显示器显示时钟图样,时,分,秒能指向正确的时间。

学生姓名:

严维锋专业年级:

自动化2008级

目录

前言3

第一章系统设计4

第一节课题目标及总体方案4

第二节原理框图5

第三节程序和芯片的初始化5

第四节构建功能模块7

第五节main函数的局部原理分析8

第二章实验(测试)结果及讨论13

第一节ads1.2软件的编译,连接和运行13

第二节程序调试14

第三章结论14

心得体会15

参考文献16

附录17

源程序17

 

前言

近年来,随着计算机技术及集成电路技术的发展,嵌入式技术日渐普及,其强大的控制能力和专业性在通讯、网络、工控、电子等领域发挥着越来越重要的作用。

嵌入式系统成为当前当之无愧的最有发展前途的IT应用领域之一。

实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。

RTC具有计时准确、耗电低和体积小等特点,特别适用于在各种嵌入式系统忠记录事件发生的时间和相关信息,尤其是在通信工程、电力自动化、工业控制等自动化程度较高领域的无人职守环境。

随着集成电路技术的不断发展,RTC器件的新品也不断推出。

这些新品不仅具有准确的RTC,还有大容量的存储器、温度传感器和A/D数据采集通道等,已成为集RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统。

本课程设计将体现嵌入式技术的优越性。

 

第一章系统设计

第一节课题目标及总体方案

一、设计要求

学习LCD与ARM的LCD的控制器的接口原理,掌握内置LCD控制器驱动编写方法和RTC控制方法,在可行性分析的基础上实现以下功能:

1、编写程序实现电子时钟功能,通过实验系统的LCD将时间显示出来;

2、仿照图1在LCD上显示类似的时钟界面;

图1LCD上显示的时钟界面

3、动态显示当前的时间,包括:

年、月、日、时、分、秒,时针,分针、秒针必须为动态实时指示当前的时间。

二、设计方案

基于S3C44B0X的典型嵌入式系统硬件体系结构图如图2所示,通过对S3C44B0X处理器的学习,可以利用其内部的RTC单元和LCD控制器,外接LCD模块、晶振和(后备)电源实现电子实时时钟的功能。

主要实现方法为:

通过电源和晶振保证处理器的正常工作和时钟来源,通过编程设定RTC单元的工作模式,实现实时时钟的功能;然后根据所要求显示的图形效果,编写程序设定LCD控制器的相应寄存器,将RTC单元和LCD控制器合理有效地结合起来;最终由LCD模块作出相应动作,完成实时时钟的显示功能。

该设计的中英文字符显示方案,有效地利用了嵌入式系统自身的ROM存储容量,其最大的特点是以少量的存储容量为代价,来简单灵活地实现LCD上的字符显示。

此方案可以显示所有的一、二级汉字,并且能实现汉字、英文的混合显示,从而方便地构造出良好的人机界面。

所讨论的硬件平台是在S3C44BOX和液晶显示器的基础上搭建的,对于实现S3C44BOX与其它类型LCD模块的连接和应用,具有一定的参考价值。

 

 

图2S3C44B0X的典型嵌入式系统硬件体系结构

第二节原理框图

根据课题所要实现的功能,结合S3C44B0X处理器的单元结构,作出如图3所示的原理框图。

图3原理框图

第三节程序和芯片的初始化

程序和芯片的初始化包括:

LCD的初始化:

U16LCD_Init(U8Lcd_Bpp)

{

switch(Lcd_Bpp)

{

Case8:

rLCDCON1=(0)|(2<<5)|(MVAL_USED<<7)|(0x1<<8)|(0x1<<10)|(CLKVAL_COLOR<<12);

rLCDCON2=(LINEVAL)|(HOZVAL_COLOR<<10)|(10<<21);

rLCDSADDR1=(0x3<<27)|(((U32)Video_StartBuffer>>22)<<21)|M5D((U32)Video_StartBuffer>>1);

rLCDSADDR2=M5D((((U32)Video_StartBuffer+(SCR_XSIZE*LCD_YSIZE))>>1))|(MVAL<<21)|1<<29;

rLCDSADDR3=(LCD_XSIZE/2)|(((SCR_XSIZE-LCD_XSIZE)/2)<<9);

rREDLUT=0xfdb96420;

rGREENLUT=0xfdb96420;

rBLUELUT=0xfb40;

rDITHMODE=0x0;

rDP1_2=0xa5a5;

rDP4_7=0xba5da65;

rDP3_5=0xa5a5f;

rDP2_3=0xd6b;

rDP5_7=0xeb7b5ed;

rDP3_4=0x7dbe;

rDP4_5=0x7ebdf;

rDP6_7=0x7fdfbfe;

rDITHMODE=0x12210;

rLCDCON1=

(1)|(2<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_COLOR<<12);

break;

default:

return1;

}

return0;

}

中断向量的初始化:

voidKeyINT_Init(void){

if((rINTPND&BIT_EINT4567))

{

SPC=BIT_EINT4567;

}

rINTMSK=~(BIT_GLOBAL|BIT_EINT4567);

}

RTC的初始化:

voidRtc_Tick_Init(void)

{

if((rINTPND&BIT_TICK))

{

rI_ISPC=BIT_TICK;

}

rINTMSK&=~(BIT_GLOBAL|BIT_TICK);

rRTCCON=0x0;

rTICINT=1|(1<<7)

}

voidRtc_Tick_Init0(void)

{

if((rINTPND&BIT_TICK))

{

rI_ISPC=BIT_TICK;

}

rINTMSK&=~(BIT_GLOBAL|BIT_TICK);

rRTCCON=0x0;

rTICINT=1|(1<<6);

}

 

第四节构建功能模块

LCD显示的时钟界面包括:

静止不动的圆形钟面和一直在走动的时钟指针。

所以需要构建两个重要的函数实现画圆和画直线。

画圆函数:

该算法是通过X变量的自增,补偿1修正正方形控制Y变量自减,找到距中心恒定距离的点,其中rs=45,X自0加1增至45。

和原点坐标运算,可以在第一象限找到一点,再通过折叠对称找到其他象限的三个点,通过画点函数描绘出。

再画他的45度镜像就好了。

画线函数:

voidline(unsignedintx1,unsignedinty1,unsignedintx2,unsignedinty2,unsignedchardraw)

以中心的坐标为起点,使用while函数与指针最外圈的点比较,不断延长直至相等,所以事先计算出时针,分针和秒针三个同心圆最外圈点的坐标,以便带入函数。

也同圆类似,要考虑不同象限点的情况,根据不同的位置带参数到画点函数中描绘。

第5节MAIN函数的局部原理分析

首先让我们先来看一下main函数的宏定义与变量定义,如下:

从上面的程序可以看出,所使用的头文件主要是config.h。

这个文件的内容不再详述,后面的附录会给出。

同时该程序还给出了时分秒的初始值,其字符型为i8,也即char型(在其它文件中有定义)。

初始值为:

hour=0,min=0,sec=0,ms=0;例如如果当前时间为6:

20,十九秒,则将对应的数字修改即可。

同理,年月日的初始值设定是一样的,并且字符类型也为char类型。

下面是针对字符类型的宏定义:

#defineI8char

#defineU8unsignedchar

#defineI16short

#defineU16unsignedshort

#defineI32long

#defineU32unsignedlong

#defineI16PI16

#defineU16PU16

下面我们来看看对于时针,分针,秒针的坐标设定,程序如下:

上述为秒针的坐标定义,SpaceXS[61]对应于秒针的横坐标值,SpaceYS[61]对应于纵坐标值。

第一个点对应的是十二点的位置,即(160,30)点。

因此只要设定两个指针,分别指向这两个数组的首地址,每当时间秒变化时,就将这两个指针加一,从而指向下一坐标,达到动态变化的效果。

分针,时针的定义与上述定义完全一样,只不过时针定义时变量个数为十三个,具体如下定义:

SpaceXH[13]={160,175,185,190,185,175,160,145,135,130,135,145,160},

SpaceYH[13]={50,55,65,80,95,105,110,105,95,80,65,55,50};

此外还要设定一些指针,用来指向各个数组的首地址,来方便坐标的变化,定义如下:

*Placex=&SpaceXS[0],*Placey=&SpaceYS[0],*Placexm=&SpaceXM[0],

*Placeym=&SpaceYM[0],*Placexh=&SpaceXH[0],*Placeyh=&SpaceYH[0];

下面我们先来介绍此程序中用到的几个重要的函数。

首先来说Set_Color()函数,这是一个设定颜色的函数,此函数的代码在其他文件中经行了编写,只要在括号中输入相应的颜色就可,颜色定义如下:

#defineGUI_BLACK0x000000

#defineGUI_BLUE0x0000FF

#defineGUI_GREEN0x00FF00

#defineGUI_CYAN0xf0f000

#defineGUI_RED0xFF0000

#defineGUI_MAGENTA0x800080#defineGUI_BROWN0x2020a0

#defineGUI_DARKGRAY0x404040#defineGUI_GRAY0x808080

#defineGUI_LIGHTGRAY0xd0d0d0#defineGUI_LIGHTBLUE0xf08080

#defineGUI_LIGHTGREEN0x80f080#defineGUI_LIGHTCYAN0x80f0f0

#defineGUI_LIGHTRED0x8080f0#defineGUI_LIGHTMAGENTA0xf080f0

#defineGUI_YELLOW0xF0f000#defineGUI_WHITE0xffffff

下面来说Fill_Circle(x,y,r)函数。

如下所示:

voidFill_Circle(U16x0,U16y0,U16r)

{

U32i;

U32imax=((int)((int)r*707))/1000+1;

U32sqmax=(int)r*(int)r+(int)r/2;

U16x=r;

LCD_DrawHLine(x0-r,y0,x0+r);

for(i=1;i<=imax;i++)

{

if((i*i+x*x)>sqmax)

{

if(x>imax)

{

LCD_DrawHLine(x0-i+1,y0+x,x0+i-1);

LCD_DrawHLine(x0-i+1,y0-x,x0+i-1);

}

x--;

}

LCD_DrawHLine(x0-x,y0+i,x0+x);

LCD_DrawHLine(x0-x,y0-i,x0+x);

}

}

当此函数执行完以后会在液晶显示仪显示出一个实心圆,与前面的setcolor函数配合可以画出特定颜色的的圆,x为横坐标,y为纵坐标,r为半径。

还有一个为fillrect()函数。

也即矩形填充函数,此函数可以在显示屏上显示特定大小的矩形图案,并结合颜色设定函数得出相应的颜色相应函数如下:

voidFill_Rect(U16x0,U16y0,U16x1,U16y1)

{

LCD_FillRect(x0,y0,x1,y1);

}

既然是实时时钟,那么程序是如何实现指针的偏转的,是靠什么思路实现的。

下面的程序是以秒针为例简述这其中的原理的。

可以看到,程序中有擦除上一秒的程序。

之所以能靠一个设定颜色的程序来将其擦出是因为,之前已经将底色设定为该指针擦除时的颜色。

既然该指针与底色有一样的颜色,所以观察者就看不到之前的指针了,所以就达到了擦出的目的,当显示下一秒时,只要将指针的颜色设定为与底色不同,即达到了显示的效果。

同时,还要显示分针和时针。

对于擦除分针和时针得原理与上面所述大同小异,这里只给出程序,不在详细讨论,程序如下:

那么是通过怎样的方式将以上时分秒的变化联系起来的呢?

其实这全靠if。

else。

的条件判断语句,程序如下:

我们可以看到其中有一个delay函数,这个函数的自变量为1200,即为delay(1200),它实现了一秒的延时,一秒以后sec加一,从而实现一秒的计时。

当为60秒时,分针指向下一分钟,擦除上一分钟,也就是调用上面的三个显示与擦除函数。

第二章实验(测试)结果及讨论

第一节ADS1.2软件的编译,连接和运行

构建完整的程序:

添加头文件,中断处理汇编程序段,初始化函数和主函数:

voidMain(void)

{

Target_Init();//ARMII实验系统的初始化,包括CPU板

GUI_Init();

OSInit();

Key_Mbox=OSMboxCreate((void*)0);//键盘初始

OSTaskCreate(Task_1,(void*)0,(OS_STK*)&Stack_Task_1[STACKSIZE-1],5);//创建任务一

OSStart();

}

编译

所有的文件:

 

第二节程序调试

连接芯片与LCD端口,运行程序,观察效果。

此时LCD上将显示如图4所示的时钟界面。

图4程序运行时LCD显示的时钟界面

第三章结论

基于LCD的电子时钟可以准确地将动态时钟进行显示,并且能通过图像时钟形式和数字时钟多种形式表现出来,此外根据需要还可添加日历功能。

在将程序烧入系统后,我们发现了两个比较严重的问题。

第一个问题是我小组成员的名字出现乱码,经过我组及指导老师的细心排查,我们发现出现的原因是,字符重叠的原因。

当擦除上一个名字时,我的名字没有对齐从而没有擦除干净,与下一个要显示的字符相重合,从而出现乱码。

解决办法是在两个字的中间加入一个汉字宽度的空格,就可以消除此现象了。

第二个问题是秒针擦除不干净的问题。

当秒针走向下一个位置时,它的上一个位置仍然有图形。

此时背景颜色是深蓝。

但是我们发现擦除时的指针确实是深蓝,为什么还会有痕迹呢?

于是我组将指针颜色改成浅蓝,将背景颜色也改成浅蓝,终于痕迹不在了。

到此,基本的问题已经解决,即实现了实验所设定的要求。

心得体会

在此次的基于LCD的电子时钟设计的过程中,我学会了把课本中的知识应用到实际操作中来,学会了通过查看其他课外资料来学习新的知识。

此外,通过这一过程也提升了自己独立思考的能力。

切实做到发现问题,仔细思考,团结合作,动手实践,解决问题这一系列过程。

虽然这只是一次小系统设计,但通过它,我了解了课程设计的一般步骤和设计中应注意的问题,受益良多。

最初接收任务书,我们有些不知所措,虽然这学期学习了嵌入式系统的理论课程,但是毕竟缺少实践,还是难以着手。

随后与任务相同的别组同学一起讨论,确定了初步的设计方案,也就是主体部分是基于S3C44B0X处理器的体系结构。

然后就是分模块的设计。

课程设计已经结束,自己从这一过程中体会到了很多,有完成的喜悦,有停滞不前的郁闷,不管何种情况,我都提醒自己要静下心来,冷静的分析,老师在验收的时候,笑着问我请了多少外援,当时回答是一本书,现在想想有些逞强,还是有些经验丰富的同学在我不懂的时候帮助我的,不然我可能还要花些时间折腾。

课程设计的过程让我懂得面对问题要勤于思考,遇到困难,要勇于面对,这在任何知识的学习中都是弥足珍贵的。

 

参考文献

【1】王勇,嵌入式系统原理与设计,浙江大学出版社,2007.

【2】谢自美,电子线路设计、实验、测试,华中理工大学出版社,2003。

【3】宋春荣,通用集成电路速查手册,山东科学技术出版社,1995。

【4】桑楠.嵌入式系统原理及应用开发技术,北京:

北京航空航天大学出版社,2002

 

附录

源程序:

#include"..\inc\config.h"

#defineSTACKSIZE256

#definex_line160

#definey_line80

OS_STK_DATAstk;

externGUI_FONTCHINESE_FONT12;

externGUI_FONTCHINESE_FONT16;

externGUI_FONTGUI_Font8x16;

OS_EVENT*Send_LCD_Sem;

OS_EVENT*Key_Mbox;

I8Hour[3],Min[3],Sec[3];

I8hour=0,min=0,sec=0,ms;

I8YEA1[3],YEA2[3],MON[3],DAY[3];

intyea1=20,yea2=11,mon=6,day=29;

I8XH0[3],XH1[3],XH2[3],XH3[3];

I8XH4[3],XH5[3];

charxh0=01,xh1=62,xh2=51,xh3=01;

charxh4=27,xh5=28,xh6=29;

//intTimeCount=0;

intSpaceXS[61]={160,165,170,175,180,185,

189,193,197,201,205,

206,207,208,209,210,

209,208,207,206,205,

201,197,193,189,185,

180,175,170,165,160,

155,150,145,140,135,

131,127,123,119,115,

114,113,112,111,110,

111,112,113,114,115,

119,123,127,131,135,

140,145,150,155,160,

},

SpaceYS[61]={30,31,32,33,34,

35,39,43,47,51,

55,60,65,70,75,

80,85,90,95,100,

105,109,113,117,121,

125,126,127,128,129,

130,129,128,127,126,

125,121,117,113,109,

105,100,95,90,85,

80,75,70,65,60,

55,51,47,43,39,

35,34,33,32,31,30},

SpaceXM[61]={160,164,168,172,176,180,183,186,189,192,

195,196,197,198,199,200,199,198,197,196,

195,192,189,186,183,180,176,172,168,164,

160,156,152,148,144,140,137,134,131,128,

125,124,123,122,121,120,121,122,123,124,

125,128,131,134,137,140,144,148,152,156,

160

},

SpaceYM[61]={40,41,42,43,44,45,48,51,54,57,

60,64,68,72,76,80,84,88,92,96,

100,103,106,109,112,115,116,117,118,119,

120,119,118,117,116,115,112,109,106,103,

100,96,92,88,84,80,76,72,68,64,

60,57,54,51,48,45,44,43,42,41,

40

},

Spac

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1