信息与电气工程学院课程设计说明书(2011/2012学年第一学期)课程名称:DSP控制器及其应用题目:万年历设计专业班级:学生姓名:学号:指导教师:设计周数:设计成绩:2012年1月5日11课程设计目的1.1设计目的本次课程设计的主要目的是以2812DSP芯片为核心控制电子钟,具有多项显示,用2812上的LCD液晶显示屏显示当前年、月、日、星期、时、分、秒,可实现电子时钟功能完成以下操作目的:(1)学习ICETEK-F2812-A板及教学实验箱的使用;(2)学习DSP芯片的I/O端口的控制方法;(3)熟悉字模的简单构建和使用;(4)熟悉Emulator方式下的程序调试规程,并最终能够熟练掌握在DSP软硬件环境下的程序开发流程;(5)能够对现有器件进行简单地编程,实现各种简单地显示控制。1.2设计要求⑴此系统可对秒分时月和年进行计数⑵设计硬件外扩电路,同时设计软件程序进行软硬件联系调试⑶最后在液晶显示屏上显示2硬件设计本设计采用TMS320F2812来实现系统的控制。时钟芯片采用DS1302,显示采用液晶LCD12864显示。此系统硬件简洁,将复杂的硬件功能用软件实现,因此系统控制灵活,能很好地满足本题的基本要求和扩展要求。本系统以F2812为核心控制部件,利用软件编程,通过液晶显示实现了时钟功能,能实现题目的基本要求和发挥部分。尽量做到硬件电路简单稳定,减小电磁干扰和其他环境干扰,充分发挥软件编程的优点,减小因元器件精度不够引起的误差。由于时间有限和本身知识水平的发挥,我们认为本系统还有需要改进和提高的地方,例如选用更高精度的元器件,硬件电路更加精确稳定,软件测量算法进一步的改进与完善等。方案框图如图1所示。2.1单元电路设计2.1.1控制部件的选择2图1电路总体框图本系统采用TMS320F2812DSP芯片来实现系统的控制。TMS320F2812DSP有多达56个通用数字量输入输出端口(GPIO),其中绝大部分是通用I/O和专用功能复用引脚。通常情况下,TMS320F2812的大多数I/O引脚都用作专用功能引脚。数字量I/O端口模块采用了一种灵活的配置方法控制复用引脚的功能,GPIOMux寄存器用来选择F281x和C281x引脚的操作模式,可以通过该寄存器独立设置每个引脚的功能(数字量I/O或外设专用I/O)。如果选择数字量I/O模式,可以通过GPxDIR寄存器配置数字量I/O的方向,并通过寄存器GPxQUAL进一步消除数字量I/O引脚的噪声信号。此外,处理器提供GPxSET和GPxCLEAR寄存器对数字量进行置位或清零,还可以GPxDAT寄存器独立读/写I/O信号。TMS320F2812DSP对所有数字量I/O进行分组,每组作为一个端口,分别是GPIO-A、B、C、D、E、F和G,C28x的绝大多数引脚内部都连接多个功能单元,但并不是所有功能单元都能同时工作,即在某一时刻一个引脚只能用作一种功能。所有的GPIO端口由各自的GPxMUX复用寄存器控制,控制位设置为0时,相应的引脚作为通用数字量I/O使用;设置为1时,相应的引脚作为专用引脚使用。当设置为数字量I/O功能时,寄存器GPxDIR确定I/O端口的方向;控制位清零引脚配置为数字量输入;置1配置为数字量输出。具有输入量化功能的引脚,用户可以定义量化时间长度以消除不必要的干扰信号。由于引脚的输出缓冲直接连接到输入缓冲,当前GPIO引脚上的任何信号都会同时传送到外设模块。因此,当GND+5VADDPWM4PWM3VSSPWM2V0IOPA7IOPA6IOPA5RESTIOPA4IOPA3OSCBYPTXAL1TXAL2IOPB0-IOPB7ECS1CS2R/WRSDB0-DB7RSTI/OSCLKVCC1/VCC2X1/X2GND复位电路OSCBYP为高电平。采用内部振荡双电源32768hz10KHY--12864TMS320LF2812DS13023引脚配置为GPIO功能时,相应的外设功能(和中断产生功能)必须通过复用寄存器禁止,否则将会首先触发中断,这一点对于PDPINTA和PDPINTB引脚尤其重要。如果复用引脚配置为数字I/O模式,则可以直接利用数字寄存器对I/O操作(读/写)也可以利用其他辅助寄存器对各I/O进行独立操作,如将数字I/O置位(GPxSET寄存器)、数字I/O清零(GPxCLEAR寄存器)及数字I/O电平转换(GPxTOGGLE寄存器)。2.1.2时钟芯片的选择本设计为数字万年历LCD的设计,根据题目采用时钟芯片DS1302。该芯片可以进行时分秒的计数,实时时钟具有能计算2000至2100年之间的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM指示决定采用24或12小时格式。双电源管脚用于主电源和备份电源供应,Vcc1为可编程涓流充电电源,附加七个字节存储器。可编程接口,还具有报警功能和掉电保存功能,并且可以对其方便的进行程序控制,完全能满足题目的要求。DS1302的管脚图如图2所示。图2DS1302的管脚图管脚描述:X1,X2——32.768KHz晶振管脚GND——地RST——复位脚I/O——数据输入/输出引脚SCLK——串行时钟Vcc1,Vcc2——电源供电管脚2.3、电路原理图18273645I/ORSTSCLKGNDVCC2X2X1VCC14如图3所示。图3电路原理图三、软件设计3.1系统分析根据本系统设计要求和硬件连接电路,软件实现主要包括三个主要部分:1302时钟芯片的读写程序,液晶显示程序和主函数部分。首先应该对1302芯片进行检测,对其进行初始化设置,比如设置运行位,选择12小时还是24小时计数制。设置完成以后,便可以写入读写程序。1302是通过I/O口一位一位地写入与读出数据。在此需要设置读写时序,选择I/O端口为输入还是输出。液晶显示部分,主要是利用通过字模提取软件计算出来的数组矩阵,选择要显示的汉字、数字或者字符。显示每一个汉字、数字或字符时,应先设置起始页,起始列,然后将所对应的数组中的数据按序写入到LCD数据控制扩展接口中,其中写入左屏的数据地址为0x108003,写入右屏的数据地址为0x108004,依次分别写入年、月、日、星期、时、分、秒。主程序的编写,首先要对2812DSP芯片的寄存器进行设置,选择输入输出方式。设置完成,打开显示器,清除显示器显示内存,设置起始行,然后循环读取1302中指示的当前时间。便可以在12864液晶显示屏上准确读出当前时刻。3.2软件系统设计3.2软件系统设计时钟芯片1302程序流程图如图4所示。G19DIR1A12B118A23B217A34B316A45B415A56B514A67B613A78B712A89B81174LS245G19DIR1A12B118A23B217A34B316A45B415A56B514A67B613A78B712A89B81174LS245R1200K30M30uF30uF4.7uPWM5PWM6PWM7PWM8PWM9PWM10PWM11PWM12T1PWMT2PWMC1TRIPC2TRIPC3TRIPC4TRIPMP/MCGNDVDD(10)XTAL1XTAL2PWM1PWM2PWM3PWM4VDDIO(6)PRORESETOSCBYPF2812VCCVCCVCCVCC21X12X23GND4VCC18SCLK7I/O6RST5DS13026pCAP6pCAP32768CRBU2NOTU1NOTVCCVCCVCC电源模块BL_BL+VEEVOLVCCGNDRETCS2CS1ER/WRSDB7DB6DB5DB4DB3DB2DB1DB0A?*51302的程序:函数名:SetByte()功能:向DS1302写入1Byte数据输入参数:DSAdree写入的数据返回值:无图4时钟芯片1302程序流程图voidSetByte(ucharDSAdree){uchari,DS;使1302不具备写保护hufdksjjgkldf护护复位产生一个高电平变量初始化写1302地址地址增加复位产生一个高电平平生将该地址数据读出延时一段时间向该地址写数据开始数据写完?写1302地址延时一段时间地址增加数据读完?显示数据NYNY6DS=DSAdree;Ioout();//设置端口为输出for(i=8;i0;i--){if(DS&0x01){GpioDataRegs.GPADAT.bit.GPIOA1=1;//I/O}else{GpioDataRegs.GPADAT.bit.GPIOA1=0;}GpioDataRegs.GPADAT.bit.GPIOA2=1;Delay(1);GpioDataRegs.GPADAT.bit.GPIOA2=0;Delay(1);DS=DS1;}Ioin();}函数名:GetByte()功能:从DS1302读取一字节输入参数:无返回值:一个字节ucharGetByte(void){uchari,DS;Ioin();//设置端口为输入DS=0;for(i=8;i0;i--)7{DS=(DS1);if(GpioDataRegs.GPADAT.bit.GPIOA1){DS|=0x80;}else{DS&=0x7f;}GpioDataRegs.GPADAT.bit.GPIOA2=1;Delay(1);GpioDataRegs.GPADAT.bit.GPIOA2=0;Delay(1);}return(DS);}函数名:WriteDataToDS1302()功能:向DS1302写入数据调用:InputByte(),GetByte()入口参数:DSAdree:DS1302地址,DSData:要写的数据返回值:无voidWriteDataToDS1302(ucharDSAdree,ucharDSData){GpioDataRegs.GPADAT.bit.GPIOA0=0;GpioDataRegs.GPADAT.bit.GPIOA2=0;Delay(1);GpioDataRegs.GPADAT.bit.GPIOA0=1;SetByte(DSAdree);//地址,命令SetByte(DSData);//写1Byte数据8GpioDataRegs.GPADAT.bit.GPIOA2=1;GpioDataRegs.GPADAT.bit.GPIOA0=0;}函数名:ReadDataDS1302()功能:读取DS1302某地址的数据调用:RTInputByte(),RTOutputByte()入口参数:ucAddr:DS1302地址返回值:ucData:读取的数据ucharReadDataDS1302(ucharDSAdree){ucharDSData;GpioDataRegs.GPADAT.bit.GPIOA0=0;GpioDataRegs.GPADAT.bit.GPIOA2=0;//SCLKDelay(1);GpioDataRegs.GPADAT.bit.GPIOA0=1;//RSTSetByte(DSAdree);//地址,命令DSData=GetByte();//读1Byte数据GpioDataRegs.GPADAT.bit.GPIOA2=1;GpioDataRegs.GPADAT.bit.GPIOA0=0;return(DSData);}voidsettime_ds1302(){uchari;WriteDataToDS1302(0x8e,0x00);//writeenablefor(i=0;i7;i++)//settime--second,munite,hour,day,month,week,year9{WriteDataToDS1302(0x80+i*2,timedata[i]);}WriteDataToDS1302(0x8e,0x80);}voidreadtime_ds1302(){intn;for(n=0;n7;n++){timedata[n]=ReadDataDS1