基于DSP的交通灯控制的设计_第1页
基于DSP的交通灯控制的设计_第2页
基于DSP的交通灯控制的设计_第3页
基于DSP的交通灯控制的设计_第4页
基于DSP的交通灯控制的设计_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于DSP的交通灯控制的设计XXXXXX电子信息工程学院课程设计报告交通灯综合控制设计人:XXX专业:电子信息工程班级:电子班学号:指导教师:二零一X年X月目录1设计目得及要求、、、、、、、、、、、、、、、、、、、41、1设计目得、、、、、、、、、、、、、、、、、、、、、41、2设计要求、、、、、、、、、、、、、、、、、、、、、41、2、1交通灯控制、、、、、、、、、、、、、、、、41、2、2计时、、、、、、、、、、、、、、、、、、、51、2、3紧急情况、、、、、、、、、、、、、、、、、51、2、4程序设计、、、、、、、、、、、、、、、、、52设计原理及方案、、、、、、、、、、、、、、、、、、、72、1课程设计总体方案、、、、、、、、、、、、、、、、72、1、1设计思路、、、、、、、、、、、、、、、、、72、2课程设计原理、、、、、、、、、、、、、、、、、、、72、2、1

系统工作原理、、、、、、、、、、、、、、、、72、2、2系统工作状态、、、、、、、、、、、、、、、83硬件设计、、、、、、、、、、、、、、、、、、、、、103、1硬件总体设计、、、、、、、、、、、、、、、、、10

3、2

交通灯显示模块

、、、、、、、、、、、、、、、113、3计数显示模块、、、、、、、、、、、、、、、、、123、4开关模块、、、、、、、、、、、、、、、、、、、134软件设计、、、、、、、、、、、、、、、、、、、、、、144、1程序流程、、、、、、、、、、、、、、、、、、、144、2交通灯模拟显示、、、、、、、、、、、、、、、、154、3定时器及中断设计、、、、、、、、、、、、、、、154、4外中断设计、、、、、、、、、、、、、、、、、、165系统调试、、、、、、、、、、、、、、、、、、、、、、185、1硬件调试、、、、、、、、、、、、、、、、、、、185、1、1电源调试、、、、、、、、、、、、、、、、、185、1、2Emulator调试、、、、、、、、、、、、、、、185、2软件调试、、、、、、、、、、、、、、、、、、、、215、2、1软件设计、、、、、、、、、、、、、、、、、、215、2、2程序运行、、、、、、、、、、、、、、、、、、235、3系统下载、、、、、、、、、、、、、、、、、、、246结论分析及体会、、、、、、、、、、、、、、、、、、、257参考文献、、、、、、、、、、、、、、、、、、、、、、261设计目得及要求1、1设计目得熟悉使用ICETEK–F2812AE评估板控制ICETEKCTR上交通灯得方法。练习自主独立得设计,实现理论与实践得统一,提高自我动手能力。

掌握TMS320F2812DSP定时器得使用与编程。

掌握TMS320F2812DSP外中断得使用与编程。

(4)学习复杂控制程序设计思路。

(5)利用DSP开发环境CCS

C2000对源程序文件进行编译、链接、装载调试,以完成基本得DSP项目文件设计。

(6)通过此次课程设计,学习DSPF2812芯片得I/O端口控制方法,熟悉字模得简单构建与使用,熟悉掌握在DSP软硬件环境下得程序开发流程,达到学以致用得目得。1、2设计要求1、2、1交通灯控制要求:利用ICETEKEDU实验箱提供得设备,设计模拟实际生活中十字路口交通灯控制得程序。要求如下:

交通灯分红黄绿三色,东、南、西、北各一组,用灯光信号实现对交通得控制:绿灯信号表示通行,黄灯表示警告,红灯禁止通行,灯光闪烁表示信号即将改变。

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

正常交通控制信号顺序:正常交通灯信号自动变换

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

南北方向绿灯闪烁3次,东西红灯(6秒)。

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

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

南北方向红灯,东西方向绿灯闪3次(6秒)。

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

(7)返回(1)循环控制

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

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

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

