交通灯综合控制报告.docx

上传人:b****4 文档编号:4879624 上传时间:2022-12-11 格式:DOCX 页数:22 大小:112.55KB
下载 相关 举报
交通灯综合控制报告.docx_第1页
第1页 / 共22页
交通灯综合控制报告.docx_第2页
第2页 / 共22页
交通灯综合控制报告.docx_第3页
第3页 / 共22页
交通灯综合控制报告.docx_第4页
第4页 / 共22页
交通灯综合控制报告.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

交通灯综合控制报告.docx

《交通灯综合控制报告.docx》由会员分享,可在线阅读,更多相关《交通灯综合控制报告.docx(22页珍藏版)》请在冰豆网上搜索。

交通灯综合控制报告.docx

交通灯综合控制报告

京江学院

JINGJIANGCOLLEGEOFJIANGSUUNIVERSITY

 

DSP原理课程设计

交通灯综合控制

 

班级:

学号:

姓名:

 

2016年6月

目录

1引言3

2课程设计的目标4

2.1课程设计的背景4

2.2设计要求4

2.3设计思路简介4

2.4交通灯控制要求5

2.5交通灯模拟5

2.6计时6

2.7紧急情况6

2.8程序设计6

3DSP定时器的算法原理8

3.1CPU定时器的原理8

3.2CPU定时寄存器原理8

4系统程序设计9

4.1流程图9

4.2试验程序10

5心得体会21

引言

随着计算机和信息技术的飞速发展数字信号处理技术得到迅速的发展。

DSP(DigitalSignalProcessing)是一门涉及许多学科和领域的新兴学科。

数字信号处理是一种通过数字信号处理器来处理现实信号的方法这些信号由数字序列表示。

在过去的二十多年时间里数字信号处理已经在通信等领域得到极为广泛的应用。

本次设计是基于DSP来实现交通灯的控制利用发光二级管来模拟交通信号利用数码管显示倒计时时间利用TMS320VC5416DSP片上定时器定时产生时钟计数来模拟实际生活中十字路口交通灯。

关键词:

DSPTMS320VC5416;交通灯;发光二极管

课程设计的目标

课程设计的背景

DSP是一种将处理器的计算核心和一定的外部设备集成在一个单片芯片上而构成的类似于单片机的一种处理器芯片。

不同于一般单片机的是由于DSP采用了特殊的总线结构和体系因此它在执行数字信号处理计算方面具有更高的性能。

数字信号处理已经在通信、信号处理等领域得到极为广泛的应用。

十字路口交通灯在我们的日常生活中随处可见它为繁忙的道路交通及人们的安全提供了较好的保障。

然而我们只知道交通灯在红、黄、绿三色之间交替更换来控制人车流量去对其内部的工作原理及软硬件的设计了解很少因此要通过此次简单道路交通灯控制系统软硬件设计来进一步研究交通灯的内部结构。

最重要的是将学习到的DSP系统的组成与原理应用到交通灯的设计当中。

通过《DSP技术及应用》课程设计,是学生能够将学到的DSP系统的组成与原理用到具体的实际系统中,加深对DSP系统的理解,是将该门课程与实际问题相连接的关键步骤。

通过课程设计,能够提高学生分析问题,解决问题,从而运用所学知识解决实际问题的能力,并培养基本的、良好的软硬件射进能力。

设计要求

利用C语言在CCS环境中编写一个交通灯综合控制程序,并能通过硬件仿真对所编写的程序及其应用性、可行性进行验证。

设计思路简介

在TMS320C54x系统开发环境CCS(CodeComposerStudio)下对交通灯综合控制的实现原理进行讨论。

通过实验仿真,可以在硬件实验箱上看到对交通灯的模拟控制。

交通等综合控制的控制原理

交通灯控制要求

利用ICETEK-S60实验箱提供的设备,设计模拟实际生活中十字路口交通灯控制的程序。

求如下:

-交通灯分红黄绿三色,东、南、西、北各一组,用灯光信号实现对交通的控制:

绿灯信号

表示通行,黄灯表示警告,红灯禁止通行,灯光闪烁表示信号即将改变。

-计时显示:

液晶屏幕上8×8点阵显示0-9计数。

-正常交通控制信号顺序:

正常交通灯信号自动变换:

⑴南北方向绿灯,东西红灯(20秒)。

⑵南北方向绿灯闪烁。

⑶南北方向黄灯。

⑷南北方向红灯,东西方向黄灯。

⑸东西方向绿灯(20秒)。

⑹东西方向绿灯闪烁。

