《基于ARM的电子时钟设计(共20页).doc》由会员分享,可在线阅读,更多相关《基于ARM的电子时钟设计(共20页).doc(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上河海大学计算机及信息工程学院(常州)课程设计报告 题 目 基于LCD的电子时钟设计 专业、学号 授课班号 学生姓名 指导教师 完成时间 课程设计(报告)任务书(理 工 科 类)、课程设计(报告)题目: 基于LCD的电子时钟设计 、课程设计(论文)工作内容一、课程设计目标 1、培养综合运用知识和独立开展实践创新的能力;2、掌握嵌入式系统设计基本原理、培养嵌入式系统设计能力;二、研究方法及手段应用1、将任务分成若干模块,查阅相关论文资料,分模块调试和完成任务;2、使用实验箱上的S3C44BOX芯片系统和LCD作为硬件基础;3、使用ADS1.2及H-JTAG对源程序进行编译
2、、仿真、调试,下载到芯片中实现LCD电子时钟功能。三、 课程设计预期效果1、完成实验环境搭建:学习LCD与ARM的LCD的控制器的接口原理;掌握内置LCD控制器驱动编写方法;2、设计完成电子时钟源程序;3、源程序编译、调试通过,下载到实验箱中,实现电子时钟功能,并在LCD上显示类似的时钟界面,动态显示当前的时间,包括:年、月、日、时、分、秒,时针,分针、秒针必须为动态实时指示当前的时间。学生姓名: 专业年级: 专心-专注-专业目 录 前 言随着科技的发展,嵌入式系统广泛应用于工业控制和商业管理领域,在多媒体手机、袖珍电脑、掌上电脑、车载导航器等方面的应用,更是极大地促进了嵌入式技术深入到生活和
3、工作各个方面。嵌入式系统主要由嵌入式处理器、相关支撑硬件及嵌入式软件系统组成;本文介绍基于ARM7的嵌入式微处理器S3C44BOX和LCD显示器的电子时钟的设计,实现电子时钟的功能,并在LCD上显示类似的时钟界面;动态显示当前的时间,包括:年、月、日、时、分、秒,时针。第一章 系统设计第一节 课题目标及总体方案本课程设计设计一种基于ARM7的嵌入式微处理器S3C44B0X和LCD显示器的电子时钟,实现电子时钟的功能,并在LCD上显示类似的时钟界面;动态显示当前的时间,包括:年、月、日、时、分、秒,时针。本课程设计主要为软件设计,硬件部分使用EL-ARM-830教学实验箱上的S3C44B0X和L
4、CD模块。软件部分使用ADS1.2及H-JTAG对源程序进行编译、仿真、调试,下载。软件设计采用模块化设计方法,分为C/OS-II系统模块、LCD初始化模块、时钟应用系统模块等,其中,时钟系统应用模块包括时钟计时模块、时钟显示模块等。各模块之间功能独立,协同完成本课程设计的全部功能。系统设计框图如图1。 软件件部分 时钟应用系统模块 时钟计时模块 时钟显示模块 LCD初始化模块C/OS-II系统模块 硬件部分 S3C44B0X LCD 图1 系统设计框图 第二节 硬件平台简介一、 S3C44B0X简介S3C44B0X 微处理器是三星公司研发的基于ARM7TDMI 核的高性能嵌入式处理器,为手持
5、设备和一般类型应用提供了高性价比和高性能的微控制器解决方案。由于其高性价比以及内嵌了多种接口,在手持设备和消费类电子中得到了广泛的应用。为了降低成本,S3C44B0X提供了丰富的内置部件,包括:8KB cache、内部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标准宏单元和存储编译器。它的低功耗和出色的
6、全静态设计特别适用于对成本和功耗敏感的应用。同样S3C44B0X还采用了一种新的总线结构,即SAMBAII(三星ARM CPU 嵌入式微处理器总线结构)。 S3C44B0X的特性是它的CPU核,是由ARM公司设计的16/32位ARM7TDMI RISC处理器(主频66MHZ)。ARM7TDMI体系结构的特点是它集成了Thumb代码压缩器,片上的ICE断点调试支持,和一个32 位的硬件乘法器。S3C44B0X 内置LCD控制器可以支持规格为每像素2位 (4 级灰度) 或每像素4 位(16 级灰度)的黑白LCD。也可以支持每像素8位(256级颜色)的彩色LCD屏。LCD控制器可以通过编程支持不同L
7、CD屏的要求,例如行和列像素数,数据总线宽度,接口时序等。 基于S3C44B0X的典型嵌入式系统硬件体系结构如图2所示。 图2 S3C44B0X硬件体系结构图二、S3C44B0X与LCD连接本课程设计使用的EL-ARM-830教学实验箱包含有一块5.7寸,256色,320X240像素的LCD显示屏,S3C44B0X内置了LCD控制器,控制LCD。S3C44B0X与LCD连接示意图如图3。 S3C44B0X LCD控制器LCD5.7寸,256色,320*240 图3 S3C44B0X与LCD连接示意图第二节 软件系统设计一、C/OS-II系统模块设计 本模块的主要功能是将C/OS-II系统移植到
8、S3C44B0X上,作为调用硬件各项功能的基础,同时也完成S3C44B0X的功能本模块主要涉及到C/OS-II在ARM上的移植,不属于本课程设计讨论的范畴,故不再赘述。二、LCD初始化模块设计 本模块的主要功能完成LCD的初始化,加载LCD驱动程序,使LCD与S3C44B0X实现对接,完成显示功能。本模块我们使用了实验箱现有的相关程序。故不再赘述。三、 时钟应用系统模块设计 本模块是电子时钟功能实现的主要模块,也是本次课程设计的核心模块,本模块实现的功能主要有:时间计时,钟面时间显示,数字时间显示。其中,时间计时功能和在LCD上显示数字钟显示功能较易实现,之前的单片机课程设计和HDL课程设计均
9、有所涉及。计时使用S3C44B0X内部时钟脉冲和分频实现,在LCD上显示数字钟显示使用LCD数字显示功能实现。在LCD上实现钟面显示功能较为复杂,主要包括以下过程:1、 给秒针、分针各设定60个坐标(包括X坐标和Y坐标),表示60秒和60分,给时针设定12个坐标(包括X坐标和Y坐标);2、 设定钟面显示初值并完成初值与时针、分针、秒针的坐标的映射,更改初值可以完成时间的设定;3、 使用画线函数完成秒针、分针、时针显示,主要功能是擦除上一秒(分、时)的轨迹和显示这一秒(分、时)。4、 使用画点函数完成钟面基本构造,即钟面与12个整点时间点。 除此之外,需要在整个移植后的系统中初始化堆栈并设定任务
10、,通过任务完成时钟的各项功能。第二章 实验结果及讨论第一节 ADS1.2集成开发环境简介ADS集成开发环境是ARM公司推出的ARM核微控制器集成开发工具,英文全称为ARM Developer Suite,成熟版本为ADS1.2。ADS1.2支持ARM10之前的所有ARM系列微控制器,支持软件调试及JTAG硬件仿真调试,支持汇编、C、C+源程序,具有编译效率高、系统库功能强等特点,可以在Windows98、 Windows XP、Windows2000以及RedHat Linux上运行。 ADS 1.2使用CodeWarrior IDE集成开发环境,并集成了ARM汇编器、 ARM的C/C+编译器
11、、Thumb的C/C+编译器、ARM连接器,包含工程管理器、代码生成接口、语法敏感(对关键字以不同颜色显示)编辑器、源文件和类浏览器等等。CodeWarrior IDE 主窗口如图4所示。图4 CodeWarrior开发环境 AXD调试器为ARM扩展调试器(即ARM eXtended Debugger),包括 ADW/ADU的所有特性,支持硬件仿真和软件仿真(ARMulator)。AXD能够装载映像文件到目标内存,具有单步、全速和断点等调试功能,可以观察变量、寄存器和内存的数据等等。AXD 调试器主窗口如图5所示。 图5 CodeWarrior开发环境 本课程设计在ADS1.2集成开发环境内编
12、写源程序并进行编译,调试,然后利用H-JTAG下载到芯片中进行片上调试,H-JTAG连接完成后如图6所示。 图6 H-JTAG连接成功示意图第二节 调试结果与分析 通过编译调试下载到实验箱的S3C44B0X芯片中进行调试,LCD显示结果如图7所示。 图7 LCD调试结果显示屏幕右上角显示出学号姓名和作品信息;屏幕中间显示的是钟面,有时针、分针和秒针,显示实时时间;屏幕下方显示的是数字时钟,显示时分秒(与钟面时间相对应)和年月日。完成系统设计要求的各项功能。第三章 结 论本课程设计属于嵌入式系统项目设计,利用EL-ARM-830教学实验箱上的嵌入式微处理器S3C44B0X和LCD模块,使用C语言
13、编程,结合ADS1.2对源程序进行编译、连接和运行,使用H-JTAG下载,设计完成了基于LCD的电子时钟,实现如下功能:1、 LCD显示“钟面”样式,时针、分针、秒针显示实时时间;2、 LCD显示“数字钟”样式,动态显示年、月、日、时、分、秒;3、 显示时间可以修改并保持“钟面”与“数字钟”时间保持一致;4、 LCD左上角动态显示小组成员姓名、学号及选题信息。本课程设计完成选题要求,但是有如下方面有待改进:1、 “钟面”现实不够精确,分针和时针只设定了60个坐标位置,分针和时针走动不均匀;2、 数字钟部分尚未考虑到“大月”和“小月”以及“平年”和“闰年”的日期问题,所有月份均设定为30天;3、
14、 时间修改麻烦,需要对源程序中设定的初值进行修改,无法通过键盘对时间进行修改;4、 未调用S4C44B0X内部实时时钟(RTC)模块,不能显示出精确的内部实时时间。 上述问题我们会在今后的学习和实践中予以改善,我们将继续学习嵌入式系统原理和设计,继续学习LCD显示技术,为将来的毕业设计打好基础。心得体会本次课程设计是嵌入式系统项目设计,是在本学期我们学完了嵌入式系统课程以后相应的课程设计。因为课时的安排,嵌入式系统只有2个学分,在有限的课时内我们掌握的知识也是相当有限的,我们对嵌入式系统的硬件和软件的基本原理、基本特点,嵌入式系统设计的基本方法有了一个初步的了解掌握。这些知识对于我们完成本次课
15、程设计是远远不够的。我们自己查找了许多关于S3C44B0X和LCD的资料和文献作为课程设计的知识储备,同时也参考了去年学长学姐完成的课题,取人之长、补己之短。经过我们的努力,在老师同学的帮助下,我们顺利完成了课程设计,对嵌入式系统的硬件、软件有了更为深入的了解,也深入掌握了嵌入式系统设计的基本方法,达到了预期的目的。本次课程设计首先要感谢奚吉老师,对我们的课程设计给予了充分的关怀和帮助;然后要感谢我的搭档范娟,我们一起完成了本次课程设计。参考文献1 王勇嵌入式系统原理与设计M杭州:浙江大学大学出版社,20072 耿辉等S3C44B0X的LCD显示解决方案 中国科技论文在线,2007. 3 SA
16、MSUNG公司. S3C44B0X数据手册. ,2006. 4 EL-ARM-830 实验系统的资源介绍,2000.5 林志琦等ARM微控制器与液晶屏接口的研究J长春大学学报,2010,20(2):7174.6 周立功单片机公司. ADS集成开发环境及EasyJTAG仿真器应用,2005.附 录源程序#include .incconfig.h#defineSTACKSIZE256#define x_line 160#define y_line 80OS_STK_DATA stk;extern GUI_FONT GUI_Font8x16;OS_EVENT * Send_D7light_Sem;O
17、S_EVENT * Send_LCD_Sem;OS_EVENT *Key_Mbox;I8 Hour3,Min3,Sec3;I8 hour = 15%12, min = 20, sec = 40;I8 YEA13,YEA23,MON3,DAY3;int yea1 = 20,yea2=11, mon = 6, day = 23;int SpaceXS61=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
18、,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, , SpaceYS61=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,
19、 80,75,70,65,60, 55,51,47,43,39, 35,34,33,32,31,30, SpaceXM61=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,15
20、6,160 , SpaceYM61=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, SpaceXH13=160,175,185,190,185,175,160,145,135,130,135,145,160, SpaceYH13=50,5
21、5,65,80,95,105,110,105,95,80,65,55,50, *Placex=&SpaceXS40,*Placey=&SpaceYS40,*Placexm=&SpaceXM20,*Placeym=&SpaceYM20, *Placexh=&SpaceXH15%12,*Placeyh=&SpaceYH15%12;void show(I8 s) if(s%5=0) Set_Color(GUI_YELLOW); Set_Font(&GUI_Font8x16); Disp_String (,10,30); Set_Font(&GUI_Font8x16); Disp_String (,1
22、0,10); else if(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); else if(s%5=2) Set_Color(GUI_YELLOW);Set_Font(&GUI_Font8x16); Disp_String(,10,30); Set_Font(&GUI_Font8x16); Disp_String(,10,10); else if(s%5=3) Set
23、_Color(GUI_YELLOW);Set_Font(&GUI_Font8x16); Disp_String (fanjuan ,10,30); Set_Font(&GUI_Font8x16); Disp_String (guxin ,10,10); else if(s%5=4) Set_Color(GUI_YELLOW); Set_Font(&GUI_Font8x16); Disp_String (S3C44BOX ,10,10); Set_Font(&GUI_Font8x16); Disp_String (LCD CLOCK ,10,30); void Shows()show(sec);
24、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,*P
25、lacexh,*Placeyh); if(Placex=&SpaceXS60&Placey=&SpaceYS60) Placex=&SpaceXS0; Placey=&SpaceYS0; void Showm()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); /显示
26、下一分的 DrawLine(x_line,y_line,*Placexm,*Placeym);Set_Color(GUI_GREEN);/显示下一时的 Draw_Line(x_line,y_line,*Placexh,*Placeyh); if(Placexm=&SpaceXM60&Placeym=&SpaceYM60) Placexm=&SpaceXM0; Placeym=&SpaceYM0; void Showh()Set_Color(GUI_YELLOW); Set_Color(GUI_GREEN);Set_Color(GUI_RED);Set_Color(GUI_GRAY); /擦除上
27、一时的 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=&SpaceXH12&Placeyh=&SpaceYH12) Placexh=&SpaceXH0; Placeyh=&SpaceYH0; void Shouw_Cricle() / 整 点Set_Color(GUI_YELLOW); Fill_Circle (160,
28、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_Cir
29、cle (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)void Show_ht()Set_Color(GUI_GRAY); Fill_Circle (160,80,54);void ChangeForm(char Time,char time) Time0 = time / 10 + 48; Time1 = time % 10 + 48; Time2 = 0;void
30、 Display_Time(char x,char y) 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);
31、 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); void Show_Color()Set_Color( GUI_BLUE ); Fill_Rect(0,0,319,239); Set_Color(GUI_BLUE); Set_BkColo
32、r (GUI_BLUE); Fill_Rect(0,0,319,2); Fill_Rect(0,0,2,239); Fill_Rect(0,237,319,239); Fill_Rect(317,0,319,239);/*分配各任务的堆栈容量*/OS_STK Stack_Task_1STACKSIZE;OS_STK Stack_Task_2STACKSIZE*3;/*- 函数名称 : Task_3(void *pdata)- 函数说明 : GUI任务,优先级为56- 输入参数 : pdata- 输出参数 : 无*/void Task_3(I8 s)I8 display; for(;) Dela
33、y(100); display+; Set_Color(GUI_RED); if(display=1000) display=0; /*- 函数名称 : Task_2(void *pdata)- 函数说明 : GUI任务,优先级为9- 输入参数 : pdata- 输出参数 : 无*/void Task_2(void *pdata) for(;) /*全屏颜色设计*/ /*时 钟 位 置*/ Show_Color(); Show_ht(); /*点 的 坐 标*/ Shouw_Cricle(); /*定背景颜色API*/ Set_Color(GUI_YELLOW); /显示 DrawLine(x
34、_line,y_line,*Placex,*Placey); Display_Time(130, 160);/时间 doDelay(1200); sec+; Shows(); if (sec = 60) sec = 0; min+; Showm(); if (min = 60) min = 0; hour+; Showh(); if (hour = 23) hour = 0; day+; if(day =32) day = 1; mon+; if(mon = 13) mon = 1; yea1+; DisplayTime(130, 160);/时间 日期while(1);/*- 函数名称 :
35、Task_1- 函数说明 : 系统启动后运行的第一个任务,优先级为5- 输入参数 : pdata- 输出参数 : 无*/void Task_1(void *pdata) Rtc_Tick_Init(); /打开时钟节拍,让操作系统跑起来OSTaskCreate(Task_2, (void *)0, (OS_STK *)&Stack_Task_2(STACKSIZE*3) - 1, 9); /在任务里创建另一个任务 for(;) OSTimeDly(50); /时钟屏幕显示 /*主 函 数*/void Main(void) Target_Init(); / ARMII实验系统的初始化,包括CPU板 GUI_Init(); OSInit(); OSTaskCreate(Task_1, (void *)0, (OS_STK *)&Stack_Task_1STACKSIZE - 1, 5); /创建任务一 OSStart();