数字电学的课程设计在灰烬中进阶!!!在线等待!!!

设计交通灯控制程序,通过ICETEK-CTR上发光二极管的开关来模拟交通信号,并利用其显示阵列来模拟显示;利用TMS320VC5509DSP片内定时器产生时钟计数;利用ICETEK-CTR上的键盘产生外部中断,模拟现实生活中十字路口的交通灯控制。

关键词:红绿灯控制,ICETEK-CTR LED,定时器,键盘。

目录:

1.系统设计要求

2.总体方案设计

3.编程;编排

4.实验步骤和调试

5.设计总结

(1)

系统设计要求

利用ICETEK-EDU实验箱提供的设备,对现实生活中十字路口的交通灯控制进行了设计和仿真。具体要求如下:

红绿灯分为黄、绿、东、南、西、北三种颜色。交通控制是通过灯光信号实现的:绿色信号表示交通,黄色信号表示警告,红色信号表示禁止交通,闪烁信号表示信号即将改变。

计时显示:8*8点阵显示两位数计数,为倒计时,每秒改变计数显示。

正常交通灯信号的自动转换;

(1)南北绿灯,东西红灯(

20秒)

(2)南北方向绿灯闪烁。

(3)南北方向的黄灯

(4)南北方向红灯,东西方向黄灯。

(5)东西向绿灯(

20秒)

(6)东西方向绿灯闪烁

(7)东西向黄灯

(8)退货(

1)循环控制

紧急情况;

使用ICETEK-CTR上的键盘产生外部中断,中断正常信号序列,模拟意外情况。

(2)

)总体方案设计

(1)红绿灯模拟:

交通信号的模拟是通过ICETEK-CTR上的一组发光二极管(***12,分为东、西、南、北、红、黄、绿四组)的开关来实现的。

(2)定时显示:

ICETEK-CTR上的LED显示阵列用于模拟显示。

欢迎访问我们的网站:www.eepw.com.cn

对于计数显示,需要在1,5和*的状态下进行递减计数,需要计算该状态下计数值的增量,根据增量判断是否更新计数显示。

(3)时机:

利用TMS320VC5509DSP片内定时器,定时产生时钟计数,然后用计数对应具体时间。

欢迎访问我们在:www.eepw.com.cn statusnsredewoll 4南北红灯,东西黄灯4秒(16,200,215) 20。

状态号信号灯状态状态定义保持时间(计数值、开始时间、结束时间)计数显示

1南北绿灯,东西红灯状态绿灯20秒(160,0,159) 20-0

2南北绿灯闪烁,东西红灯状态闪烁6秒(24,160,183) 0。

3南北黄灯、东西红灯状态持续4秒钟(16、184、199) 20

5南北红灯,东西绿灯状态statusNSRedEWGreen 20秒(160,216,375) 20-1。

6南北红灯、东西绿灯闪烁状态闪烁6秒(24,376,399) 0

7南北向红灯,东西向黄灯状态黄灯持续4秒(16,400,415) 20

8南北黄灯,东西红灯状态持续4秒(16,416,431) 20

*南北红灯,东西红灯状态保持20秒(160,0,159) 20-1。

其中,正常顺序为每112秒一个周期(计日448),状态“*”为非顺序状态。

这样,仅根据计数值就可以确定当前状态,并且可以根据状态来处理情况。

(4)紧急情况:

紧急处理;模拟紧急情况时(重要车队经过、救护车经过等。)发生,交警会手动控制。

1.

当任意方向的剩余时间超过秒时,将时间更改为10秒。

2.

正常情况下变四个红灯(20秒)

3.

直接按正常顺序回到下一个通过信号(跳过闪烁的绿灯和黄灯)。

(3)总体程序流程图

欢迎访问我们的网站:www.eepw.com.cn

定时器中断服务程序入口

将计数工作变量的原始值加上1。

退出定时器中断服务程序

开始

初始化:EMIF、CPU、频率、ICETEK-CTR、定时器、中断控制寄存器、工作变量。

根据定时器计数确定当前状态。

根据当前状态,设置指示灯状态。

根据当前状态设置LED显示阵列状态。

读取键盘输入

结束?

结束

欢迎访问我们的网站:www.eepw.com.cn

(4)

编程;编排

根据设计要求,由于控制是由不同的状态按顺序产生的,我们可以用状态机制控制的方法来解决这个问题。具体方法是:首先,列出所有可能的状态;然后这些状态依次编号生成;状态延续的持续时间由程序控制。对于紧急情况,特殊控制序列可以插入到正常序列控制中。

注:程序附在后面几页。

(五)实验步骤和调试

1.将连接到实验室箱的键盘的PS2插头连接到ICETEK-CTRR的键盘接口P8。

