XXXXXX电子信息工程学院
课程设计报告
交通灯综合控制
设 计 人: 专 业: 班 级: 学 号: 指导教师:
XXX 电子信息工程 电子班
二零一X年X月
目 录
1 设计目的及要求......................................4 1.1设计目的.........................................4 1.2设计要求.........................................4 1.2.1 交通灯控制................................4 1.2.2 计时......................................5 1.2.3 紧急情况..................................5
1.2.4 程序设计..................................5
2 设计原理及方案.....................................7 2.1 课程设计总体方案................................7 2.1.1 设计思路 ..................................7 2.2课程设计原理.....................................7 2.2.1 系统工作原理...............................7
2.2.2 系统工作状态 ..............................8 3 硬件设计..........................................10 3.1 硬件总体设计..................................10 3.2 交通灯显示模块 ..............................11 3.3 计数显示模块..................................12 3.4 开关模块......................................13 4 软件设计...........................................14 4.1 程序流程......................................14 4.2 交通灯模拟显示................................15 4.3 定时器及中断设计..............................15 4.4 外中断设计....................................16
5 系统调试...........................................18 5.1 硬件调试......................................18 5.1.1 电源调试..................................18
5.1.2 Emulator调试..............................18 5.2软件调试........................................21
5.2.1软件设计....................................21 5.2.2程序运行....................................23 5.3系统下载......................................24 6 结论分析及体会.....................................25 7参考文献...........................................26
1 设计目的及要求
1.1 设计目的
(1)熟悉使用ICETEK–F2812-AE评估板控制ICETEK-CTR上交通灯的方法。练习自主独立的设计,实现理论和实践的统一,提高自我动手能力。
(2)掌握TMS320F2812DSP定时器的使用和编程。 (3)掌握TMS320F2812DSP外中断的使用和编程。 (4)学习复杂控制程序设计思路。
(5)利用DSP开发环境CCS C2000对源程序文件进行编译、链接、装载调试,以完成基本的DSP项目文件设计。
(6)通过此次课程设计,学习DSPF2812芯片的I/O端口控制方法,熟悉字模的简单构建和使用,熟悉掌握在DSP软硬件环境下的程序开发流程,达到学以致用的目的。 1.2 设计要求
1.2.1 交通灯控制要求:
利用ICETEK-EDU实验箱提供的设备,设计模拟实际生活中十字路口交通灯控制的程序。要求如下:
交通灯分红黄绿三色,东、南、西、北各一组,用灯光信号实现对交通的控制:绿灯信号表示通行,黄灯表示警告,红灯禁止通
行,灯光闪烁表示信号即将改变。 计时显示:8×8点阵显示两位计数,为倒计时,每秒改变计数显示。 正常交通控制信号顺序:正常交通灯信号自动变换 (1)南北方向绿灯,东西红灯(20秒)。 (2)南北方向绿灯闪烁3次,东西红灯(6秒)。 (3)南北方向黄灯,东西红灯(4秒)。
(4)南北方向红灯,东西方向绿灯(20秒)。 (5)南北方向红灯,东西方向绿灯闪3次(6秒)。 (6)南北方向红灯,东西方向黄灯(4秒)。 (7)返回(1)循环控制
紧急情况处理:模仿紧急情况(重要车队通过、急救车通过等)发生时,交通警察手动控制
(1)当任意方向通行剩余时间多于10秒,将时间改成10秒。 (2)正常变换到四面红灯(20秒)。
(3)直接返回正常信号顺序的下一个通行信号(跳过闪烁绿灯、黄灯状态)。 1.2.2 计时要求:
使用TMS320VC5416DSP 片上定时器,定时产生时钟计数,再利用此计数对应具体时间。 1.2.3 紧急情况要求:
利用ICETEK-CTR 上键盘产生外中断,中断正常信号顺序,模拟突发情况。
1.2.4 程序设计要求
根据设计要求,由于控制是由不同的各种状态按顺序发生的,我们可以采用状态机制控制方法来解决此问题。
这种方法是:首先列举所有可能发生的状态;然后将这些状态编号,按顺序产生这些状态;状态延续的时间用程序控制。对于突发情况,可采用在正常顺序的控制中插入特殊控制序列的方式完成。
时钟计数:采用250ms 一次中断进行累加计数。
表格 1 状态编号 信号灯状态 状态定义 保持时间(计数值,起始时间,结束时间) 计数显示 20-0 0 20 20 20-1 0 20 20 20-1 statusNSGreenEWR20秒(160,0,159) ed 南北绿灯闪烁,东西statusNSFlashEWR2 6秒(24,160,183) 红灯 ed statusNSYellowEW3 南北黄灯,东西红灯 4秒(16,184,199) Red statusNSRedEWYel4 南北红灯,东西黄灯 4秒(16,200,215) low statusNSRedEWGre20秒(160,216,5 南北红灯,东西绿灯 en 375) 南北红灯,东西绿灯statusNSRedEWFla6 6秒(24,376,399) 闪烁 sh statusNSRedEWYel7 南北红灯,东西黄灯 4秒(16,400,415) low statusNSYellowEW8 南北黄灯,东西红灯 4秒(16,416,431) Red * 南北红灯,东西红灯 StatusHold 20秒(160,0,159) 其中,正常顺序每112 秒(计数值448)为一个循环,状态“*”为非顺序状态。
这样,只要根据计数值就可确定当前状态,根据状态再分情况处理。
对于计数显示,当处于状态1、5、*中时需要进行倒计时,需要计算在此状态中的计数值增量,根据增量判断是否更新计数显示。 1 南北绿灯,东西红灯
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
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 ICETEK-F2812-AE原理框图
3.2 交通灯显示模块
利用ICETEK-CTR上的一组发光二极管(共12只,分为东西南北四组、红黄绿三色)的亮灭实现交通信号的模拟。TMS320F2812 DSP有最多56个专门的通用输入输出管脚。这些通用输入输出管脚通过专用寄存器可以由软件控制,比如指定输入、输出以及输出值等。通过ICETEK-F2812-AE评估板的插座,扩展板(通用输出/控制模块ICETEK-CTR)将板上的一个指示灯和DSP的一个通用输入/输出管脚直接相连。这个管脚为PWM12,可以设置成通用输入/输出管脚使用。扩展原理如图3.2所示。
图3.2发光二极管设计原理
3.3计数显示模块
计数显示采用放光二极管显示阵列显示。TMS320F2812 DSP的存储器扩展接口(EMIF)用来与大多数外围设备进行连接,典型应用如连接片外扩展存储器等。这一接口提供地址线、数据线和一组控制线,ICETEK-F2812-A评估板已将这些扩展线引到了板上的扩展插座上,供扩展使用。发光二极管显示阵列由扩展端口控制,EMIF接口的两个寄存器提供具体控制。原理图如图3.3所示。
图3.3 计数显示原理
3.4开关模块
开关模块采用外部外部存储器扩展接口(EMIF)上的PS2接口键盘,通过扫描码判断输入键值。TMS320F2812 DSP的扩展存储器接口(EMIF)用来与大多数外围设备进行连接,典型应用如连接片外扩展存储器等。这一接口提供地址线、数据线和一组控制线,ICETEK-F2812-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’时,数据的低6位将写入EWR寄存器;当高两位的值为‘01’时,写入SNR寄存器 bit5 东-红 bit4 东-黄 bit3 东-绿 bit2 西-红 bit1 西-黄 bit0 西-绿 表4.1 寄存器EWR
bit5 南-红 bit4 南-黄 bit3 南-绿 bit2 北-红 bit1 北-黄 bit0 北-绿 表4.2 寄存器SNR
4.3定时器及中断设计
TMS320F2812A内部有三个32位通用定时器(TIMER0/1/2),定时 器1和2被保留给实时操作系统(DSPBIOS)用,只有定时器0可以提供给用户使用。定时器采用中断方式,中断过程如下:a.接受中断请求。必须由软件中断(从程序代码)或硬件中断(从一个引脚或一个基于芯片的设备)提出请求去暂停当前主程序的执行。b.响应中断。必须能够响应中断请求。如果中断是
可屏蔽的,则必须满足一定的条件,按照一定的顺序去执行。而对于非可屏蔽中断和软件中断,会立即作出响应。c.准备执行中断服务程序并保存寄存器的值。d.执行中断服务子程序。调用相应得中断服务程序ISR,进入预先规定的向量地址,并且执行已写好的ISR。定时器及中断的流程如图4.2。
等待中断产生 初始化定时器 初始化中断向量 中断服务结束 初始化DSP时钟 改变指示灯状态 开始 中断服务开始 图4.2 定时器及中断流程图
4.4外中断设计
紧急情况时,利用ICETEK-CTR上键盘产生外中断,中断正常信号顺序,模拟突发情况。显示/控制模块ICETEK-CTR通过接口P8连接小键盘,接收小键盘传送的扫描码,并在每个扫描码结束后保存,同时向DSP的XINT2发送中断信号;当DSP读键盘
时将扫描码送到数据总线上。小键盘上每次按下一个键将产生2个扫描码、2次中断。外中断的程序流程图如图4.3所示。
初始化: DSP时钟、ICETEK-CTR 开始 中断服务开始 等待中断产生 初始化中断控制寄存器 改变指示灯状态 中断服务结束 图4.3 外中断程序流程图
5系统调试
5.1硬件调试 5.1.1电源调试
1.连接电源:打开实验箱,取出三相电源连接线(如右图),将电源线的一端插入实验箱外部左侧箱壁上的电源插孔中。确认实验箱面板上电源总开关(位于实验箱底板左上角)处于“关”的位置,连接电源线的另一端至220V 交流供电插座上,保证稳固连接。
2.使用电源连接线(如右图,插头是带孔的)连接各模块电源:确认实验箱总电源断开。连接ICETEK-CTR 板上边插座到实验箱底板上+12V电源 插座;ICETEK-CTR 板下边插座到实验箱底板上+5V 电源插座;如使用PP(并口)型仿真器,则连接仿真器上插座到实验箱底板上+5V电源插座;连接DSP 评估板模块电源插座到实验箱底板上+5V 电源插座。注意各插头要插到底,防止虚接或接触不良。
3.连接DSP 评估板信号线:当需要连接信号源输出到A/D 输入插座时,使用信号连接线(如右图)分别连接相应插座。 4.接通电源:检查实验箱上220V 电源插座(箱体左侧)中保险管是否完好,在连接电源线以后,检查各模块供电连线是否正确连接,打开实验箱上的电源总开关(位于实验箱底板左上角),使开关位于“开”的位置,电源开关右侧的指示灯亮。 5.1.2 Emulator调试 1.启动Simulator 方式
双击桌面上图标: 2.启动Emulator 方式
(1)首先将实验箱电源关闭。连接实验箱的外接电源线。 (2)检查ICETEK-5100USB 仿真器的黑色JTAG 插头是否正确接到ICETEK-VC5416-A 板的J3 插头上。注:仿真器的插头中有个孔加入了封针与J3 插头上的缺针位置应重合,保证不会插错。 (3)检查是否已经用电源连接线连接了ICETEK-VC5416-A 板的POW1 插座和实验箱底板上+5V 电源插座。
(4)检查其他连线是否符合实验要求。检查实验箱上三个拨动开关位置是否符合实验要求。
(5)打开实验箱上电源开关(位于实验箱底板左上角),注意开关 边上红色指示灯点亮。ICETEK-VC5416-A 板上指示灯D1 和D2 点 亮。如果打开了ICETEK-CTR 的电源开关,ICETEK-CTR 板上指示 灯L1、L2 和L3 点亮。如果打开了信号源电源开关,相应开关边的指示灯点亮。
(6)用实验箱附带的USB 信号线连接ICETEK-5100USB 仿真器和PC 机后面的USB 插座,注意ICETEK-5100USB 仿真器上指示灯Power 和Run 灯点亮。
(7)(7)双击桌面上仿真器初始化图标:如果出现下面图5.1
提示窗口,表示初始化成功,按一下空格键进入下一步操作。
图5.1 初始化图
如果窗口中没有出现“按任意键继续…”,请关闭窗口,关闭实验箱电源,再将USB 电缆从仿真器上拔出,返回第(2)步重试。 如果窗口中出现“The adapter returned an error.”,并提示“按任意键继续…”表示初始瑞泰创新——ICETEK-VC5416-A-USB-EDU 教学实验系统软件实验指导 III-7化失败,请关闭窗口重试两三次,如果仍然不能初始化则关闭实验箱电源,再将USB 电缆从仿真器上拔出,返回第(2)步重试。
⑧双击桌面上图标:
启动CCS2.21。
⑨如果进入CCS 提示错误,先选“Abort”,然后用“初始化ICETEK-5100USB2.0 仿真器”初始化仿真器,如提示出错,可多做几次。如仍然出错,拔掉仿真器上USB 接头(白色方形),按一下ICETEK-VC5416-A 板上S1 复位按钮,连接USB 接头再做“初始化ICETEK-5100 USB2.0 仿真器”。
⑩如果遇到反复不能连接或复位仿真器、进入CCS 报错,请打开Windows 的“任务管理器”,在“进程”卡片上的“映像名称”栏中查找是否有“cc_app.exe”,将它结束再试。 5.2软件调试 5.2.1软件设计
CCS 可以工作在纯软件仿真环境中,就是由软件在PC 机内存中构造一个虚拟的DSP 环境,可以调试、运行程序。但一般软件无法构造DSP 中的外设,所以软件仿真通常用于调试纯软件的算法和进行效率分析等。
在使用软件仿真方式工作时,无需连接板卡和仿真器等硬件。
(1)单击桌面上图标:进入CCS 设置窗口。
(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.4 CSS2设置图
在出现的窗口按标号顺序进行如下图5.5设置:
图5.5 CSS2设置图
(5)在出现的窗口按标号顺序进行如下图5.6设置:
图5.6 CSS2设置图
以上设置完成后,CCS 已经被设置成Emulator 的方式(用仿真器连接硬件板卡的方式),并且指定通过ICETEK-5100USB 仿真器连接ICETEK-VC5416-A 评估板。如果您需要一直使用这一方式就不需要重新进行以上设置操作了。 5.2.2程序运行
选择菜单“Project”的“New…”项。如图5.7所示。
图5.7 CSS2设置图
如下图,按编号顺序操作建立Trafficlight.pjt 工程文件: 展开主窗口左侧工程管理窗口中“Projects”下新建立的“Trafficlight.pjt”,其中各项均为空。 (2) 在工程文件中添加程序文件:
选择菜单“Project”的“Add Files to Project…”项;在“Add Files to Project”对话框中
选择文件目录为C:\\ICETEK-VC5416-EDULab\\Lab0601-UseCCS,改变文件类型为“C Source
Files(*.c;*.ccc)”,选择显示出来的文件“Trafficlight.c”;重复上述各步骤,添加Trafficlight.cmd 文件,到volume 工程中;
添加 C:\i\\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()行上,单击鼠标右键选择Toggle Breakpoint 或按F9 设置断点(另外,双击此行左边的灰色控制条也可以设置或删除断点标记)。 (3) 利用断点调试程序:选择Debug→Run 或按F5 运行程序,程序会自动停在main()函数上。
(4)在ICETEK-CTR 附带的小键盘上按下按键,观察信号是否满足要求。
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\"
#define SPSA0 *(unsigned int *)0x38 #define SPSD0 *(unsigned int *)0x39
#define REGISTERCLKMD (*(unsigned int *)0x58) #define #define #define #define #define #define
#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
TIM
*(int *)0x24
PRD *(int *)0x25 TCR IMR IFR PMST
*(int *)0x26 *(int *)0x0 *(int *)0x1
*(int *)0x1d
#define statusNSRedEWYellow 3 #define statusNSRedEWGreen 4 #define statusNSRedEWFlash 5 #define statusHold 6
ioport unsigned int port3004; // CTR扩展寄存器定义
ioport unsigned int port8000; ioport unsigned int port8001; ioport unsigned int port8002; ioport unsigned int port8003; ioport unsigned int port8004; ioport unsigned int port8005; ioport unsigned int port8007; #define CTRGR port8000 #define CTRLCDCMDR port8001 #define CTRKEY port8001 #define CTRCLKEY port8002 #define CTRLCDCR port8002 #define CTRLCDLCR port8003 #define CTRLCDRCR port8004 #define CTRLA port8005 #define CTRLR port8007
void InitDSP(); void InitTimer();
void InitICETEKCTR(); void interrupt time(void);
void interrupt xint2(void); // XINT2中断服务程序 void SetLEDArray(int nNumber); void RefreshLEDArray(); void EndICETEKCTR();
unsigned int uWork,nTimeCount;
unsigned int uLightStatusEW,uLightStatusSN; unsigned int bHold;
unsigned char ledbuf[8],ledx[8]; unsigned char led[40]= { }; main() {
int nWork1,nWork2,nWork3,nWork4; int
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
// 修改显示内容
// 刷新显示
nNowStatus,nOldStatus,nOldTimeCount,nSaveTimeCount,nSaveStatus;
unsigned int nScanCode;
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 ) else if ( nTimeCount else if ( nTimeCount else if ( nTimeCount else if ( nTimeCount else if ( nTimeCount else if ( nTimeCount if ( nNowStatus==nOldStatus ) { switch ( nNowStatus ) { case statusNSFlashEWRed: 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):(0 x40); 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):(0 x00); break; case statusNSGreenEWRed: nWork1=nStatusNSGreenEWRed/30; if ( nWork1>0 ) { nWork2=30-nTimeCount/nWork1; if ( bHold ) { if ( nWork2>10 ) { nTimeCount=nWork1*10; ; } } } nWork2=10; if ( nOldTimeCount!=nWork2 ) { } nOldTimeCount=nWork2; SetLEDArray(nWork2); break; case statusNSRedEWGreen: nWork1=(nStatusNSRedEWGreen-nStatusNSRedEWYellow)/30 if ( nWork1>0 ) { nWork2=30-(nTimeCount-nStatusNSRedEWYellow)/nWork1; if ( bHold ) { if ( nWork2>10 ) { nTimeCount=nStatusNSRedEWYellow+nWork1*10; nWork2=10; } } } } } if ( nOldTimeCount!=nWork2 ) { } nOldTimeCount=nWork2; SetLEDArray(nWork2); break; case statusHold: nWork1=nStatusHold/30; if ( nWork1>0 ) { } break; nWork2=30-nTimeCount/nWork1; if ( nOldTimeCount!=nWork2 ) { } nOldTimeCount=nWork2; SetLEDArray(nWork2); else { if ( bHold ) { nSaveStatus=nNowStatus; nSaveTimeCount=nTimeCount; nNowStatus=statusHold; nTimeCount=0; if ( nSaveStatus==statusNSFlashEWRed || nSaveStatus==statusNSYellowEWRed ) { } else if ( nSaveStatus==statusNSRedEWFlash nSaveStatus=statusNSRedEWGreen; nSaveTimeCount=nStatusNSRedEWYellow; || nSaveStatus==statusNSRedEWYellow ) } nOldStatus=nNowStatus; switch ( nNowStatus ) { case statusNSGreenEWRed: uLightStatusEW=0x24; { } nSaveStatus=statusNSGreenEWRed; nSaveTimeCount=0; uLightStatusSN=0x49; SetLEDArray(18); break; case statusNSFlashEWRed: uLightStatusEW=0x24; uLightStatusSN=0x49; SetLEDArray(0); break; case statusNSYellowEWRed: uLightStatusEW=0x24; uLightStatusSN=0x52; SetLEDArray(20); break; case statusNSRedEWYellow: uLightStatusEW=0x12; uLightStatusSN=0x64; SetLEDArray(20); break; case statusNSRedEWGreen: uLightStatusEW=0x09; uLightStatusSN=0x64; SetLEDArray(20); break; case statusNSRedEWFlash: uLightStatusEW=0x09; uLightStatusSN=0x64; SetLEDArray(0); break; case statusHold: uLightStatusEW=0x24; uLightStatusSN=0x64; SetLEDArray(20); break; } } CTRLR=uLightStatusEW; CTRLR=uLightStatusSN; 设置交通灯状态 RefreshLEDArray(); // 刷新发光二极管显示 nScanCode=port8001; // 读键盘扫描码 nScanCode&=0x0ff; if ( nScanCode==SCANCODE_Enter ) break; } EndICETEKCTR(); exit(0); } // 定时器中断服务程序,进行时钟计数 void interrupt time(void) { nTimeCount++; nTimeCount%=nTotalTime; // } // 设置发光二极管显示内容 void SetLEDArray(int nNumber) { } // 将缓存中点阵送发光二极管显示 void RefreshLEDArray() { int i; for ( i=0;i<8;i++ ) { } CTRGR=ledx[i]; CTRLA=ledbuf[i]; int i,k,kk,kkk; kkk=nNumber; k=kkk/10*4; kk=kkk%10*4; for ( i=0;i<4;i++ ) { } ledbuf[7-i]=~led[k+i]; ledbuf[3-i]=~led[kk+i]; } // 初始化DSP,设置运行速度=8MHz void InitDSP() { } // 设置定时器参数、允许中断 void InitTimer() { unsigned int k; asm(\" ssbx INTM\"); // 关中断,进行关键设置时不 REGISTERCLKMD=0; // 速度设置=8MHz 许打扰 // 设置通用定时器 k=PMST; // 设置PMST寄存器 PMST =k&0xff; // 中断向量表起始地址=80H IMR = 0x0c; // 使能TINT TCR = 0x41f; // 预分频系数为16 TIM = 0; // 时钟计数器清0 // 周期寄存器为0ffH PRD = 0x0f423; TCR = 0x42f; // 复位、启动 IFR = 0x0c; // 清中断标志位 } port3004=0; asm(\" rsbx // 使能XINT2 // 开中断 INTM\"); // 初始化ICETEK-CTR板上设备 void InitICETEKCTR() { } void interrupt xint2(void) // XINT2中断服务程序 { int k; CTRGR=0; CTRGR=0x80; CTRGR=0; CTRLR=0; CTRLR=0x40; // 关闭东西方向的交通灯 // 关闭南北方向的交通灯 // 初始化ICETEK-CTR CTRLR=0x0c1; // 开启发光二极管显示阵列 for ( k=0;k<8;k++ ) { } k=CTRCLKEY; // 清除键盘缓冲区 ledbuf[k]=0x0ff; // 显示为空白 ledx[k]=(k<<4); // 生成显示列控制字 } bHold=1; void EndICETEKCTR() { } int k; CTRLR=0; CTRLR=0x40; // 关闭东西方向的交通灯 // 关闭南北方向的交通灯 CTRLR=0x0c0; // 关闭发光二极管显示阵列 k=CTRCLKEY; // 清除键盘缓冲区 附录二 实物图 因篇幅问题不能全部显示,请点此查看更多更全内容