资源描述
课程设计总结汇报
课程名称 DSP控制器及其应用
设计题目 万年历设计
专 业 电子信息工程
班 级
姓 名
学 号
指导老师
汇报成绩
信息工程学院
二〇一四年六月十三日
目 录
前 言 3
第一章 设计要求 4
1.1 基础要求 4
1.2 提升要求 4
第二章 系统组成和工作原理 5
2.1 DSP TMS320 VC5509APGE芯片工作原理 5
2.2 LCD1602液晶显示器工作原理 6
第三章 主电路图及程序步骤图 7
3.1主电路图 7
3.2程序总步骤图 7
3.3程序分块步骤图 8
第四章 软件程序设计 9
4.1 程序 9
4.2 调试和处理出现问题 9
第五章 设计总结 20
附录1:参考文件 30
前 言
伴随科技不停发展,诞生了越来越多电子产品。比如手表,时钟等等,现在钟表在功效设计上不停地完善,不仅仅能够显示时间(时分秒),而且能够显示年月日,星期几等等。
科技发展离不开人类不停努力,培养高科技人才是二十一世纪必做事。作为祖国接班人更要努力学习好电子信息这门科技专业。所以我们要不停接触多种电子产品,加强对电子技术 技术理论掌握和实际应用 。在此次试验中,我们就 以 DSP芯片为关键控制电子钟,含有多项显示,用2812上LCD液晶显示器显示目前年、月、日、时、分、秒。
第一章 设计要求
此次课程设计要求设计一个万年历,利用DSPTMS320 VC5509APGE芯片控制,使用程序来控制时间实时更新,当秒加到60时,分自动加1,当分加到60时,小时自动加1,当小时加到24,天加1,天加到30时,月加1,月加到12时,年加1,使用I602上LCD液晶显示器显示目前年、月、日、时、分、秒。对现有器件进行简单地编程,实现多种简单地显示控制。
1.1 设计目标
1. 学习软件安装,熟悉利用CCS v3.3软件,加强软件编程能力;
2. 学习DSP芯片I/O端口控制方法;
3. 了解1602字符液晶使用功效
4. 能够对现有器件进行简单地编程,实现多种简单地显示控制。
1.2 基础要求
⑴ 此系统先显示设定目前时间(年月日时分秒),并进行计数
⑵ 设计硬件外扩电路,同时设计软件程序进行软硬件联络调试
⑶ 连接仿真器,在液晶显示器上进行显示
第二章系统组成和工作原理
2.1 DSP TMS320 VC5509APGE芯片
2.1.1 DSP TMS320 VC5509APGE芯片引脚图。
2.1.2 DSP开发环境
ccs 3.3,Easy5509开发板程序全部是基于TI 企业 CCS3.3 。
2.1.3 软件安装
1) 首先安装 CCS3.3。安装步骤可直接运行光盘中软件目录下 CCS 软件 setup.exe,按提醒操作,即可完成 CCS 安装,接着按手册说明次序安装CCS补丁软件
2)然后连接好硬件和仿真器,连和电脑接口,打开电脑设备管理器,寻求刚检测到未知设备,更新驱动,接着安装仿真器驱动,注意要和 CCS 安装在同一个目录;
3)打开set up ccs,设置。具体可看手册。最终能够打开ccs软件,进行编写程序,同时连接硬件,测试是否连接。
2.2 LCD1602液晶显示器
2.2.1 1602LCD液晶显示原理
LCD1602液晶显示器工作原理是利用液晶物理特征,经过电压对其显示区域进行控制,有电就有显示,这么即能够显示出图形。液晶显示器含有厚度薄、适适用于大规模集成电路直接驱动、易于实现全彩色显示特点,现在已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
引脚图:
1602采取标准16脚接口,其中:
第1脚:VSS为电源地 第2脚:VCC接5V电源正极
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高
第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时实施指令。
第7~14脚:D0~D7为8位双向数据端。
第15~16脚:空脚或背灯电源。
第三章 主电路图及步骤图
4.1 主电路图
4.2程序总步骤图
该设计用DSP程序完成。程序总步骤图以下:
接通电源,DSP和时钟初始化,读取时钟数据,DSP进行处理程序,LCD1602显示器接收数据并进行显示。每200ms检测一次时间。
4.3程序分块步骤图
4.3.1 LCD1602液晶显示模块
当DSP一上电,显示一个时间,一定时间后,显示程序中设置时间,并实时刷新时间,将要要显示时间送入LCD1602中,实现万年历显示。利用LCD1602 16*2数组,自己设置两个长度为10数组,第一行显示年月日,第二行显示时分秒,如第一行:-12-12,第二行:12-12-12。秒表时间靠近于60秒意在能够快速检测分秒日月,是否能够转换增加。
4.3.2 时钟模块
先判定1s延迟是否到了,如否,如否,则返回,如是,则将秒加1,加到60秒时,分加1,并将秒置0,分加到60时,小时自动加1,当小时加到24时,天加1,天加到30时,月加1,月加到12时,年加1。从而实现万年历设计。
第四章 软件程序设计
#include <csl.h>
#include <csl_pll.h>
#include <csl_emif.h>
#include <csl_chip.h>
#include <stdio.h>
#define led8 (*((unsigned int *)0x01))
#define Digital8 (*((unsigned int *)0x02))
#define LCD_REG (*((unsigned int *)0x03))
#define buzzer (*((unsigned int *)0x04))
#define USER_SW (*((unsigned int *)0x05))
#define LCD_DATA (*((unsigned int *)0x06))
#define UART_BASE_ADDR 0x08
#define RBR *((int *)(UART_BASE_ADDR+0))
#define THR *((int *)(UART_BASE_ADDR+0))
#define IER *((int *)(UART_BASE_ADDR+1))
#define IIR *((int *)(UART_BASE_ADDR+2))
#define FCR *((int *)(UART_BASE_ADDR+2))
#define LCR *((int *)(UART_BASE_ADDR+3))
#define MCR *((int *)(UART_BASE_ADDR+4))
#define LSR *((int *)(UART_BASE_ADDR+5))
#define MSR *((int *)(UART_BASE_ADDR+6))
#define SCR *((int *)(UART_BASE_ADDR+7))
#define DLL *((int *)(UART_BASE_ADDR+0))
#define DLM *((int *)(UART_BASE_ADDR+1))
#define comm 0
#define dat 1
/*要显示字符*/
unsigned char str1[]={"-12-30"};
unsigned char str2[]={"23-59-55"};
Uint16 nian,yue,ri,shi,fen,miao,a;
void Delay(unsigned int nDelay);
void wr_lcd(unsigned char dat_comm, unsigned int content);
void delaynum(unsigned int d_time);
/*锁相环设置*/
PLL_Config myConfig = {
0, //IAI: the PLL locks using the same process that was underway
//before the idle mode was entered
1, //IOB: If the PLL indicates a break in the phase lock,
//it switches to its bypass mode and restarts the PLL phase-locking
//sequence
12, //PLL multiply value; multiply 12 times
2 //Divide by 2 PLL divide value; it can be either PLL divide value
//(when PLL is enabled), or Bypass-mode divide value
//(PLL in bypass mode, if PLL multiply value is set to 1)
};
/*SDRAMEMIF设置*/
EMIF_Config emiffig = {
0x221, //EGCR : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence
// the WPE = 0 ,forbiden the writing posting when we debug the EMIF
// the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin
// the NOHOLD = 1,HOLD requests are not recognized by the EMIF
0xFFFF, //EMI_RST: any write to this register resets the EMIF state machine
0x1fff, //CE3_1: CE0 space control register 1
0x00ff, //CE3_2: CE0 space control register 2
0x00ff, //CE3_3: CE0 space control register 3
0x1fff, //CE1_1: CE0 space control register 1
// Asynchronous, 16Bit
0x00ff, //CE1_2: CE0 space control register 2
0x00ff, //CE1_3: CE0 space control register 3
0x1FFF, //CE2_1: CE0 space control register 1
// Asynchronous, 16Bit
0xFFFF, //CE2_2: CE0 space control register 2
0x00FF, //CE2_3: CE0 space control register 3
0x1fff, //CE3_1: CE0 space control register 1
0x00ff, //CE3_2: CE0 space control register 2
0x00ff, //CE3_3: CE0 space control register 3
0x2911, //SDC1: SDRAM control register 1
// TRC = 8
// SDSIZE = 0;SDWID = 0
// RFEN = 1
// TRCD = 2
// TRP = 2
0x0410, //SDPER : SDRAM period register
// 7ns *4096
0x07FF, //SDINIT: SDRAM initialization register
// any write to this register to init the all CE spaces,
// do it after hardware reset or power up the C55x device
0x0131 //SDC2: SDRAM control register 2
// SDACC = 0;
// TMRD = 01;
// TRAS = 0101;
// TACTV2ACTV = 0001;
};
/*************以下内容为LCD读写等函数**************/
TMS320VC5509 DSP External Memory Interface (EMIF) Reference Guide
*/
//*addr为CPLD寄存器操作专用指针
void delay(unsigned int d_time)
{
while(d_time--);
}
main()
{
int temp,k;
CSL_init();
CHIP_RSET(XBSR,0x0a01);
PLL_config(&myConfig);
EMIF_config(&emiffig);
a=20;
nian=14;
yue=12;
ri=31;
shi=23;
fen=59;
miao=55;
wr_lcd(comm,0x01); //清屏指令
wr_lcd(comm,0x38); //设定LCD为16*2,5*7矩阵,8位数据接口
wr_lcd(comm,0x0f); //显示ON 光标ON,闪烁ON
wr_lcd(comm,0x06); //文字不动,光标
while(1)
{
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
ri++;
if(ri==32)
{
ri=1;
yue++;
if(yue==13)
{
yue=1;
nian++;
if(nian==99)
{
nian=0;
a++;
}
}
}
}
}
}
str1[0]=a/10+0x30;
str1[1]=a%10+0x30;
str1[2]=nian/10+0x30;
str1[3]=nian%10+0x30;
str1[4]='-';
str1[5]=yue/10+0x30;
str1[6]=yue%10+0x30;
str1[7]='-';
str1[8]=ri/10+0x30;
str1[9]=ri%10+0x30;
str2[0]=shi/10+0x30;
str2[1]=shi%10+0x30;
str2[2]=':';
str2[3]=fen/10+0x30;
str2[4]=fen%10+0x30;
str2[5]=':';
str2[6]=miao/10+0x30;
str2[7]=miao%10+0x30;
wr_lcd(comm,0x80); //第一行字符地址
for(k=0;k<10;k++)
{
wr_lcd(dat,str1[k]);
delay(200);
}
/* wr_lcd(comm,0x80); //第一行字符地址
for(k=0;k<16;k++)
{
wr_lcd(dat,str1[k]);
delay(200);
} */
wr_lcd(comm,0xc0); //第二行数据指针地址
for(k=0;k<8;k++)
{
wr_lcd(dat,str2[k]);
delay(200);
}
delay(5000);
}
//LCD输出设置
}
void delaynum(unsigned int d_time)
{
while(d_time--);
}
void wr_lcd(unsigned char dat_comm, unsigned int content)
{
Delay(40);
if(dat_comm)
{
LCD_REG=0x01;
LCD_DATA=content; //数据端口
LCD_REG=0x03; //en=0
delaynum(80);
LCD_REG=0x00; //en=0
}
else
{
LCD_REG=0x00;
LCD_DATA=content;
LCD_REG=0x02; //rs==1 en==0 写指令端口
delaynum(80);
LCD_REG=0x00; //en=0
}
Delay(100);
}
void Delay(unsigned int nDelay)
{
int ii,jj,kk=0;
for ( ii=0;ii<nDelay;ii++ )
{
for ( jj=0;jj<1024;jj++ )
{
kk++;
}
}
}
* End of lcd.c
第五章 设计总结
在两周万年历课程设计中,我首先学到是软件安装,在前几天,一直安装CCS3.3和驱动,尽管电脑系统是32位,因为装不上补丁不能用。接下来学习就是软件编写,基础要求是可对年月日时分秒进行计数。当秒加到60时,分自动加1,当分加到60时,小时自动加1,当小时加到24,天加1,天加到30时,月加1,月加到12时,年加1。这部分我们原先需要用是定时器,不过一直无法显示出想要效果,最终是在老师指导下将定时器那部分程序直接用延时程序替换。最终将软硬件联络调试,在1602上正常显示时间并进行运作。
经过这两周学习,对DSP有了更深了解,掌握了对现有器件进行编程,实现多种简单地显示控制。
展开阅读全文