ARM课设----数字钟的设计--报告(共20页).doc
精选优质文档-倾情为你奉上ARM嵌入式系统课程设计报告题 目: 数字钟的设计 院 (系): 信息科学与工程学院 专业班级: 通信工程1103 学生姓名: 学 号: 指导教师: 2014年5月26日至2014年6月6日华中科技大学武昌分校制专心-专注-专业嵌入式系统 课程设计任务书一、设计(调查报告/论文)题目课题:数字钟的设计二、设计(调查报告/论文)主要内容掌握定时器的使用方法,利用串口、数码管、点阵或者液晶屏进行日期、时间的实时显示,并可以根据需要进行调整。三、原始资料开发板的原理图,课设讲义。四、要求的设计(调查/论文)成果l 使用开发板或实验箱实现一个数字钟;l 根据原理图完成实验方案的设计;l 实时显示日期、时间。可以利用串口发送到上位机显示或利用数码管、点阵、液晶屏显示;l 具备时间调整功能;l 在实验完成的基础上完成课程设计报告的撰写,按照模板的格式书写,要求有软件流程图和详细的调试过程。五、进程安排时间内容地点15周周一上午课题讲解、选题11-60215周周一下午软硬件准备、清理实验楼402,40315周周二至周三课题分析、收集资料、完成设计方案实验楼402,403,图书馆15周周四至周五详细设计,编写代码实验楼402,40316周周一至周三系统调试实验楼402,40316周周四成果验收实验楼402,40316周周五整理文档,撰写提交课设报告实验楼402,403六、主要参考资料见下发的课程设计资料指导教师(签名): 20 年 月 日目 录一、设计原理及基本方案 5 1、设计原理 5 2、基本方案 8二、 软件设计 8 1、基本思路 8 2、软件流程图 8 3、主要代码说明 9三、软件模块 9 1、RTC时钟模块 10 2、LCD驱动模块 10 3、LCD显示模块 11 4、字模模块 11 5、串口模块 12四、工程结构及软件流程图 12五、数字钟课设结果图 14六、课设问题 14 七、总结 15八、参考文献 15九、附录 15一、设计原理及基本方案1、设计原理(1)实时时钟RTC模块S3C2410A 实时时钟单元是处理器集成的片内外设,由开发板上的后备电池供电,可以在系统电源关闭的情况下运行,RTC发送8位BCD码数据到CPU。传送的数据包括秒、分、时、星期、日期、月份和年份。RTC单元时钟源频率由外部32.768 kHz晶振提供,可以实现闹钟(报警)功能及时间片中断、置0计数功能。如图1-1。图1-1 RTC框图RTC最重要的功能就是显示时间,是通过读/写寄存器实现的。要显示秒、分、时、日期、月、年,CPU必须读取存于BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON与BCDYEAR寄存器中得值。时间的设置也是通过以上的寄存器实现的,即以上寄存器是可读写的。(2)RTC特殊功能寄存器所有RTC寄存器都是字节型的,必须使用字节型访问指令(STRB、LDRB)或者字符型指令访问。在小端模式和大端模式中所采用的地址不同,这里采用小端模式的地址。 时钟BCD数据寄存器时钟BCD数据寄存器用于保存RTC的实时数据,包括BCDSEC、BCDMIN、BCDHOUR、BCDDATE、BCDDAY、BCDMON和BCDYEAR等7个寄存器,如表1-1所列。表1-1时钟数据寄存器寄存器地 址读写操作描 述复位值BCDSEC0x读/写BCD秒数据寄存器未定义BCDMIN0x读/写BCD分数据寄存器未定义BCDHOUR0x读/写BCD时数据寄存器未定义BCDDATE0xC读/写BCD日数据寄存器未定义BCDDAY0x读/写BCD星期数据寄存器未定义BCDMON0x读/写BCD月数据寄存器未定义BCDYEAR0x读/写BCD年数据寄存器未定义BCDSEC用于保存报警的秒数据,其中的位6:0SECDATA保存报警秒数据的BCD码,位6:4取值0-5,位3:0取值09。BCDMIN用于保存报警的分数据,其中的位6:0MINDATA保存报警分数据的BCD码,位6:4取值0-5,位3:0取值0-9。BCDHOUR用于保存报警的时数据,其中的位5:0HOURDATE保存报警时数据的BCD码,位5:4取值0-2,位3:0取值0-9。BCDDATE用于保存报警的日数据,其中的位5:0DATEDATA保存报警日数据的BCD码,取值0-28、29、30、31,位5:4取值0-3,位3:0取值0-9。BCDDAY用于保存报警的星期数据,其中的位2:0DAYDATA保存报警星期数据的BCD码,取值1-7。BCDMON用于保存报警的月数据,其中的位4:0MONDATA保存报警月数据的BCD码,位4取值0-1,位3:0取值0-9。BCDYEAR用于保存报警的年数据,其中的位7:0YEARDATA保存报警年数据的BCD码,取值00-99。 实时时钟控制寄存器实时时钟控制寄存器RTCCON如表1-2所列,共有四位。表1-2实时时钟控制寄存器寄存器地 址读写操作描 述复位值RTCCON0x读/写RTC控制寄存器0x0各位定义如下:3CLKRST:RTC时钟计数器复位。0=不复位;1=复位。2CNTSEL:BCD计数器选择。0=合并BCD计数器;1=保留(即分离BCD计数器)。1CLKSEL:BCD时钟选择。0=采用XTAL的1/215作为时钟;1=保留(XTAL时钟仪用于测试)。0RTCEN:RTC控制使能。0=禁止;1=使能。RTCEN控制BCD寄存器的读/写使能,CLKSEL、CNTSEL和CLKRST用于测试。RTCEN控制着CPU和RTC的所有接口,为了使能数据可读/写,在系统复位后RTCEN应该置1。(3)串口通信模块S3C2410A串行通信单元UART提供2个独立的异步串行通信口,皆可工作于中断和DMA模式。最高波特率达b/s。每个UART单元包含一个16字节FIFO,用于数据接收和发送。此外,每个UART模块还包含可编程波特率、红外发送/接收、1个或2个停止位、5/6/7/8位数据宽度和奇偶校验。通过初始化好串口,与RTC进行通信,来设置RTC当前时间及报警时间。(4)液晶显示LCD模块S3C2410A处理器集成了LCD控制器,支持4位单扫描、4位双扫描和8位单扫描工作方式。处理器使用内部RAM区作为显示缓存,并支持屏幕水平和垂直滚动显示。数据的传送采用DMA(直接内存访问)方式,以达到最小延迟。根据实际硬件水平和垂直像素点数、传送数据位数、时间线和帧速率方式等进行编程,以支持多种类型的显示屏。LCD控制器主要液晶屏显示数据的传送、时钟和各种信号的产生与控制功能。2、基本方案 本课设电子时钟的设计主要是将RTC模块中的时间传到LCD上进行实时显示;此外,通过串口与PC机通信,设置RTC模块中当前时间及报警时间,其结构框图如图1-2所示:PC串口RTC模块LCD显示 图1-2 整体结构框图二、软件设计1、基本思路(1)读写RTC模块 S3C2410A内部集成了RTC模块,通过读取RTC模块中寄存器BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON和BCDYEAR的值得到当前的相应的时间值。还可以往这些寄存器里写值以设置当前的时间值。(2)串口通信UART模块采用S3C44B0X的UART模块,利用PC机进行当前时钟时间和时钟报警时间的设置。设置时间时 S3C2410A发送新的时间值到BCDYEAR、BCDMON、BCDDAY、BCDHOUR、BCDMIN、BCDSEC修改当前时间。(3)液晶屏LCD640*480显示设计使用液晶屏显示最基本的是像素控制数据的使用。像素控制数据的存放与传送形式决定了显示的效果,图形显示可以直接使用像素控制函数实现,把像素控制数据按一定形式存入即可实现字符显示。本次课设通过调用字符显示函数,将读取的实时时钟送到LCD上显示。 2、软件流程图本次课设程序设计基于S3C2410A嵌入式开发平台,并结合PC的超级终端完成RTC模块的初始化、时间显示(显示于超级终端)、时间设置、重置测试、报警测试等功能。其程序开发流程如图2-1所示。RTC初始化时间显示LCD初始化时间设置程序入口点串口初始化主函数2410A初始化时设置分设置秒设置图2-1 软件流程图3、主要代码说明各函数功能如下: Rtc_Init():RTC模块初始化函数。该函数主要实现对BCD数据初始化,当其他函数读取初始化时间时,可以调用此函数。 Rtc_TineSet():时间设置功能函数。该函数调用Uart_GetIntNum()函数从超级终端读入整型数字,由用户完成对当前时间的修改。RndRst_Rtc():重置测试功能函数。该函数通过对Rtc_TimeSet()函数的调用完成用户当前时间设置,然后通过修改RTCRST寄存器,实现重置边界的修改,进而通过对Uart_Printf()函数的调用,显示输出时间。用户可以观察重置后的时间,来测试重置功能。Test_Rtc_Alarm():报警测试功能函数。该函数完成RTC初始化,通过清除RTC模块的中断屏蔽位,产生报警,然后再设置中断屏蔽位,关闭中断。Test_Rtc_Tick():时钟滴答测试功能函数。通过寄存器RTICNT设置时钟滴答周期,再通过调用Uart_Printf()输出时钟滴答具体值。报警中断开与时钟滴答完成相应中断状态位和中断挂起位开中断的功能。相应的功能可以查看S3C2410A的中断模块。Display_Rtc( ):显示时间功能函数。三、软件模块在本次软件设计中,采用语言模块化的设计思想,分别编写RTC时钟模块;LCD驱动模块;LCD显示模块;UART模块;字模模块;延时模块;LED模块;组合各个模块功能设计实现数字时钟。1、 RTC时钟模块RTC最重要的功能就是显示时间,RTC模块能够在系统断电的情况下由后备电池供电继续工作,它能将8位数据转换为BCD码的格式传送给CPU。这些数据包括秒、分、时、日期、星期、月、年。RTC模块需要一个外部晶振提供32.768kHz的频率才能工作,它也能完成报警功能。通过CPU读取存于BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE, BCDMON与BCDYEAR寄存器中的值来实现显示时间。2、LCD驱动模块 实现LCD相关寄存器的配置。包括LCD_Init和LCD_Refresh两个功能函数。定义全局数组LCDBufferII2480640,实现像素点的描绘。函数编写在LCD640.c文件中,每个函数封装在LCD640.h中供外部调用。3、 LCD显示模块该模块包括汉字显示程序,数字显示程序;实现在LCD上的显示功能。4、字模模块字模就是对汉字,数字,图像等需要显示的东西进行编码。通过取模软件对需要显示的汉字和数字进行取模,因为在LCD显示的汉字和数字的字模。程序中分别对刘奇 数字时钟年月日1234567890:进行了取模编码。5、串口模块通过超级终端打印出实时时钟的时间,以及报警提示信息等等。四、 工程结构及软件流程图工程设计图软件程序流程图:程序开始锁相环时钟初始化串口初始化MMU初始化LCD初始化中断初始化在LCD上显示背景和汉字RTC报警中断服务RTC报警报警RTC显示时间程序结束五、数字钟课设结果图LCD显示结果:六、 课设问题 1、如何查看串口信息? 解决:在计算机中打开超级终端并设置好参数后,就能显示电子钟信息,设置参数如下图 2如何查看各个模块的具体信息解决:可以再主程序中找到调用的模块,鼠标右键后有选项能直接进入模块七、总结在本次课程设计中使用的是32位ARM处理器。此次设计是基于嵌入式的数字时钟的制作,将理论知识和工程实践应用相结合在一起,这使我们深刻了解了理论知识与应用实践的相关联系,加大了对理论知识的重要性的认识和应用实践的重要性。也使我们明白了仅仅知道课本上的理论知识是远远不够的,还需要通过大量的查阅相关资料并通过实际的亲自动手实践才能得到真正的有用的知识。这次的数字时钟设计主要应用的就是实时时钟和LCD以及串口和中断等功能,在课设中我遇到了许多困难,但在老师和同学的帮助下一一解决,最后完成课设要求,在次过程中我更加深刻的学习了ARM相关的理论知识,以及一些常用的中断的设计方法。八、参考文献 1 刘彦文.嵌入式系统原理及接口技术.清华大学出版社2011年3月.2 三星公司.ARM9三星S3C2410英文数据手册.3 王波波.ARM9完全学习手册.九、附录主程序:#include <string.h>#include <stdio.h>#include "def.h"#include "option.h"#include "2440addr.h" #include "2440lib.h"#include "2440slib.h" #include "mmu.h" #include "hanzi.h"#include "display.h"#include "rtc.h"#include "LCD640.h"#include "uart.h"#include "rtcalm.h"/#define rUTRSTAT0(*(volatile unsigned *)0x)#define rUTRSTAT1(*(volatile unsigned *)0x)#define WrUTXH0(ch)(*(volatile unsigned char *)0x)=(unsigned char)(ch)#define WrUTXH1(ch)(*(volatile unsigned char *)0x)=(unsigned char)(ch)#define RdURXH0()(*(volatile unsigned char *)0x)#define RdURXH1()(*(volatile unsigned char *)0x)void Uart_Init(int mclk,int baud);void Uart_Select(int ch);void Uart_TxEmpty(int ch);char Uart_Getch(void);char Uart_GetKey(void);void Uart_GetString(char *string);int Uart_GetIntNum(void);void Uart_SendByte(int data);void Uart_SendString(char *pt);void Uart_Printf(char *fmt,.);/extern int RTC_num; extern U32 LCDBufferII2480640;int Main(int argc, char *argv) char c11; char err;U8 key,key1,key2,key3;int i,j,k,temp;int x=130; /列int y=170; /行 U16 year ;U8 month, day ;U8 hour, minute, second ; U8 secondgewei,secondshiwei; U8 minutegewei,minuteshiwei; U8 hourgewei,hourshiwei; U8 daygewei,dayshiwei; U8 monthgewei,monthshiwei; U8 yearqian,yearbai,yearshi,yearge; ChangeMPllValue(68,1,1); Port_Init();/端口初始化函数Uart_Select(0);/串行IO口选择函数Uart_Init(0,);/串口初始化函数; MMU_Init(); MMU_DisableICache(); MMU_DisableDCache();LCD_Init();/LCD初始化 Isr_Init();/RTC 中断初始化 for (k=0;k<480;k+)/hang for (j=0;j<640;j+) /列 LCDBufferII2kj=0x0000fcf8;/上黄框背景 for( i=0;i<9;i+)/显示汉字LCD_Display_hanzi_16_16(x,y,hanzii); /第一参数为 列 第二参数为 行y=y;x=x+40;/显示名称 LCD_Display_hanzi_16_16(260,120, hanzi15);/数 LCD_Display_hanzi_16_16(280,120, hanzi16);/字 LCD_Display_hanzi_16_16(300,120, hanzi17);/时 LCD_Display_hanzi_16_16(320,120, hanzi18);/钟 /显示数字/ LCD_Refresh();/初始化 RTC_Time_Set() ; / rRTCCON = 1 ;while(1) rRTCCON = 1 ; year = 0x2000+rBCDYEAR ;/年 month = rBCDMON ; /月 day = rBCDDATE ; /日hour = rBCDHOUR ; /时 minute = rBCDMIN ; /分 second = rBCDSEC ; /秒 rRTCCON &= 1 ;/RTC read and write disable Uart_Printf( "RTC time : %04x-%02x-%02x %02x:%02x:%02xn", year, month, day, hour, minute, second ); dely(20); secondgewei=second%0x10; / BCD码 模 十六进制 送显 secondshiwei=second/0x10; minutegewei=minute%0x10; minuteshiwei=minute/0x10; hourgewei=hour%0x10; hourshiwei=hour/0x10; daygewei=day%0x10; dayshiwei=day/0x10; monthgewei=month%0x10; monthshiwei=month/0x10; yearqian=year/0x1000; yearbai=(year%0x1000)/0x100; yearshi=(year%0x1000)%0x100)/0x10; yearge=(year%0x1000)%0x100)%0x10; LCD_Display_English_8_16(230,210,numberyearqian); LCD_Display_English_8_16(240,210,numberyearbai); LCD_Display_English_8_16(250,210,numberyearshi); LCD_Display_English_8_16(260,210,numberyearge); LCD_Display_hanzi_16_16(270,210, hanzi9);/年 LCD_Display_English_8_16(290,210,numbermonthshiwei); LCD_Display_English_8_16(300,210,numbermonthgewei); LCD_Display_hanzi_16_16(310,210,hanzi10);/月 LCD_Display_English_8_16(330,210,numberdayshiwei); LCD_Display_English_8_16(340,210,numberdaygewei); LCD_Display_hanzi_16_16(350,210,hanzi11);/日 LCD_Display_English_8_16(220,250,numberhourshiwei); LCD_Display_English_8_16(230,250,numberhourgewei); LCD_Display_hanzi_16_16(250,250,hanzi12); /时 LCD_Display_English_8_16(280,250,numberminuteshiwei); LCD_Display_English_8_16(290,250,numberminutegewei); LCD_Display_hanzi_16_16(310,250,hanzi13); /分 LCD_Display_English_8_16(340,250,numbersecondshiwei); LCD_Display_English_8_16(350,250,numbersecondgewei); LCD_Display_hanzi_16_16(370,250,hanzi14); /秒 LCD_Refresh() ; return 0;成绩评定项 目比例得 分平时成绩(百分制记分)30%业务考核成绩(百分制记分)70%总评成绩(百分制记分)100%评定等级优 良 中 及格 不及格课程设计成绩评定表