嵌入式课程设计报告.docx
《嵌入式课程设计报告.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
嵌入式课程设计报告
河海大学计算机及信息工程学院(常州)
课程设计报告
题目基于LCD的电子时钟
专业学号电子信息工程0962610222
授课班号277701
学生姓名王宁
指导教师梁瑞宇
完成时间2012.5.18
课程设计(报告)任务书
(理工科类)
Ⅰ、课程设计(报告)题目:
基于LCD的电子时钟实验
Ⅱ、课程设计(论文)工作内容
一、课程设计目标
1、培养综合运用知识和独立开展实践创新的能力;
2、培养学生将理论知识与实际应用结合在一起;
3、培养学生的自我学习能力和解决问题的能力;
4、培养学生的协作意识和团队合作能力;
5、培养学生的总结经验的能力。
二、研究方法及手段应用
1、问题解决模块化,将任务分成若干模块,分模块调试和完成任务;
2、查阅网上的相关素材,查阅相关论文资料,进行比较、研究;
3、在独立思考的基础上,请教老师,和同组同学讨论、学习;
4、反复调试、总结经验、排除差错;
5、连接PC和EL-ARM-830实验箱,完成整个实验环境搭建;
6、运用CodeWarriorforARM编译软件编译汇编语言和进行调试;
7、使用H-JTAG下载至硬件进行观察、调试。
三、课程设计预期效果
1、在液晶屏上显示表盘,和时间点和时、分、秒针;
2、在液晶屏上显示时、分、秒、年、月、日;
3、在液晶屏上实现指针的动态图像;
4、可以实现自己设定的初始时间。
学生姓名:
王宁专业年级:
09电子信息工程
目录
前言4
第一章系统设计5
第一节课题目标及总体方案5
第二节相关组件说明5
第三节项目设计模块描述及流程图7
1.主函数模块8
2.时钟表盘的构建模块8
3.表盘下日期的显示模块9
4.任务运行模块…………………………………………………………10
第二章结果与显示11
结果显示11
心得体会12
参考文献13
附录13
前言
近年来,随着计算机技术及集成电路技术的发展,嵌入式技术日渐普及,在通讯、网络、工控、医疗、电子等领域发挥着越来越重要的作用。
嵌入式系统无疑成为当前最热门最有发展前途的IT应用领域之一。
实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。
RTC具有计时准确、耗电低和体积小等特点,特别适用于在各种嵌入式系统忠记录事件发生的时间和相关信息,尤其是在通信工程、电力自动化、工业控制等自动化程度较高领域的无人职守环境。
随着集成电路技术的不断发展,RTC器件的新品也不断推出。
这些新品不仅具有准确的RTC,还有大容量的存储器、温度传感器和A/D数据采集通道等,已成为集RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统。
关键字:
嵌入式系统、实时时钟RTC
第一章系统设计
第一节课题目标及总体方案
随着嵌入式技术的发展,我们身边充斥着各类各样的嵌入式电子产品。
实时时钟(RTC)就是一种在现代电子设备中应用非常普遍,可以帮助人们实时、准确的掌握时间的器件,如手机、PDA及一些智能仪表都提供了时钟显示。
我们本次课题的目标就是要基于S3C44BOX芯片设计出一个实时时钟,编写汇编语言可以通过CodeWarriorforARM软件调试,然后下载至实验箱内进行观察。
在试验箱中的LCD液晶屏幕上显示出时钟的圆盘和动态的指针,并在时钟下方显示出当前的年份和日期。
另外,我们将要实现的系统分为几个模块实现,每个模块间相对独立而又相互联系,在主函数中进行调用。
第二节相关组件说明
一、LCD显示原理
S3C44B0X中具有内置的LCD控制器,它能将显示缓存(在SDRAM存储器中)中的LCD图像数据传输到外部的LCD驱动电路上的逻辑功能。
它支持单色、4级、16级灰度LCD显示,以及256彩色LCD显示。
在显示灰度时,它采用时间抖动算法(time-basedditheringalgorithm)和帧率控制(FrameRateControl)方法,在显示彩色时,它采用RGB的格式,即RED、GREEN、BLUE,三色混合调色。
通过软件编程,可以实现233或332的RGB调色的格式。
对于不同尺寸的LCD显示器,它们会有不同的垂直和水平象素点、不同的数据宽度、不同的接口时间及刷新率,通过对LCD控制器中的相应寄存器写入不同的值,来配置不同的LCD显示板。
本次课设的显示模式设置为8bit单扫描模式。
二、项目文件说明
本实验使用实验教学系统的CPU板,液晶显示器(LCD),在LCD下方,有一个可调电阻,标号为VR2,它用来调整LCD的对比度及亮度。
在LCD的右下方,有一个黄头的按键,它用来开关LCD,它的标号为LCD_ON/OFF。
该项目添加了包含LCD驱动程序的文件夹Gui,其中,包括四个文件夹,Font中存放的是字体文件,Glib中存放绘图的中层和上层的函数,上层函数是直接供用户调用的API,Init中存放GUI初始化的函数,Lcddriver中存放的是LCD的底层驱动函数。
以及对LCD控制器的初始化函数。
把LCD驱动程序加入的过程,也就是把整个GUI文件夹加入该项目里,同时,还要在Application\INC目录下的config.h文件中,加入GUI程序的头文件,#include"..\..\Gui\Glib\Glib.h",这是为了在应用中方便调用画图的API函数。
如果,要在LCD上显示英文或汉字,还要在Application\SRC\Main.c中声明引用的是externGUI_FONTCHINESE_FONT12;等外部定义过的字体。
图1
第三节项目设计模块描述及流程图
1.模块描述:
我先进行了整个系统的规划,将整个系统分为四大模块:
第一,主函数模块;第二,时钟表盘的构建模块,包括:
设置液晶全屏背景色、绘制时钟表盘形状并着色、绘制表盘内12个点的形状并着色以及绘制表盘内指针的形状并着色;第三,表盘下日期的显示模块,包括:
定位表盘下时间和日期的坐标和日期显示函数的编写;第四,任务运行模块。
2.流程图:
一、主函数模块
二、时钟表盘的构建模块
(1)绘制时钟表盘形状并着色
(2)绘制表盘内12个点的形状并着色
(3)绘制表盘内指针的形状并着色(以秒针为例)
三、表盘下日期的显示模块
(1)定位表盘下时间和日期的坐标(仍以秒计时为例)
(2)日期显示函数的编写
四、任务运行模块
第二章结果与显示
结果显示
1.经过多次的调试和排查,以及总结,使用编译器编译,编译器提示编译文件正确,没有出现任何错误,没有出现任何警告,而且编译出文件容量很小,下载迅速,符合软件设计要求。
2.下面的图片是从实验箱上的LCD屏幕上显示的图像拍下来的,也就是我本次课程设计的成果。
从图片显示上可以看出,所有预计实现的功能和界面都实现了。
表盘显示在相对中央的地方,整个屏幕以白色为基调,表盘底色为灰色,指针为红、绿、黄三种颜色,点数为绿色,表盘下方显示当前时间、日期,同时界面很漂亮,色彩对比很鲜明。
图2效果显示图
心得体会
说实话,刚开始拿到课设题目的时候感觉毫无头绪,即使在查阅了大量相关资料的基础上。
后来,手上有了一份参考程序,打开一看,顿时懵了。
当时想如果纯粹靠我自己或者和同学讨论,恐怕很难完成这次课设吧。
于是,实验室刚开放,我就立刻去调试程序,通过观察试验箱上显示的结果来理解程序。
一个模块一个模块对应的理解下去之后,思路开始清晰起来。
每当遇到一行程序不懂或者有疑问时,比如这行程序起什么作用、可不可以删掉或者可不可以换个位置,我都通过程序的相关改动结合实验结果的观察将这些疑问解决掉了。
同时,同学的帮助也给了我很多的启发,非常感谢他们。
但不得不承认,关于μC/OS-II操作系统方面理解的很不透彻。
验收时,我只是把时钟界面的构建部分理解了,没有过多的加深对操作系统μC/OS-II的学习,所以验收时对于老师的提问也是磕磕绊绊。
因而,在编写这份报告前,我又认真地上网搜索了μC/OS-II操作系统的简介,尤其是它的优点和任务调度方面。
在写这份报告时,我也许还没能完全弄懂μC/OS-II操作系统,但我相信,只要努力过,总会有收获。
参考文献
1.吴学智,《基于ARM的嵌入式系统设计与开发》……人民邮电出版社,2007
2.金建设,《嵌入式系统基础实验》…………………大连理工大学出版社,2009
3.王晓薇,《嵌入式硬件基础实验与习题解答》…………电子工业出版社,2009
附录
1.软件清单:
1)CodeWarriorforARM编译软件;
2)AXDDebugger调试软件;
3)H-JTAG软件;
2.硬件:
PC和EL-ARM-830实验箱;
3.程序清单:
#include"..\inc\config.h"
#definex_line160
#definey_line80
externGUI_FONTCHINESE_FONT12;
externGUI_FONTCHINESE_FONT16;
externGUI_FONTGUI_Font8x16;
I8Hour[3],Min[3],Sec[3];
I8hour=9,min=0,sec=0,ms;
I8YEA1[3],YEA2[3],MON[3],DAY[3];
intyea1=20,yea2=12,mon=5,day=18;
I8XH1[3],XH2[3],XH3[3],XH4[3],XH5[3],XH6[3],XH7[3];
intxh1=9,xh2=62,xh3=61;
intxh4=02,xh5=19,xh6=22,xh7=23;
//SpaceXS[61]、SpacYS[61]分别表示秒针的横坐标、纵坐标
//SpaceXM[61]、SpaceXM[61]分别表示分针的横坐标、纵坐标
//SpaceXH[13]、SpacYH[13]分别表示时针的横坐标、纵坐标
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
},
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},
//当前要显示的时间的3个指针的坐标取地址。
*Placex=&SpaceXS[0],*Placey=&SpaceYS[0],*Placexm=&SpaceXM[0],*Placeym=&SpaceYM[0],
*Placexh=&SpaceXH[9],*Placeyh=&SpaceYH[9];
//显示学号函数
voidDisplay_xh1(charxx1,charyy1);
voidDisplay_xh2(charxx2,charyy2);
voidDisplay_xh3(charxx3,charyy3);
//showsandmandh
voidShows()
{
Set_Color(GUI_GRAY);//擦除上一秒的
Draw_Line(x_line,y_line,*Placex,*Placey);
Placex=Placex+1;
Placey=Placey+1;
Set_Color(GUI_YELLOW);//显示下一秒的
Draw_Line(x_line,y_line,*Placex,*Placey);
Set_Color(GUI_RED);//显示下一分的
Draw_Line(x_line,y_line,*Placexm,*Placeym);
Set_Color(GUI_GREEN);//显示下一时的
Draw_Line(x_line,y_line,*Placexh,*Placeyh);
if(Placex==&SpaceXS[60]&&Placey==&SpaceYS[60])
{
Placex=&SpaceXS[0];
Placey=&SpaceYS[0];
}
}
//showmuniteandhour
voidShowm()
{
Set_Color(GUI_GRAY);//擦除上一分的
Draw_Line(x_line,y_line,*Placexm,*Placeym);
Placexm=Placexm+1;
Placeym=Placeym+1;
Set_Color(GUI_RED);//显示下一分的
Draw_Line(x_line,y_line,*Placexm,*Placeym);
Set_Color(GUI_GREEN);//显示下一时的
Draw_Line(x_line,y_line,*Placexh,*Placeyh);
if(Placexm==&SpaceXM[60]&&Placeym==&SpaceYM[60])
{
Placexm=&SpaceXM[0];
Placeym=&SpaceYM[0];
}
}
//showhour
voidShowh()
{
Set_Color(GUI_GRAY);//擦除上一时的
Draw_Line(x_line,y_line,*Placexh,*Placeyh);
Placexh=Placexh+1;
Placeyh=Placeyh+1;
Set_Color(GUI_GREEN);//显示下一时的
Draw_Line(x_line,y_line,*Placexh,*Placeyh);
if(Placexh==&SpaceXH[12]&&Placeyh==&SpaceYH[12])
{
Placexh=&SpaceXH[0];
Placeyh=&SpaceYH[0];
}
}
voidShouw_Cricle()//整点
{
Set_Color(GUI_GREEN);
Fill_Circle(160,30,2);//12点(x,y,r)
Fill_Circle(135,35,2);//11点(x,y,r)
Fill_Circle(115,55,2);//10点(x,y,r)
Fill_Circle(110,80,2);//9点(x,y,r)
Fill_Circle(115,105,2);//8点(x,y,r)
Fill_Circle(135,125,2);//7点(x,y,r)
Fill_Circle(160,130,2);//6点(x,y,r)
Fill_Circle(185,125,2);//5点(x,y,r)
Fill_Circle(205,105,2);//4点(x,y,r)
Fill_Circle(210,80,2);//3点(x,y,r)
Fill_Circle(205,55,2);//2点(x,y,r)
Fill_Circle(185,35,2);//1点(x,y,r)
}
//表盘背景色
voidShow_ht()
{
Set_Color(GUI_GRAY);
Fill_Circle(160,80,54);
}
voidDelay(inttime);
voidChangeForm(charTime[],chartime)
{
Time[0]=time/10+48;
Time[1]=time%10+48;
Time[2]='\0';
}
voidDisplay_Time(charx,chary)
{
ChangeForm(Hour,hour);
ChangeForm(Min,min);
ChangeForm(Sec,sec);
ChangeForm(MON,mon);
ChangeForm(DAY,day);
ChangeForm(YEA1,yea1);
ChangeForm(YEA2,yea2);
//Disp_String(constI8*s,I16x,I16y),s:
char,x:
x_labelpositiony:
y_labelposition
Disp_String(Hour,x,160);
Disp_String(":
",x+18,160);
Disp_String(Min,x+28,160);
Disp_String(":
",x+46,160);
Disp_String(Sec,x+56,160);
Disp_String(YEA1,x-5,180);
Disp_String(YEA2,x+11,180);
Disp_String(".",x+27,180);
Disp_String(MON,x+35,180);//40
Disp_String(".",x+51,180);//56
Disp_String(DAY,x+59,180);//64
}
voidDisplay_xh1(charxx1,charyy1)
{
ChangeForm(XH1,xh1);
ChangeForm(XH2,xh2);
ChangeForm(XH3,xh3);
ChangeForm(XH4,xh4);
ChangeForm(XH5,xh5);
Disp_String(XH1,xx1,yy1);
Disp_String(XH2,xx1+16,yy1);
Disp_String(XH3,xx1+32,yy1);
Disp_String(XH4,xx1+48,yy1);
Disp_String(XH5,xx1+64,yy1);
}
voidDisplay_xh2(charxx2,charyy2)
{
ChangeForm(XH1,xh1);
ChangeForm(XH2,xh2);
ChangeForm(XH3,xh3);
ChangeForm(XH4,xh4);
ChangeForm(XH6,xh6);
Disp_String(XH1,xx2,yy2);
Disp_String(XH2,xx2+16,yy2);
Disp_String(XH3,xx2+32,yy2);
Disp_String(XH4,xx2+48,yy2);
Disp_String(XH6,xx2+64,yy2);
}
voidDisplay_xh3(charxx3,charyy3)
{
ChangeForm(XH1,xh1);
ChangeForm(XH2,xh2);
ChangeForm(XH3,xh3);
ChangeForm(XH4,xh4);
ChangeForm(XH7,xh7);
Disp_String(XH1,xx3,yy3);
Disp_String(XH2,xx3+16,yy3);
Disp_String(XH3,xx3+32,yy3);
Disp_String(XH4,xx3+48,yy3);
Disp_String(XH7,xx3+64,yy3);
}
voidShow_Color()
{
Set_Color(GUI_WHITE);
//填充矩形函数
Fill_Rect(0,0,319,239);
Set_Color(GUI_RED);
Set_BkColor(GUI_WHITE);
Fill_Rect(0,0,319,2);
Fill_Rect(0,0,2,239);
Fill_Rect(0,237,319,239);
Fill_Rect(317,0,319,239);
Set_Color(GUI_RED);