直接返回正常信号顺序得下一个通行信号(跳过闪烁绿灯、黄灯状态)。1、2、2计时要求:使用TMS320VC5416DSP片上定时器,定时产生时钟计数,再利用此计数对应具体时间。1、2、3紧急情况要求:利用ICETEKCTR上键盘产生外中断,中断正常信号顺序,模拟突发情况。1、2、4程序设计要求根据设计要求,由于控制就是由不同得各种状态按顺序发生得,我们可以采用状态机制控制方法来解决此问题。这种方法就是:首先列举所有可能发生得状态;然后将这些状态编号,按顺序产生这些状态;状态延续得时间用程序控制。对于突发情况,可采用在正常顺序得控制中插入特殊控制序列得方式完成。时钟计数:采用250ms一次中断进行累加计数。表格SEQ表格\*ARABIC1状态编号信号灯状态状态定义保持时间(计数值,起始时间,结束时间)计数显示1南北绿灯,东西红灯statusNSGreenEWRed20秒(160,0,159)2002南北绿灯闪烁,东西红灯statusNSFlashEWRed6秒(24,160,183)03南北黄灯,东西红灯statusNSYellowEWRed4秒(16,184,199)204南北红灯,东西黄灯statusNSRedEWYellow4秒(16,200,215)205南北红灯,东西绿灯statusNSRedEWGreen20秒(160,216,375)2016南北红灯,东西绿灯闪烁statusNSRedEWFlash6秒(24,376,399)07南北红灯,东西黄灯statusNSRedEWYellow4秒(16,400,415)208南北黄灯,东西红灯statusNSYellowEWRed4秒(16,416,431)20*南北红灯,东西红灯StatusHold20秒(160,0,159)201其中,正常顺序每112秒(计数值448)为一个循环,状态“*”为非顺序状态。这样,只要根据计数值就可确定当前状态,根据状态再分情况处理。对于计数显示,当处于状态1、5、*中时需要进行倒计时,需要计算在此状态中得计数值增量,根据增量判断就是否更新计数显示。2设计原理及方案2、1设计总体方案2、1、1设计思路根据DSP得硬件中断、定时器、I/O访问得原理。用定时器定时,用I/O口控制红绿黄灯得开关,用硬件外部中断模拟急救车得到达。有急救车到达时,两向为全红,以便让急救车通过。急救车通过后,交通灯恢复硬件中断前得状态。触发开关(红色按纽)为中断申请,表示有急救车通过。在实验箱上交通灯模块由高8位数据线控制:南北红灯D9、D11为高,南北黄灯D9、D11、D13、D15为高,南北绿灯D13、D15为高,东西红灯D8、D10为高,东西黄灯由D8、D10、D12、D14为高,东西绿灯D12、D14为高。交通灯模块得I/O地址:0x5008h图图STYLEREF1\s5SEQ图\*ARABIC1设计总流程图2、2课程设计原理2、2、1系统工作原理本设计硬件由定时模块、发光二极管模块、数码管显示模块与紧急中断模块组成。信号灯受芯片中输出高低电平得控制。当锁存器I/O口输出为高电平时,她所驱动得信号灯即发光二极管就会亮起来。定时模块采用硬件定时与软件定时相结合得方法,用DSP定时/计数器定时100ms,再用软件计时实现所需得定时。发光二极管模块由DSP控制发光二极管来实现。数码管显示模块由实验平台上得LED显示模块实现。紧急中断模块就是由单脉冲发生单元与DSP中断控制器组成。本次设计中东西南北路口得红灯均亮1秒,信号灯开始工作,东西红灯亮20秒,在东西红灯亮得同时,南北绿灯亮20秒。到20秒时,东西绿灯闪亮,绿灯闪亮得周期为2秒(亮1秒,灭1秒)。绿灯闪亮3次后灭,东西黄灯亮并维持4秒。到4秒时,东西黄灯灭,东西红灯亮,同时南北红灯灭,南北绿灯亮。东西红灯亮维持20秒,南北绿灯亮维持20秒,到20秒时,南北绿灯闪亮3次后灭,南北黄灯亮,并维持4秒。到4秒时,南北黄灯灭,南北红灯亮,同时东西红灯灭,东西绿灯亮。紧接着开始第二周期得动作,以后周而复始得循环。2、2、2系统工作状态系统工作状态状态一:南北绿灯、东西红灯,延时20秒,20秒后南北绿灯闪3次,东西红灯延时6秒;如图所示图2、1状态一状态二:南北黄灯、东西红灯,持续6秒;图2、2状态二状态三:东西绿灯、南北红灯,延时20秒,20秒后东西绿灯闪3次,南北红灯持续6秒;图2、3状态三状态四:东西黄灯、南北红灯,持续6秒;图2、4状态四状态五:紧急状态下东西南北均亮红灯;图2、5状态五3硬件设计3、1硬件总体设计1根据设计要求,由于控制就是由不同得各种状态按顺序发生得,我可以采用状态机制控制方法来解决此问题。这种方法就是:首先列举所有可能发生得状态;然后将这些状态编号,按顺序产生这些状态;状态延续得时间用程序控制,对于突发情况,可采用在正常顺序得控制中插入特殊控制序列得方式完成。

