课程设计用纸教师批阅基于LPC2138的秒表设计摘要:本设计以ARM7系列中的LPC2138为核心元件,并配合蜂鸣器、串口转换芯片组成的一个秒表系统。与普通秒表相比,本设计并不是用液晶显示器显示时间,而是利用ARM与PC串行通信,把计时时间发送到电脑上的DOS显示屏显示。关键词:ARM;NXPLPC2138;秒表;串行通信Abstract:ThisdesignwiththeLPC2138ARM7seriesforcorecomponents,andcoordinatesthebuzzer,serialportstransitionchipconsistingofastopwatchsystem.Comparedwithordinarystopwatch,thisstopwatchdon’tuseLCDdisplaytime,butbasedontheARMwithPCserialcommunication,thetimingtimewassenttocomputerandshownontheDOSscreen.Keywords:ARM7;NXPLPC2138;Stopwatch;SerialPortCommunication-1-课程设计用纸教师批阅1设计目的与要求1.1设计目的1、注重培养综合运用所学知识、独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训练。2、了解所选择的ARM芯片各个引脚功能,工作方式,计数/定时,I/O口,中断等的相关原理,并巩固学习嵌入式的相关内容知识。3、通过软硬件设计实现利用ARM芯片完成秒表功能。1.2设计要求实现秒表功能,按下K1按钮秒表启动计时,再次按下K1停止并蜂鸣器响,按K2清零,显示在数码管或通过串口显示在屏幕上。-2-课程设计用纸教师批阅2方案设计与论证2.1设计分析于方案论证方案一:做个普通秒表,能让它计时,还可以记住时间,就是按下键后可以记住刚才的显示时间数据,然后将它读出来,只是ARM板没有这么多数码管,只有一个,根本不行,起码要5个,将1秒分成100份快速显示,这样的话4个数码管显示秒表计时时间,最大时间是60秒。方案三:也是个秒表,不用数码管显示,而是将其数据发送到字符窗口显示秒表的计时,并用定时器、串行口发送来显示秒表的计时,这些都用按键控制,再加复位键清零。方案论证:用DOS字符窗口显示秒表的计时比较方便,而且用容易操作,简洁明了。DOS字符窗口只要一连接就可以发送的数据显示出来,发送也可以用定时器与中断控制秒表发送到串行接口。2.2方案选择由于开发板只有一个数码管,所以方案一不好实现;只有方案二可以很好的实现设计要求的功能。-3-课程设计用纸教师批阅3系统硬件设计本设计要实现秒表功能需要组成一个最小系统,其中包括主芯片LPC2138、晶振与复位电路、3.3V电源与滤波电路、按键电路、蜂鸣器电路、串口电路,P0.14脚接一个上拉电阻。3.1主芯片本设计所用的芯片是NXP公司的LPC2138,具有丰富的外设资源,可以很好的实现秒表计时功能。对于LPC2138芯片,最小系统需要1组3.3伏的电源,复位电路,晶振电路,P0.14脚接一个上拉电阻,而要实现本设计的秒表功能,还要外接按键电路、蜂鸣器电路及串口电路。如图4-1所示,为LPC2138芯片原理图。LPC2138内嵌512KB的高速Flash存储器和32KB的RAM,具有丰富的外设资源:2个32位定时器;2个10位8路ADC;1个10位DAC;PWM通道;47路GPIO;9个边沿或电平触发的外部中断;RTC;多个串行接口(UART、I2C、SPI、SSP)。它内含向量中断控制器,可配置中断优先级和向量地址,片内Boot装载程序可以实现在系统/在应用编程(ISP/IAP),通过片内PLL可实现60MHz的CPU操作频率,具有空闲和掉电2种低功耗模式,并且可通过外部中断唤醒。-4-课程设计用纸教师批阅图3-1主芯片3.2晶振与复位电路晶振电路用于向CPU提供工作时钟。微控制器可以使用内部的晶体振荡器产生时钟信号,也可以从外部引入时钟信号,而本设计采用振荡模式,如图4-2所示。使用时,时钟信号有内部晶体振荡器和外部连接的晶体振荡产生,振荡频率范围:1-30(MHz)。复位电路完成系统的上电复位和系统在运行是的按键复位功能。本系统选择的是外部复位电路,如图4-3所示,把nRESET引脚拉为低电平,并保持一个最小时间,引发复位。-5-课程设计用纸教师批阅图3-2晶振电路图3-3复位电路3.3电源与滤波电路LPC2138及部分外围器件的工作电压为3.3V,因为系统的要求比较高,且其功耗不是很大,所以不适合开关电源,应当用低压差模拟电源。合乎技术参数的稳压LDO芯片很多,本设计选用DS2434,如图4-5所示。而后接的滤波电路可以滤除电源的毛刺,使3.3V电压更加平稳,如图4-5所示。图3-43.3V电源图3-5滤波电路3.4按键电路通过GPIO外设接按键输入,P0需要接上拉电阻,电路如图4-6所示。当按键按下时为低电平,不按时为高电平。按下KEY1按钮秒表启动计时,再次按下KEY1停止并蜂鸣器响,按KEY2清零。-6-课程设计用纸教师批阅图3-6按键连接3.5蜂鸣器电路通过GPIO外设接蜂鸣器,上拉电阻R22可以避免当IO口作为输入时Q1基极悬空引起漏电。通过IO口控制蜂鸣器的供电,高电平时蜂鸣器停止鸣叫,低电平时开始鸣叫。电路如图4-7所示。图3-7蜂鸣器-7-课程设计用纸教师批阅3.6串口电路本设计秒表计时时间的显示,通过串口UART0把数据发送到PC端显示在DOS字符窗口中。由于PC机串口是RS-232点评,所以连接时需要使用RS-232转换器,本设计所用的转换芯片为MAX232,具体电路如图4-8所示。图3-8串口电路-8-课程设计用纸教师批阅4程序流程图本设计软件的实现方法是,程序运行开始检查KEY1键有没按下,如果按下则启动定时器,开始计时。在整个程序的运行过程中,串口实时发送中断服务程序中的ss、s、m、h变量的值到PC机,由PC机的DOS窗口显示定时时间。程序在定时器启动后,检查KEY1键是否按下第二次,如果KEY1键按下第二次则停止定时器,暂停计时,此时检查KEY2键是否按下,如果按下,则程序的变量复位清零,DOS屏幕清零,然后重新检查KEY1键是否按下以决定是否要重新开始定时,具体主程序流程图如图4-1所示。程序运行时定时器启动后,当定时器计数值等于匹配值时,产生中断,中断服务程序实现的功能是统计定时器中断的次数,每1次代表10毫秒,每100次代表1秒,每6000次代表1分钟,每360000次代表1小时,程序每统计一次后,清除中断标志,通知VIC中断处理结束并返回中断原点,具体流程图如图4-2所示。-9-课程设计用纸教师批阅否否否是是是否是开始图4-1主程序流程图设置P0.16、P0.17为GPIO口,P0.0为TxD0,P0.1为RxD0IRQ中断使能,初始化UART0定时器初始化:时钟分频、定时器初值、匹配后产生中断、定时时间、使能定时器VIC中断向量控制器设置:设置为向量中断;分配中断通道;设置中断服务程序地址;使能Timer0中断消除抖动,变量复位,DOS清屏,启动定时器停止定时器,蜂鸣器响显示暂停时间KEY1是否按下KEY1是否再次按下KEY1是否按下实时显示当前时间KEY2是否按下清零恢复计时-10-课程设计用纸教师批阅否是否是否是图4-2中断服务程序流程图Timer0中断服务程序开始SS自加1SS等于0;S加1S等于0;m加1SS是否=100?直到h等于24S是否=60?m等于0;h加1通知VIC中断处理结束m是否=60?清除Timer0中断标志返回原中断点-11-课程设计用纸教师批阅5程序清单本设计是使用C语言进行编制程序,并使用ARMDevelopersuitv1.2软件的编译器编译下载代码到LPC2138开发板中,以下为程序代码:/****************************************************************/#includeconfig.h#includestdio.h#defineUART_BPS115200//通讯波特率115200#defineBEEPCON17uint32k1=116;uint32k2=117;uint32h=0,m=0,s=0,ss=0,i=1;charstr[20],strr[];void__irqIRQ_Timer0(void){ss++;if(ss==100){ss=0;s++;}if(s==60){s=0;m++;}if(m==60){m=0;h++;}if(h==60){h=0;}T0IR=0x01;//清除中断标志VICVectAddr=0x00;//返回}voiddelay(uint32dly){uint32i;for(;dly0;dly--)for(i=0;i5000;i++);}voidUART0_Init(void){uint16Fdiv;U0LCR=0x83;//DLAB=1Fdiv=(Fpclk/16)/UART_BPS;U0DLM=Fdiv/256;U0DLL=Fdiv%256;U0LCR=0x03;}-12-课程设计用纸教师批阅voidUART0_SendByte(uint8data){U0THR=data;while((U0LSR&0x40)==0);//等待数据发送完毕}voidPC_DispChar(uint8x,uint8y,uint8chr,uint8color){UART0_SendByte(0xff);//起始字符UART0_SendByte(x);UART0_SendByte(y);UART0_SendByte(chr);UART0_SendByte(color);}voidISendStr(uint8x,uint8y,uint8color,char*str){while(1){if(*str=='\0')break;//结束字符PC_DispChar(x++,y,*str++,color);}}voidreset(){h=0;m=0;s=0;ss=0;}voidxianshi(){sprintf(str,%2d:%2d:%2d:%2d,h,m,s,ss);ISendStr(1,1,0x30,str);}intmain(void){PINSEL0=0x00000005;IO0DIR=BEEPCON;IRQEnable();//IRQ中断使能-13-课程设计用纸教师批阅/*定时器0初始化*/T0TC=0;//定时器设置为0T0PR=0;//时钟不分频T0MCR=0x03;//设置T0MR0匹配后复位T0TC,并产生中断标志T0MR0=Fpclk/100;//1ms秒钟定时UART0_Init();/*设置定时器0中断IRQ*/VICIntSelect=0x00;VICVectCntl0=0x20|0x04;VICVectAddr0=(uint32)IRQ_Timer0;VICIntEnable=(10x04);sprintf(strr,TheTimeIs:);ISendStr(1,0,0x30,strr);reset();while(IO0PIN&k1);//等待K1按下delay(80);while(!(IO0PIN&k1));//K1按下T0TCR=0x01;//启动定时器while(1){if((IO0PIN&k1)==0)//等待K1第2次按下{while(!(IO0PIN&k1));//K1第2次按下delay(80);T0TCR=0x00;//停止计时IO0CLR=BEEPCON;//蜂鸣器响while((IO0PIN&k1)){if((IO0PIN&k2)==0)//K2按下{reset();//复位xianshi();//DOS屏清零IO0SET=BEEPCON;//蜂鸣器停止鸣叫}}while