ImageVerifierCode 换一换
格式:DOCX , 页数:34 ,大小:325.89KB ,
资源ID:27464195      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/27464195.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(dsp课程设计 万年历设计.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

dsp课程设计 万年历设计.docx

1、dsp课程设计 万年历设计课程设计说明书(学年第二学期)课程名称 : DSP控制器及其应用 题 目 : 万年历设计 专业班级 : 学生姓名 : 学 号: 指导教师 : 设计周数 : 2周 设计成绩 : 年月日 1 课程设计目的 12 硬件设计 12.1硬件方案设计12.2单元电路设计22.2.1控制部件 22.2.2时钟芯片 32.2.3显示模块 52.3电路原理图62.4硬件调试63 软件设计 73.1系统分析 73.2软件系统设计73.3软件代码实现103.4软件调试224 课程设计体会总结 225 参考文献 231 课程设计目的课程设计的主要目的是用tms320f2812芯片为核心控制部

2、件,设计一个能用LCD液晶显示屏显示当前年,月,日,时,分,秒以及星期的具有电子时钟功能的万年历。 学习并了解ICETEK-F2812-A板及教学实验箱的使用; 学习DSP芯片的I/O端口的控制方法; 熟悉字模的简单构建和使用; 熟悉Emulator方式下的程序调试规程,并最终能够熟练掌握在DSP软硬件环境下的程序开发流程;能够对现有器件进行简单地编程,实现各种简单地显示控制。2 硬件设计 2.1 硬件方案设计本系统以TMS2812为核心控制部件,利用软件编程,通过DS1302进行时钟控制,使用12864 LCD液晶显示器进行时钟显示,能实现题目的基本要求,尽量做到硬件电路简单稳定,减小电磁干

3、扰和其他环境干扰,充分发挥软件编程的优点,减小因元器件精度不够引起的误差。由于时间有限和本身知识水平的发挥,我们认为本系统还有需要改进和提高的地方,例如选用更高精度的元器件,硬件电路更加精确稳定,软件测量算法进一步的改进与完善等。总体框图如图1所示。 图1 电路总体框图2.2 单元电路设计2.2.1 控制部件 TMS320F2812结构及性能本次课设所使用的TMS320F2812是ICETEK-F2812-A型DSP用户板中集成试验箱,所以下面主要对该板各个板块及其功能的描述。图3-1 F2812-A 板的实物图下面说明该些接口及其功能如表3-1:在本次设计中主要用到P1口中的pwm引脚作为I

4、/O口来传送数据。P1 接口主要是扩展评估板上空闲的DSP 外设引脚,以便于定制用户的硬件环境。由于这组引脚是直接来自于F2812 DSP 芯片,因此,这些引脚为TTL 3.3V 标准,其输出最高电压为3.3V。所以在ds1302中要用四个二极管来降压,关于其接口的设置可以用软件对每个引脚功能设计。表3-1接口和功能分类功能分类接口名称接口定义电源接口POWER5V 电源输入外设接口DB9九针D 型串口总线接口P134芯外扩总线P234芯外扩总线P334芯外扩总线P434芯外扩总线指示灯POW_LED电源指示灯USER_LED用户使用的发光管辅助接口DSP_JTAG:DSP 仿真器接口开关US

5、ER_SW用户使用的开关RESET手动复位开关JP3SCI 选择AD参考电压选择ADREFLO1AD 参考低电压输入ADREFIN1测试端,必须悬空模式选择跳线MP/MC1MP/MC方式选择MDXA1SCITXDA1SPICLKA1SPISTEA12.2.2 时钟芯片 DS1302结构及其功能 DS1302的引脚图3-2 DS1302的引脚图图3-2DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc10.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1

6、时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK

7、始终是输入端。 DS1302的结构及工作原理DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。 DS1302的控制字节表3-2 DS1302的控制字节1RAM CKA4A3A2A1

8、A0RAM KDS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。 DS1302的连接 DS1302与CPU的

9、连接需要三条线,即SCLK(7)、I/O(6)、RST(5)。如图3-3:图3-3 DS1302连接图2.2.3 显示模块 LCD12864液晶显示采用LCD12864液晶显示。液晶显示器(LCD)具有功耗低、体积小、重量轻、超薄等许多其它显示器无法比拟的优点。12864分左屏和右屏是由两块64*64的液晶组成,有CS1和CS2左右屏使能引脚。64*64的共分8页, 8行led液晶是一页,每行分别是由DB0_DB7控制,也就是从单片机中发64次8位的二进制数可以扫一页,发64(8页)次的二进制数可以扫一个半屏,再乘以二就可以扫全屏,当把二进制数全发完了,才可以控制液晶开始显示。单片机可以通过数

10、据总线与控制信号直接采用存储器访问形式、I/O设备访问形式控制该液晶显示模块。液晶显示模块的访问、控制是由2812DSP 对扩展扩展接口的操作完成。控制扩展口的寻址:命令控制扩展接口的地址为0x,数据控制扩展接口的地址为0x 和0x,辅助控制扩展接口的地址为0x。显示控制方法:液晶显示模块中有两片显示缓冲存储器,分别对应屏幕显示的象素,向其中写入数值将改变显示,写入“1”则显示一点,写入“0”则不显示。发送控制命令:向液晶显示模块发送控制命令的方法是通过向命令控制扩展接口写入命令控制字,然后再向辅助控制接口写入0;显示开关:0x3f 打开显示;0x3e 关闭显示;设置显示起始行:0x0c0+起

11、始行取值,其中起始行取值为0 至63;设置操作页:0x0b8+页号,其中页号取值为 0-7;设置操作列:0x40+列号,其中列号为取值为0-63;写显示数据:在使用命令控制字选择操作位置(页数、列数)之后,可以将待显示的数据写入液晶显示模块的缓存。将数据发送到相应数据控制扩展接口即可。2.3电路原理图电路原理图如图3所示。图3 电路原理图2.4 硬件调试硬件调试可分为静态调试与动态调试两步进行。静态调试是在用户系统未工作时的一种硬件检测。第一步:目测。检查外部的各种元件或者是电路是否有断点。第二步:用万用表测试。先用万用表复核目测中有疑问的连接点,再检测各种电源线与地线之间是否有短路现象。第三

12、步:加电检测。给板加电,检测所有插座或是器件的电源端是否符合要求的值。 第四步:联机检查。因为只有用单片机开发系统才能完成对用户系统的调试。 动态调试是在用户系统工作的情况下发现和排除用户系统硬件中存在的器件内部故障、器件连接逻辑错误等的一种硬件检查。动态调试的一般方法是由近及远、由分到合。由分到合是指首先按逻辑功能将用户系统硬件电路分为若干块,当调试电路时,与该元件无关的器件全部从用户系统中去掉,这样可以将故障范围限定在某个局部的电路上。当各块电路无故障后,将各电路逐块加入系统中,在对各块电路功能及各电路间可能存在的相互联系进行调试。由分到合的调试既告完成。由近及远是将信号流经的各器件按照距

13、离单片机的逻辑距离进行由近及远的分层,然后分层调试。调试时,仍采用去掉无关元件的方法,逐层调试下去,就会定位故障元件了。在这个过程之中,首先要考虑所有器件的大小,从而能够在电路板上正确安排足够的空间,此外还要考虑器件只能装的方向以及引脚的位置,尽可能的使引脚的连接简单明了,减少错误的出现。最后更要通过整个电路板的测试,来确定是否达到要求,只有每个节点的线路状况完全良好,才能继续以后的步骤。并且在软件调试阶段要维护电路板的完整性以及正确性,因为在软件测试时需要不断的测试系统,而不断的移动电路板,可能会导致线路连接的可靠性,还可能有人为的原因造成连接不够良好,或者节点之间的连接脱落等状况,因而在整

14、个试验过程中都要保持电路板的正常工作。最重要的是电源的连接正确,否则可能导致期间的烧毁。在老师的监督下以及同学的帮助下,几经波折的调试后,我们的系统圆满的实现预定的要求:准确显示当前时间。3 软件设计3.1 系统分析根据本系统设计要求和硬件连接电路,软件实现主要包括三个主要部分:1302时钟芯片的读写程序,液晶显示程序和主函数部分。首先应该对1302芯片进行检测,对其进行初始化设置,比如设置运行位,选择12小时还是24小时计数制。设置完成以后,便可以写入读写程序。1302是通过I/O口一位一位地写入与读出数据。在此需要设置读写时序,选择I/O端口为输入还是输出。液晶显示部分,主要是利用通过字模

15、提取软件计算出来的数组矩阵,选择要显示的汉字、数字或者字符。显示每一个汉字、数字或字符时,应先设置起始页,起始列,然后将所对应的数组中的数据按序写入到LCD数据控制扩展接口中,其中写入左屏的数据地址为0x ,写入右屏的数据地址为0x,依次分别写入年、月、日、星期、时、分、秒。主程序的编写,首先要对2812DSP芯片的寄存器进行设置,选择输入输出方式。设置完成,打开显示器,清除显示器显示内存,设置起始行,然后循环读取1302中指示的当前时间。便可以在12864液晶显示屏上准确读出当前时刻。3.2 软件系统设计时钟芯片1302程序流程图如图4所示。图4 时钟芯片1302程序流程图液晶显示程序流程图

16、如图5所示。图5 液晶显示程序流程图主函数流程图如图6所示。图6 主函数流程图3.3 系统实现代码/主函数void main() EALLOW; GpioMuxRegs.GPAMUX.all=0x0000; /io GpioMuxRegs.GPADIR.all=0x000d; / 输出 pwm1 pwm2 pwm3 pwm4 EDIS; InitDS1302(); settime_ds1302(); /设置时间 InitSysCtrl(); *(int *)0x=0x80; / 初始化ICETEK-CTR 0x:全局控制寄存器 Delay(LCDDELAY); *(int *)0x=0x0;

17、Delay(LCDDELAY); *(int *)0x=0x80; Delay(LCDDELAY); *(int *)0x=0; / 关闭东西方向的交通灯 Delay(LCDDELAY); *(int *)0x=0x40; / 关闭南北方向的交通灯 Delay(LCDDELAY); TurnOnLCD(); / 打开显示 LCDCLS(); / 清除显示内存 *(int *)0x=LCDCMDSTARTLINE; / 设置显示起始行 命令控制接口的地址为 0x Delay(LCDDELAY); *(int *)0x=0; /辅助控制接口的地址为 0x 向液晶显示模块发送控制命令的方法是通过向命

18、令控制扩展接口写入命令控制字,然后再向辅助控制接口写入0 Delay(LCDDELAY); xingqi_display(); for (;) readtime_ds1302(); /读出当前时间,读出7个字节 time_display(); /初始化1302void InitDS1302(void) GpioDataRegs.GPADAT.bit.GPIOA2=0; GpioDataRegs.GPADAT.bit.GPIOA0=0; WriteDataToDS1302(0x8E, 0x00); /写保护关闭 /Sec = ReadDataDS1302(0x81); WriteDataToDS

19、1302(0x80, 0x7F); /设置运行位 sec位 WriteDataToDS1302(0x84,0x00); /设置为24小时制 /WriteDataToDS1302(0x90, 0xAB); /启用电池充电,双二极管,8K电阻。 WriteDataToDS1302(0x8E, 0x80); /写保护开启/向1302中写入一字节void SetByte(uchar DSAdree) uchar i,DS; DS = DSAdree; Ioout(); /设置端口为输出 for(i = 8; i 0; i -) if (DS & 0x01) GpioDataRegs.GPADAT.bi

20、t.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 = DS 1; Ioin(); /从1302中读一字节uchar GetByte(void) uchar i,DS; Ioin(); /设置端口为输入 DS = 0; for(i = 8; i 0; i -) DS = (DS 1); if (GpioDataRegs.GPADAT.bit.GPIOA1)

21、 DS |= 0x80; else DS &= 0x7f; GpioDataRegs.GPADAT.bit.GPIOA2=1; Delay(1); GpioDataRegs.GPADAT.bit.GPIOA2=0; Delay(1); return (DS);/写数据void WriteDataToDS1302(uchar DSAdree, uchar DSData) GpioDataRegs.GPADAT.bit.GPIOA0=0; GpioDataRegs.GPADAT.bit.GPIOA2=0; Delay(1); GpioDataRegs.GPADAT.bit.GPIOA0=1; Se

22、tByte(DSAdree); / 地址,命令 SetByte(DSData); / 写1Byte数据 GpioDataRegs.GPADAT.bit.GPIOA2=1; GpioDataRegs.GPADAT.bit.GPIOA0=0;/读数据uchar ReadDataDS1302(uchar DSAdree) uchar DSData; GpioDataRegs.GPADAT.bit.GPIOA0=0; GpioDataRegs.GPADAT.bit.GPIOA2=0; /SCLK Delay(1); GpioDataRegs.GPADAT.bit.GPIOA0=1; /RST SetB

23、yte(DSAdree); / 地址,命令 DSData = GetByte(); / 读1Byte数据 GpioDataRegs.GPADAT.bit.GPIOA2=1; GpioDataRegs.GPADAT.bit.GPIOA0=0; return(DSData);/设定时间void settime_ds1302() uchar i; WriteDataToDS1302(0x8e,0x00); /write enable for(i=0;i7;i+) /set time-second,munite,hour,day,month,week,year WriteDataToDS1302(0x

24、80+i*2,timedatai); WriteDataToDS1302(0x8e,0x80); /write protect/读时间void readtime_ds1302() int n; for(n=0;n7;n+) timedatan=ReadDataDS1302(0x81+n*2); /设置端口为输入void Ioin() EALLOW; GpioMuxRegs.GPADIR.bit.GPIOA1=0; EDIS;/设置端口为输出void Ioout() EALLOW; GpioMuxRegs.GPADIR.bit.GPIOA1=1; EDIS;/固定汉字显示void xingqi_

25、display() int i,nBW=0; *(int *)0x=LCDCMDPAGE+1; / 设置操作页=1 Delay(LCDDELAY); *(int *)0x=0; Delay(LCDDELAY); *(int *)0x=LCDCMDVERADDRESS; / 起始列=0 Delay(LCDDELAY); *(int *)0x=0; Delay(LCDDELAY); for ( i=0;i8;i+ ) *(int *)0x=( nBW=0 )?(ledkey2i):(ledkey2i); / 在左屏第1页第0行第0列显示数字20 Delay(LCDDELAY); *(int *)0

26、x=0; Delay(LCDDELAY); for ( i=0;i8;i+ ) *(int *)0x=( nBW=0 )?(ledkey0i):(ledkey0i); Delay(LCDDELAY); *(int *)0x=0; Delay(LCDDELAY); display1Cha(1,32,0,nian);/在指定位置显示汉字年 display1Cha(1,0,1,yue);/在指定位置显示汉字月 display1Cha(1,32,1,ri);/ 在指定位置显示汉字日 display1Cha(5,0,0,xing);/在指定位置显示汉字星 display1Cha(5,16,0,qi);/

27、在指定位置显示汉字期 /display1Cha(0,0,0,huabian);/在指定位置显示花边 *(int *)0x=LCDCMDPAGE+3; / 设置操作页=3 Delay(LCDDELAY); *(int *)0x=0; Delay(LCDDELAY); *(int *)0x=LCDCMDVERADDRESS+16; / 起始列=16 Delay(LCDDELAY); *(int *)0x=0; Delay(LCDDELAY); for ( i=0;i8;i+ ) / 在指定位置显示第一个: *(int *)0x=maohaoi; Delay(LCDDELAY); *(int *)0

28、x=0; Delay(LCDDELAY); *(int *)0x=LCDCMDVERADDRESS+40; / 在指定位置显示第二个: Delay(LCDDELAY); *(int *)0x=0; Delay(LCDDELAY); for ( i=0;i8;i+ ) *(int *)0x=maohaoi; Delay(LCDDELAY); *(int *)0x=0; Delay(LCDDELAY); *(int *)0x=LCDCMDPAGE; / 设置操作页 Delay(LCDDELAY); *(int *)0x=0; Delay(LCDDELAY); *(int *)0x=LCDCMDVERADDRESS; / 起始列 Delay(LCDDELAY); *(int *)0x=0; D

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1