《DSP交通灯综合控制程序代码.doc》由会员分享,可在线阅读,更多相关《DSP交通灯综合控制程序代码.doc(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateDSP交通灯综合控制程序代码DSP交通灯综合控制程序代码 DSP原理及C程序开发 交通灯综合控制实验及程序代码 一、实验目的 熟悉使用ICETECK-F2812-A评估板控制ICETECK-CTR上交通灯的方法 掌握TMS320F2812DSP定时器的使用和编程 掌握TMS320F2812DSP外中断的使用和编程二、实验要求1、交通灯控制要求 交通灯分红黄绿三色,东、
2、南、西、北各一组 计时显示:8*8点阵显示两位计数 正常交通控制信号顺序 南北绿灯:东西红灯(20s) 南北绿灯闪烁 南北黄灯 南北红灯,东西黄灯 东西绿灯(20s) 东西绿灯闪烁 东西黄灯 返回1循环控制 紧急情况处理 当任意方向通行剩余时间多于10s,将时间给为10s 正常变换到四面红灯(20s) 直接返回正常信号顺序的下一个通行信号(跳过闪烁绿灯、黄灯状态)2、交通灯模拟利用ICETECK-CTR上的一组发光二极管(共12只,分为东西南北四组、红黄绿三色)的亮灭实现交通信号的模拟;3、计时显示利用ICETEK-CTR上的发光二极管显示阵列模拟显示4、计时利用TMS320F2812DSP片
3、上定时器,定时产生时钟计数,再利用此计数对应具体时间5、紧急情况利用ICETECK-CTR上键盘产生外中断,中断正常信号顺序,模拟突发情况6、程序设计由于控制是由不同的各种状态按顺序发生的,可采用状态机控制方法来实现、 首先列举所有可能发生的状态 然后将这些状态编号,按顺序产生这些状态;状态延续的时间用程序控制 对于突发情况,可采用在正常顺序的控制中插入特殊控制序列的方式完成三、实验步骤1实验准备(1)连接实验设备: (2)连接实验箱附带的键盘的PS2插头到ICETEK-CTR的“键盘接口”P8。(3)将ICETEK-CTR板的供电电源开关拨动到“开”的位置。2设置Code Composer
4、Studio3.3在硬件仿真(Emulator)方式下运行。3启动Code Composer Studio 3.3,选择菜单DebugConnect ; DebugReset CPU。 4打开工程文件,工程目录为:C:ICETEKF2812AES60F2812AES60DSP281x_exampleslab0601-TrafficLight。5编译并下载程序。6运行程序观察结果。观察交通灯信号是否正常工作。7突发事件控制在ICETEK-CTR附带的小键盘上按下除“Enter”键外的按键,观察信号是否满足要求。8结束程序运行退出。在ICETEK-CTR附带的小键盘上按下“Enter”键。9退出C
5、CS。 四、实验程序#include DSP281x_Device.h / DSP281x Headerfile Include File#include DSP281x_Examples.h / DSP281x Examples Include FileUint16 var1 = 0;Uint16 var2 = 0;Uint16 var3 = 0;Uint16 test_count = 0;Uint16 Test_flag = 0;Uint16 Test_var = 0;Uint16 Test_status32;#define nStatusNSGreenEWRed 160 /用数字来区分每
6、一个状态 南北绿灯,东西红灯#define nStatusNSFlashEWRed 184 /南北绿灯闪烁,东西红灯#define nStatusNSYellowEWRed 200 /南北黄灯,东西红灯#define nStatusNSRedEWYellow 216 /南北红灯,东西黄灯#define nStatusNSRedEWGreen 376 /南北红灯,东西绿灯#define nStatusNSRedEWFlash 400 /南北红灯,东西绿灯闪烁#define nStatusNSRedEWYellow1 416 /南北红灯,东西黄灯#define nStatusNSYellowEWR
7、ed1 432 /南北黄灯,东西红灯#define nTotalTime 448 /正常顺序一个循环#define nStatusHold 160 /突发情况#define statusNSGreenEWRed 0 /一共7个状态#define statusNSFlashEWRed 1#define statusNSYellowEWRed 2#define statusNSRedEWYellow 3#define statusNSRedEWGreen 4#define statusNSRedEWFlash 5#define statusHold 6int a=0;unsigned int uW
8、ork,nTimeCount,nTimeMS; /计数时使用的变量unsigned int uLightStatusEW,uLightStatusSN; /东西、南北红黄绿二极管的亮灭情况unsigned int bHold; /用来表明是否处于突发情况unsigned char ledbuf8,ledx8; /二极管点阵显示用到unsigned char led40=0x7E,0x81,0x81,0x7E,0x00,0x02,0xFF,0x00,0xE2,0x91,0x91,0x8E,0x42,0x89,0x89,0x76,0x38,0x24,0x22,0xFF,0x4F,0x89,0x89
9、,0x71,0x7E,0x89,0x89,0x72,0x01,0xF1,0x09,0x07,0x76,0x89,0x89,0x76,0x4E,0x91,0x91,0x7E;void main(void) int nWork1,nWork2,nWork3,nWork4,k; int nNowStatus,nOldStatus,nOldTimeCount,nSaveTimeCount,nSaveStatus; unsigned int nScanCode; nTimeCount=0; bHold=0; /给各变量赋初值 uLightStatusEW=uLightStatusSN=0; nNowSt
10、atus=0; nOldStatus=1; nOldTimeCount=0; /InitSysCtrl();/初始化cpu InitPll(0x0); /SYSCLKOUT=30 MHz /2=15MHz DINT;/关中断 InitPieCtrl();/初始化pie寄存器 CTRGR=0;/ 初始化ICETEK-CTR 具体说明见实验箱硬件编程CTRGR=0x80;CTRGR=0;CTRLR=0;/ 关闭东西方向的交通灯CTRLR=0x40;/ 关闭南北方向的交通灯CTRLR=0x0c1;/ 开启发光二极管显示阵列 for ( k=0;k8;k+ )ledbufk=0x0ff;/ 显示为空白
11、 值为“1”时灭;值为“0”时点亮ledxk=(k=nStatusHold ) nNowStatus=nSaveStatus;nTimeCount=nSaveTimeCount;bHold=0;/根据计数值来确定状态else if ( nTimeCountnStatusNSGreenEWRed )nNowStatus=statusNSGreenEWRed;else if ( nTimeCountnStatusNSFlashEWRed )nNowStatus=statusNSFlashEWRed;else if ( nTimeCountnStatusNSYellowEWRed )nNowStat
12、us=statusNSYellowEWRed;else if ( nTimeCountnStatusNSRedEWYellow )nNowStatus=statusNSRedEWYellow;else if ( nTimeCountnStatusNSRedEWGreen )nNowStatus=statusNSRedEWGreen;else if ( nTimeCountnStatusNSRedEWFlash )nNowStatus=statusNSRedEWFlash;else if ( nTimeCountnStatusNSRedEWYellow1 )nNowStatus=statusNS
13、RedEWYellow;else if ( nTimeCount=0 & nWork20 & nWork30 & nWork40 ) /if和条件语句用来 uLightStatusSN=( (nWork1%nWork3)=0 & nWork20 & nWork30 & nWork40 ) /分析同前uLightStatusEW=( (nWork1%nWork3)0 )nWork2=20-nTimeCount/nWork1; /nWork1最大20,最小0if ( bHold ) /出现突发状态if ( nWork210 ) /若多于10s,则将时间改为10snTimeCount=nWork1*
14、10;nWork2=10;if ( nOldTimeCount!=nWork2 )nOldTimeCount=nWork2;SetLEDArray1(nWork2);break;case statusNSRedEWGreen:nWork1=(nStatusNSRedEWGreen-nStatusNSRedEWYellow)/20;if ( nWork10 )nWork2=20-(nTimeCount-nStatusNSRedEWYellow)/nWork1;if ( bHold )if ( nWork210 )nTimeCount=nStatusNSRedEWYellow+nWork1*10;
15、nWork2=10;if ( nOldTimeCount!=nWork2 )nOldTimeCount=nWork2;SetLEDArray1(nWork2);break;case statusHold:nWork1=nStatusHold/20;if ( nWork10 )nWork2=20-nTimeCount/nWork1;if ( nOldTimeCount!=nWork2 )nOldTimeCount=nWork2;SetLEDArray1(nWork2);break;elseif ( bHold )nSaveStatus=nNowStatus;nSaveTimeCount=nTim
16、eCount;nNowStatus=statusHold;nTimeCount=0;if ( nSaveStatus=statusNSFlashEWRed | nSaveStatus=statusNSYellowEWRed )/若突发情况,其状态为闪烁或黄灯,则直接将下一状态保存nSaveStatus=statusNSRedEWGreen;nSaveTimeCount=nStatusNSRedEWYellow;else if ( nSaveStatus=statusNSRedEWFlash | nSaveStatus=statusNSRedEWYellow )nSaveStatus=statu
17、sNSGreenEWRed;nSaveTimeCount=0;nOldStatus=nNowStatus;switch ( nNowStatus )case statusNSGreenEWRed:uLightStatusEW=0x24; uLightStatusSN=0x49; /东西红灯,南北绿灯SetLEDArray1(20);break;case statusNSFlashEWRed:uLightStatusEW=0x24; uLightStatusSN=0x49; /东西红灯,南北绿灯SetLEDArray1(0);break;case statusNSYellowEWRed:uLig
18、htStatusEW=0x24; uLightStatusSN=0x52; /东西红灯,南北黄灯SetLEDArray1(20);break;case statusNSRedEWYellow:uLightStatusEW=0x12; uLightStatusSN=0x64;SetLEDArray1(20);break;case statusNSRedEWGreen:uLightStatusEW=0x09; uLightStatusSN=0x64;SetLEDArray1(20);break;case statusNSRedEWFlash:uLightStatusEW=0x09; uLightS
19、tatusSN=0x64;SetLEDArray1(0);break;case statusHold:uLightStatusEW=0x24; uLightStatusSN=0x64;SetLEDArray1(20);break;CTRLR=uLightStatusEW; CTRLR=uLightStatusSN;/ 设置交通灯状态RefreshLEDArray1();/ 刷新发光二极管显示nScanCode=CTRKEY;/ 读键盘扫描码nScanCode&=0x0ff;if ( nScanCode=SCANCODE_Enter )break; /若按ENTER,则退出程序 EndICETE
20、KCTR();exit(0); interrupt void cpu_timer0_isr(void) /CpuTimer0.InterruptCount+; / Acknowledge this interrupt to receive more interrupts from group 1 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; CpuTimer0Regs.TCR.bit.TIF = 1; CpuTimer0Regs.TCR.bit.TRB = 1; nTimeMS+;if ( nTimeMS=5 ) /来5次中断,才改变一次计数值nTimeMS=
21、0;nTimeCount+;nTimeCount%=nTotalTime;interrupt void XINT2_isr(void) /StopCpuTimer0(); PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; bHold=1; /StartCpuTimer0();void Delay(unsigned int nDelay)int ii,jj,kk=0;for ( ii=0;iinDelay;ii+ )for ( jj=0;jj64;jj+ )kk+;/ 设置发光二极管显示内容void SetLEDArray1(int nNumber)int i,k,
22、kk,kkk;kkk=nNumber; k=kkk/10*4; kk=kkk%10*4;for ( i=0;i4;i+ )ledbuf7-i=ledk+i;ledbuf3-i=ledkk+i;/ 将缓存中点阵送发光二极管显示void RefreshLEDArray1()int i;for ( i=0;i8;i+ )CTRGR=ledxi;CTRLA=ledbufi;void EndICETEKCTR()int k;CTRLR=0;/ 关闭东西方向的交通灯CTRLR=0x40;/ 关闭南北方向的交通灯CTRLR=0x0c0;/ 关闭发光二极管显示阵列k=CTRLCDCR;/ 清除键盘缓冲区五、实验结果 程序可以完成交通灯功能,顺序循环工作; 在中断信号到来后,进入特殊过程:当前计时如果大于10改成10;否则不变,等待状态切换;切换后进入四面进行状态,计数20s后返回断点后的通行(有两方向是绿灯)状态;-