ARM设计实验报告_第1页
ARM设计实验报告_第2页
ARM设计实验报告_第3页
ARM设计实验报告_第4页
ARM设计实验报告_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录实验目的实验软件,硬件实验题目及要求(设计要求)软件时钟设计总体方案软件时钟的电路原理图程序流程图及C程序(软件部分)Proteus仿真图(硬件部分)一实验目的。应用所学的ARM知识设计一个实时时钟掌握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带日历和时钟功能,要使用它也要进行一下的基本操作:设置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发生才有意义。在判断状态是我灵活的使用了C语言开关语句——switch,可以优化程序使程序看起来更紧凑,一目了然。五软件时钟的电路原理图六程序流程图及C程序(软件部分)#include"config.h"#definers(1<<8)#definerw(1<<9)#defineen(1<<10)#definebusy(1<<7)#defineFPCLK2764800Luint8change;uint8txt[]={"ALM:"};uint8MESSAGE[]={"RTC:"};/**********************************外部中断*************************************/void__irqeint0(void)//向量中断开始,说明有外部中断 { switch(change) { case1:{while(EXTINT&(1<<0))EXTINT=1<<0;VICVectAddr=0;ALSEC++;if(ALSEC>59)ALSEC=0;break;} case2:{while(EXTINT&(1<<0))EXTINT=1<<0;VICVectAddr=0;ALMIN++;if(ALMIN>59)ALMIN=0;break;} case3:{while(EXTINT&(1<<0))EXTINT=1<<0;VICVectAddr=0;ALHOUR++;if(ALHOUR>23)ALHOUR=0;break;} case4:{while(EXTINT&(1<<0))EXTINT=1<<0;VICVectAddr=0;SEC++;if(SEC>23)SEC=0;break;} case5:{while(EXTINT&(1<<0))EXTINT=1<<0;VICVectAddr=0;MIN++;if(MIN>23)MIN=0;break;} case6:{while(EXTINT&(1<<0))EXTINT=1<<0;VICVectAddr=0;HOUR++;if(HOUR>23)HOUR=0;break;} } } void__irqeint1(void)//向量中断开始,说明有外部中断 { switch(change) { case1:{while(EXTINT&(1<<1))EXTINT=1<<1;VICVectAddr=0;ALSEC--;if(ALSEC==0XFF)ALSEC=59;break;} case2:{while(EXTINT&(1<<1))EXTINT=1<<1;VICVectAddr=0;ALMIN--;if(ALMIN==0XFF)ALMIN=59;break;} case3:{while(EXTINT&(1<<1))EXTINT=1<<1;VICVectAddr=0;ALHOUR--;if(ALHOUR==0XFF)ALHOUR=23;break;} case4:{while(EXTINT&(1<<1))EXTINT=1<<1;VICVectAddr=0;SEC--;if(SEC==0XFF)SEC=59;break;} case5:{while(EXTINT&(1<<1))EXTINT=1<<1;VICVectAddr=0;MIN--;if(MIN==0XFF)MIN=59;break;} case6:{while(EXTINT&(1<<1))EXTINT=1<<1;VICVectAddr=0;HOUR--;if(HOUR==0XFF)HOUR=23;break;} } }void__irqeint2(void) //向量中断开始,说明有外部中断 { change++; if(change>6) change=0; while(EXTINT&(1<<2))//等待extint[2]变成1 EXTINT=1<<2; //往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--显示行数******************************************************/voidlcd_string(uint8*p,uint8flag){ if(flag==1) { DisText(0x80,p); //指定显示地址,第一行显示 } if(flag==2) { DisText(0xc0,p); //指定显示地址,第二行显示 }}/*****************************RTC**********************************/voidRTCIni(void){PREINT=FPCLK/32768-1;//设置预分频器PREFRAC=FPCLK-(FPCLK/32768)*32768;YEAR=2005;//初始化年MONTH=6;//初始化月DOM=10;//初始化日HOUR=8;MIN=30;SEC=0;ALHOUR=8;ALMIN=50;ALSEC=37;AMR=0xf8;CIIR=0x01;//设置秒值的增量产生一次中断CCR=0x01;//启动RTC}/********************************************************************************名称:SendTimeRtc()*功能:读取RTC的时间值,并将读出的时分秒值由lcd1602显示,显示报警时间*******************************************************************************/voidSendTimeRtc(void){MESSAGE[4]=HOUR/10+'0'; //时的值MESSAGE[5]=HOUR%10+'0';MESSAGE[6]=':';MESSAGE[7]=MIN/10+'0';//取得分的值MESSAGE[8]=MIN%10+'0';MESSAGE[9]=':';MESSAGE[10]=SEC/10+'0';//取得秒的值MESSAGE[11]=SEC%10+'0';lcd_string(MESSAGE,1);txt[4]=ALHOUR/10+'0'; //时的报警值txt[5]=ALHOUR%10+'0';txt[6]=':';txt[7]=ALMIN/10+'0'; //分的报警值txt[8]=ALMIN%10+'0';txt[9]=':';txt[10]=ALSEC/10+'0'; //秒的报警值txt[11]=ALSEC%10+'0';lcd_string(txt,2);}voidDelayNS(uint32dly){uint32i;for(;dly>0;dly--)for(i=0;i<500;i++);}/************************************************************************************************主函数**************************************/intmain(){ lcd_init(); //LCD初始化 RTCIni(); //RTC初始化 PINSEL0=PINSEL0|0XA0000000; //选择外部中断1,2 PINSEL1=PINSEL1|0X00000001; //选择外部中断0 //EXTPOLAR=0X00; //低电平或下降沿 //EXTMODE=0X07; //下降沿 VICIntSelect=0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论