DSP实验报告班级:学号:姓名:2014年11月3日交通灯控制实验一、实验目的1.熟悉2812的指令系统。2.熟悉74HC573的使用方法。3.熟悉DSP的IO操作使用方法。二、实验设备1.一台装有CCS3.3软件的计算机;2.插上2812主控板的DSP实验箱;3.DSP硬件仿真器。三、实验原理交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又有很多不同的显示要求,比如十字路口,车辆如果只要东西和南北方向通行就很简单,而如果车子可以左右转弯的通行就比较复杂,本实验仅针对最简单的南北和东西直行的情况。要完成本实验,首先必须了解交通路灯的燃灭规律。本实验需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各三个。依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。其交通灯的燃灭规律为:初始态是两个路口的红灯全亮,之后,东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。本实验要完成任务就是设计一个简单的交通灯控制器,交通灯显示用实验箱的交通灯模块显示。此模块由发光二极管和一个锁存器组成。数据由2812模块的低八位输入,锁存器的控制信号由2812模块输出,但经由74LS00译码后再控制锁存器。交通灯原理图四、程序设计思路根据设计要求,由于控制是由不同的各种状态按顺序发生的,我们可以采用状态机制控制方法来解决此问题。这种方法是:首先列举所有可能发生的状态;然后将这些状态编号,按顺序产生这些状态;状态延续的时间用程序控制。对于突发情况,可采用在正常顺序的控制中插入特殊控制序列的方式完成。时钟计数:采用250ms一次中断进行累加计数。表格1状态编号信号灯状态状态定义保持时间(计数值,起始时间,结束时间)计数显示1南北绿灯,东西红灯statusNSGreenEWRed20秒(160,0,159)20-02南北绿灯闪烁,东西红灯statusNSFlashEWRed6秒(24,160,183)03南北黄灯,东西红灯statusNSYellowEWRed4秒(16,184,199)204南北红灯,东西statusNSRe4秒(16,2黄灯dEWYellow200,215)05南北红灯,东西绿灯statusNSRedEWGreen20秒(160,216,375)20-16南北红灯,东西绿灯闪烁statusNSRedEWFlash6秒(24,376,399)07南北红灯,东西黄灯statusNSRedEWYellow4秒(16,400,415)208南北黄灯,东西红灯statusNSYellowEWRed4秒(16,416,431)20*南北红灯,东西红灯StatusHold20秒(160,0,159)20-1其中,正常顺序每112秒(计数值448)为一个循环,状态“*”为非顺序状态。这样,只要根据计数值就可确定当前状态,根据状态再分情况处理。对于计数显示,当处于状态1、5、*中时需要进行倒计时,需要计算在此状态中的计数值增量,根据增量判断是否更新计数显示。五、DSP定时器的算法原理5.1CPU定时器的原理本次设计主要用的是F2812器件上的3个32位CPU定时器(TIMER0/1/2)。其中定时器1和定时器2预留给实时操作系统使用(如DSP-BIOS),只有定时器0用户可以在应用程序中使用。定时器功能框图如下:5.2CPU定时寄存器原理定时器在工作过程中,首先把周期寄存器(PRDH:PRD)的值装入32位计数寄存器。计数寄存器根据SYSCLKOUT时钟递减计数。当计数寄存器等于0时,定时器中断输出产生一个中断脉冲。(1)定时器计数寄存器(TIMERxTIM和TIMERxTIMH)(2)定时器控制寄存器(TIMERxTCR):使能中断,定时功能;(3)定时器周期寄存器(TIMERxPRD):符合条件则周期性重新装载并保存周期值(4)定时器预定标寄存器(TIMERxTPR和TIMERxTPRH):控制多久减1。六、系统程序设计6.1流程图图6-1实验程序流程图设计总流程图6.2试验程序#includescancode.h#defineSPSA0*(unsignedint*)0x38#defineSPSD0*(unsignedint*)0x39#defineREGISTERCLKMD(*(unsignedint*)0x58)#defineTIM*(int*)0x24#definePRD*(int*)0x25开始初始化DSP全部红灯,延时1秒南北绿灯、东西红灯,延时20秒南北绿灯闪3次、东西红灯南北绿灯闪3次、东西红灯南北黄灯、东西红灯,延时3秒南北红灯、东西绿灯,延时20秒南北红灯、东西绿灯闪3次南北红灯、东西黄灯,延时3秒图6-2设计总流程图#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#defineLCDCMDVERADDRESS0x40ioportunsignedintport3004;//CTR扩展寄存器定义ioportunsignedintport8000;ioportunsignedintport8001;//8001:读键盘扫描值,写液晶控制寄存器地址ioportunsignedintport8002;//8002:液晶控制寄存器地址ioportunsignedintport8003;//8003,8004:液晶显示数据寄存器地址ioportunsignedintport8004;//ioportunsignedintport8005;//8005:发光二极管显示阵列控制寄存器地址ioportunsignedintport8007;//8007:发光二极管显示阵列控制寄存器地址#defineCTRGRport8000#defineCTRLCDCMDRport8001#defineCTRKEYport8001#defineCTRCLKEYport8002#defineCTRLCDCRport8002#defineCTRLCDLCRport8003#defineCTRLCDRCRport8004#defineCTRLAport8005#defineCTRLRport8007voidInitDSP();//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(nTimeCountnStatusNSGreenEWRed)nNowStatus=statusNSGreenEWRed;elseif(nTimeCountnStatusNSFlashEWRed)nNowStatus=statusNSFlashEWRed;elseif(n