1、 广东岭南职业技术学院课 程 设 计课题:基于 ICETEK-VC5416A 试验箱的交通灯设计与仿真指 导 教 师: 姓 名: 专 业: 学 号: 广东岭南职业技术学院Guangdong Lingnan Institute of Technology摘要数字信号处理(Digital Signal Processing,简称 DSP)是一门涉及许多学科而又广泛应用于许多领域的新兴学科。D SP( digital signal processor) 是 一 种 独 特 的 微 处 理 器 , 是 以 数 字 信 号 来 处理 大 量 信 息 的 器 件 。 其 工 作 原 理 是 接 收 模 拟
2、 信 号 , 转 换 为 0 或 1的 数 字 信 号 , 再 对 数 字 信 号 进 行 修 改 、 删 除 、 强 化 , 并 在 其 他 系统 芯 片 中 把 数 字 数 据 解 译 回 模 拟 数 据 或 实 际 环 境 格 式 。 它 不 仅 具有 可 编 程 性 , 而 且 其 实 时 运 行 速 度 可 达 每 秒 数 以 千 万 条 复 杂 指 令程 序 , 远 远 超 过 通 用 微 处 理 器 , 是 数 字 化 电 子 世 界 中 日 益 重 要 的电 脑 芯 片 。 本次设计是基于 DSP 原理设计交通灯控制系统软硬件系统,利用发光二级管亮灭模拟交通信号,数码管显示倒计
3、时时间,利用 TMS320VC5402 DSP 片上定时器定时产生时钟计数,设计模拟实际生活中十字路口交通灯。一、 课程设计内容及要求1 课题设计内容DSP 课程设计是对数字信号处理 、 DSP 原理及应用等课程的较全面练习和训练,是实践教学中的一个重要环节。通过本次课程设计,综合运用数字信号处理、DSP 技术课程以及其他有关先修课程的理论和生产实际知识去分析和解决具体问题,并使所学知识得到进一步巩固、深化和发展。初步培养学生对工程设计的独立工作能力,掌握电子系统设计的一般方法。通过课程设计,基本技能的训练,如查阅设计资料和手册、程序的设计、调试等,提高学生分析问题、解决问题的能力。本题目为急
4、救车与十字路口交通灯的设计,目的是熟练掌握 DSP 定时器的控制、中断系统的应用以及程序的编写调试。2. 课程设计要求1、南北、东西各三个灯(红、黄、绿) ; 2、南北、东西两向各有倒计时功能(各两位数码管显示) ;(1)南北绿灯、东西红灯,延时 20 秒(2)南北绿灯闪 3 次、东西红灯(6 秒)(3)南北黄灯、东西红灯(4 秒)(4)南北红灯、东西绿灯(20 秒)(5)南北红灯、东西绿灯闪 3 次(6 秒)(6)南北红灯、东西黄灯延时 3 秒(4 秒)(7)回到(1)3、功能键:(1)启动开关 (2)急救灯的启动开关4、启动开关按下时,交通灯开始运行,再按一下表示停止。5、急救灯的控制按钮
5、按下时,四个路口全红灯状态。6、按要求编写课程设计报告书,正确、完整的阐述设计和实验结果二、课程设计总体方案及原理1、课程设计总体方案根据 DSP 的硬件中断、定时器、I/O 访问的原理。用定时器定时,用 I/O口控制红绿黄灯的开关,用硬件外部中断模拟急救车的到达。有急救车到达时,两向为全红,以便让急救车通过。急救车通过后,交通灯恢复硬件中断前的状态。触发开关( 红色按纽) 为中断申请,表示有急救车通过。在实验箱上交通灯模块由高 8 位数据线控制:南北红灯 D9、D11 为高,南北黄灯D9、D11、D13、D15 为高,南北绿灯 D13、D15 为高,东西红灯 D8、D10 为高,东西黄灯由
6、D8、D10、D12 、D14 为高,东西绿灯 D12、D14 为高。交通灯模块的 I/O 地址:0x5008h2、系统工作原理本设计硬件由定时模块、发光二极管模块、数码管显示模块和紧急中断模块组成。信号灯受芯片中输出高低电平的控制。当锁存器 I/O 口输出为高电平时,他所驱动的信号灯即发光二极管就会亮起来。定时模块采用硬件定时和软件定时相结合的方法,用 DSP 定时/计数器定时 100ms,再用软件计时实现所需的定时。发光二极管模块由 DSP 控制发光二极管来实现。数码管显示模块由实验平台上的 LED 显示模块实现。紧急中断模块是由单脉冲发生单元和 DSP 中断控制器组成。本次设计中东西南北
7、路口的红灯均亮 1 秒,信号灯开始工作,东西红灯亮 20 秒,在东西红灯亮的同时,南北绿灯亮 20 秒。到 20 秒时,东西绿灯闪亮,绿灯闪亮的周期为 2 秒(亮 1 秒,灭 1 秒)。绿灯闪亮 3 次后灭,东西黄灯亮并维持 4 秒。到 4 秒时,东西黄灯灭,东西红灯亮,同时南北红灯灭,南北绿灯亮。东西红灯亮维持 20 秒,南北绿灯亮维持 20 秒,到 20 秒时,南北绿灯闪亮 3 次后灭,南北黄灯亮,并维持 4 秒。到 4 秒时,南北黄灯灭,南北红灯亮,同时东西红灯灭,东西绿灯亮。紧接着开始第二周期的动作,以后周而复始的循环。3、工作状态状态一:南北绿灯、东西红灯,延时 20 秒,20 秒后
8、南北绿灯闪 3 次,东西红灯延时 6 秒;状态二:南北黄灯、东西红灯,持续 6 秒状态三:东西绿灯、南北红灯,延时 20 秒,20 秒后东西绿灯闪 3 次,南北红灯持续 6 秒;状态四:东西黄灯、南北红灯,持续 6 秒;状态五:紧急状态下东西南北均亮红灯;1.实验设备计算机,ICETEK-VC5416A-S61 实验箱2.软件的使用本次设计主要使用的是 CCS 软件,CCS 是一种针对 TMS320 系列 DSP 的集成开发环境,在 Windows 操作系统下,采用图形接口界面,提供有环境配置、源文件编辑、程序调试、跟踪和分析等工具。实验步骤1实验准备: 连接实验设备。 连接实验箱附带的键盘的
9、PS2 插头到ICETEK-CTR 的“键盘接口”P8。 将ICETEK-CTR 板的供电电源开关拨动到“开”的位置。2设置Code Composer Studio 3.1 在硬件仿真(Emulator)方式下运行:3启动Code Composer Studio 3.1:4打开工程文件:工程文件为:C:ICETEKVC5416AeVC5416AeLab0601-TrafficLightv61light.pjt。5编译并下载程序:6运行程序观察结果:观察交通灯信号是否正常工作。7突发事件控制:在ICETEK-CTR 附带的小键盘上按下除“9”键外的按键,观察信号是否满足要求。8结束程序运行退出。
10、在ICETEK-CTR 附带的小键盘上按下“9”键。9退出CCS。总结通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟是第一次接触通信仿真,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固最后在老师的辛勤的指导下,终于游逆而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识
11、,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。附加程序:#include “scancode.h“#define SPSA0 *(unsigned int *)0x38#define SPSD0 *(unsigned int *)0x39#define REGISTERCLKMD (*(unsigned int *)0x58)#define TIM *(int *)0x24#define PRD *(int *)0x25#define TCR *(int *)0x26#define IMR *(int *)0x0#define IFR *(int *)
12、0x1#define PMST *(int *)0x1d#define nStatusNSGreenEWRed 160#define nStatusNSFlashEWRed 184#define nStatusNSYellowEWRed 200#define nStatusNSRedEWYellow 216#define nStatusNSRedEWGreen 376#define nStatusNSRedEWFlash 400#define nStatusNSRedEWYellow1 416#define nStatusNSYellowEWRed1 432#define nTotalTime
13、 448#define nStatusHold 160#define statusNSGreenEWRed 0#define statusNSFlashEWRed 1#define statusNSYellowEWRed 2#define statusNSRedEWYellow 3#define statusNSRedEWGreen 4#define statusNSRedEWFlash 5#define statusHold 6#define LCDDELAY 1#define LCDCMDTURNON 0x3f#define LCDCMDTURNOFF 0x3e#define LCDCMD
14、STARTLINE 0xc0#define LCDCMDPAGE 0xb8#define LCDCMDVERADDRESS 0x40ioport unsigned int port3004;/ CTR 扩展寄存器定义ioport unsigned int port8000;ioport unsigned int port8001;ioport unsigned int port8002;ioport unsigned int port8003;ioport unsigned int port8004;ioport unsigned int port8005;ioport unsigned in
15、t port8007;#define CTRGR port8000#define CTRLCDCMDR port8001#define CTRKEY port8001#define CTRCLKEY port8002#define CTRLCDCR port8002#define CTRLCDLCR port8003#define CTRLCDRCR port8004#define CTRLA port8005#define CTRLR port8007void InitDSP();void InitTimer();void InitICETEKCTR();void interrupt tim
16、e(void);void interrupt xint2(void); / XINT2 中断服务程序void SetLEDArray(int nNumber); / 修改显示内容void RefreshLEDArray(); / 刷新显示void EndICETEKCTR();void TurnOnLCD();void LCDCLS();void Delay(unsigned int nDelay);unsigned int uWork,nTimeCount;unsigned int uLightStatusEW,uLightStatusSN;unsigned int bHold;unsign
17、ed char ledbuf8,ledx8;unsigned char led40=0x7E,0x81,0x81,0x7E,0x00,0x02,0xFF,0x00,0xE2,0x91,0x91,0x8E,0x42,0x89,0x89,0x76,0x38,0x24,0x22,0xFF,0x4F,0x89,0x89,0x71,0x7E,0x89,0x89,0x72,0x01,0xF1,0x09,0x07,0x76,0x89,0x89,0x76,0x4E,0x91,0x91,0x7E;unsigned char ledkey108=0x00,0x00,0x7C,0x82,0x82,0x82,0x7C
18、,0x00, /00x00,0x00,0x00,0x84,0xFE,0x80,0x00,0x00, /10x00,0x00,0x84,0xC2,0xA2,0x92,0x8C,0x00, /20x00,0x00,0x44,0x92,0x92,0x92,0x6C,0x00,0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00,0x00,0x00,0x4E,0x92,0x92,0x92,0x62,0x00,0x00,0x00,0x7C,0x92,0x92,0x92,0x64,0x00,0x00,0x00,0x02,0xC2,0x32,0x0A,0x06,0x00,0x00,
19、0x00,0x6C,0x92,0x92,0x92,0x6C,0x00,0x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00;main()int nWork1,nWork2,nWork3,nWork4,tKey;int nNowStatus,nOldStatus,nOldTimeCount,nSaveTimeCount,nSaveStatus;unsigned int nScanCode;nTimeCount=0; bHold=0;uLightStatusEW=uLightStatusSN=0;nNowStatus=0; nOldStatus=1; nOldTimeCo
20、unt=0;InitDSP(); / 初始化 DSP,设置运行速度InitICETEKCTR(); / 初始化显示/控制模块InitTimer(); / 设置定时器中断/ 根据计时器计数切换状态/ 根据状态设置计数和交通灯状态while ( 1 )if ( bHold nTimeCount=nSaveTimeCount;bHold=0;else if ( nTimeCount=0 if ( bHold )if ( nWork210 )nTimeCount=nWork1*10;nWork2=10;if ( nOldTimeCount!=nWork2 )nOldTimeCount=nWork2;S
21、etLEDArray(nWork2);break;case statusNSRedEWGreen:nWork1=(nStatusNSRedEWGreen-nStatusNSRedEWYellow)/20;if ( nWork10 )nWork2=20-(nTimeCount-nStatusNSRedEWYellow)/nWork1;if ( bHold )if ( nWork210 )nTimeCount=nStatusNSRedEWYellow+nWork1*10;nWork2=10;if ( nOldTimeCount!=nWork2 )nOldTimeCount=nWork2;SetLE
22、DArray(nWork2);break;case statusHold:nWork1=nStatusHold/20;if ( nWork10 )nWork2=20-nTimeCount/nWork1;if ( nOldTimeCount!=nWork2 )nOldTimeCount=nWork2;SetLEDArray(nWork2);break;elseif ( bHold )nSaveStatus=nNowStatus;nSaveTimeCount=nTimeCount;nNowStatus=statusHold;nTimeCount=0;if ( nSaveStatus=statusN
23、SFlashEWRed | nSaveStatus=statusNSYellowEWRed )nSaveStatus=statusNSRedEWGreen;nSaveTimeCount=nStatusNSRedEWYellow;else if ( nSaveStatus=statusNSRedEWFlash | nSaveStatus=statusNSRedEWYellow )nSaveStatus=statusNSGreenEWRed;nSaveTimeCount=0;nOldStatus=nNowStatus;switch ( nNowStatus )case statusNSGreenE
24、WRed:uLightStatusEW=0x24; uLightStatusSN=0x49;SetLEDArray(20);break;case statusNSFlashEWRed:uLightStatusEW=0x24; uLightStatusSN=0x49;SetLEDArray(0);break;case statusNSYellowEWRed:uLightStatusEW=0x24; uLightStatusSN=0x52;SetLEDArray(20);break;case statusNSRedEWYellow:uLightStatusEW=0x12; uLightStatus
25、SN=0x64;SetLEDArray(20);break;case statusNSRedEWGreen:uLightStatusEW=0x09; uLightStatusSN=0x64;SetLEDArray(20);break;case statusNSRedEWFlash:uLightStatusEW=0x09; uLightStatusSN=0x64;SetLEDArray(0);break;case statusHold:uLightStatusEW=0x24; uLightStatusSN=0x64;SetLEDArray(20);break;CTRLR=uLightStatus
26、EW; CTRLR=uLightStatusSN; / 设置交通灯状态RefreshLEDArray(); / 刷新发光二极管显示nScanCode=port8001; / 读键盘扫描码nScanCodetKey=CTRCLKEY;if ( nScanCode=SCANCODE_9 ) break;EndICETEKCTR();exit(0);/ 定时器中断服务程序,进行时钟计数void interrupt time(void)nTimeCount+;nTimeCount%=nTotalTime;/ 设置发光二极管显示内容void SetLEDArray(int nNumber)int i,S
27、howNumber;ShowNumber=nNumber/2;if(ShowNumber9) ShowNumber=0;CTRLCDCMDR=LCDCMDPAGE; / 设置操作页=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);CTRLCDCMDR=LCDCMDVERADDRESS; / 起始列=0Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);for ( i=0;i8;i+ )CTRLCDLCR=ledkeyShowNumberi;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY
28、);/ 将缓存中点阵送发光二极管显示void RefreshLEDArray()int i;for ( i=0;i8;i+ )CTRGR=ledxi;CTRLA=ledbufi;/ 初始化 DSP,设置运行速度=8MHzvoid InitDSP()REGISTERCLKMD=0; / 复位 PLLREGISTERCLKMD=0x1007; / 速度设置=16MHz/ 设置定时器参数、允许中断void InitTimer()unsigned int k;asm(“ ssbx INTM“); / 关中断,进行关键设置时不许打扰/ 设置通用定时器k=PMST; / 设置 PMST 寄存器PMST =
29、k / 中断向量表起始地址=80HIMR = 0x0c; / 使能 TINTTCR = 0x41f; / 预分频系数为 16TIM = 0; / 时钟计数器清 0PRD = 0x0f423; / 周期寄存器为 0ffHTCR = 0x42f; / 复位、启动IFR = 0x0c; / 清中断标志位port3004=0; / 使能 XINT2asm(“ rsbx INTM“); / 开中断/ 初始化 ICETEK-CTR 板上设备void InitICETEKCTR()int k;CTRGR=0; / 初始化 ICETEK-CTRCTRGR=0x80;CTRGR=0;CTRLR=0; / 关闭东
30、西方向的交通灯CTRLR=0x40; / 关闭南北方向的交通灯CTRLR=0x0c1; / 开启发光二极管显示阵列CTRLR=0xc8; /使能外部中断for ( k=0;k8;k+ )ledbufk=0x0ff; / 显示为空白ledxk=(k4); / 生成显示列控制字k=CTRCLKEY; / 清除键盘缓冲区TurnOnLCD(); / 打开显示LCDCLS(); / 清除显示内存CTRLCDCMDR=LCDCMDSTARTLINE; / 设置显示起始行CTRLCDCR=0;void interrupt xint2(void) / XINT2 中断服务程序bHold=1;void End
31、ICETEKCTR()int k;CTRLR=0; / 关闭东西方向的交通灯CTRLR=0x40; / 关闭南北方向的交通灯CTRLR=0x0c0; / 关闭发光二极管显示阵列k=CTRCLKEY; / 清除键盘缓冲区void TurnOnLCD()CTRLCDCMDR=LCDCMDTURNON;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY); CTRLCDCMDR=LCDCMDSTARTLINE;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);void LCDCLS()int i,j;CTRLCDCMDR=LCDCM
32、DSTARTLINE;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);for ( i=0;i8;i+ )CTRLCDCMDR=LCDCMDPAGE+i;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);CTRLCDCMDR=LCDCMDVERADDRESS;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);for ( j=0;j64;j+ )CTRLCDLCR=0;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);CTRLCDCMDR=LCDCMDPAGE+i;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);CTRLCDCMDR=LCDCMDVERADDRESS;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);for ( j=0;j64;j+ )CTRLCDRCR=0;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);void Delay(unsigned int nDelay)int ii,jj,kk=0;for ( ii=0;iinDelay;ii+ )for ( jj=0;jj1024;jj+ )kk+;