嵌入式系统设计课程设计报告伪windows电子时钟的设计与实现.doc
信息工程学院嵌入式系统设计课程设计报告题目:伪windows电子时钟的设计与实现学号:学生姓名:专业名称:物联网工程班级:物联13本1目录1. 课题研究意义和现状- 1 -1.1 课题研究意义- 1 -1.2 课题研究现状- 1 -2. 系统总体方案设计及功能模块介绍- 1 -2.1 总体方案设计- 1 -2.2 数字时钟功能模块介绍- 3 -3. 系统硬件平台及接口设计- 3 -3.1 系统硬件平台设计- 3 -3.2 系统硬件接口设计- 4 -4. 系统软件设计与实现- 5 -4.1 主程序设计与实现- 5 -4.2 数字时钟程序设计与实现- 7 -5. 系统测试- 10 -5.1 系统软件测试- 10 -5.2 系统硬件测试- 12 -6. 总结和展望- 14 -7. 参考文献- 15 -1. 课题研究意义和现状1.1 课题研究意义电子钟是目前应用非常广泛的一种电子装置,众所周知,ARM微处理器功能特别的强大,与MC51单片机相比,它更适合做中高端数字系统的微处理器,ARM已经成了现代主流微处理器内核,目前,绝大多数码产品,如,手机,MP3,MP4,数码相机,他们的系统都嵌入了ARM系列内核,ARM微处理器更新换代很快,现在的诺基亚N系列智能手机如N78,N79已经采用了ARM11了,使得运行于塞班操作系统S60第三版的应用程序流畅自如。本文使用TQ2440处理器而设计的实时时钟,由硬件和软件相配合使用。硬件由主控器、时钟电路、显示电路、键盘接口5个模块组成。实现电子时钟的功能,并在LCD上显示类似的时钟界面;动态显示当前的时间,包括:年月、日、时、分、秒,时针。1.2 课题研究现状目前市场上各式各样的数字电子钟大多数用全硬件电路实现,电路结构复杂,功率损耗大,而且目前市场上的电子钟一般都用LED显示,显示界面不友好。市场上还有一些老式的机械式电子钟,机械式的电子钟使用寿命较短,一般只能使用一年时间,机械式电子钟出现故障后很难修复,这样很浪费资源。因此有必要对机械式电子钟进行淘汰,对电子钟进行改进。本文设计的可调电子钟,设计的电路成本较低,可靠性高,运用简单方便,正常环境下能使用五年。出现元器件老化故障,可以只更换元器件,便可正常使用,节省资源,保护环境。2. 系统总体方案设计及功能模块介绍2.1 总体方案设计本设计是基于ARM处理器而设计的实时时钟,综合性较强,涉及到RTC外部中断,引脚的GPIO功能,C语言编程等知识。首先要定义P0口为基本IO功能,然后通过引脚功能选择寄存器PINSEL0及PINSEL1定义输入输出外部中断口所在的位,另外还要对外部中断进行初始化,其中有规定他们的优先级,中断触发方式,中断地址分配,本设计采用液晶模块LCD1602同时显示实时时间和报警时间,同样要对他们进行初始化,包括检查总线忙与闲,传送地址,传送数据及显示函数的编程、开发板自带有一个实时时钟RTC带日历和时钟功能,要使用它也要进行一下的基本操作:设置RTC基准时钟分频器初始化RTC的时钟值如,YEAR,MONTH,HOUR等启动RTC即CCR的CLKEN位职位读取完整时间寄存器值或等待中断。先调用以上各个模块的初始化函数lcd_int(),RTCint()然后开启RTC时钟,并调用LCD显示函数SendTimetRtc(),如果没用中断发生就判断实时时间是否与以设定的报警时间相同,如果相同就马上接通蜂鸣器报警并且点亮LED灯。假如有中断发生,在无效状态下,马上给中断标志寄存器EXTINT对应位,然后写1清零,然后转到中断服务程序。本设计设定7种系统状态:正常运行:0态设定RTC的:HOUR1态;SEC2态;MIN3态;ALHOUR4态;ALSEC5态;ALMIN6态电路中通过三个按钮开关与三个中断eint的输入端相连,对应也有eint0,eint1,eint3三个中断服务程序,当eint2 端按下时,就转到eint2中断服务程序,它的功能就是设定系统当前所取的状态,也就是所选择实时时钟和报警时间的时,分,秒,按一下,状态就自增一,eint0,eint1的中断服务程序都是调节时间不同的是一个以加1调节,一个以减2调节。按下一次就加一次时间值,但具体是对HOUR,SEL,MIN,ALHOUR,ALMIN,ALSEL中的哪一个调节那还得看eint2触发下系统所处的状态所以只有在eint2发生的基础上eint0,eint1发生才有意义。LCD初始化模块时钟显示模块闹钟模块时钟计时模块TQ2440LCD图1 系统设计图2.2 数字时钟功能模块介绍数字实时时钟单元是处理器集成的片内外设,由开发板上的后备电池供电,可以在系统电源关闭的情况下运行,RTC发送8位BCD码数据到CPU。传送的数据包括秒、分、时、星期、日期、月份和年份。RTC单元时钟源频率由外部32.768 kHz晶振提供,可以实现闹钟(报警)功能及时间片中断、置0计数功能。RTC最重要的功能就是显示时间,是通过读/写寄存器实现的。要显示秒、分、时、日期、月、年,CPU必须读取存于BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON与BCDYEAR寄存器中得值。时间的设置也是通过以上的寄存器实现的。 3. 系统硬件平台及接口设计3.1 系统硬件平台设计图2 硬件平台图3.2 系统硬件接口设计图3 LCD接口图图4 蜂鸣器接口图4. 系统软件设计与实现开始4.1 主程序设计与实现图5 主程序流程图RTC显示时间RTC报警中断服务RTC报警在LCD上显示背景和汉字结束中断初始化LCD初始化MMU初始化串口初始化时钟初始化关键代码如下void Main(void)char *mode;int i,ii,j; U32 jj=100;unsigned char Temp1,Temp2;unsigned int Addr=0;U16 freq;/ lci 1000 U32 x,y; double offset=0;/x坐标偏移量 U32 z;/=init FCLK=400M, so change MPLL first=U8 key = 14;U32 mpll_val = (92<<12)|(1<<4)|(1);/= Lcd_Init();Port_Init();Isr_Init();ChangeMPllValue(mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);ChangeClockDivider(key, 12);cal_cpu_bus_clk();consoleNum = 0;/ Uart 1 select for debug.Uart_Init( 0,115200 );Uart_Select( consoleNum );Beep(2000, 100);Uart_SendByte('n');Uart_Printf("<*>n");Uart_Printf(" TQ2440 Test Programn");Uart_Printf(" n");Uart_Printf("<*>n");rMISCCR=rMISCCR&(1<<3); / USBD is selected instead of USBH1 rMISCCR=rMISCCR&(1<<13); / USB port 1 is enabled.rDSC0 = 0x2aa;rDSC1 = 0x2aaaaaaa;/Enable NAND, USBD, PWM TImer, UART0,1 and GPIO clock,/the others must be enabled in OS!rCLKCON = 0xfffff0;MMU_Init();/ /Rtc_Init(); pISR_SWI=(_ISR_STARTADDRESS+0xf0);/for pSOSLed_Display(0x66);mode="DMA"Clk0_Disable();Clk1_Disable();mpll_val = rMPLLCON;Lcd_TFT_Init() ;/ LCD initial/Lcd_ClearScr(0x00<<11) | (0x3f<<5) | (0x00) );/刷屏刷为青色/开机logl Paint_Bmp(0,0,480,272,Win8_480272); /win8 /Paint_Bmp(0,0,480,272,AnZuo1_480272); /安卓 Delay(100000); for(j=30;j<480;j+) Lcd_printf(-j+16*0,220, 0x0000,(0x1f<<11) | (0x3f<<5) | (0),1,"马野王盼陈杰榆林学院"); Delay(5);Delay(1000);4.2 数字时钟程序设计与实现数字实时时钟单元是处理器集成的片内外设,由开发板上的后备电池供电,可以在系统电源关闭的情况下运行,RTC发送8位BCD码数据到CPU。传送的数据包括秒、分、时、星期、日期、月份和年份。RTC单元时钟源频率由外部32.768 kHz晶振提供,可以实现闹钟(报警)功能及时间片中断、置0计数功能。RTC最重要的功能就是显示时间,是通过读/写寄存器实现的。要显示秒、分、时、日期、月、年,CPU必须读取存于BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON与BCDYEAR寄存器中得值。时间的设置也是通过以上的寄存器实现的。关键代码如下:void Createtime() /年加 if(xdata>=24)&&(xdata<=96)&&(ydata>=108)&&(ydata<=135) if(rYear=0x63) /最大值为99加1后强制跳为 0x00 rYear=0x00; else if(rYear=0x59) /寄存器中值为BCD码 rYear=0x5a; /显示的是16进制数 else if(rYear=0x4f) /只不过我们看的时候把它当成了十进制看 rYear=0x50; /所以此处需要 强制赋值 否则加一后将变成0x7a else if(rYear=0x45) rYear=0x46; else if(rYear=0x3b) rYear=0x3c; else if(rYear=0x31) rYear=0x32; else if(rYear=0x27) rYear=0x28; else if(rYear=0x1d) rYear=0x1e; else if(rYear=0x13) rYear=0x14; else if(rYear=0x09) rYear=0x0a; else rYear+; xdata=0; /清除x坐标值 ydata=0; /清除y坐标值 /Createtime_flag=0; /年减 else if(xdata>=24)&&(xdata<=96)&&(ydata>=144)&&(ydata<=171) if(rYear=0x00) rYear=0x63; else if(rYear=0x5a) rYear=0x59; else if(rYear=0x50) rYear=0x4f; else if(rYear=0x46) rYear=0x45; else if(rYear=0x3c) rYear=0x3b; else if(rYear=0x32) rYear=0x31; else if(rYear=0x28) rYear=0x27; else if(rYear=0x1e) rYear=0x1d; else if(rYear=0x14) rYear=0x13; else if(rYear=0x0a) rYear=0x09; else rYear-; xdata=0; /清除x坐标值 ydata=0; /清除y坐标值 5. 系统测试5.1 系统软件测试图6 编译环境截图图7 编译结果图8 烧写过程5.2 系统硬件测试图9 开机画面图10 主界面图11 模拟时钟界面图12 数字时钟设置界面图13 闹钟设置界面6. 总结和展望本设计先后进行了很长的时间,万事开头难,最终在这次难得的电子钟设计实验中我锻炼了自己的思考能力和动手能力。通过题目选择和设计电路的过程中,加强了我思考问题的完整性和实际生活联系的可行性。在方案设计选择和芯片的选择上,培养了我们综合应用ARM的能力,对ARM的各种功能也有了进一步的认识。还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题,解决问题的能力。并且我们熟练掌握了有关器件的性能及测试方法。在本次课程设计中使用的是ARM处理器。此次设计是基于嵌入式的数字时钟的制作,将理论知识和工程实践应用相结合在一起,这使我们深刻了解了理论知识与应用实践的相关联系,加大了对理论知识的重要性的认识和应用实践的重要性。也使我们明白了仅仅知道课本上的理论知识是远远不够的,还需要通过大量的查阅相关资料并通过实际的亲自动手实践才能得到真正的有用的知识。这次的数字时钟设计主要应用的就是实时时钟和LCD以及串口和中断等功能,在课设中我遇到了许多困难,但在老师和同学的帮助下一一解决,最后完成课设要求,在次过程中我更加深刻的学习了ARM相关的理论知识,以及一些常用的中断的设计方法。7. 参考文献1蔡希彪,曹洪奎.单片机电子时钟系统的设计与仿真J.中国科技信息.2007(4).2刘彦文,嵌入式系统原理及接口技术M.清华大学出版社,2011.3王波波,ARM9完全学习手册M.化学工业出版社,2012.