电气信息工程学院
DSP技术与综合训练
实验报告
班 级 08通信1W
姓 名 丁安华
学 号 08313115 指导老师 倪福银 刘舒淇
2011年 09 月
D S P 技 术 与 综 合 训 练 实 验 报 告
目 录
实验一 LED演示
1.1.实验目的 -------------------------------------------------P2 1.2.实验设备 -------------------------------------------------P2 1.3.实验原理 -------------------------------------------------P2 1.4.实验程序设计流程 ------------------------------------------P3 1.5.实验程序编写 ----------------------------------------------P4 1.6.实验步骤 -------------------------------------------------P7 1.7.实验结果与分析 --------------------------------------------P7
实验二 键盘输入
2.1.实验目的 -------------------------------------------------P8 2.2.实验设备 -------------------------------------------------P8 2.3.实验原理 -------------------------------------------------P8 2.4.实验程序设计流程 ------------------------------------------P9 2.5.实验程序编写 ----------------------------------------------P10 2.6.实验步骤 -------------------------------------------------P14 2.7.实验结果与分析 --------------------------------------------P14
实验三 液晶显示器控制显示
3.1.实验目的 -------------------------------------------------P15 3.2.实验设备 -------------------------------------------------P15 3.3.实验原理 -------------------------------------------------P15 3.4.实验程序设计流程 ------------------------------------------P17 3.5.实验程序编写 ----------------------------------------------P18 3.6.实验步骤 -------------------------------------------------P22 3.7.实验结果与分析 --------------------------------------------P23
实验四 有限冲激响应滤波器(FIR)算法
4.1.实验目的 -------------------------------------------------P23 4.2.实验设备 -------------------------------------------------P23 4.3.实验原理 -------------------------------------------------P24 4.4.实验程序设计流程 ------------------------------------------P25 4.5.实验程序编写 ----------------------------------------------P25 4.6.实验步骤 -------------------------------------------------P27 4.7.实验结果与分析 --------------------------------------------P28
第 1 页 共2 8 页
D S P 技 术 与 综 合 训 练 实 验 报 告
实验一 LED演示
1. 1实验目的
1.了解ICETEK–VC5509-A板在TMS320VC5509DSP外部扩展存储空间上 的扩展。
2.了解ICETEK–VC5509-A板上指示灯扩展原理。 3.学习在C语言中使用扩展的控制寄存器的方法。
1. 2实验设备
计算机,ICETEK-VC5509-A实验箱(或ICETEK仿真器+ICETEK–VC5509-A系统板+相关连线及电源)。
1. 3实验原理
(1)TMS320VC5509的EMIF接口:
存储器扩展接口(EMIF)是DSP扩展片外资源的主要接口,它提供了一 组控制信号和地址、数据线,可以扩展各类存储器和寄存器映射的外设。
ICETEK–VC5509-A评估板在EMIF接口上除了扩展了片外SDRAM外,还扩展了指示灯、DIP开关和D/A设备。具体扩展地址如下: 400800-400802h: D/A转换控制寄存器 400000-400000h: 板上DIP开关控制寄存器 400001-400001h: 板上指示灯控制寄存器
与ICETEK–VC5509-A评估板连接的ICETEK-CTR显示控制模块也使用扩展空间控制主要设备:
602800-602800h: 读-键盘扫描值,写-液晶控制寄存器 600801-600801h: 液晶辅助控制寄存器 602801h 、600802h: 液晶显示数据寄存器 602802-602802h: 发光二极管显示阵列控制寄存器
第 2 页 共2 8 页
D S P 技 术 与 综 合 训 练 实 验 报 告
(2)指示灯扩展原理图如图1所示,
图1 指示灯扩展原理图
1.4 实验程序流程图
程序设计流程图如图2所示,
第 3 页 共2 8 页
D S P 技 术 与 综 合 训 练 实 验 报 告
开 始 初始化DSP时钟 初始化EMIF接口 正向送控制一个灯亮并延时 反向送控制一个灯亮并延时 正向送控制一个灯不亮并延时 反向送控制一个灯不亮并延时 正向控制一个灯闪烁并延时 4个灯同时闪烁并延时 反向控制依次熄灭并延时 正向控制依次熄灭并延时
图2 程序设计流程图
1.5 实验程序编写
#include \"myapp.h\"
// 定义指示灯寄存器地址和寄存器类型
#define LBDS (*((unsigned int *)0x400001)) // 子程序接口
void Delay(unsigned int nDelay); // 延时子程序 /*功能描述:LED依次正向从D1到D4点亮; LED依次反向从D4到D1点亮;
LED依次正向从D1到D4有一个不亮,其余点亮,四路LED依次
反向从D4到D1有个不亮,其余点亮;
第 4 页 共2 8 页
D S P 技 术 与 综 合 训 练 实 验 报 告
四路LED从D1到D4依次闪烁3次; 四路LED同时闪烁6次;
四路LED全亮从D4依次全部熄灭; 四路LED全灭从D1依次全部点亮*/ main()
{ unsigned int uLED[11]={1,2,4,8,7,11,13,14,15,0,3}; // 控制字,逐位置1: 0001B 0010B 0100B 1000B 0111B 1011B 1101B 1110B 1111B 0000B int i,j;
PLL_Init(72); // 初始化DSP运行时钟 SDRAM_init(); // 初始化EMIF接口 while ( 1 )
{ for ( i=0;i<4;i++ )
{ LBDS=uLED[i]; // 正向顺序送控制字使得D1-D4依次点亮 Delay(1024); // 延时 }
for ( i=3;i>=0;i-- )
{ LBDS=uLED[i]; // 反向顺序送控制字使得D4-D1依次点亮 Delay(1024); // 延时 }
for ( i=7;i>=4;i-- )
{ LBDS=uLED[i]; // 反向顺序送控制字使得D1-D4依次熄灭 Delay(2048); // 延时 }
for ( i=4;i<=7;i++ )
{ LBDS=uLED[i]; // 正向顺序送控制字使得D4-D1依次熄灭 Delay(2048); // 延时 }
/* 实现LED D1闪烁3次*/
for(j=0;j<3;j++) // 变量J控制闪烁次数 {LBDS=uLED[0]; // D2点亮 Delay(1024);
LBDS=uLED[9]; // 全部熄灭 Delay(1024); }
/* 实现LED D2闪烁3次*/ for(j=0;j<3;j++)
{LBDS=uLED[1]; // D2点亮 Delay(1024);
LBDS=uLED[9]; // 全部熄灭 Delay(1024); }
/* 实现LED D3闪烁3次*/ for(j=0;j<3;j++)
{LBDS=uLED[2]; // D3点亮 Delay(1024);
LBDS=uLED[9]; //全部熄灭
第 5 页 共2 8 页
D S P 技 术 与 综 合 训 练 实 验 报 告
Delay(1024); }
/* 实现LED D4闪烁3次*/ for(j=0;j<3;j++)
{LBDS=uLED[3]; // D4点亮 Delay(1024);
LBDS=uLED[9]; //全部熄灭 Delay(1024); }
/* 实现四路LED同时闪烁6次*/
for(j=0;j<6;j++) // 定义变量来J控制四路同时亮灭的次数为6次 { for (i=8;i<=9;i++) //四路LED同时点亮 同时熄灭依次 { LBDS=uLED[i];
Delay(1024); } }
for(j=0;j<1;j++) // D4到D0从全亮依次全部熄灭,过程执行一次 { LBDS=uLED[8]; // 4路全亮 Delay(2048);
LBDS=uLED[4]; // D4 不工作,其余点亮 Delay(2048);
LBDS=uLED[10]; // D4,D3 不工作,其余点亮 Delay(2048);
LBDS=uLED[0]; // D4,D3,D2 不工作,其余点亮 Delay(2048);
LBDS=uLED[9]; // 4路全熄灭 Delay(2048); }
for(j=0;j<1;j++) // D0到D4从全灭依次全部点亮,过程执行一次 { LBDS=uLED[9]; // 4路全熄灭 Delay(2048);
LBDS=uLED[0]; // D4,D3,D2 不工作,其余点亮 Delay(2048);
LBDS=uLED[10]; // D4,D3 不工作,其余点亮 Delay(2048);
LBDS=uLED[4]; // D4 不工作,其余点亮 Delay(2048);
LBDS=uLED[8]; // 4路全亮 Delay(2048); } }}
void Delay(unsigned int nDelay) //延时子程序 { int ii,jj,kk=0;
for ( ii=0;ii D S P 技 术 与 综 合 训 练 实 验 报 告 1.6 实验步骤 1.实验准备:关闭实验箱上扩展模块和信号源电源开关,连接实验设备。 2.设置Code Composer Studio 2.21在硬件仿真(Emulator)方式下运行。 3.启动Code Composer Studio 2.21,选择菜单Debug→Reset CPU。 4.打开工程文件: 工程文件为:C:\\ICETEK\\VC5509AES60\\VC5509AES60\\Lab0301-LED\\LED.pjt 打开源程序LED.c阅读程序,理解程序内容。 5.编译、、调试程序下载程序。 6.运行程序,完善程序后观察结果。 7.退出CCS。 1.7 实验结果与分析 实验结果:运行程序,观察到LED依次正向从D1到D4点亮;然后LED依次反 向从D4到D1点亮;然后LED依次正向从D1到D4有一个不亮,其余点亮,四路LED依次反向从D4到D1有个不亮,其余点亮;然后四路LED从D1到D4依次闪烁3次;然后四路LED同时闪烁6次;然后四路LED全亮从D4依次全部熄灭;然后四路LED全灭从D1依次全部点亮。说明实验成功,完成了程序对LED灯的控制。 分析可知:映射在扩展存储器空间地址上的指示灯寄存器在设置时是低4位有 效的,数据的最低位开始依次对应指示灯D1,D2,D3,D4。 控制相应的灯亮时,可以通过控制字编写控制字表,然后通过数组循环调用即可实现相应的灯控制。 收获总结:通过指示灯的实验,熟练地掌握了控制LED灯亮的方法,并可以顺 利给出亮灯顺序。掌握了LED灯驱动原理,为以后学习打下了基础。 第 7 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 实验二 键盘输入 2.1 实验目的 通过实验学习使用5509DSP的扩展端口接收外围设备信息的方法,了解键盘的使用原理及编程方法。 2.2 实验设备 计算机,ICETEK-VC5509-A实验箱(或ICETEK仿真器+ICETEK-VC5509-A系统板+相关连线及电源)。 2.3 实验原理 (1)EMIF接口: TMS320C5509DSP的扩展存储器接口(EMIF)用来与大多数外围设备进行连接,典型应用如连接片外扩展存储器等。这一接口提供地址连线、数据连线和一组控制线。ICETEK-VC5509-A将这些扩展线引到了板上的扩展插座上供扩展使用。 (2) 键盘连接原理如图3所示:(备注:按键使用实验箱上面的按键) 图3 键盘连接原理图 (3) 键盘的扫描码由DSP的扩展地址0x602800给出,当有键盘输入时,读此端口得到扫描码,当无键被按下时读此端口的结果为0。各按键的扫描码排列 第 8 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 如下所示(scancode.h)。 #define SCANCODE_0 0x70 #define SCANCODE_1 0x69 #define SCANCODE_2 0x72 #define SCANCODE_3 0x7A #define SCANCODE_4 0x6B #define SCANCODE_5 0x73 #define SCANCODE_6 0x74 #define SCANCODE_7 0x6C #define SCANCODE_8 0x75 #define SCANCODE_9 0x7D #define SCANCODE_Del 0x49 #define SCANCODE_Enter 0x5A #define SCANCODE_Plus 0x79 #define SCANCODE_Minus 0x7B #define SCANCODE_Mult 0x7C define SCANCODE_Divid 0x4A #define SCANCODE_Num 0x77 2.4 实验程序设计流程 实验2程序设计流程图如4所示, 第 9 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 开 始 初始化:DSP时钟、EMIF、ICETEK-CTR 选通发光二极管显示阵列 设计八个功能,编写控制字 采集第N个按键输入信号 根据按键N的不同,调用第N个键的控制字 二极管阵列根据控制字显示 点亮全部二极管,准备按下一个键 返回 图4 实验2程序设计流程图 2.5 实验程序编写 #include \"myapp.h\" #include \"ICETEK-VC5509-EDU.h\" // 定义指示灯寄存器地址和寄存器类型 #define CTRLED (*(unsigned int *)0x600802) // port8004 #define MCTRKEY (*(unsigned int *)0x602802) // port8005 #define CTRCLKEY (*(unsigned int *)0x600803) // port8006 #define CTRSTATUS (*(unsigned int *)0x600800) //port8000 unsigned int uWork1,uWork2,nWork,w; unsigned int ccc[8]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};// 控制字 unsigned int ccc1[6]={0x77,0xBB,0xDD,0xEE,0xF0,0x0F}; unsigned int ccc2[9]={0x00,0x1,0x3,0x7,0xF,0x1F,0x3F,0x7F,0xFF}; unsigned int ccc3[8]={0xFC,0xF3,0xCF,0x3F,0x1F,0x3F,0x7F,0xFF}; 第 10 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 // 子程序接口 void mydelay(unsigned int nDelay); // 延时子程序 /* 功能描述:K1按键D1开始按顺时针跑动2圈; K2按键D5开始按逆时针跑动2圈; K3按键按列循环扫描2周; K4按键按行循环扫描2周; K5按键由全亮到D1-D8开始依次全部熄灭,全灭后由D8-D1依次全部点亮; K6按键由D1D2,D3D4,D5D6,D7D8依次循环点亮两个,然后反循环点亮; K7按键将LED分为左右两块,左边四个从D1开始顺时钟跑动,右边四个从D4开始逆时钟跑动 K8按键从 D1开始依次熄灭一路,其余保持点亮;跑完一圈反循环从D8开始跑一圈 */ main() { int i,j; //定义局部变量 PLL_Init(12); // 初始化DSP运行时钟 SDRAM_init(); // 初始化EMIF接口 uWork1=0; uWork2=0; nWork=0; CTRLED=0xff; //熄灭全部LED CTRGR=0; w=1; for(i=0;i<8;i++) //LED从 D1-D8依次点亮 { CTRLED=~ccc[i]; mydelay(200); } //CTRLED=0xff; CTRLED=0x0; //8路LED全亮 //CTRLED=0xff; for(j=0;j<=2;j++) // 8路LED闪烁3次 {mydelay(200); CTRLED=0xff; // 8路LED全灭 mydelay(200); CTRLED=0x00; // 8路LED全亮 mydelay(200); } while(w) { mydelay(30); CTRLED=0; mydelay(30); for(;;) // FOR循环使程序一直在执行按键扫描 { uWork1=MCTRKEY; // 采集按键信息 CTRCLKEY=0; asm(\" nop \"); // 空指令,空操作延时一个周期 第 11 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 uWork2=MCTRKEY; CTRCLKEY=0; if(uWork1==uWork2&&uWork1!=0) //判断按键是否按下 { nWork=uWork1; //将采集的对应按键序号付给nWork供判断 /* CTRLED=nWork; }*/ /* K1按键D1开始按顺时针跑动3圈 */ if (nWork==0x1) { for(j=0;j<3;j++) // 定义跑动次数为3 { for(i=0;i<=3;i++) { CTRLED=~ccc[i]; mydelay(100); } for(i=7;i>3;i--) {CTRLED=~ccc[i]; mydelay(100); }} CTRLED=0; // 点亮全部LED } /* K2按键D5开始按逆时针跑动3圈 */ if(nWork==0x2) { for(j=0;j<3;j++) // 定义跑动次数为3 { for(i=4;i<=7;i++) {CTRLED=~ccc[i]; mydelay(100); } for(i=3;i>=0;i--) {CTRLED=~ccc[i]; mydelay(100); } } CTRLED=0; } /* K3按键按列循环扫描2周 */ if(nWork==0x4) { for(j=0;j<2;j++) { for(i=0;i<=3;i++) {CTRLED=ccc1[i]; mydelay(200); } for(i=3;i>=0;i--) {CTRLED=ccc1[i]; mydelay(200); }} CTRLED=0; } /* K4按键按行循环扫描2周? */ if(nWork==0x8) 第 12 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 { for(j=0;j<2;j++) { for(i=4;i<=5;i++) {CTRLED=ccc1[i]; mydelay(200); }; for(i=5;i>=4;i--) {CTRLED=ccc1[i]; mydelay(200); } } CTRLED=0; } /* K5按键由全亮到D1-D8开始依次全部熄灭,全灭后由D8-D1依次全部点亮 */ if(nWork==0x10) { for(i=1;i<=8;i++) {CTRLED=ccc2[i]; mydelay(200); }; for(i=8;i>=0;i--) {CTRLED=ccc2[i]; mydelay(200); }; CTRLED=0; } /* K6按键由D1D2,D3D4,D5D6,D7D8依次循环点亮两个,然后反循环点亮 */ if(nWork==0x20) { for(i=0;i<=3;i++) {CTRLED=ccc3[i]; mydelay(400); }; for(i=3;i>=0;i--) {CTRLED=ccc3[i]; mydelay(400); }; CTRLED=0; } /* K7按键将LED分为左右两块,左边四个从D1开始顺时钟跑动,右边四个从D4开始逆时钟跑动 */ if(nWork==0x40) {for(j=0;j<=10;j++) // 定义跑动次数为11 { CTRLED=0xF6; mydelay(80); CTRLED=0xF9; mydelay(80); CTRLED=0x9F; mydelay(80); CTRLED=0x6F; mydelay(80);} CTRLED=0;} /*K8按键从 D1开始依次熄灭一路, 其余保持点亮;跑完一圈反循环从D8开始跑一圈 */ if(nWork==0x80) { for(j=0;j<2;j++) 第 13 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 { for(i=0;i<=3;i++) {CTRLED=ccc[i]; mydelay(200); } for(i=7;i>3;i--) {CTRLED=ccc[i]; mydelay(200); } } CTRLED=0; } } } } exit(0); } void mydelay(unsigned int nDelay) //延时子程序 { int ii,jj,kk=0; for ( ii=0;ii 2.6 实验步骤 1.实验准备: (1)连接实验设备。 (2)连接实验箱附带的键盘的PS2插头到ICETEK-CTR的“键盘接口”P8。 (3)将ICETEK-CTR板的供电电源开关拨动到“开”的位置。 2.设置Code Composer Studio 2.21在硬件仿真(Emulator)方式下运行: 3.启动Code Composer Studio 2.21:选择菜单Debug→Reset CPU。 4.打开工程文件: 工程目录:C:\\ICETEK\\VC5509AS60\\VC5509AS60\\Lab0402-key\\Key.pjt。 浏览key.c文件的内容,理解各语句作用。 5.编译、调试并下载程序。 6.运行程序观察结果:运行程序后,分别按小键盘上的8个键,可以看到发光二极管按照指定的功能显示。 7.结束程序运行,退出CCS。 2.7 实验结果与分析 实验结果:可以观察到发光二极管阵列显示键盘输入字符。 K1按键D1开始顺时针跑动2圈; K2按键D5开始按逆时针跑动2圈; 第 14 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 K3按键按列循环扫描2周; K4按键按行循环扫描2周; K5按键由全亮到D1-D8开始依次全部熄灭,全灭后由D8-D1依次全 部点亮; K6按键由D1D2,D3D4,D5D6,D7D8依次循环点亮两个,然后反循 环点亮; K7按键将LED分为左右两块,左边四个从D1开始顺时钟跑动,右 边四个从D4开始逆时钟跑动; K8按键从D开始依次熄灭一路,其余保持点亮;跑完一圈反循环从 D8开始跑一圈。 实验分析:在程序中加入分支语句实现对不同键盘输入值的处理或支持控制型 按键。控制相应的灯亮时,可以通过控制字编写控制字表,然后通过数组循环调用即可实现相应的灯控制。 收获总结:通过按键的实验,熟练地通过按键掌握控制发光二极管阵列灯亮的方法,并可以顺利给出亮灯顺序。基本掌握了按键的工作原理,达到了预期的实验目的。 实验三 液晶显示器控制显示 3.1 实验目的 通过实验学习使用5509ADSP的扩展I/O端口控制外围设备的方法,了解液晶显示器的显示控制原理及编程方法。 3.2 实验设备 计算机,ICETEK-VC5509-A实验箱(或ICETEK仿真器+ICETEK-VC5509-A系统板+相关连线及电源)。 3.3 实验原理 (1) EMIF接口: TMS320C5509DSP的扩展存储器接口(EMIF)用来与大多数外围设备进行连接,典型应用如连接片外扩展存储器等。这一接口提供地址连线、数据连线和一组控制线。ICETEK-VC5509-A将这些扩展线引到了板上的扩展插座上供扩 第 15 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 展使用。 (2)液晶显示模块的访问、控制是由5509ADSP对扩展接口的操作完成。 控制口的寻址:命令控制接口的地址为0x602800,数据控制接口的地址为0x602801和0x600802,辅助控制接口的地址为0x600801。 (3)显示控制方法: 液晶显示模块中有两片显示缓冲存储器,分别对应屏幕显示的像素,向其中写入数值将改变显示,写入“1”则显示一点,写入“0”则不显示。其地址与像素的对应方式如下表1: 表1: 地址与像素的对应方式 左侧显示内存 Y= 0 1 ··· 62 63 0 1 右侧显示内存 ··· 62 63 行号 DB0 DB0 DB0 DB0 DB0 ↓ ↓ ↓ ↓ ↓ DB0 ↓ DB7 DB0 ↓ DB7 DB0 ↓ DB7 DB0 ↓ DB7 DB0 ↓ DB7 DB0 ↓ DB7 DB0 ↓ DB7 DB0 ↓ DB7 DB0 ↓ DB7 DB0 ↓ DB7 DB0 ↓ DB7 DB0 ↓ DB7 DB0 ↓ DB7 DB0 ↓ 0 ↓ 7 8 ↓ X=0 DB7 DB7 DB7 DB7 DB7 ↓ DB0 DB0 DB0 DB0 DB0 ↓ ↓ ↓ ↓ ↓ DB7 DB7 DB7 DB7 DB7 DB7 55 DB0 56 ↓ ↓ X=7 DB0 DB0 DB0 DB0 DB0 ↓ ↓ ↓ ↓ ↓ DB7 DB7 DB7 DB7 DB7 DB7 63 发送控制命令:向液晶显示模块发送控制命令的方法是通过向命令控制接口写入命令控制字,然后再向辅助控制接口写入0。下面给出的是基本命令字、解释和C语言控制语句举例: .显示开关:0x3f打开显示;0x3e关闭显示; .设置显示起始行:0x0c0+起始行取值,其中起始行取值为0至63; 第 16 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 .设置操作页:0x0b8+页号,其中页号取值为0-7; .设置操作列:0x40+列号,其中列号为取值为0-63; 写显示数据:在使用命令控制字选择操作位置(页数、列数)之后,可以将待显示的数据写入液晶显示模块的缓存。将数据发送到相应数据控制I/O接口即可。 (4)液晶显示器与DSP的连接如图5: 图5 液晶显示与DSP连接图 (5)数据信号的传送: 由于液晶显示模块相对运行在高主频下的DSP属于较为慢速设备,连接时需要考虑数据线上信号的等待问题; (6)电平转换:由于DSP为3.3V设备,而液晶显示模块属于5V设备,所以 在连接控制线、数据线时需要加电平隔离和转换设备,如:ICETEK-CTR板上使用了74LS245 3.4 实验程序设计流程 实验3设计流程图如图6所示 第 17 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 开 始 编写字模库 初始化DSP时钟 初始化EMIF接口 初始化CTR 清屏,设置显示位置 按位置显示四条斜线,与4个倒计时数字控制 教学试验箱 滚动显示 显示五角星 返回 图6 实验3程序设计流程图 3.5 实验程序编写 #include \"LCD.h\" unsigned int str1[80]= //定义字模数组 { 0x910,0x914,0x4894,0x88D4,0x7eBF,0x594,0x449C,0x4414, 0x2050,0x20F8,0x130F,0xC08,0x3388,0xC078,0x4008,0x00}; //字模 教 unsigned int str2[80]={ 第 18 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 0x40,0x230,0x210,0x212,0x25C,0x254,0x4250,0x8251, 0x7F5E,0x2D4,0x250,0x218,0x257,0x232,0x210,0x00}; //字模 学 unsigned int str3[80]={ 0x00,0x8210,0x820C,0x4204,0x424C,0x23B4,0x1294,0xA05, 0x7F6,0xA04,0x1204,0xE204,0x4214,0x20C,0x204,0x00} ; //字模 实 unsigned int str4[80]={ 0x802,0x8FA,0x482,0x2482,0x40FE,0x3F80,0x2240,0x2C60, 0x2158,0x2E46,0x2048,0x3050,0x2C20,0x2320,0x2020,0x00}; //字模 验 unsigned int str5[80]={ 0x2010,0x1088,0xC87,0x382,0xFFF6,0x28A,0xC82,0x12, 0xFFE8,0x4927,0x4922,0x4926,0x493A,0xFFE2,0x02,0x00}; // 字模 箱 unsigned int ledkey[10][8]= //定义字模数组 { {0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00}, //字模 0 }; unsigned int nScreenBuffer[30*128]; #define CTRSTATUS (*(unsigned int *)0x600800) //port8000 int w,ww,www; /*功能描述:从屏幕四个角画4条直线,倾角均与边线成45度角,线的另一端 4个数字从9-0同步倒计时。然后,屏幕右上角开始一个一个出现 教学试验箱 5个字滚动到左边一个一个逐渐消失,然后从右下角开始一个一个出现,滚动 第 19 页 共2 8 页 {0x00,0x00,0x00,0x84,0xFE,0x80,0x00,0x00}, //字模 1 {0x00,0x00,0x84,0xC2,0xA2,0x92,0x8C,0x00}, //字模 2 {0x00,0x00,0x44,0x92,0x92,0x92,0x6C,0x00}, //字模 3 {0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00}, //字模 4 {0x00,0x00,0x4E,0x92,0x92,0x92,0x62,0x00}, //字模 5 {0x00,0x00,0x7C,0x92,0x92,0x92,0x64,0x00}, //字模 6 {0x00,0x00,0x02,0xC2,0x32,0x0A,0x06,0x00}, //字模 7 {0x00,0x00,0x6C,0x92,0x92,0x92,0x6C,0x00}, //字模 8 {0x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00} //字模 9 D S P 技 术 与 综 合 训 练 实 验 报 告 到左边一个个消失, 滚动两次,然后从左下角发出一个五角星,沿着45度角走,遇到边沿开始反弹,持续进行*/ main() { unsigned int uWork,* pWork; int x,y,a,b,color,i,j; //定义局部变量 w=0; ww=500,www=5000; PLL_Init(12); // 初始化DSP运行时钟 SDRAM_init(); // 初始化EMIF接口 LCDTurnOff(); //关闭液晶 LCDSetScreenBuffer(nScreenBuffer); for ( uWork=0,pWork=nScreenBuffer;uWork<30*128;uWork++,pWork++ )(*pWork)=0; LCDSetDelay(1); //打开内部延时 LCDTurnOn(); // 打开显示 LCDCLS(); // 清屏幕 x=0;y=0;color=2; for(i=0;i<50;i++) //在左下角画斜线,且倾角为45度 { LCDPutPixel(x,y,color); x++; y++;} x=240;y=0;color=2; for(i=0;i<50;i++) //在右下角画斜线,且倾角为135度 { LCDPutPixel(x,y,color); x--; y++;} x=240;y=128;color=2; for(i=0;i<50;i++) //在右上角画斜线,且倾角为275度 { LCDPutPixel(x,y,color); x--; y--; } x=0;y=128;color=2; for(i=0;i<50;i++) //在左上角画斜线,且倾角为-45度 第 20 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 { LCDPutPixel(x,y,color); x++; y--; } for(i=9;i>=0;i--) //倒计时显示9到0 { LCDWriteBytes(ledkey[i],50,78,1); //左上角线计时 LCDWriteBytes(ledkey[i],50,50,1); //左下角线计时 LCDWriteBytes(ledkey[i],190,78,1); //右上角线计时 LCDWriteBytes(ledkey[i],190,50,1); //右下角线计时 _Delay(www); } //延时 LCDCLS(); //清除显示内存 while ( 1 ) { for(i=0;i<=1;i++) { for(j=240;j>=-160;j=j-16) //从右边开始显示字 { LCDPutCString(str1,j,128,1,3); //最上边显示教字 LCDPutCString(str2,j+32,128,1,3); //最上边显示学字 LCDPutCString(str3,j+64,128,1,3); //最上边显示实字 LCDPutCString(str4,j+96,128,1,3); //最上边显示验字 LCDPutCString(str5,j+128,128,1,3); //最上边显示箱字 LCDRefreshScreen(); _Delay(100); //延时 LCDCLS(); } //清除显示内存 for(j=240;j>=-160;j=j-16) { LCDPutCString(str1,j,16,1,3); //最下边显示教字 LCDPutCString(str2,j+32,16,1,3); //最下边显示学字 LCDPutCString(str3,j+64,16,1,3); //最下边显示实字 LCDPutCString(str4,j+96,16,1,3); //最下边显示验字 LCDPutCString(str5,j+128,16,1,3); //最下边显示箱字 LCDRefreshScreen(); //刷屏 _Delay(100); //延时 LCDCLS(); } } //清除显示内存 第 21 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 if ( w ) break; //不满足条件,终止 x=0; y=0; a=3; b=3; color=2; //画五角星,给变量附初值 for (i=0;i<1024;i++) //画五角星 { LCDDrawLine(x+9,y,x+44,y+24,color); //画五角星的一边,长度为44 LCDDrawLine(x,y+24,x+35,y,color); //画五角星的一边,长度为44 LCDDrawLine(x+9,y,x+22,y+40,color); //画五角星的一边,长度为44 LCDDrawLine(x,y+24,x+44,y+24,color); //画五角星的一边,长度为44 LCDDrawLine(x+22,y+40,x+35,y,color); //画五角星的一边,长度为44 LCDRefreshScreen(); //刷屏 _Delay(ww); //延时 LCDDrawLine(x+9,y,x+44,y+24,color); //再次显示方框,起销抖作用 LCDDrawLine(x,y+24,x+35,y,color); LCDDrawLine(x+9,y,x+22,y+40,color); LCDDrawLine(x,y+24,x+44,y+24,color); LCDDrawLine(x+22,y+40,x+35,y,color); x+=a; y+=b; if ( x>196 || x<0 ) a=-a; //到达右边或者左边反弹 if ( y>84 || y<0 ) b=-b; //到达上边或者下边反弹 if ( w ) break; } } // 清除显示内存 LCDCLS(); LCDTurnOff(); //关闭液晶 LCDSetDelay(0); exit(0); } //退出 3.6 实验步骤 1.实验准备: (1)连接实验设备; (2)将ICETEK-CTR板的供电电源开关拨动到“开”的位置。 2.设置Code Composer Studio 2.21在硬件仿真(Emulator)方式下运行; 3.启动Code Composer Studio 2.21:选择菜单Debug→Reset CPU; 第 22 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 4.打开工程文件: 工程目录:C:\\ICETEK\\VC5509AS60\\VC5509AS60\\Lab0403-LCD\\LCD.pjt 浏览LCD.c文件的内容,理解各语句作用; 5.编译、调试、下载程序; 6.运行程序观察结果:按照功能描述依次显示; 7.结束程序运行,退出CCS。 3.7 实验结果与分析 实验结果:运行时从屏幕四个角画4条直线,倾角均与边线成45度角,线的另 一端,4个数字从9-0同步倒计时。 然后,屏幕右上角开始一个一个出现 教学试验箱 5个字滚动到左边一个一个逐渐消失,然后从右下角开始一个一个出现,滚动到左边一个个消失,滚动两次,然后从左下角发出一个五角星,沿着45度角走,遇到边沿开始反弹,持续进行。 实验分析:灵活使用控制字,可以实现复杂多变的显示,改变控制字符库即可 实现不同的字符和图像显示。当使用点阵图形显示时需要在DSP内。 收获总结:通过lcd液晶的实验,熟练地掌握了通过改变控制字符库控制液晶 显示的方法。液晶的多样化显示是一门很深的学问,也非常有研究性可用性。此次实验,我们初步掌握了其显示原理,为以后更深一步地研究它打下了基础。 实验四 有限冲激响应滤波器(FIR)算法 4.1 实验目的 1.掌握用窗函数法设计FIR数字滤波器的原理和方法。 2.熟悉线性相位FIR数字滤波器特性。 3.了解各种窗函数对滤波器特性的影响。 4.2 实验设备 第 23 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 PC兼容机一台,操作系统为Windows2000(或Windows98,WindowsXP,以下默认为Windows2000),安装Code Composer Studio 2.21软件。 4.3 实验原理 1.有限冲激响应数字滤波器的基础理论(请参考相关书籍)。 2.模拟滤波器原理(巴特沃斯滤波器、切比雪夫滤波器、椭圆滤波器、贝塞尔滤波器)。 3.数字滤波器系数的确定方法。 4.根据要求设计低通FIR滤波器。 要求:通带边缘频率10kHz,阻带边缘频率22kHz,阻带衰减75dB,采样 频率50kHz。 设计: 过渡带宽度=阻带边缘频率-通带边缘频率=22-10=12kHz 采样频率: f1=通带边缘频率+(过渡带宽度)/2=10000+12000/2=16kHz Ω1=2πf1/fs=0.64π 理想低通滤波器脉冲响应: h1[n]=sin(nΩ1)/n/π=sin(0.64πn)/n/π 根据要求,选择布莱克曼窗,窗函数长度为: N=5.98fs/过渡带宽度=5.98*50/12=24.9 选择N=25,窗函数为: w[n]=0.42+0.5cos(2πn/24)+0.8cos(4πn/24) 滤波器脉冲响应为: h[n]=h1[n]w[n] |n|≤12 h[n]=0 |n|>12 根据上面计算,各式计算出h[n],然后将脉冲响应值移位为因果序列。 完成的滤波器的差分方程为: y[n]=-0.001x[n-2]-0.002x[n-3]-0.002x[n-4]+0.01x[n-5] -0.009x[n-6]-0.018x[n-7]-0.049x[n-8]-0.02x[n-9] +0.11x[n-10]+0.28x[n-11]+0.64x[n-12] 第 24 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 +0.28x[n-13]-0.11x[n-14]-0.02x[n-15] +0.049x[n-16]-0.018x[n-17]-0.009x[n-18]+0.01x[n-19] -0.002x[n-20]-0.002x[n-21]+0.001x[n-22] 4.4 实验程序设计流程 实验四程序设计流程图如图7所示 开始 波形发生 初始化工作变量 计算步长 调用波形发生子程序产生混叠的用标准C的sin函波形(高频+低频) 数和cos函数计算当前波形值 调用FIR滤波子程序计算当前输出 返回波形值 图7 程序设计流程图 4.5 实验程序编写 #include \"myapp.h\" #include \"ICETEK-VC5509-EDU.h\" #include \"scancode.h\" #include #define SIGNAL1F 1000 #define SIGNAL2F 4500 #define SAMPLEF 10000 #define PI 3.1415926 float InputWave(); 第 25 页 共2 8 页 FIR滤波 用滤波器系数乘以保存的N-1个输入值和当前输入值并求和 返回计算结果 D S P 技 术 与 综 合 训 练 实 验 报 告 float FIR(); float fHn[FIRNUMBER]={ 0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009, -0.018,0.049,-0.02,0.11,0.28,0.64,0.28, -0.11,-0.02,0.049,-0.018,-0.009,0.01, -0.002,-0.002,0.001,0.0,0.0 }; float fXn[FIRNUMBER]={ 0.0 }; float fInput,fOutput; float fSignal1,fSignal2; // 定义高频信号和低频信号 float fStepSignal1,fStepSignal2; // 定义信号步进变量 float f2PI; int i; float fIn[256],fOut[256]; int nIn,nOut; /*功能描述:实现低通滤波器功能,滤除采样信号中的高频成分,呈现出较为理想的滤波波形*/ main() { nIn=0; nOut=0; f2PI=2*PI; // 满周期相位为2π fSignal1=0.0; // 低频信号的初相 fSignal2=PI*0.1; // 高频信号的初相 fStepSignal1=2*PI/30; // 低频信号的步进频率 fStepSignal2=2*PI*1.4; // 高频信号的步进频率 while ( 1 ) { fInput=InputWave(); // 输入混频信号 fIn[nIn]=fInput; nIn++; nIn%=256; fOutput=FIR(); fOut[nOut]=fOutput; nOut++; /* break point */ if ( nOut>=256 ) //设置波形一个周期,图形达到周期就回初相; { nOut=0; } } } float InputWave() { for ( i=FIRNUMBER-1;i>0;i-- ) fXn[i]=fXn[i-1]; fXn[0]=sin((double)fSignal1)+cos((double)fSignal2)/6.0; // 输入滤波器信号的数学表达式,包涵高频和低频信号 fSignal1+=fStepSignal1; // 低频信号相位步进 if ( fSignal1>=f2PI ) fSignal1-=f2PI; // 低频信号相位为2π时,按步进递减 fSignal2+=fStepSignal2; // 低频信号相位步进 if ( fSignal2>=f2PI ) fSignal2-=f2PI; // 高频信号相位为2π时,按步进递减 return(fXn[0]); } // 将模拟混频信号返回代入; float FIR() { float fSum; 第 26 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 fSum=0; for ( i=0;i 1.实验准备:设置软件仿真模式 2.打开工程,浏览程序:工程目录为 C:\\ICETEK\\VC5509AES60\\VC5509AES60\\Lab0501-FIR\\Fir.pjt。 3.编译、调试并下载程序。 4.打开观察窗口。 *选择菜单View->Graph->Time/Frequency„,进行如下设置: *选择菜单View->Graph->Time/Frequency„,进行如下设置: 在弹出的图形窗口中单击鼠标右键,选择“Clear Display”。 5.设置断点:在有注释“break point”的语句设置软件断点。 6.运行并观察结果: (1)选择“Debug”菜单的“Animate”项,或按F12键运行程序; (2)观察“Input”、“Output”窗口中时域图形;观察滤波效果; (3)鼠标右键单击“Input”和“Output”窗口,选择“Properties„”项, 第 27 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 设置“Display Type”为“FFT Magitude”,再单击“OK”按钮结束设置; (4)观察“Input”、“Output”窗口中频域图形,观察滤波效果; 7.退出CCS。 4.7 实验结果与分析 实验结果: (1)滤波器输入端和输出端的波形如图8所示 图8 滤波器输入端和输出端波形 (2)滤波输入端和输出端的频域波形如图9所示 第 28 页 共2 8 页 D S P 技 术 与 综 合 训 练 实 验 报 告 图9 滤波器输入端和输出端的频域波形 实验分析: 输入波形为一个低频率的正弦波与一个高频的正弦波叠加而成。 通过观察频域和时域图,得知:输入波形中的低频波形通过了滤波器,而高频部分则大部分被滤除。通过对滤波器参数的设计,可以改变该滤波器的滤波性能。 收获总结: 通过FIR算法的实验,基本掌握了有限冲激的滤波原理。为我们今 后对滤波器的设计打下了更深一步的基础。 第 29 页 共2 8 页 因篇幅问题不能全部显示,请点此查看更多更全内容