2突发事件设置,

在实际交通过程中会出现突发状况,

比如说有救护车或者110

紧急车要通过,

此时就可以通过小键盘进行突发状况模拟。通过按键进入到中断服务子程序,

相当于原来先要通过得车辆在突发状况来了以后就要先让紧急车辆通过。原理框图如图3、1所示。

图3、1

ICETEKF2812AE原理框图

3、2

交通灯显示模块

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

DSP有最多56个专门得通用输入输出管脚。这些通用输入输出管脚通过专用寄存器可以由软件控制,比如指定输入、输出以及输出值等。通过ICETEKF2812AE评估板得插座,扩展板(通用输出/控制模块ICETEKCTR)将板上得一个指示灯与DSP得一个通用输入/输出管脚直接相连。这个管脚为PWM12,可以设置成通用输入/输出管脚使用。扩展原理如图3、2所示。图3、2发光二极管设计原理3、3计数显示模块

计数显示采用放光二极管显示阵列显示。TMS320F2812

DSP得存储器扩展接口(EMIF)用来与大多数外围设备进行连接,典型应用如连接片外扩展存储器等。这一接口提供地址线、数据线与一组控制线,ICETEKF2812A评估板已将这些扩展线引到了板上得扩展插座上,供扩展使用。发光二极管显示阵列由扩展端口控制,EMIF接口得两个寄存器提供具体控制。原理图如图3、3所示。图3、3

计数显示原理3、4开关模块

开关模块采用外部外部存储器扩展接口(EMIF)上得PS2接口键盘,通过扫描码判断输入键值。TMS320F2812

DSP得扩展存储器接口(EMIF)用来与大多数外围设备进行连接,典型应用如连接片外扩展存储器等。这一接口提供地址线、数据线与一组控制线,ICETEKF2812A评估板已将这些扩展线引到了板上得扩展插座上。键盘得扫描码由DSP得扩展地址0x给出,当有键盘输入时,读此端口得到扫描码,当无键被按下时读此端口得结果为0。开关设计原理如图3、4所示。图3、4

开关设计原理

