班级:测控062姓名:宁运琨学号:200600304067目录:一,实验心得体会(设计体会)二,实验目的三,实验软件,硬件四,实验题目及要求(设计要求)五,软件时钟设计总体方案六,软件时钟的电路原理图七,程序流程图及C程序(软件部分)八,Proteus仿真图(硬件部分)九,课题研究的意义。一,实验心得体会心得体会:众所周知,ARM微处理器功能特别的强大,与MC51单片机相比,它更适合做中高端数字系统的微处理器,ARM已经成了现代主流微处理器内核,目前,绝大多数码产品,如,手机,MP3,MP4,数码相机,他们的系统都嵌入了ARM系列内核,ARM微处理器更新换代很快,现在的诺基亚N系列智能手机如N78,N79已经采用了ARM11了,使得运行于塞班操作系统S60第三版的应用程序流畅自如,基于ARM的强大功能,我们没有理由不学ARM,而我们现在学的仅仅是ARM7或LPC2000系列的一点皮毛,有大把知识需要自学才能掌握,兴趣是最好的老师,只要你爱ARM,ARM也会爱你的,通过这次实验的设计,我对ARM有了一定的了解,1,初步了解了LPC2000系列的硬件结构。2,了解了LPC2106引脚的大致功能,3,掌握LPC2106中断处理,GPIO口,实时时钟的使用,4,相关寄存器的名称和使用功能。5,熟悉基于C语言的ARM初始化程序和功能模块编程,6,掌握LCD1602的初始化及显示功能程序的编写。在此也很感谢老师给我们提供了珍贵的实验参考资料和指导并给我们充裕的准备时间。二,实验目的。1,应用所学的ARM知识设计一个实时时钟2,掌握LPC2106中断处理,RTC的使用。三,实验软件,硬件。软件:proteus6.9仿真软件,ARM开发环境ADS.硬件:WINDOW2000/XPPC机一台。四,实验题目及要求(设计要求)。题目:带报警功能并且可以调节时间的实时时钟。要求:1,实时时间可通过按键选择调节。2,可以通过按键设定报警时间。3,当达到报警时间时,蜂鸣器响一下,LED灯点亮。4,报警时间和实时时间通过液晶模块LCD1602显示五,软件时钟设计总体方案本实验是基于LPC2106ARM处理器而设计的实时时钟,综合性较强,涉及到RTC外部中断,引脚的GPIO功能,C语言编程等知识。首先要定义P0口为基本I\O功能,然后通过引脚功能选择寄存器PINSEL0及PINSEL1定义输入输出外部中断口所在的位,另外还要对外部中断进行初始化,其中有规定他们的优先级,中断触发方式,中断地址分配,本实验采用液晶模块LCD1602同时显示实时时间和报警时间,同样要对他们进行初始化,包括检查总线忙与闲,传送地址,传送数据及显示函数的编程、LPC2106微控制器自带有一个实时时钟RTC带日历和时钟功能,要使用它也要进行一下的基本操作:1,设置RTC基准时钟分频器2,初始化RTC的时钟值如,YEAR,MONTH,HOUR等3,启动RTC即CCR的CLKEN位职位4,读取完整时间寄存器值或等待中断。5,陈述完以上的模块初始化后,下面简要说明一下程序的流程先调用以上各个模块的初始化函数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发生才有意义。在判断状态是我灵活的使用了C语言开关语句——switch,可以优化程序使程序看起来更紧凑,一目了然。六,软件时钟的电路原理图七,程序流程图及C程序(软件部分)#includeconfig.h#definers(18)#definerw(19)#defineen(110)#definebusy(17)#defineFPCLK2764800Luint8change;uint8txt[]={ALM:};uint8MESSAGE[]={RTC:};/**********************************外部中断*************************************/void__irqeint0(void)//向量中断开始,说明有外部中断{switch(change){case1:{while(EXTINT&(10))EXTINT=10;VICVectAddr=0;ALSEC++;if(ALSEC59)ALSEC=0;break;}case2:{while(EXTINT&(10))EXTINT=10;VICVectAddr=0;ALMIN++;if(ALMIN59)ALMIN=0;break;}case3:{while(EXTINT&(10))EXTINT=10;VICVectAddr=0;ALHOUR++;if(ALHOUR23)ALHOUR=0;break;}case4:{while(EXTINT&(10))EXTINT=10;VICVectAddr=0;SEC++;if(SEC23)SEC=0;break;}case5:{while(EXTINT&(10))EXTINT=10;VICVectAddr=0;MIN++;if(MIN23)MIN=0;break;}case6:{while(EXTINT&(10))EXTINT=10;VICVectAddr=0;HOUR++;if(HOUR23)HOUR=0;break;}}}void__irqeint1(void)//向量中断开始,说明有外部中断{switch(change){case1:{while(EXTINT&(11))EXTINT=11;VICVectAddr=0;ALSEC--;if(ALSEC==0XFF)ALSEC=59;break;}case2:{while(EXTINT&(11))EXTINT=11;VICVectAddr=0;ALMIN--;if(ALMIN==0XFF)ALMIN=59;break;}case3:{while(EXTINT&(11))EXTINT=11;VICVectAddr=0;ALHOUR--;if(ALHOUR==0XFF)ALHOUR=23;break;}case4:{while(EXTINT&(11))EXTINT=11;VICVectAddr=0;SEC--;if(SEC==0XFF)SEC=59;break;}case5:{while(EXTINT&(11))EXTINT=11;VICVectAddr=0;MIN--;if(MIN==0XFF)MIN=59;break;}case6:{while(EXTINT&(11))EXTINT=11;VICVectAddr=0;HOUR--;if(HOUR==0XFF)HOUR=23;break;}}}void__irqeint2(void)//向量中断开始,说明有外部中断{change++;if(change6)change=0;while(EXTINT&(12))//等待extint[2]变成1EXTINT=12;//往extint[1]写1清除中断VICVectAddr=0;//向量中断结束}/****************************LCD**************************************//*****************************************************************************名称:WrOp()*功能:写函数****************************************************************************/voidChkBusy(){IODIR=0x700;//设置P0.8~P0.10为输出while(1){IOCLR=rs;//命令选择IOSET=rw;//写操作IOSET=en;//使能有效if(!(IOPIN&busy))break;IOCLR=en;//使能无效}IODIR=0x7ff;//设置P0.0~P0.10为输出}/*****************************************************************************名称:WrOp()*功能:写命令函数****************************************************************************/voidWrOp(uint8dat){ChkBusy();//判忙IOCLR=rs;//全部清零,命令选择IOCLR=rw;//写选择IOCLR=0xff;//先清零IOSET=dat;//再送数IOSET=en;//使能有效IOCLR=en;//使能无效}/*****************************************************************************名称:WrDat()*功能:写数据函数****************************************************************************/voidWrDat(uint8dat){ChkBusy();//判忙IOSET=rs;//数据选择IOCLR=rw;//写选择IOCLR=0xff;//先清零IOSET=dat;//再送数IOSET=en;//使能有效IOCLR=en;//使能无效}/*****************************************************************************名称:lcd_init()*功能:lcd初始化函数****************************************************************************/voidlcd_init(void){WrOp(0x38);//设置16*2显示,5*7点阵WrOp(0x06);//读/写后地址加一,光标加一WrOp(0x0c);//开显示,不显示光标,光标不闪烁}voidDisText(uint8addr,uint8*p){WrOp(addr);//调用写命令函数while(*p!='\0')WrDat(*(p++));}/******************************************************//函数名称:voidlcd_string(uchar*p,ucharflag)//函数功能:1602LCD显示函数//参数功能:*p--显示数据首地址;//flag--显示行数******************************************************/void