⑺东西方向黄灯。

⑻返回⑴循环控制。

-紧急情况处理:

模仿紧急情况(重要车队通过、急救车通过等)发生时,交通警察手动控制

⑴当任意方向通行剩余时间多于5秒,将时间改成5秒。

⑵正常变换到四面红灯(20秒)。

⑶直接返回正常信号顺序的下一个通行信号(跳过闪烁绿灯、黄灯状态)。

交通灯模拟

利用ICETEK-CTR上的一组发光二极管(共12只,分为东西南北四组、红黄绿三色)的亮灭实现交通信号的模拟。

#defineCTRLCDCMDR*(int*)0x108001

#defineCTRKEY*(int*)0x108001

#defineCTRLCDCR*(int*)0x108002

#defineCTRCLKEY*(int*)0x108002

#defineCTRLCDLCR*(int*)0x108003

#defineCTRLCDRCR*(int*)0x108004

#defineCTRLA*(int*)0x108005

#defineCTRLR*(int*)0x108007

计时

使用TMS320VC5416DSP片上定时器,定时产生时钟计数,再利用此计数对应具体时间。

定时器控制及中断编程可参考实验3.3程序。

紧急情况

利用ICETEK-CTR上键盘产生外中断,中断正常信号顺序,模拟突发情况。

外中断编程控制可参考实验3.4程序。

程序设计

根据设计要求,由于控制是由不同的各种状态按顺序发生的,我们可以采用状态机制控制

方法来解决此问题。

这种方法是:

首先列举所有可能发生的状态;然后将这些状态编号,按顺

序产生这些状态;状态延续的时间用程序控制。

对于突发情况,可采用在正常顺序的控制中插

入特殊控制序列的方式完成。

时钟计数:

采用250ms一次中断进行累加计数。

表格1

状态编号

信号灯状态

状态定义

保持时间(计数值,起始时间,结束时间)

计数显示

1

南北绿灯,东西红灯

statusNSGreenEWRed

20秒(160,0,159)

20-0

2

南北绿灯闪烁,东西红灯

statusNSFlashEWRed

6秒(24,160,183)

0

3

南北黄灯,东西红灯

statusNSYellowEWRed

4秒(16,184,199)

20

4

南北红灯,东西黄灯

statusNSRedEWYellow

4秒(16,200,215)

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)为一个循环,状态“*”为非顺序状态。

这样,只要根据计数值就可确定当前状态,根据状态再分情况处理。

对于计数显示,当处于状态1、5、*中时需要进行倒计时,需要计算在此状态中的计数值

增量,根据增量判断是否更新计数显示。

DSP定时器的算法原理

CPU定时器的原理

本次设计主要用的是F2812器件上的3个32位CPU定时器(TIMER0/1/2)。

其中定时器1和定时器2预留给实时操作系统使用(如DSP-BIOS),只有定时器0用户可以在应用程序中使用。

定时器功能框图如下:

CPU定时寄存器原理

定时器在工作过程中,首先把周期寄存器(PRDH:

PRD)的值装入32位计数寄存器。

计数寄存器根据SYSCLKOUT时钟递减计数。

当计数寄存器等于0时,定时器中断输出产生一个中断脉冲。

(1)定时器计数寄存器(TIMERxTIM和TIMERxTIMH)

(2)定时器控制寄存器(TIMERxTCR):

使能中断,定时功能;

(3)定时器周期寄存器(TIMERxPRD):

符合条件则周期性重新装载并保存周期值

(4)定时器预定标寄存器(TIMERxTPR和TIMERxTPRH):

控制多久减1。

系统程序设计

流程图

图51实验程序流程图

图52设计总流程图

设计总流程图

试验程序

#include"scancode.h"

#defineSPSA0*(unsignedint*)0x38

#defineSPSD0*(unsignedint*)0x39

#defineREGISTERCLKMD(*(unsignedint*)0x58)

#defineTIM*(int*)0x24

#definePRD*(int*)0x25

#defineTCR*(int*)0x26

#defineIMR*(int*)0x0//IMR中断屏蔽寄存器

#defineIFR*(int*)0x1//IFR中断标志寄存器

#definePMST*(int*)0x1d//PMST处理器模式状态寄存器(地址1dh)

#definenStatusNSGreenEWRed160//状态1计数结束时间

#definenStatusNSFlashEWRed184

#definenStatusNSYellowEWRed200

#definenStatusNSRedEWYellow216

#definenStatusNSRedEWGreen376

#definenStatusNSRedEWFlash400

