摘要:设计交通灯控制程序、用ICETEK-CTR上的发光二极管的亮灭模拟交通信号,并用其显示阵列模拟显示;使用TMS320VC5509DSP片上定时器定时产生时钟计数;利用ICETEK-CTR上键盘产生外中断,从而模拟实际生活中十字路口交通灯控制。
关键词:交通灯控制、ICETEK-CTR发光二极管、定时器、键盘
目录:
1.系统设计要求
2.总体方案设计
3.程序编写
4.实验步骤及调试
5.设计总结
(一)
系统设计要求
利用ICETEK-EDU实验箱提供的设备,设计模拟实际生活中十字路口交通灯控制,具体要求如下:
交通灯分红黄绿三色,东、南、西、北各一组,用灯光信号实现对交通的控制:绿灯信号表示通行,黄灯表示警告,红灯禁止通行,灯光闪烁表示信号即将改变。
计时显示:8*8点阵显示两位计数,为倒计时,每秒改变计数显示。
正常交通灯信号自动变换:
(1) 南北方向绿灯,东西红灯(
20秒)
(2) 南北方向绿灯闪烁
(3) 南北方向黄灯
(4) 南北方向红灯,东西方向黄灯
(5) 东西方向绿灯(
20秒)
(6) 东西方向绿灯闪烁
(7) 东西方向黄灯
(8) 返回(
1)循环控制
紧急情况;
利用ICETEK-CTR上键盘产生外中断,中断正常信号顺序,模拟突发情况。
(二
) 总体方案设计
(1) 交通灯模拟:
利用ICETEK-CTR上的一组发光二极管(共12只,分为东西南北四组、红黄绿三色)的亮灭实现交通信号的模拟。
(2) 计时显示:
利用ICETEK-CTR上的发光二极管显示阵列模拟显示。
Welcome visit us at:
www.eepw.com.cn 对于计数显示,当处于状态1、5、*中时需要进行倒计时,需要计算在此状态中的计数值增量,根据增量判断是否更新计数显示。
(3) 计时:
使用TMS320VC5509DSP片上定时器,定时产生时钟计数,再利用此计数对应具体时间。
Welcome visit us at:
www.eepw.com.cn statusNSRedEWYellow 4 南北红灯,东西黄灯 4秒(16,200,215) 20
状态编号 信号灯状态 状态定义 保持时间(计数值,起始时间,结束时间) 计数显示
1 南北绿灯,东西红灯 statusNSGreenEWRed 20秒(160,0,159) 20-0
2 南北绿灯闪烁,东西红灯 statusNSFlashEWRed 6秒(24,160,183) 0
3 南北黄灯,东西红灯 statusNSYellowEWRed 4秒(16,184,199) 20
5 南北红灯,东西绿灯 statusNSRedEWGreen 20秒(160,216,375) 20-1
6 南北红灯,东西绿灯闪烁 statusNSRedEWFlash 6秒(24,376,399) 0
7 南北红灯,东西黄灯 statusNSRedEWYellow 4秒(16,400,415) 20
8 南北黄灯,东西红灯 statusNSYellowEWRed 4秒(16,416,431) 20
* 南北红灯,东西红灯 StatusHold 20秒(160,0,159) 20-1
其中,正常顺序每112秒(计数值日448)为一个循环,状态“*”为非顺序状态。
这样,只要根据计数值就可确定当前状态,根据状态再分情况处理。
(4) 紧急情况:
紧急情况处理;模拟紧急情况(重要车队通过、急救车通过等)发生时,交通警察手动控制
1.
当任意方向通行剩余时间多于是秒,将时间改成10秒。
2.
正常变换到四面红灯(20秒)
3.
直接返回正常顺序的下一个通行信号(跳过闪烁绿灯、黄灯状态)。
(三)总程序流程图
Welcome visit us at:
www.eepw.com.cn 定时器中断服务程序入口
计数工作变量值在原基础上加1
退出定时器中断服务程序
开始
初始化:EMIF、CPU、频率、ICETEK-CTR、定时器、中断控制寄存器、工作变量
根据定时器计数确定当前状态
根据当前状态设置批示灯状态
根据当前状态设置发光二极管显示阵列状态
读取键盘输入
结束?
结束
Welcome visit us at:
www.eepw.com.cn (四)
程序编写
根据设计要求,由于控制是由不同的各种状态按顺序发生的,我们可以采用状态机制控制方法来解决此问题。具体方法是:首先列举所有可能发生的状态;然后将这些状态编号,按顺序产生这些状态;状态延续的时间用程序控制。对于突发情况,可采用在正常顺序的控制中插入特殊控制序列的方式完成。
注:程序附在后面几页里
(五)实验步骤及调试
1.连接实验箱附带的键盘的PS2插头到ICETEK-CTRR的键盘接口P8
2.将ICETEK-CTR板的供电电源开关拨动到“开”的位置。
3.设置Code Composer Studio2.21在硬件仿真方式下运行。
4.启动Code Composer Studio2.21:
选择菜单Debug->Reset CPU。
5.编译并下载已编好的程序。
6.运行程序观察结果。
7.突发事件控制。
在ICETEK-CTR附带的小键盘上按下除“Enter“键外的按键,观察信号是否满足要求。
8.结束程序运行退出。
在ICETEK-CTR附带的小键盘上按下“Enter“键。
9.退出CCS
(六)设计总结
通过此次课程设计,对交通灯的控制有了进一步的认识;同时 也掌握了TMS320VC5509DST定时器、外中断的使用和编程。设计控制系统在把握好整体设计理念的同时,要考虑到特殊情况的存在。本次控制程序的编写,考虑交通出现紧急情况是比较困难的一个方面,交通灯要如何高速。
(七)参考文献
胡庆名 李小刚 吴钰淳 EMS320C55X DSP原理、应用和设计 北京机械出版社,2005
同组者:
(八)程序:
键盘中断服务程序入口
设置突发事件标志
退出键盘中断服务程序
Welcome visit us at:
www.eepw.com.cn #include "c5509.h"
#include "ICETEK-VC5509-EDU.h"
#include "scancode.h"
#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 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
void InitDSP();
void InitTimer();
void InitICETEKCTR();
void INTR_init();
void interrupt time(void);
void interrupt xint2(void);// XINT2中断服务程序
void SetLEDArray1(int nNumber); // 修改显示内容
void RefreshLEDArray1(); // 刷新显示
void EndICETEKCTR();
unsigned int uWork,nTimeCount,nTimeMS;
unsigned int uLightStatusEW,uLightStatusSN;
unsigned int bHold;
unsigned char ledbuf[8],ledx[8];
unsigned char led[40]=
{
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,
Welcome visit us at:
www.eepw.com.cn 0x76,0x89,0x89,0x76,0x4E,0x91,0x91,0x7E
};
int www=0;
main()
{
int nWork1,nWork2,nWork3,nWork4;
int nNowStatus,nOldStatus,nOldTimeCount,nSaveTimeCount,nSaveStatus;
unsigned int nScanCode;
nTimeCount=nTimeMS=0; bHold=0;
uLightStatusEW=uLightStatusSN=0;
nNowStatus=0; nOldStatus=1; nOldTimeCount=0;
InitDSP(); // 初始化DSP,设置运行速度
InitICETEKCTR(); // 初始化显示/控制模块
InitTimer(); // 设置定时器中断
// 根据计时器计数切换状态
// 根据状态设置计数和交通灯状态
while ( 1 )
{
if ( bHold && nNowStatus==statusHold )
{
if ( nTimeCount>=nStatusHold )
{
nNowStatus=nSaveStatus;
nTimeCount=nSaveTimeCount;
bHold=0;
}
}
else if ( nTimeCount<nStatusNSGreenEWRed ) nNowStatus=statusNSGreenEWRed;
else if ( nTimeCount<nStatusNSFlashEWRed ) nNowStatus=statusNSFlashEWRed;
else if ( nTimeCount<nStatusNSYellowEWRed ) nNowStatus=statusNSYellowEWRed;
else if ( nTimeCount<nStatusNSRedEWYellow ) nNowStatus=statusNSRedEWYellow;
else if ( nTimeCount<nStatusNSRedEWGreen ) nNowStatus=statusNSRedEWGreen;
else if ( nTimeCount<nStatusNSRedEWFlash ) nNowStatus=statusNSRedEWFlash;
else if ( nTimeCount<nStatusNSRedEWYellow1 ) nNowStatus=statusNSRedEWYellow;
Welcome visit us at:
www.eepw.com.cn else if ( nTimeCount<nStatusNSYellowEWRed1 ) nNowStatus=statusNSYellowEWRed;
if ( nNowStatus==nOldStatus )
{
switch ( nNowStatus )
{
case statusNSFlashEWRed:
nWork1=nTimeCount-nStatusNSGreenEWRed;//-160
nWork2=nStatusNSYellowEWRed-nStatusNSFlashEWRed;//200-184=16
nWork3=nWork2/3;
nWork4=nWork3/2;
if ( nWork1>=0 && nWork2>0 && nWork3>0 && nWork4>0 )
uLightStatusSN=( (nWork1%nWork3)<=nWork4 )?(0x49):(0x40);
break;
case statusNSRedEWFlash:
nWork1=nTimeCount-nStatusNSRedEWGreen;
nWork2=nStatusNSRedEWYellow1-nStatusNSRedEWFlash;
nWork3=nWork2/3;
nWork4=nWork3/2;
if ( nWork1>=0 && nWork2>0 && nWork3>0 && nWork4>0 )
uLightStatusEW=( (nWork1%nWork3)<=nWork4 )?(0x09):(0x00);
break;
case statusNSGreenEWRed:
nWork1=nStatusNSGreenEWRed/20;
if ( nWork1>0 )
{
nWork2=20-nTimeCount/nWork1;
if ( bHold )
{
if ( nWork2>10 )
{
nTimeCount=nWork1*10;
nWork2=10;
}
}
if ( nOldTimeCount!=nWork2 )
{
nOldTimeCount=nWork2;
SetLEDArray1(nWork2);
}
Welcome visit us at:
www.eepw.com.cn }
break;
case statusNSRedEWGreen:
nWork1=(nStatusNSRedEWGreen-nStatusNSRedEWYellow)/20;
if ( nWork1>0 )
{
nWork2=20-(nTimeCount-nStatusNSRedEWYellow)/nWork1;
if ( bHold )
{
if ( nWork2>10 )
{
nTimeCount=nStatusNSRedEWYellow+nWork1*10;
nWork2=10;
}
}
if ( nOldTimeCount!=nWork2 )
{
nOldTimeCount=nWork2;
SetLEDArray1(nWork2);
}
}
break;
case statusHold:
nWork1=nStatusHold/20;
if ( nWork1>0 )
{
nWork2=20-nTimeCount/nWork1;
if ( nOldTimeCount!=nWork2 )
{
nOldTimeCount=nWork2;
SetLEDArray1(nWork2);
}
}
break;
}
}
else
{
if ( bHold )
{
Welcome visit us at:
www.eepw.com.cn nSaveStatus=nNowStatus;
nSaveTimeCount=nTimeCount;
nNowStatus=statusHold;
nTimeCount=0;
if ( nSaveStatus==statusNSFlashEWRed || nSaveStatus==statusNSYellowEWRed )
{
nSaveStatus=statusNSRedEWGreen;
nSaveTimeCount=nStatusNSRedEWYellow;
}
else if ( nSaveStatus==statusNSRedEWFlash || nSaveStatus==statusNSRedEWYellow )
{
nSaveStatus=statusNSGreenEWRed;
nSaveTimeCount=0;
}
}
nOldStatus=nNowStatus;
switch ( nNowStatus )
{
case statusNSGreenEWRed:
uLightStatusEW=0x24; uLightStatusSN=0x49;
SetLEDArray1(20);
break;
case statusNSFlashEWRed:
uLightStatusEW=0x24; uLightStatusSN=0x49;
SetLEDArray1(0);
break;
case statusNSYellowEWRed:
uLightStatusEW=0x24; uLightStatusSN=0x52;
SetLEDArray1(20);
break;
case statusNSRedEWYellow:
uLightStatusEW=0x12; uLightStatusSN=0x64;
SetLEDArray1(20);
break;
case statusNSRedEWGreen:
uLightStatusEW=0x09; uLightStatusSN=0x64;
SetLEDArray1(20);
break;
case statusNSRedEWFlash:
uLightStatusEW=0x09; uLightStatusSN=0x64;
SetLEDArray1(0);
Welcome visit us at:
www.eepw.com.cn break;
case statusHold:
uLightStatusEW=0x24; uLightStatusSN=0x64;
SetLEDArray1(20);
break;
}
}
CTRLR=uLightStatusEW; CTRLR=uLightStatusSN; // 设置交通灯状态
RefreshLEDArray1(); // 刷新发光二极管显示
nScanCode=CTRKEY; // 读键盘扫描码
nScanCode&=0x0ff;
if ( nScanCode==SCANCODE_Enter ) break;
}
EndICETEKCTR();
exit(0);
}
// 定时器中断服务程序,进行时钟计数
void interrupt time(void)
{
nTimeMS++;
if ( nTimeMS>=5 )
{
nTimeMS=0;
nTimeCount++;
nTimeCount%=nTotalTime;
}