2.将ICETEK-CTR板的电源开关转到“开”的位置。

3.将Code Composer Studio2.21设置为在硬件仿真模式下运行。

4.开始代码作曲工作室2.21:

选择菜单调试-& gt;重置CPU .

5.编译并下载编译好的程序。

6.运行程序观察结果。

7.紧急控制。

按下ICETEK-CTR附带的键盘上除“Enter”键以外的键,观察信号是否符合要求。

8.结束程序并退出。

按下随ICETEK-CTR提供的键盘上的“Enter”键。

9.退出CCS

(6)设计总结

通过这次课程设计,我对红绿灯的控制有了进一步的了解;同时也掌握了TMS320VC5509DST定时器和外部中断的使用和编程。设计控制系统在把握整体设计理念的同时,要考虑到特殊情况的存在。这个控制方案的编制,考虑到交通突发事件是一个比较困难的方面,交通灯应该有多高。

(7)参考文献

胡肖刚吴玉春EMS320C55X DSP原理、应用与设计北京机械出版社,2005。

同一组:

(8)程序:

键盘中断服务程序入口

设置紧急标志

退出键盘中断服务程序。

欢迎访问我们的网站:www.eepw.com.cn

#包括“c5509.h”

#包括“ICETEK-VC5509-EDU.h”

#包含“scancode.h”

#定义nStatusNSGreenEWRed 160

# define nStatusNSFlashEWRed 184

#定义nStatusNSYellowEWRed 200

#定义nStatusNSRedEWYellow 216

#定义nStatusNSRedEWGreen 376

#定义nStatusNSRedEWFlash 400

# define nstatusnsredewyellow 1 416

# define nstatusnsyellowered 1 432

#定义nTotalTime 448

#定义nStatusHold 160

#定义statusNSGreenEWRed 0

#定义状态SFlashEWRed 1

#定义状态信息2

#定义状态黄色3

#定义状态4

#定义状态更新闪存5

#定义状态阈值6

void init DSP();

void init timer();

void initicetectr();

void INTR _初始化();

void中断时间(void);

void中断xint 2(void);// XINT2中断服务程序

void setledarray 1(int n number);//修改显示内容

void refreshledarray 1();//刷新显示

void endicetectr();

unsigned int uWork,nTimeCount,nTimeMS

无符号int uLightStatusEW,uLightStatusSN

无符号int bHold

无符号字符ledbuf[8],ledx[8];

无符号字符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,

欢迎访问我们的网站:www.eepw.com.cn

0x76,0x89,0x89,0x76,0x4E,0x91,0x91,0x7E

};

int www = 0;

主()

