基于DSP交通灯
信
息
工
程
院
班级: 0312405
姓名: 覃川
学号:
摘要:
结合中国交通现实状况和实际需求,研发灵活配时交通信号控制,
实现定时控制方法。这里关键介绍信号定时具体实现;
系 | 统 | 设 | 计 | 关 | 键 | 围 | 绕 | 配 | 时 | 设 | 置 | 展 | 开 | 。 |
本文提出了基于DSP交通信号控制机具体实现方法,给出了具体硬件、
然后以信号机功效为根本介绍上位机实现各功效方法,
软 件 设 计 。 首 总 体 设 计 ;
U盘文件方法进行配时设置,介绍了U盘和文件系统识别基础过程.
关键字:交通信号控制机
Abstract:
Combiningwith the traffic situation in China and the actual demand, traffic
signalcontrolat the time of flexible with R & D, to achieve timing control
method. Here | mainly introduce the | concrete | realization | of the |
timing signal; system designmainly around the timing setting expansion. This |
paperpresents the concrete realization methodof traffic signal controller
basedon DSP, gives the detaileddesign of hardware and software. First
proposedthe overall design of the system; and then to the signal function as
the | main | line | the computer realization | method | of each |
function,hardware design as the center to introduce the lower position
machine by | each | module, key | and | |||
difficulty about programming machinegroom number describes | the firmware | |||||
design | of lower | computer, namely | the DSP | program; finally | puts |
forwardsetting with to U disk file mode, introduces the basicprocess of
Udisk and filesystem identification.
Keywords: DSP、Trafficsingnal controller
目录
1系统概述................................................2
1.1设计目标.....................................................2
1.2设计任务....................................................2
2 方案论证.......................................................3
2.1设计思绪.....................................................3
2.2设计方案.....................................................4
2.3工作状态....................................................5
3.1硬件总体设计.................................................6
3硬件设计.........................................................6
3.3计数显示模块.................................................7
3.4开关模块.....................................................8
4软件设计.........................................................9
4.1程序步骤.....................................................9
4.2交通灯模拟显示..............................................10
4.3定时器及中止设计............................................10
4.4外中止设计..................................................12
5系统调试........................................................12
5.1硬件调试....................................................12
5.2软件调试....................................................14
5.3系统下载....................................................18
6致谢............................................................18
参考文件.........................................................19
附录..............................................................19
1 系统概述
(1)练习自主独立设计,实现理论和实践统一,提升自我动手能力。
(2)利用DSP开发环境CCS C对源程序文件进行编译、链接、 装载调试,
以完成基础DSP项目文件设计。
(3)经过此次课程设计,学习DSPF2812芯片I/O端口控制方法,
熟悉字模简单构建和使用,熟悉掌握在DSP软硬件环境下程序开发步骤,
达成学以致用目标。
1.2设计任务
利用ICETEK-EDU试验箱提供设备, |
|
设计模拟实际生活中十字路口交通灯控制程序。要求以下:
交通灯分红黄绿三色,东、南、 西、 北各一组,
用灯光信号实现对交通控制:绿灯信号表示通行,黄灯表示警告,
红灯严禁通行,灯光闪烁表示信号立即改变。
计时显示:8×8点阵显示两位计数,为倒计时,每秒改变计数显示。
正常交通控制信号次序:正常交通灯信号自动变换
(1)南北方向绿灯,东西红灯(10秒)。
(2)南北方向绿灯闪烁3次,东西红灯(4秒)。
(3)南北方向黄灯,东西红灯(2秒)。
(4)南北方向红灯,东西方向绿灯(10秒)。
(5)南北方向红灯,东西方向绿灯闪3次(4秒)。
(7)返回(1)循环控制。
功效键:(1)开启开关 (2)抢救灯开启开关
紧急情况处理:模拟紧急情况(关键车队经过、抢救车经过等)发生时,
交通警察手动控制
(1)当任意方向通行剩下时间多于10秒,将时间改成10秒。
(2)正常变换到四面红灯(20秒)。
(3)直接返回正常信号次序下一个通行信号(跳过闪烁绿灯、黄灯状态)。
2 方案论证
2.1设计思绪
依据DSP硬件中止、定时器、 显示/控制模块上发光二极管控制原理。
用 | 定 | 时 | 器 | 定 | 时 | , |
用连接在2812DSP扩展地址接口上寄存器EWR和SNR控制红绿黄灯开关,
用硬件外部中止模拟抢救车抵达。有抢救车抵达时,两向为全红,
方便让抢救车经过。抢救车经过后,交通灯恢复硬件中止前状态。
触 | 发 | 开 | 关 | 为 | 中 | 止 | 申 | 请 | , | 表 | 示 | 有 | 抢 | 救 | 车 | 经 | 过 | 。 |
在试验箱上交通灯模块由连接在2812DSP扩展地址接口上寄存器EWR和SNR控制,
这两个寄存器均为6位寄存器,交通灯模块(CTRLR)I/O地址:0x108007。
2.2设计方案
能够采取状态机制控制方法来处理此问题。这种方法是:
首先列举全部可能发生状态;然后将这些状态编号,按次序产生这些状态;
状 | 态 | 延 | 续 | 时 | 间 | 用 | 程 | 序 | 控 | 制 | 。 | 对 | 于 | 突 | 发 | 情 | 况 | , |
可采取在正常次序控制中插入特殊控制序列方法完成。时钟计数:采取250ms
一次中止进行累加计数。如表2.1所表示。
状 |
|
|
| 计数 |
态 | 信号灯状态 | 状态定义 | 时间(计数值, 起始时间, 结束时间) | 显示 |
1 | 南北灯绿,东西灯红 | statusNSGreenEWRed | 10s(40, 0 , 39) | 10-1 |
2 | 南北绿灯闪, 东西红灯 | statusNSFlashEWRed | 4s (16, 40, 55 ) | 4-1 |
3 | 南北黄灯, 东西红灯 | statusNSYellowEWRed | 2s (8, 56, 63) | 2-1 |
4 | 南北红灯, 东西绿灯 | statusNSRedEWGreen | 10s(40,64,103) | 10-1 |
5 | 南北红灯, 东西绿灯闪 | statusNSRedEWFlash | 4s (16,104,119) | 4-1 |
6 | 南北红灯, 东西黄灯 | statusNSRedEWYellow | 2s (8,120,127) | 2-1 |
* | 南北红灯, 东西红灯 | statusNSRedEWRed | 20s(80, 0, 79) | 20-1 |
表2.1信号灯状态图
2.2.2定时器设计
MS320F2812A内部有三个32位通用定时器(TIMER0/1/2),定时器1和2被保留给实时操作系统(DSPBIOS)用,
2.2.3 倒计时显示设计
利用ICETEK-CTR上发光二极管显示阵列模拟显示。DSP须将显示图形按列次序存放起来(8×8点阵,8个字节,高位在下方,低位在上方),然后定时刷新控制显示。具体方法是,将以下控制字按前后次序、每两个为一组发送到端口0x602802,发送完成后,隔不太长时间(以人眼观察不闪烁时间间隔)再发送一遍。因为位值为“0”时点亮,所以需要将显示数据取反。
2.2.4 紧急情况下设计
利用ICETEK-CTR上键盘产生外中止, 中止正常信号次序, 进入突发情况。
2.3工作状态
状态一:南北绿灯、东西红灯,延时10秒,10秒后南北绿灯闪3次,东西红灯延时4秒;
状态二:南北黄灯、东西红灯,连续2秒;
状态三:东西绿灯、南北红灯,延时10秒,10秒后东西绿灯闪3次,南北红灯连续4秒;
状态四:东西黄灯、南北红灯,连续2秒;
状态五:紧急状态下东西南北均亮红灯;
3硬件设计
3.1硬件总体设计
我能够采取状态机制控制方法来处理此问题。这种方法是:
首先列举全部可能发生状态; 然后将这些状态编号,按次序产生这些状态;
状态延续时间用程序控制,对于突发情况,
可采取在正常次序控制中插入特殊控制序列方法完成。
②突发事件设置,在实际交经过程中会出现突发情况,比如说有救护车或110 紧急车要经过,此时就能够经过小键盘进行突发情况模拟。
经过按键进入到中止服务子程序,
相当于原来先要经过车辆在突发情况来了以后就要先让紧急车辆经过。原理框图图3.1所表示。
TMS320F2812PGFA | SRAM:64K*16bit数据 |
JTAG
16路,12bit | JTAG | 扩展DSP引脚 | 地址 |
PORT
控制
图3.1ICETEK-F2812-AE原理框图
3.2 交通灯显示模块
这些通用输入输出管脚经过专用寄存器能够由软件控制,比如指定输入、
输出和输出值等。经过ICETEK-F2812-AE评定板插座,
扩 | 展 | 板 | ( | 通 | 用 | 输 | 出 | /控 | 制 | 模 | 块 | ICETEK- |
CTR)将板上一个指示灯和DSP一个通用输入/输出管脚直接相连。这个管脚为PWM12,能够设置成通用输入/输出管脚使用。扩展原理图3.2所表示。
图3.2 发光二极管设计原理
3.3计数显示模块
数 | 据 | 线 | 和 | 一 | 组 | 控 | 制 | 线 | , | ICETEK-F2812- |
A评定板已将这些扩展线引到了板上扩展插座上,供扩展使用。发光二极管显示阵列由扩展端口控制,EMIF接口两个寄存器提供具体控制。原理图图3.3所表示。
图3.3计数显示原理
3.4开关模块
开关模块采取外部外部存放器扩展接口(EMIF)上PS2接口键盘,经DSP扩展存放器接口(EMIF)用来和大多数外围设备进行连接,过扫 描 码 判 TMS320F2812
数 A评定板已将这些扩展线引到了板上扩展插座上。
键盘扫描码由DSP扩展地址0x108001给出,当有键盘输入时,
读此端口得到扫描码,当无键被按下时读此端口结果为0。
开关设计原理图3.4所表示。
图3.4开关设计原理
4软件设计
4.1程序步骤
该设计实现功效是南北方向绿灯,东西红10秒,
南北方向绿灯闪烁3次,东西红灯4秒,南北方向黄灯,东西红灯2秒,
南北方向红灯,东西方向绿灯10秒,南北方向红灯,东西方向绿灯闪3次4秒,
南北方向红灯,东西方向黄灯(2秒)。在紧急情况下,
当任意方向通行剩下时间多于10秒,将时间改成10秒,
正常 变换 到 四面 红 灯 20秒 ,
然后直接返回正常信号次序下一个通行信号(跳过闪烁绿灯、黄灯状态)。
程序步骤图图4.1所表示。
开始
定时器中止服务程序入口
初始化: CPU频率、ICETEK-CTR、
定时器、中止控制寄存器、工作变量计数工作变量值
依据定时器计数确定目前状态 在原基础上加1
依据目前状态设置指示灯状态退出定时器中止服务
依据目前状态设置发光二极管显示阵 程序
列状态
读取键盘输入
键盘中止服务程序入口
设置突发事件标
结束? | 否 | 志 |
退出键盘中止服务程
图4.1程序步骤图
4.2交通灯模拟显示
显示/控制模块上发光二极管是由连接在2812DSP扩展地址接口上寄存器EWR和SNR控制。这两个寄存器均为6位寄存器,其位定义见表4.1表4.2。
两个寄存器地址均映射到2812DSP扩展空间,CTRLR地址为0x108007,DSP经过
对该地址写操作来修改两个寄存器上各位状态,当寄存器某位取‘1’值时,对应指示灯
被点亮,取‘0’值则熄灭。当写入CTRLR数据(8位有效值)高两位为‘00’时,数据
bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
东-红 | 东-黄 | 东-绿 | 西-红 | 西-黄 | 西-绿 |
低6位将写入EWR寄存器;当高两位值为‘01’时,写入SNR寄存器
表4.1 寄存器EWR
bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
南-红 | 南-黄 | 南-绿 | 北-红 | 北-黄 | 北-绿 |
4.3定时器及中止设计 |
只有定时器0能够提供给用户使用。定时器采取中止方法,中止过程以下:
a. | 接 | 收 | 中 | 止 | 请 | 求 | 。 |
必需由软件中止(从程序代码)或硬件中止(从一个引脚或一个基于芯片设备)提出请求去暂停目前主程序实施。b.响应中止。必需能够响应中止请求。 假如中止是可屏蔽,则必需满足一定条件,根据一定次序去实施。而对于非可屏蔽中止和软件中止,会立即作出响应。c.准备实施中止服务程序并保留寄存器值。d.实施中止服务子程序。调用对应得中止服务程序ISR,进入预先要求向量地址,而且实施已写好ISR。
定时器及中止步骤图4.2。
开始中止服务开始
初始化DSP时钟 改变指示灯状态
初始化中止向量 中止服务结束
图4.2 定时器及中止步骤图
4.4外中止设计
紧急情况时,利用ICETEK-CTR上键盘产生外中止,中止正常信号次序,模拟突发情况。显示/控制模块ICETEK-CTR经过接口P8连接小键盘,接收小键盘传送扫描码,并在每个扫描码结束后保留,同时向DSPXINT2发送中止信号;当DSP读键盘时将扫描码送到数据总线上。小键盘上每次按下一个键将产生2个扫描码、2次中止。外中止程序步骤图图4.3所表示。
开始
中止服务开始初始化:DSP时钟、ICETEK-CTR
改变指示灯状态 中止服务结束 初始化中止控制寄存器
。
图4.3外中止程序步骤图
5系统调试
5.1硬件调试
5.1.1电源调试
1.连接电源:打开试验箱,取出三相电源连接线(如右图),
将电源线一端插入试验箱外部左侧箱壁上电源插孔中。
确定试验箱面板上电源总开关(在试验箱底板左上角)处于“关”位置,
连接电源线另一端至220V交流供电插座上,确保稳固连接。
2.使用电源连接线(如右图,插头是带孔)连接各模块电源:
确定试 验箱 总 电 源 断 开 。 连 接 ICETEK-CTR
板下边插座到试验箱底板上+5V电源插座; 如使用PP(并口)型仿真器,
板上边插座到试验箱底板上+12V电源插座; ICETEK-CTR
3.连接DSP评定板信号线:当需要连接信号源输出到A/D输入插座时,
使用信号连接线(如右图)分别连接对应插座。
4.接通电源:检验试验箱上220V电源插座(箱体左侧)中保险管是否完好,
在连接电源线以后,检验各模块供电连线是否正确连接,
打开试验箱上电源总开关(在试验箱底板左上角),使开关在“开”位置,
电源开关右侧指示灯亮。
5.1.2Emulator调试
1.开启Simulator 方法
双击桌面上图标:
2.开启Emulator方法
(1)首先将试验箱电源关闭。连接试验箱外接电源线。
(2)检验ICETEK-5100USB仿真器黑色JTAG插头是否正确连接到ICETEK-VC5416-
A板J3插头上。注:仿真器插头中有一个孔加入了封针和J3
插头上缺针位置应重合,确保不会插错。
(3)检验是否已经用电源连接线连接了ICETEK-VC5416-A板上POW1
插座和试验箱底板上+5V电源插座。
(4)检 | 验 | 其 | 它 | 连 | 线 | 是 | 否 | 符 | 合 | 试 | 验 | 要 | 求 | 。 |
检验试验箱上三个拨动开关位置是否符合试验要求。
(5)打开试验箱上电源开关(在试验箱底板左上角),
点亮。 假如打开了信号源电源开关,对应开关边指示灯点亮。
(6)用试验箱附带USB信号线连接ICETEK-5100USB仿真器和PC机后面USB
插座,注意ICETEK-5100USB仿真器上指示灯Power和Run灯点亮。
(7)双击桌面上仿真器初始化图标:
假如出现下面图5.1提醒窗口,
表示初始化成功, 按一下空格键进入下一步操作。
图5.1初始化图
假如窗口中没有出现“按任意键继续…”,请关闭窗口,关闭试验箱电源,再将USB电缆从仿真器上拔出,返回第(2)步重试。
假如窗口中出现“Theadapter returned an error.” ,
教学试验系统软件试验指导
并提醒“按任意键继续…”表示初始瑞泰创新——ICETEK-VC5416-A-USB-EDU
III-返回第(2)步重试。
⑧双击桌面上图标:
开启CCS2.21。
⑨假如进入CCS 提醒错误,先选“ Abort” , 然后用“初始化ICETEK-5100USB2.0 仿真器”初始化仿真器,如提醒犯错, 可多做几次。如仍然犯错, 拔掉仿真器上USB接头(白色方形),按一下ICETEK-VC5416-A 板上S1复位按钮, 连接USB接头再做“初始化ICETEK-5100USB2.0 仿真器”。
⑩假如碰到反复不能连接或复位仿真器、进入CCS报错,请打开Windows
“ | 任 | 务 | 管 | 理 | 器 | ” | , |
在“进程” 卡片上“ 映像名称” 栏中查找是否有“cc_app.exe”,
将它结束再试。
5.2软件调试
5.2.1软件设计
CCS能够工作在纯软件仿真环境中,就是由软件在PC
机内存中结构一个虚拟DSP环境,能够调试、运行程序。
但 | 通 | 常 | 软 | 件 | 无 | 法 | 结 | 构 | DSP | 中 | 外 | 设 | , |
所以软件仿真通常见于调试纯软件算法和进行效率分析等。
在使用软件仿真方法工作时,无需连接板卡和仿真器等硬件。
(2)在出现窗口中按标号次序进行以下图5.2设置:
图5.2仿真设置图
接着在下面出现窗口中选择“否(N)”。
此时CCS已经被设置成Simulator方法(软件仿真TMS320VC5416器件方法),假如一直使用这一方法就不需要重新进行以上设置操作了。
2.设置CCS经过ICETEK-5100USB仿真器连接ICETEK-VC5416-A硬件环境进行软件调试和开发。
(1)单击桌面上图标:进入CCS设置窗口
(2)在出现窗口中按标号次序进行以下图5.3设置:
图5.3 CSS2设置图
(3)接着在下面窗口中按标号次序进行以下图5.4选择:
图5.4CSS2设置图
在出现窗口按标号次序进行以下图5.5设置:
图5.5CSS2设置图
(5)在出现窗口按标号次序进行以下图5.6设置:
图5.6CSS2设置图
以 | 上 | 设 | 置 | 完 | 成 | 后 | , | CCS | 已 | 经 | 被 | 设 | 置 | 成 | Emulator |
方法(用仿真器连接硬件板卡方法),而且指定经过ICETEK-5100USB
仿 | 真 | 器 | 连 | 接 | ICETEK-VC5416-A | 评 | 定 | 板 | 。 |
假如您需要一直使用这一方法就不需要重新进行以上设置操作了。
5.2.2程序运行
选择菜单“Project”“New…”项。 图5.7所表示。
图5.7CSS2设置图
以下图,按编号次序操作建立Trafficlight.pjt工程文件:
展开主窗口左侧工程管理窗口中“Projects”下新建立“Trafficlight.pjt”,
其中各项均为空。
(2)在工程文件中添加程序文件:
Project”对话框中
选择菜单“Project”“AddFiles to Project…”项; 在“AddFiles to
选 Files(*.c;*.ccc)” , 选择显示出来文件“Trafficlight.c” ;
反复上述各步骤,添加Trafficlight.cmd文件,到volume工程中;
添加C:\ti\C5400\cgtools\lib\rts.lib。
(3)编译连接工程:选择菜单“Project”“ Rebuild All” 项,
或 | 单 | 击 | 工 | 具 | 条 | 中 | 按 | 钮 | ; | 注 | 意 | 编 | 译 | 过 | 程 | 中 | CCS |
主窗口下部“Build”提醒窗中显示编译信息,最终将给犯错误和警告统计数。
5.3系统下载
(1) 下载程序: 实施File→Load Program ,在随即打开对话框中选择刚刚建立
C:\ICETEK-VC5416-EDULab\Lab0601-UseCCS\Debug\Trafficlight.out文件。
(2)设置软件调试断点:在项目浏览窗口中,双击Trafficlight.c
激活这个文件,移动光标到main()行上,单击鼠标右键选择ToggleBreakpoint
或 | 按 | F9 | 设 | 置 | 断 | 点 | (另 | 外 | , |
双击此行左边灰色控制条也能够设置或删除断点标识)。
(3)利用断点调试程序:选择Debug→Run或按F5运行程序,
程序会自动停在main()函数上。
(4)在ICETEK-CTR附带小键盘上按下按键,观察信号是否满足要求。
6致谢
该学期期间一直得到刘嵩老师悉心教导。从她身上,
参考文件
[1] | 刘 | 和 | 平 | 等 | . | DSP原 | 理 | 及 | 电 | 机 | 控 | 制 | 应 | 用 | — |
基于TMS320LF2407x系列[M].北京航空航天大学出版社,.
[2]宁改娣等.DSP控制器原理及应用[M].北京:科学出版社,.
[3] 仿真系统使用说明书,北京瑞泰创新。
[4]清源科技.TMS320C54xDSP应用程序设计教程[M].机械工业出版社,.1.
[5] 清源科技.TMS320C54x硬件开发教程[M].机械工业出版社,.1.
附录
源程序
main()
{
intnWork1,nWork2,nWork3,nWork4;
nNowStatus,nOldStatus,nOldTimeCount,nSaveTimeCount,nSaveStatus;
int
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;
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;
else | if | ( | nTimeCount<nStatusNSYellowEWRed1 | ) |
nNowStatus=statusNSYellowEWRed;
if( nNowStatus==nOldStatus )
{
switch ( nNowStatus )
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);
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;
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);
}
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 )
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 )
uLightStatusEW=0x24;
uLightStatusSN=0x49;
SetLEDArray(20);
break;
casestatusNSFlashEWRed:
uLightStatusEW=0x24;
uLightStatusSN=0x49;
SetLEDArray(0); |
|
break;
casestatusNSYellowEWRed:
uLightStatusEW=0x24;
uLightStatusSN=0x52;
SetLEDArray(20);
break;
casestatusNSRedEWYellow:
uLightStatusEW=0x12;
uLightStatusSN=0x64;
break;
uLightStatusEW=0x09;
uLightStatusSN=0x64;
SetLEDArray(20);
break;
casestatusNSRedEWFlash:
uLightStatusEW=0x09;
uLightStatusSN=0x64;
SetLEDArray(0);
break;
casestatusHold:
uLightStatusEW=0x24;
uLightStatusSN=0x64;
SetLEDArray(20);
break;
}
}
CTRLR=uLightStatusEW;CTRLR=uLightStatusSN; //
设置交通灯状态
RefreshLEDArray(); //刷新发光二极管显示
nScanCode&=0x0ff;
if( nScanCode==SCANCODE_Enter ) break;
}
EndICETEKCTR();
exit(0);
}
// 定时器中止服务程序, 进行时钟计数
voidinterrupt time(void)
{
nTimeCount++;
nTimeCount%=nTotalTime;
}
//设置发光二极管显示内容
voidSetLEDArray(int nNumber)
{ | int i,k,kk,kkk; |
|
|
for( i=0;i<4;i++ )
{
ledbuf[7-i]=~led[k+i];
ledbuf[3-i]=~led[kk+i];
}
}
// 将缓存中点阵送发光二极管显示
voidRefreshLEDArray()
{
inti;
for( i=0;i<8;i++ )
{
CTRGR=ledx[i];
CTRLA=ledbuf[i];
}
}
// 初始化DSP, 设置运行速度=8MHz
{ REGISTERCLKMD=0; // 速度设置=8MHz
}
//设置定时器参数、许可中止
voidInitTimer()
{
unsignedint k;
asm(" ssbx | INTM"); | // 关中止, 进行关键设置时不许打搅 |
//设置通用定时器
k=PMST; //设置PMST寄存器
PMST=k&0xff; //中止向量表起始地址=80H
IMR= 0x0c; //使能TINT
TCR= 0x41f; //预分频系数为16
TIM= 0; //时钟计数器清0
PRD= 0x0f423; //周期寄存器为0ffH
TCR= 0x42f; //复位、开启
IFR= 0x0c; //清中止标志位
}
//初始化ICETEK-CTR板上设备
voidInitICETEKCTR()
{
intk;
CTRGR=0; | // 初始化ICETEK-CTR |
|
CTRGR=0x80; |
CTRGR=0;
CTRLR=0; //关闭东西方向交通灯
CTRLR=0x40;// 关闭南北方向交通灯
CTRLR=0x0c1; //开启发光二极管显示阵列
for( k=0;k<8;k++ )
{
} | ledbuf[k]=0x0ff; | // 显示为空白 |
ledx[k]=(k<<4); | // 生成显示列控制字 | |
} |
void interrupt xint2(void)
{
bHold=1;
}
void EndICETEKCTR()
{
//XINT2中止服务程序
int k;
CTRLR=0; //关闭东西方向交通灯
CTRLR=0x40;// 关闭南北方向交通灯
CTRLR=0x0c0; //关闭发光二极管显示阵列
k=CTRCLKEY;// 清除键盘缓冲区
}