基于ARM和LCD的电子时钟设计毕业设计.docx
《基于ARM和LCD的电子时钟设计毕业设计.docx》由会员分享,可在线阅读,更多相关《基于ARM和LCD的电子时钟设计毕业设计.docx(22页珍藏版)》请在冰豆网上搜索。
![基于ARM和LCD的电子时钟设计毕业设计.docx](https://file1.bdocx.com/fileroot1/2023-5/16/9fcea1e2-99e0-4e4d-8396-7334842cc29c/9fcea1e2-99e0-4e4d-8396-7334842cc29c1.gif)
基于ARM和LCD的电子时钟设计毕业设计
目录
前言2
第一章系统设计3
第一节课题目标及总体方案3
第二节硬件平台简介3
一、S3C44B0X简介3
二、S3C44B0X与LCD连接5
第二节软件系统设计5
一、μC/OS-II系统模块设计5
二、LCD初始化模块设计5
三、时钟应用系统模块设计5
第二章实验结果及讨论7
第一节ADS1.2集成开发环境简介7
第二节调试结果与分析9
第三章结论10
心得体会11
参考文献12
附录13
源程序13
前言
随着科技的发展,嵌入式系统广泛应用于工业控制和商业管理领域,在多媒体手机、袖珍电脑、掌上电脑、车载导航器等方面的应用,更是极大地促进了嵌入式技术深入到生活和工作各个方面。
嵌入式系统主要由嵌入式处理器、相关支撑硬件及嵌入式软件系统组成;本文介绍基于ARM7的嵌入式微处理器S3C44BOX和LCD显示器的电子时钟的设计,实现电子时钟的功能,并在LCD上显示类似的时钟界面;动态显示当前的时间,包括:
年、月、日、时、分、秒,时针。
第一章系统设计
第一节课题目标及总体方案
本课程设计设计一种基于ARM7的嵌入式微处理器S3C44B0X和LCD显示器的电子时钟,实现电子时钟的功能,并在LCD上显示类似的时钟界面;动态显示当前的时间,包括:
年、月、日、时、分、秒,时针。
本课程设计主要为软件设计,硬件部分使用EL-ARM-830教学实验箱上的S3C44B0X和LCD模块。
软件部分使用ADS1.2及H-JTAG对源程序进行编译、仿真、调试,下载。
软件设计采用模块化设计方法,分为μC/OS-II系统模块、LCD初始化模块、时钟应用系统模块等,其中,时钟系统应用模块包括时钟计时模块、时钟显示模块等。
各模块之间功能独立,协同完成本课程设计的全部功能。
系统设计框图如图1。
图1系统设计框图
第二节硬件平台简介
一、S3C44B0X简介
S3C44B0X微处理器是三星公司研发的基于ARM7TDMI核的高性能嵌入式处理器,为手持设备和一般类型应用提供了高性价比和高性能的微控制器解决方案。
由于其高性价比以及内嵌了多种接口,在手持设备和消费类电子中得到了广泛的应用。
为了降低成本,S3C44B0X提供了丰富的内置部件,包括:
8KBcache、内部SRAM、LCD控制器、带自动握手协议的2通道UART、4通道DMA、系统管理器(片选逻辑,FP/EDO/SDRAM控制器)、带有PWM功能的5通道定时器,I/O端口,RTC,8通道10位ADC,IIC-BUS接口,IIS-BUS接口,同步SIO接口和PLL倍频器。
S3C44B0X采用了ARM7TDMI内核,0.25um工艺的CMOS标准宏单元和存储编译器。
它的低功耗和出色的全静态设计特别适用于对成本和功耗敏感的应用。
同样S3C44B0X还采用了一种新的总线结构,即SAMBAII(三星ARMCPU嵌入式微处理器总线结构)。
S3C44B0X的特性是它的CPU核,是由ARM公司设计的16/32位ARM7TDMIRISC处理器(主频66MHZ)。
ARM7TDMI体系结构的特点是它集成了Thumb代码压缩器,片上的ICE断点调试支持,和一个32位的硬件乘法器。
S3C44B0X内置LCD控制器可以支持规格为每像素2位(4级灰度)或每像素4位(16级灰度)的黑白LCD。
也可以支持每像素8位(256级颜色)的彩色LCD屏。
LCD控制器可以通过编程支持不同LCD屏的要求,例如行和列像素数,数据总线宽度,接口时序等。
基于S3C44B0X的典型嵌入式系统硬件体系结构如图2所示。
图2S3C44B0X硬件体系结构图
二、S3C44B0X与LCD连接
本课程设计使用的EL-ARM-830教学实验箱包含有一块5.7寸,256色,320X240像素的LCD显示屏,S3C44B0X内置了LCD控制器,控制LCD。
S3C44B0X与LCD连接示意图如图3。
图3S3C44B0X与LCD连接示意图
第二节软件系统设计
一、μC/OS-II系统模块设计
本模块的主要功能是将μC/OS-II系统移植到S3C44B0X上,作为调用硬件各项功能的基础,同时也完成S3C44B0X的功能本模块主要涉及到μC/OS-II在ARM上的移植,不属于本课程设计讨论的范畴,故不再赘述。
二、LCD初始化模块设计
本模块的主要功能完成LCD的初始化,加载LCD驱动程序,使LCD与S3C44B0X实现对接,完成显示功能。
本模块我们使用了实验箱现有的相关程序。
故不再赘述。
3、时钟应用系统模块设计
本模块是电子时钟功能实现的主要模块,也是本次课程设计的核心模块,本模块实现的功能主要有:
时间计时,钟面时间显示,数字时间显示。
其中,时间计时功能和在LCD上显示数字钟显示功能较易实现,之前的单片机课程设计和HDL课程设计均有所涉及。
计时使用S3C44B0X内部时钟脉冲和分频实现,在LCD上显示数字钟显示使用LCD数字显示功能实现。
在LCD上实现钟面显示功能较为复杂,主要包括以下过程:
1、给秒针、分针各设定60个坐标(包括X左边和Y坐标),表示60秒和60分,给时针设定12个坐标(包括X左边和Y坐标);
2、设定钟面显示初值并完成初值与时针、分针、秒针的坐标的映射,更更改初值可以完成时间的设定;
3、使用画线函数完成秒针、分针、时针显示,主要功能是擦除上一秒(分、时)的轨迹和显示这一秒(分、时)。
4、使用画点函数完成钟面基本构造,即钟面与12个整点时间点。
除此之外,需要在整个移植后的系统中初始化堆栈并设定任务,通过任务完成时钟的各项功能。
第二章实验结果及讨论
第一节ADS1.2集成开发环境简介
ADS集成开发环境是ARM公司推出的ARM核微控制器集成开发工具,英文全称为ARMDeveloperSuite,成熟版本为ADS1.2。
ADS1.2支持ARM10之前的所有ARM系列微控制器,支持软件调试及JTAG硬件仿真调试,支持汇编、C、C++源程序,具有编译效率高、系统库功能强等特点,可以在Windows98、WindowsXP、Windows2000以及RedHatLinux上运行。
ADS1.2使用CodeWarriorIDE集成开发环境,并集成了ARM汇编器、ARM的C/C++编译器、Thumb的C/C++编译器、ARM连接器,包含工程管理器、代码生成接口、语法敏感(对关键字以不同颜色显示)编辑器、源文件和类浏览器等等。
CodeWarriorIDE主窗口如图4所示。
图4CodeWarrior开发环境
AXD调试器为ARM扩展调试器(即ARMeXtendedDebugger),包括ADW/ADU的所有特性,支持硬件仿真和软件仿真(ARMulator)。
AXD能够装载映像文件到目标内存,具有单步、全速和断点等调试功能,可以观察变量、寄存器和内存的数据等等。
AXD调试器主窗口如图5所示。
图5CodeWarrior开发环境
本课程设计在ADS1.2集成开发环境内编写源程序并进行编译,调试,然后利用H-JTAG下载到芯片中进行片上调试,H-JTAG连接完成后如图6所示。
图6H-JTAG连接成功示意图
第2节调试结果与分析
通过编译调试下载到实验箱的S3C44B0X芯片中进行调试,LCD显示结果如图7所示。
图7LCD调试结果显示
屏幕右上角显示出学号姓名和作品信息;
屏幕中间显示的是钟面,有时针、分针和秒针,显示实时时间;
屏幕下方显示的是数字时钟,显示时分秒(与钟面时间相对应)和年月日。
完成系统设计要求的各项功能。
第三章结论
本课程设计属于嵌入式系统项目设计,利用EL-ARM-830教学实验箱上的嵌入式微处理器S3C44B0X和LCD模块,使用C语言编程,结合ADS1.2对源程序进行编译、连接和运行,使用H-JTAG下载,设计完成了基于LCD的电子时钟,实现如下功能:
1、LCD显示“钟面”样式,时针、分针、秒针显示实时时间;
2、LCD显示“数字钟”样式,动态显示年、月、日、时、分、秒;
3、显示时间可以修改并保持“钟面”与“数字钟”时间保持一致;
4、LCD左上角动态显示小组成员姓名、学号及选题信息。
本课程设计完成选题要求,但是有如下方面有待改进:
1、“钟面”现实不够精确,分针和时针只设定了60个坐标位置,分针和时针走动不均匀;
2、数字钟部分尚未考虑到“大月”和“小月”以及“平年”和“闰年”的日期问题,所有月份均设定为30天;
3、时间修改麻烦,需要对源程序中设定的初值进行修改,无法通过键盘对时间进行修改;
4、未调用S4C44B0X内部实时时钟(RTC)模块,不能显示出精确的内部实时时间。
上述问题我们会在今后的学习和实践中予以改善,我们将继续学习嵌入式系统原理和设计,继续学习LCD显示技术,为将来的毕业设计打好基础。
心得体会
本次课程设计是嵌入式系统项目设计,是在本学期我们学完了嵌入式系统课程以后相应的课程设计。
因为课时的安排,嵌入式系统只有2个学分,在有限的课时内我们掌握的知识也是相当有限的,我们对嵌入式系统的硬件和软件的基本原理、基本特点,嵌入式系统设计的基本方法有了一个初步的了解掌握。
这些知识对于我们完成本次课程设计是远远不够的。
我们自己查找了许多关于S3C44B0X和LCD的资料和文献作为课程设计的知识储备,同时也参考了去年学长学姐完成的课题,取人之长、补己之短。
经过我们的努力,在老师同学的帮助下,我们顺利完成了课程设计,对嵌入式系统的硬件、软件有了更为深入的了解,也深入掌握了嵌入式系统设计的基本方法,达到了预期的目的。
本次课程设计首先要感谢奚吉老师,对我们的课程设计给予了充分的关怀和帮助;然后要感谢我的搭档范娟,我们一起完成了本次课程设计。
参考文献
[1]王勇.嵌入式系统原理与设计[M].杭州:
浙江大学大学出版社,2007.
[2]耿辉等.S3C44B0X的LCD显示解决方案中国科技论文在线,2007.
[3]SAMSUNG公司.S3C44B0X数据手册.,2006.
[4]EL-ARM-830实验系统的资源介绍,2000.
[5]林志琦等.ARM微控制器与液晶屏接口的研究[J].长春大学学报,2010,20
(2):
71-74.
[6]周立功单片机公司.ADS集成开发环境及EasyJTAG仿真器应用,2005.
附录
源程序
#include"..\inc\config.h"
#defineSTACKSIZE256
#definex_line160
#definey_line80
OS_STK_DATAstk;
externGUI_FONTGUI_Font8x16;
OS_EVENT*Send_D7light_Sem;
OS_EVENT*Send_LCD_Sem;
OS_EVENT*Key_Mbox;
I8Hour[3],Min[3],Sec[3];
I8hour=15%12,min=20,sec=40;
I8YEA1[3],YEA2[3],MON[3],DAY[3];
intyea1=20,yea2=11,mon=6,day=23;
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,4},
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[40],*Placey=&SpaceYS[40],*Placexm=&SpaceXM[20],*Placeym=&SpaceYM[20],*Placexh=&SpaceXH[15%12],*Placeyh=&SpaceYH[15%12];
voidshow(I8s)
{
if(s%5==0)
{Set_Color(GUI_YELLOW);
Set_Font(&GUI_Font8x16);
Disp_String("0862310104",10,30);
Set_Font(&GUI_Font8x16);
Disp_String("0862310121",10,10);}
elseif(s%5==1)
{Set_Color(GUI_YELLOW);
Set_Font(&GUI_Font8x16);
Disp_String("guxin",10,10);
Set_Font(&GUI_Font8x16);
Disp_String("fanjuan",10,30);
}
elseif(s%5==2)
{Set_Color(GUI_YELLOW);
Set_Font(&GUI_Font8x16);
Disp_String("0862310104",10,30);
Set_Font(&GUI_Font8x16);
Disp_String("0862310121",10,10);
}
elseif(s%5==3)
{Set_Color(GUI_YELLOW);
Set_Font(&GUI_Font8x16);
Disp_String("fanjuan",10,30);
Set_Font(&GUI_Font8x16);
Disp_String("guxin",10,10);
}
elseif(s%5==4)
{Set_Color(GUI_YELLOW);
Set_Font(&GUI_Font8x16);
Disp_String("S3C44BOX",10,10);
Set_Font(&GUI_Font8x16);
Disp_String("LCDCLOCK",10,30);
}
}
voidShows()
{show(sec);
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);//显示下一分的DrawLine(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];
}
}
voidShowm()
{Set_Color(GUI_GREEN);
Set_Color(GUI_RED);
Set_Color(GUI_YELLOW);
Set_Color(GUI_GRAY);//擦除上一分的
DrawLine(x_line,y_line,*Placexm,*Placeym);
Placexm=Placexm+1;
Placeym=Placeym+1;
Set_Color(GUI_RED);//显示下一分的DrawLine(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];
}
}
voidShowh()
{Set_Color(GUI_YELLOW);
Set_Color(GUI_GREEN);
Set_Color(GUI_RED);
Set_Color(GUI_GRAY);//擦除上一时的DrawLine(x_line,y_line,*Placexh,*Placeyh);
Placexh=Placexh+1;
Placeyh=Placeyh+1;
Set_Color(GUI_GREEN);//显示下一时的DrawLine(x_line,y_line,*Placexh,*Placeyh);if(Placexh==&SpaceXH[12]&&Placeyh==&SpaceYH[12])
{Placexh=&SpaceXH[0];
Placeyh=&SpaceYH[0];
}
}
voidShouw_Cricle()//整点
{Set_Color(GUI_YELLOW);
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);
}
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(Hour,x,160);
Disp_String(":
",x+16,160);
Disp_String(Min,x+24,160);
Disp_String(":
",x+40,160);
Disp_String(Sec,x+48,160);
Disp_String(YEA1,x,180);
Disp_String(YEA2,x+16,180);
Disp_String("-",x+32,180);
Disp_String(MON,x+40,180);
Disp_String("-",x+56,180);
Disp_String(DAY,x+64,180);
}
voidShow_Color()
{Set_Color(GUI_BLUE);
Fill_Rect(0,0,319,239);
Set_Color(GUI_BLUE);
Set_BkColor(GUI_BLUE);
Fill_Rect(0,0,319,2);
Fi