4软件设计4、1程序流程该设计实现得功能就是南北方向绿灯,东西红10秒,南北方向绿灯闪烁3次,东西红灯4秒,南北方向黄灯,东西红灯2秒,南北方向红灯,东西方向绿灯10秒,南北方向红灯,东西方向绿灯闪3次4秒,南北方向红灯,东西方向黄灯(2秒)。在紧急情况下,当任意方向通行剩余时间多于10秒,将时间改成10秒,正常变换到四面红灯20秒,然后直接返回正常信号顺序得下一个通行信号(跳过闪烁绿灯、黄灯状态)。程序流程图如图4、1所示。开始初始化:CPU频率、ICETEKCTR、定时器、中断控制寄存器、工作变量根据定时器计数确定当前状态根据当前状态设置指示灯状态根据当前状态设置发光二极管显示阵列状态读取键盘输入开始初始化:CPU频率、ICETEKCTR、定时器、中断控制寄存器、工作变量根据定时器计数确定当前状态根据当前状态设置指示灯状态根据当前状态设置发光二极管显示阵列状态读取键盘输入结束?就是否结束定时器中断服务程序入口计数工作变量值在原基础上加1退出定时器中断服务程序键盘中断服务程序入口设置突发事件标志退出键盘中断服务程序4、2交通灯模拟显示显示/控制模块上得发光二极管就是由连接在2812DSP扩展地址接口上得寄存器EWR与SNR控制得。这两个寄存器均为6位寄存器,其位定义见表4、1表4、2。两个寄存器得地址均映射到2812DSP得扩展空间,CTRLR地址为0x,DSP通过对该地址得写操作来修改两个寄存器上各位得状态,当寄存器某位取‘1’值时,相应指示灯被点亮,取‘0’值则熄灭。当写入CTRLR得数据(8位有效值)得高两位为‘00’时,数据得低6位将写入EWR寄存器;当高两位得值为‘01’时,写入SNR寄存器bit5bit4bit3bit2bit1bit0东红东黄东绿西红西黄西绿表4、1寄存器EWRbit5bit4bit3bit2bit1bit0南红南黄南绿北红北黄北绿表4、2寄存器SNR4、3定时器及中断设计TMS320F2812A内部有三个32位通用定时器(TIMER0/1/2),定时器1与2被保留给实时操作系统(DSPBIOS)用,只有定时器0可以提供给用户使用。定时器采用中断方式,中断过程如下:a.接受中断请求。必须由软件中断(从程序代码)或硬件中断(从一个引脚或一个基于芯片得设备)提出请求去暂停当前主程序得执行。b.响应中断。必须能够响应中断请求。如果中断就是可屏蔽得,则必须满足一定得条件,按照一定得顺序去执行。而对于非可屏蔽中断与软件中断,会立即作出响应。c.准备执行中断服务程序并保存寄存器得值。d.执行中断服务子程序。调用相应得中断服务程序ISR,进入预先规定得向量地址,并且执行已写好得ISR。定时器及中断得流程如图4、2。开始初始化DSP时钟初始化中断向量等待中断产生初始化定时器改变指示灯状态中断服务开始开始初始化DSP时钟初始化中断向量等待中断产生初始化定时器改变指示灯状态中断服务开始中断服务结束4、4外中断设计紧急情况时,利用ICETEKCTR上键盘产生外中断,中断正常信号顺序,模拟突发情况。显示/控制模块ICETEKCTR通过接口P8连接小键盘,接收小键盘传送得扫描码,并在每个扫描码结束后保存,同时向DSP得XINT2发送中断信号;当DSP读键盘时将扫描码送到数据总线上。小键盘上每次按下一个键将产生2个扫描码、2次中断。外中断得程序流程图如图4、3所示。开始初始化:DSP时钟、ICETEKCTR初始化中断控制寄存器等待中断产生改变指示灯状态中断服务开始中断服务结束开始初始化:DSP时钟、ICETEKCTR初始化中断控制寄存器等待中断产生改变指示灯状态中断服务开始中断服务结束5系统调试5、1硬件调试5、1、1电源调试1.连接电源:打开实验箱,取出三相电源连接线(如右图),将电源线得一端插入实验箱外部左侧箱壁上得电源插孔中。确认实验箱面板上电源总开关(位于实验箱底板左上角)处于“关”得位置,连接电源线得另一端至220V交流供电插座上,保证稳固连接。2.使用电源连接线(如右图,插头就是带孔得)连接各模块电源:确认实验箱总电源断开。连接ICETEKCTR板上边插座到实验箱底板上+12V电源插座;ICETEKCTR板下边插座到实验箱底板上+5V电源插座;如使用PP(并口)型仿真器,则连接仿真器上插座到实验箱底板上+5V电源插座;连接DSP评估板模块电源插座到实验箱底板上+5V电源插座。注意各插头要插到底,防止虚接或接触不良。3.连接DSP评估板信号线:当需要连接信号源输出到A/D输入插座时,使用信号连接线(如右图)分别连接相应插座。4.接通电源:检查实验箱上220V电源插座(箱体左侧)中保险管就是否完好,在连接电源线以后,检查各模块供电连线就是否正确连接,打开实验箱上得电源总开关(位于实验箱底板左上角),使开关位于“开”得位置,电源开关右侧得指示灯亮。5、1、2Emulator调试1.启动Simulator方式双击桌面上图标:2.启动Emulator方式(1)首先将实验箱电源关闭。连接实验箱得外接电源线。(2)检查ICETEK5100USB仿真器得黑色JTAG插头就是否正确接到ICETEKVC5416A板得J3插头上。注:仿真器得插头中有个孔加入了封针与J3插头上得缺针位置应重合,保证不会插错。(3)检查就是否已经用电源连接线连接了ICETEKVC5416A板得POW1插座与实验箱底板上+5V电源插座。(4)检查其她连线就是否符合实验要求。检查实验箱上三个拨动开关位置就是否符合实验要求。(5)打开实验箱上电源开关(位于实验箱底板左上角),注意开关边上红色指示灯点亮。ICETEKVC5416A板上指示灯D1与D2点亮。如果打开了ICETEKCTR得电源开关,ICETEKCTR板上指示灯L1、L2与L3点亮。如果打开了信号源电源开关,相应开关边得指示灯点亮。用实验箱附带得USB信号线连接ICETEK5100USB仿真器与PC机后面得USB插座,注意ICETEK5100USB仿真器上指示灯Power与Run灯点亮。(7)双击桌面上仿真器初始化图标:如果出现下面图5、1提示窗口,表示初始化成功,按一下空格键进入下一步操作。图5、1初始化图如果窗口中没有出现“按任意键继续…”,请关闭窗口,关闭实验箱电源,再将USB电缆从仿真器上拔出,返回第(2)步重试。如果窗口中出现“Theadapterreturnedanerror、”,并提示“按任意键继续…”表示初始瑞泰创新——ICETEKVC5416AUSBEDU教学实验系统软件实验指导III-7化失败,请关闭窗口重试两三次,如果仍然不能初始化则关闭实验箱电源,再将USB电缆从仿真器上拔出,返回第(2)步重试。⑧双击桌面上图标:启动CCS2、21。⑨如果进入CCS提示错误,先选“Abort”,然后用“初始化ICETEK5100USB2、0仿真器”初始化仿真器,如提示出错,可多做几次。如仍然出错,拔掉仿真器上USB接头(白色方形),按一下ICETEKVC5416A板上S1复位按钮,连接USB接头再做“初始化ICETEK5100USB2、0仿真器”。⑩如果遇到反复不能连接或复位仿真器、进入CCS报错,请打开Windows得“任务管理器”,在“进程”卡片上得“映像名称”栏中查找就是否有“cc_app、exe”,将它结束再试。5、2软件调试5、2、1软件设计CCS可以工作在纯软件仿真环境中,就就是由软件在PC机内存中构造一个虚拟得DSP环境,可以调试、运行程序。但一般软件无法构造DSP中得外设,所以软件仿真通常用于调试纯软件得算法与进行效率分析等。在使用软件仿真方式工作时,无需连接板卡与仿真器等硬件。单击桌面上图标:进入CCS设置窗口。在出现得窗口中按标号顺序进行如下图5、2设置:图5、2仿真设置图接着在下面出现得窗口中选择“否(N)”。此时CCS已经被设置成Simulator方式(软件仿真TMS320VC5416器件得方式),如果一直使用这一方式就不需要重新进行以上设置操作了。2.设置CCS通过ICETEK5100USB仿真器连接ICETEKVC5416A硬件环境进行软件调试与开发。(1)单击桌面上图标:进入CCS设置窗口(2)在出现得窗口中按标号顺序进行如下图5、3设置:图5、3CSS2设置图(3)接着在下面得窗口中按标号顺序进行如下图5、4选择:图5、4CSS2设置图在出现得窗口按标号顺序进行如下图5、5设置:图5、5CSS2设置图在出现得窗口按标号顺序进行如下图5、6设置:图5、6CSS2设置图以上设置完成后,CCS已经被设置成Emulator得方式(用仿真器连接硬件板卡得方式),并且指定通过ICETEK5100USB仿真器连接ICETEKVC5416A评估板。如果您需要一直使用这一方式就不需要重新进行以上设置操作了。5、2、2程序运行选择菜单“Project”得“New…”项。如图5、7所示。图5、7CSS2设置图如下图,按编号顺序操作建立Trafficlight、pjt工程文件:展开主窗口左侧工程管理窗口中“Projects”下新建立得“Trafficlight、pjt”,其中各项均为空。(2)在工程文件中添加程序文件:选择菜单“Project”得“AddFilestoProject…”项;在“AddFilestoProject”对话框中选择文件目录为C:\ICETEKVC5416EDULab\Lab0601UseCCS,改变文件类型为“CSourceFiles(*、c;*、ccc)”,选择显示出来得文件“Trafficlight、c”;重复上述各步骤,添加Trafficlight、cmd文件,到volume工程中;添加C:\ti\C5400\cgtools\lib\rts、lib。编译连接工程:选择菜单“Project”得“RebuildAll”项,或单击工具条中得按钮;注意编译过程中CCS主窗口下部得“Build”提示窗中显示编译信息,最后将给出错误与警告得统计数。5、3系统下载下载程序:执行Program,在随后打开得对话框中选择刚刚建立得C:\ICETEKVC5416EDULab\Lab0601UseCCS\Debug\Trafficlight、out文件。(2)设置软件调试断点:在项目浏览窗口中,双击Trafficlight、c激活这个文件,移动光标到main行上,单击鼠标右键选择ToggleBreakpoint或按F9设置断点(另外,双击此行左边得灰色控制条也可以设置或删除断点标记)。(3)利用断点调试程序:选择Debug→Run或按F5运行程序,程序会自动停在main函数上。(4)在ICETEKCTR附带得小键盘上按下按键,观察信号就是否满足要求。6设计心得与体会此次课程设计,通过学习,我进一步熟悉了CCS软件,巩固了以前所学过得知识。通过对书本上得理论知识与实际得操作相结合,对所学得理论知识也有了更深层次得理解。本次设计中主要用到了DSP得硬件中断、定时器以及I/O访问等方面得相关得知识。对于这几方面知识我并不陌生,在以前得得课程设计中,这些内容都曾涉及,再加上曾经DSP课程得学习。因此在本次得功能实现方面遇到得问题并不就是太多。不过毕竟DSP得相关知识有别于单片机,因此对编程得理解上还就是出现了一些问题,通过对课本以及相关资料得查询,这些问题也及时得得到了解决。通过对问题得发现与解决,使我更加了解DSP得原理及其编程得相关注意事项,加深了对课本理论知识得理解。7参考文献[1]刘与平等.DSP原理及电机控制应用—基于TMS320LF2407x系列[M].北京航空航天大学出版社,2006.[2]宁改娣等、DSP控制器原理及应用[M].北京:科学出版社,2002、[3]仿真系统使用说明书,北京瑞泰创新有限公司。[4]清源科技、TMS320C54xDSP应用程序设计教程[M]、机械工业出版社,2004、1、[5]清源科技、TMS320C54x硬件开发教程[M]、机械工业出版社,2003、1、附录一控制源程序#include"scancode、h"#defineSPSA0*(unsignedint*)0x38#defineSPSD0*(unsignedint*)0x39#defineREGISTERCLKMD(*(unsignedint*)0x58)#define TIM *(int*)0x24#define PRD*(int*)0x25#define TCR *(int*)0x26#define IMR *(int*)0x0#define IFR *(int*)0x1 #define PMST *(int*)0x1d #definenStatusNSGreenEWRed160#definenStatusNSFlashEWRed184#definenStatusNSYellowEWRed200#definenStatusNSRedEWYellow216#definenStatusNSRedEWGreen376#definenStatusNSRedEWFlash400#definenStatusNSRedEWYellow1416#definenStatusNSYellowEWRed1432#definenTotalTime448#definenStatusHold160#definestatusNSGreenEWRed0#definestatusNSFlashEWRed1#definestatusNSYellowEWRed2#definestatusNSRedEWYellow3#definestatusNSRedEWGreen4#definestatusNSRedEWFlash5#definestatusHold6ioportunsignedintport3004;//CTR扩展寄存器定义ioportunsignedintport8000;ioportunsignedintport8001;ioportunsignedintport8002;ioportunsignedintport8003;ioportunsignedintport8004;ioportunsignedintport8005;ioportunsignedintport8007;#defineCTRGRport8000#defineCTRLCDCMDRport8001#defineCTRKEYport8001#defineCTRCLKEYport8002#defineCTRLCDCRport8002#defineCTRLCDLCRport8003#defineCTRLCDRCRport8004#defineCTRLAport8005#defineCTRLRport8007voidInitDSP;voidInitTimer;voidInitICETEKCTR;voidinterrupttime(void);voidinterruptxint2(void); //XINT2中断服务程序voidSetLEDArray(intnNumber); //修改显示内容voidRefreshLEDArray; //刷新显示voidEndICETEKCTR;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};main{ intnWork1,nWork2,nWork3,nWork4; 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<nStatusNSGreenEWRed) nNowStatus=statusNSGreenEWRed; elseif(nTimeCount<nStatusNSFlashEWRed) nNowStatus=statusNSFlashEWRed; elseif(nTimeCount<nStatusNSYellowEWRed) nNowStatus=statusNSYellowEWRed; elseif(nTimeCount<nStatusNSRedEWYellow) nNowStatus=statusNSRedEWYellow; elseif(nTimeCount<nStatusNSRedEWGreen) nNowStatus=statusNSRedEWGreen; elseif(nTimeCount<nStatusNSRedEWFlash) nNowStatus=statusNSRedEWFlash; elseif(nTimeCount<nStatusNSRedEWYellow1) nNowStatus=statusNSRedEWYellow; elseif(nTimeCount<nStatusNSYellowEWRed1) nNowStatus=statusNSYellowEWRed; if(nNowStatus==nOldStatus) { switch(nNowStatus) { casestatusNSFlashEWRed: nWork1=nTimeCountnStatusNSGreenEWRed; nWork2=nStatusNSYellowEWRednStatusNSFlashEWRed; nWork3=nWork2/3; nWork4=nWork3/2; if(nWork1>=0&&nWork2>0&&nWork3>0&&nWork4>0) uLightStatusSN=((nWork1%nWork3)<=nWork4)?(0x49):(0x40); break; casestatusNSRedEWFlash: nWork1=nTimeCountnStatusNSRedEWGreen; nWork2=nStatusNSRedEWYellow1nStatusNSRedEWFlash; 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/30; if(nWork1>0) { nWork2=30nTimeCount/nWork1; if(bHold) { if(nWork2>10) { nTimeCount=nWork1*10; nWork2=10; } } if(nOldTimeCount!=nWork2) { nOldTimeCount=nWork2; SetLEDArray(nWork2); } } break; casestatusNSRedEWGreen: nWork1=(nStatusNSRedEWGreennStatusNSRedEWYellow)/30; if(nWork1>0) { nWork2=30(nTimeCountnStatusNSRedEWYellow)/nWork1; if(bHold) { if(nWork2>10) { nTimeCount=nStatusNSRedEWYellow+nWork1*10; nWork2=10; } } if(nOldTimeCount!=nWork2) { nOldTimeCount=nWork2; SetLEDArray(nWork2); } } break; casestatusHold: nWork1=nStatusHold/30; if(nWork1>0) { nWork2=30nTimeCount/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=nNowStatus; switch(nNowStatus) { casestatusNSGreenEWRed: uLightStatusEW=0x24;uLightStatusSN=0x49; SetLEDArray(18); break; casestatusNSFlashEWRed: uLightStatusEW=0x24;uLightStatusSN=0x49; SetLEDArray(0); break; casestatusNSYellowEWRed: uLightStatusEW=0x24;uLightStatusSN=0x52; SetLEDArray(20); break; casestatusNSRedEWYellow: uLightStatusEW=0x12;uLightStatusSN=0x64; SetLEDArray(20); break; casestat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论