#definenStatusNSRedEWYellow1416

#definenStatusNSYellowEWRed1432

#definenTotalTime448

#definenStatusHold160

#definestatusNSGreenEWRed0

#definestatusNSFlashEWRed1

#definestatusNSYellowEWRed2

#definestatusNSRedEWYellow3

#definestatusNSRedEWGreen4

#definestatusNSRedEWFlash5

#definestatusHold6

#defineLCDDELAY1

#defineLCDCMDTURNON0x3f

#defineLCDCMDTURNOFF0x3e

#defineLCDCMDSTARTLINE0xc0

#defineLCDCMDPAGE0xb8

#defineLCDCMDVERADDRESS0x40

ioportunsignedintport3004;

//CTR扩展寄存器定义

ioportunsignedintport8000;

ioportunsignedintport8001;//8001:

读键盘扫描值,写液晶控制寄存器地址

ioportunsignedintport8002;//8002:

液晶控制寄存器地址

ioportunsignedintport8003;//8003,8004:

液晶显示数据寄存器地址

ioportunsignedintport8004;//

ioportunsignedintport8005;//8005:

发光二极管显示阵列控制寄存器地址

ioportunsignedintport8007;//8007:

发光二极管显示阵列控制寄存器地址

#defineCTRGRport8000

#defineCTRLCDCMDRport8001

#defineCTRKEYport8001

#defineCTRCLKEYport8002

#defineCTRLCDCRport8002

#defineCTRLCDLCRport8003

#defineCTRLCDRCRport8004

#defineCTRLAport8005

#defineCTRLRport8007

voidInitDSP();//void表示此函数为空类型,执行此函数后不产生函数值

voidInitTimer();

voidInitICETEKCTR();

voidinterrupttime(void);

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

voidSetLEDArray(intnNumber);//修改显示内容

voidRefreshLEDArray();//刷新显示

voidEndICETEKCTR();

voidTurnOnLCD();

voidLCDCLS();

voidDelay(unsignedintnDelay);

unsignedintuWork,nTimeCount;

unsignedintuLightStatusEW,uLightStatusSN;

unsignedintbHold;

unsignedcharledbuf[8],ledx[8];

unsignedcharled[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,

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

};

unsignedcharledkey[10][8]=

{

{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00},//0

{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},

{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,0x00,0x6C,0x92,0x92,0x92,0x6C,0x00},

{0x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00}

};

main()

{

intnWork1,nWork2,nWork3,nWork4,tKey;

intnNowStatus,nOldStatus,nOldTimeCount,nSaveTimeCount,nSaveStatus;

unsignedintnScanCode;

nTimeCount=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;

}

}

elseif(nTimeCount

elseif(nTimeCount

elseif(nTimeCount

elseif(nTimeCount

elseif(nTimeCount

elseif(nTimeCount

elseif(nTimeCount

elseif(nTimeCount

if(nNowStatus==nOldStatus)

{

switch(nNowStatus)

{

casestatusNSFlashEWRed:

nWork1=nTimeCount-nStatusNSGreenEWRed;

nWork2=nStatusNSYellowEWRed-nStatusNSFlashEWRed;

nWork3=nWork2/3;

nWork4=nWork3/2;

if(nWork1>=0&&nWork2>0&&nWork3>0&&nWork4>0)

uLightStatusSN=((nWork1%nWork3)<=nWork4)?

(0x49):

(0x40);//满足条件,取0x49地址的值,否则,取0x48的值

break;

casestatusNSRedEWFlash:

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;

casestatusNSGreenEWRed:

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;

SetLEDArray(nWork2);

}

}

break;

casestatusNSRedEWGreen:

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;

SetLEDArray(nWork2);

}

}

break;

casestatusHold:

nWork1=nStatusHold/20;

if(nWork1>0)

{

nWork2=20-nTimeCount/nWork1;

if(nOldTimeCount!

=nWork2)

{

nOldTimeCount=nWork2;

SetLEDArray(nWork2);

}

}

break;

}

}

else

{

if(bHold)

{

nSaveStatus=nNowStatus;

nSaveTimeCount=nTimeCount;

nNowStatus=statusHold;

nTimeCount=0;

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

{

nSaveStatus=statusNSRedEWGreen;

nSaveTimeCount=nStatusNSRedEWYellow;

}

elseif(nSaveStatus==statusNSRedEWFlash||nSaveStatus==statusNSRedEWYellow)

{

nSaveStatus=statusNSGreenEWRed;

nSaveTimeCount=0;

}

}

nOldStatus=nNowStatu

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1