{

int nWork1,nWork2,nWork3,nWork4

int nNowStatus,nOldStatus,nOldTimeCount,nSaveTimeCount,nSaveStatus。

无符号int nScanCode

ntime count = nti MEMS = 0;bHold = 0;

ulightstatusw = uLightStatusSN = 0;

nNowStatus = 0;nold status = 1;nOldTimeCount = 0;

init DSP();//初始化DSP,设置运行速度。

initicetectr();//初始化显示/控制模块

init timer();//设置定时器中断

//根据计时器计数切换状态。

//根据状态设置计数和红绿灯状态。

while ( 1)

{

if(bHold & amp;& ampnNowStatus==statusHold)

{

if(ntime count & gt;=nStatusHold)

{

nNowStatus = nSaveStatus

nTimeCount = nSaveTimeCount

bHold = 0;

}

}

else if(ntime count & lt;nStatusNSGreenEWRed)nNowStatus = statusNSGreenEWRed;

else if(ntime count & lt;nStatusNSFlashEWRed)nNowStatus = statusNSFlashEWRed;

else if(ntime count & lt;nStatusNSYellowEWRed)nNowStatus = statusNSYellowEWRed;

else if(ntime count & lt;nStatusNSRedEWYellow)nNowStatus = statusNSRedEWYellow;

else if(ntime count & lt;nStatusNSRedEWGreen)nNowStatus = statusNSRedEWGreen;

else if(ntime count & lt;nStatusNSRedEWFlash)nNowStatus = statusNSRedEWFlash;

else if(ntime count & lt;nstatusnsredewyellow 1)nNowStatus = statusNSRedEWYellow;

欢迎访问我们的网站:www.eepw.com.cn

else if(ntime count & lt;nstatusnsyellowewred 1)nNowStatus = statusNSYellowEWRed;

if ( nNowStatus==nOldStatus)

{

开关(无状态)

{

案例状态SFlashEWRed:

nwork 1 = ntime count-nStatusNSGreenEWRed;//-160

nwork 2 = nstatusnsyellowered-nStatusNSFlashEWRed;//200-184=16

nwork 3 = nwork 2/3;

nwork 4 = nwork 3/2;

if(nwork 1 & gt;= 0 & amp& ampnWork2 & gt0 & amp& ampnWork3 & gt0 & amp& ampnWork4 & gt0 )

uLightStatusSN =((nwork 1% nwork 3)& lt;=nWork4)?(0x 49):(0x 40);

打破;

案例状态回顾闪存:

nwork 1 = ntime count-nStatusNSRedEWGreen;

nwork 2 = nstatusnsredewellow 1-nStatusNSRedEWFlash;

nwork 3 = nwork 2/3;

nwork 4 = nwork 3/2;

if(nwork 1 & gt;= 0 & amp& ampnWork2 & gt0 & amp& ampnWork3 & gt0 & amp& ampnWork4 & gt0 )

uLightStatusEW =((nwork 1% nwork 3)& lt;=nWork4)?(0x 09):(0x 00);

打破;

案例状态已审核:

nwork 1 = nStatusNSGreenEWRed/20;

if(nwork 1 & gt;0 )

{

nwork 2 = 20-ntime count/nwork 1;

if ( bHold)

{

if(nwork 2 & gt;10 )

{

ntime count = nwork 1 * 10;

nwork 2 = 10;

}

}

if ( nOldTimeCount!=nWork2)

{

nOldTimeCount = nWork2

setledarray 1(nwork 2);

}

欢迎访问我们的网站:www.eepw.com.cn

}

打破;

案例状态回复绿色:

nwork 1 =(nStatusNSRedEWGreen-nStatusNSRedEWYellow)/20;

if(nwork 1 & gt;0 )

{

nwork 2 = 20-(ntime count-nStatusNSRedEWYellow)/nwork 1;

if ( bHold)

{

if(nwork 2 & gt;10 )

{

ntime count = nStatusNSRedEWYellow+nwork 1 * 10;

nwork 2 = 10;

}

}

if ( nOldTimeCount!=nWork2)

{

nOldTimeCount = nWork2

setledarray 1(nwork 2);

}

}

打破;

案例状态阈值:

nwork 1 = nStatusHold/20;

if(nwork 1 & gt;0 )

{

nwork 2 = 20-ntime count/nwork 1;

if ( nOldTimeCount!=nWork2)

{

nOldTimeCount = nWork2

setledarray 1(nwork 2);

}

}

打破;

}

}

其他

{

if ( bHold)

{

欢迎访问我们的网站:www.eepw.com.cn

nSaveStatus = nNowStatus

nSaveTimeCount = nTimeCount

nNowStatus = statusHold

ntime count = 0;

if(nSaveStatus = = statusNSFlashEWRed | | nSaveStatus = = statusNSYellowEWRed)

{

nSaveStatus = statusNSRedEWGreen;

nSaveTimeCount = nStatusNSRedEWYellow;

}

else if(nSaveStatus = = statusNSRedEWFlash | | nSaveStatus = = statusNSRedEWYellow)

{

nSaveStatus = statusNSGreenEWRed;

nSaveTimeCount = 0;

}

}

nOldStatus = nNowStatus

开关(无状态)

{

案例状态已审核:

uLightStatusEW = 0x24uLightStatusSN = 0x49

setledarray 1(20);

打破;

案例状态SFlashEWRed:

uLightStatusEW = 0x24uLightStatusSN = 0x49

setledarray 1(0);

打破;

案例状态如下:

uLightStatusEW = 0x24uLightStatusSN = 0x52

setledarray 1(20);

打破;

案例状态黄色:

uLightStatusEW = 0x 12;uLightStatusSN = 0x64

setledarray 1(20);

打破;

案例状态回复绿色:

uLightStatusEW = 0x09uLightStatusSN = 0x64

setledarray 1(20);

打破;

案例状态回顾闪存:

uLightStatusEW = 0x09uLightStatusSN = 0x64

setledarray 1(0);

欢迎访问我们的网站:www.eepw.com.cn

打破;

案例状态阈值:

uLightStatusEW = 0x24uLightStatusSN = 0x64

setledarray 1(20);

打破;

}

}

CTRLR = uLightStatusEWCTRLR = uLightStatusSN//设置红绿灯状态

refreshledarray 1();//刷新LED显示

nScanCode = CTRKEY//读取键盘扫描码

nScanCode & amp= 0x0ff

if(nscan code = = scan code _ Enter)break;

}

endicetectr();

退出(0);

}

//定时器中断服务程序,计数时钟。

无效中断时间(无效)

{

nti mems++;

if(nTimeMS & gt;=5 )

{

nti MEMS = 0;

ntime count++;

nTimeCount % = nTotalTime

}