第一篇:基于DSP实现道路交通灯控制系统设计
引言..........................................................................................................1 2项目设计实现功能...................................................................................2 2.1交通灯控制要求...............................................................................2 2.2 液晶显示器控制..............................................................................3 3 项目实现方案..........................................................................................3 3.1项目设计整体思路..........................................................................3 3.2设计原理...........................................................................................5 3.2.1 CPU定时器原理.....................................................................5 3.2.2 DSP外设中断扩展模块.........................................................6 3.2.3 发光二极原理.........................................................................6 3.2.4 TMS320F28x DSP 的I/O.......................................................7 3.2.5 液晶显示器控制原理.............................................................8 4 程序设计..................................................................................................8 4.1 程序总体设计..................................................................................8 4.2 程序编写(见附页).....................................................................9 5 心得体会..................................................................................................9 附页............................................................................................................10
DSP原理及应用
基于DSP实现道路交通灯控制系统设计
摘要:DSP数字信号处理,是一门涉及多学科而又广泛应用于许多领域的新兴学科。随着计算机和信息技术的飞速发展,数字信号处理技术应运而生并得到迅速发展。数字信号处理是一种通过使用数学技巧执行转换或提取信息,来处理现实信号的方法。本次设计是基于dsp原理设计交通灯控制系统软硬件系统,利用发光二极管亮灭模拟交通信号,数码管倒计时时间,利用TMS320F2812 DSP片上定时器产生时钟计数,设计模拟实际生活中的十字路口交通灯。
关键字:DSP;TMS320F2812;发光二极管;交通灯;
Abstract: DSP digital signal processing, is a multidisciplinary and widely applied in many fields of the emerging discipline.Along with the computer and the rapid development of information technology, digital signal processing technology to emerge as the times require and develop rapidly.Digital signal processing is through the use of a mathematical skills to perform the conversion or extraction of information, to deal with real signal method.The design is based on the principle of DSP design of traffic light control system software and hardware system, using light-emitting diodes to eliminate simulated traffic signal countdown time, digital tube, the use of TMS320F2812 DSP on-chip timer generates a clock counting, designed to simulate the actual life of the crossroads traffic lights.Keyword: DSP;TMS320F2812;light emitting diode;traffic lights;1 引言
交通是经济、社会发展的基础性产业,是社会、经济活动中人流、物流、资金流和信息 流的主要流动方式。现代社会中,如果没有高效运转的交通运输体系,就不可能有经济的持续发展。然而,随着社会经济的发展,机动车辆迅速增加,人们在赚取由机动车辆所带来的巨额利润以及充分享受汽车带来的巨大便利的同时,越来越被交通拥堵、交通事故频发、环境污染加剧和燃油损耗上升等诸多问题所困扰。
随着交通的不断发展和汽车化进程的加快,交通拥挤加剧,交通事故频发,交通环境恶化,已经成为引人注目的城市问题之一。交通问题不仅在发展中国家,就在发达国家也是一个令人困扰的严重问题。众所周知,缓解交通拥挤的最直接和最有效办法是提高路网的通信能力。但无论哪个国家的大城市,不可能无限制地修建道路,不论是资金
DSP原理及应用
因素还是土地因素,都限制了道路的无节制增长。因此,无限制地修建道路难满足日益增长的交通需求。与此同时,通过限制车辆增加削减交通需求也受到客观因素的制约而无法取得满意的结果。事实上,由于交通系统是一个相当复杂的大系统,无论单独从车辆方面考虑还是从道路方面考虑,都很难从根本上解决问题。
道路交通系统是一个地区、一个城市的主要组成部份,这个系统的运行状况如何,直接反映了一个地区、一个城市的现代化管理水平。在这一系统中,道路不仅仅是易变化的部分,而其它组成部分则存在着较大的可变性和随机性。只有对这一系统的组成及其运行机理进行科学客观的分析研究,对能制定出科学有效的管理和控制对策,从而保障系统的有效运行。
2项目设计实现功能
2.1交通灯控制要求
交通灯分红黄绿三色,东、南、西、北各一组,用灯光信号实现对交通的控制:绿灯信号表示通行,黄灯表示警告,红灯禁止通行,灯光闪烁表示信号即将改变。计时显示:液晶屏幕上8×8 点阵显示0-9 计数。
正常交通控制信号顺序:正常交通灯信号自动变换: ⑴ 南北方向绿灯,东西红灯(20 秒)。⑵ 南北方向绿灯闪烁。⑶ 南北方向黄灯。
⑷ 南北方向红灯,东西方向黄灯。⑸ 东西方向绿灯(20 秒)。⑹ 东西方向绿灯闪烁。⑺ 东西方向黄灯。⑻ 返回⑴循环控制。
紧急情况处理:模仿紧急情况(重要车队通过、急救车通过等)发生时,交通警察手动控制
⑴ 当任意方向通行剩余时间多于10 秒,将时间改成10 秒。
DSP原理及应用
⑵ 正常变换到四面红灯(20 秒)。
⑶ 直接返回正常信号顺序的下一个通行信号(跳过闪烁绿灯、黄灯状态)。
2.2 液晶显示器控制
本次设计使用ICETEK-F2812-A板,ICETEK-F2812-A是一块以TMS320F2812DSP 为核心的DSP 扩展评估板,它通过扩展接口与实验箱的显示/控制模块连接,可以控制其各种外围设备。液晶显示模块的访问、控制是由2812DSP对扩展扩展接口的操作完成。
控制扩展口的寻址:命令控制扩展接口的地址为0x108001,数据控制扩展接口的地址为0x108003 和0x108004,辅助控制扩展接口的地址为0x108002。
可以观察到液晶显示从0到9的计数。灵活使用控制字,可以实现复杂多变的显示。当使用点阵图形显示时需要在 DSP 内存中建立图形存储缓冲;适当更新显示可取得动画效果。在实际生活中观察点阵显示的霓虹灯广告、交通指示牌、报站牌等领会这种控制的具体应用。项目实现方案
3.1项目设计整体思路
根据DSP的硬件中断、定时器、I/O访问原理。用定时器定时。用I/O口控制红绿黄灯的开关,用硬件中断模拟紧急情况发生(如:急救车,消防车)。有紧急情况发生,两向全红,以便让紧急车通过。紧急车通过后,交通的恢复中断前的状态。
DSP原理及应用
设计总流程图 中断服务流程
DSP原理及应用
3.2设计原理 3.2.1 CPU定时器原理
F2810/F2812芯片内部有3个32位CPU定时器(TIMER0/1/2),其中定时器1和定时器2预留给实时操作系统使用(如 DSPBIOS),只有CPU定时器0用户可以在应用程序中使用。定时器功能框图如下:
在F281x芯片中,向CPU申请中断的定时器中断信号(TINT0、TINT1及TINT2)连接方式如下图:
为保证定时器正常,需要进行一下操作:首先将计数值写入32位计数寄存器(TIMH:TIM)内,该计数值放在周期寄存器(PRDH:PRD)中;然后按SYSCLOCKOUT的频率对计数值进行减计数。当计数器的值计到0时,定时器会产生一个中断脉冲输出。
DSP原理及应用
3.2.2 DSP外设中断扩展模块
2812的CPU为了能够及时有效的处理好各个外设的中断请求,设计了一个专门处理外设中断的扩展模块(the Peripheral Interrupt Expansion block),叫做外设中断控制器PIE,它能够对各种中断请求源(例如来自于外设或者其他外部引脚的请求)做出判断以及相应的决策。PIE 可以支持96个不同的中断,这些中断分成了12个组,每个组有8个中断,而且每个组都被反馈到CPU内核的12 条中断线中的某一条上(INT1-INT12)。PIE 目前只使用了96 个终端中的45 个,其他的等待将来的功能扩展。
2812的中断是3级中断机制,分别是外设级,PIE级以及CPU级,对于某一个具体的外设中断请求,任意一级的不许可,CPU最终都不会执行该外设中断。
3.2.3 发光二极原理
显示/控制模块上的发光二极管是由连接在F2812DSP 扩展扩展接口上的寄存器EWR和SNR控制的。这两个寄存器均为6 位寄存器,其位定义见下表:
DSP原理及应用
两个寄存器的地址均映射到 F2812DSP 的扩展空间,地址为108007H,DSP 通过对扩展区域该地址的写操作来修改两个寄存器上各位的状态,当寄存器某位取‘1’值时,相应指示灯被点亮,取‘0’值则熄灭。当写入108007H 的数据(8 位有效值)的高两位为‘00’时,数据的低6 位将写入EWR 寄存器;当高两位的值为‘01’时,写入SNR 寄存器。
3.2.4 TMS320F28x DSP 的I/O TMS320F28x DSP 的I/O 空间大部分被保留用于外部扩展。在扩展时一般将带有控制能的寄存器或分离地址访问的存储单元的地址映射到I/O 空间,访问这部分的单元又称I/O 端口访问。例如:可将控制指示灯组的寄存器或锁存器映射到一个I/O 端口地址上;A/D、D/A 等专用芯片控制端和状态寄存器也常映射到I/O 端口上。总之,在I/O 空间中扩展的设备一般重点用于控制,而使用大片连续存储空间的存储器单元一般映射到数据空间。ICETEK-F2812-A 板将指示灯、DIP 开关、A/D 和D/A 的控制端等映射在I/O 空间。在程序中,访问I/O 端口的语句较为简单。
DSP原理及应用
3.2.5 液晶显示器控制原理
显示开关:0x3f 打开显示;0x3e 关闭显示;
设置显示起始行:0x0c0+起始行取值,其中起始行取值为0 至63; 设置操作页:0x0b8+页号,其中页号取值为0-7; 设置操作列:0x40+列号,其中列号为取值为0-63;
写显示数据:在使用命令控制字选择操作位置(页数、列数)之后,可以将待显示的数据写入液晶显示模块的缓存。将数据发送到相应数据控制扩展接口即可。液晶显示器与DSP 的连接:
数据信号的传送:由于液晶显示模块相对运行在8MHz 主频下的DSP 属于较为慢速设备,连接时需要考虑数据线上信号的等待问题;
电平转换:由于DSP 为3.3V 设备,而液晶显示模块属于5V 设备,所以在连接控制线、数据线时需要加电平隔离和转换设备。程序设计
4.1 程序总体设计① 根据设计要求,由于控制是由不同的各种状态按顺序发生的, 我们可以采用状态机制控制方法来解决此问题。这种方法是: 首先列举所有可能发生的状态;然后将这些状态编号, 按顺序产生这些状态;状态延续的时间用程序控制,对于突发情况, 可采用在正常顺序的控制中插入特殊控制序列的方式完成。
② 定时器的设定, VC5509A 定时器是由一个4 位的预定标值PSC 和一个16 位的减法计数的计数器TIM 组成。在实际工作中首先是每经过一个周期PSC 值减1, 一直减到0
DSP原理及应用
后TIM 开始减1, 直到减到0 后的第一个周期, 计数器会向CPU 发出中断请求。③ 突发事件设置, 在实际交通过程中会出现突发状况, 比如说有救护车或者110 紧急车要通过, 此时就可以通过小键盘进行突发状况模拟。通过按键进入到中断服务子程序, 相当于原来先要通过的车辆在突发状况来了以后就要先让紧急车辆通过。
4.2 程序编写(见附页)心得体会
随着信息技术的飞速发展,数字信号处理技术已逐渐发展成为一门主流技术,它在电子信息,通信,软件无线电,制动控制,仪表仪器,信息家电等高科技领域得到了越来越广泛的应用。数字信号处理器由于运算速度快,具有可编程特性和接口灵活的特点,使的它在许多电子产品的研制,开发与应用中,发挥着越来越重要的作用。采用DSP 芯片来实现数字信号处理系统更是当前的发展趋势。
通过做基于DSP 的交通灯的设计,进一步熟悉DSP 芯片及其开发环境CCS的功能。同时对当前交通控制的现状有了进一部的了解。为以后的学习打下了坚实的基础。随着科学技术的发展及各门学科的相互融合,DSP 将有更为广阔的应用前景。交通控制也会更智能,为人们的出行提供更多的便利。
DSP原理及应用
附页#include “scancode.h” #define SPSA0 *(unsigned int *)0x38 #define SPSD0 *(unsigned int *)0x39 #define REGISTERCLKMD(*(unsigned int *)0x58)#define TIM *(int *)0x24 #define PRD *(int *)0x25 #define TCR *(int *)0x26 #define IMR *(int *)0x0 #define IFR *(int *)0x
1#define PMST *(int *)0x1d
#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 #define statusNSRedEWYellow 3 #define statusNSRedEWGreen 4 #define statusNSRedEWFlash 5 #define statusHold 6
#define LCDDELAY 1 #define LCDCMDTURNON 0x3f #define LCDCMDTURNOFF 0x3e #define LCDCMDSTARTLINE 0xc0 #define LCDCMDPAGE 0xb8 #define LCDCMDVERADDRESS 0x40
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();void TurnOnLCD();void LCDCLS();
void Delay(unsigned int nDelay);
unsigned int uWork,nTimeCount;unsigned int
uLightStatusEW,uLightStatusSN;unsigned int bHold;unsigned char
ledbuf[8],ledx[8];unsigned char led[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 };
unsigned char ledkey[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,0x9
2,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(){ int
nWork1,nWork2,nWork3,nWork4,tKey;int
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
DSP原理及应用
(nTimeCount 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):(0x40); 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):(0x00); break; case statusNSGreenEWRed: 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); } } break; case statusNSRedEWGreen: 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; case statusHold: nWork1=nStatusHold/20; if(nWork1>0) { nWork2=20-nTimeCount/nWork1; if(nOldTimeCount!=nWork2) { nOldTimeCount=nWork2; SetLEDArray(nWork2); } } DSP原理及应用 break; } } else { if(bHold) { nSaveStatus=nNowStatus; nSaveTimeCount=nTimeCount; nNowStatus=statusHold; nTimeCount=0; if(nSaveStatus==statusNSFlashEWRed || nSaveStatus==statusNSYellowEWRed) { nSaveStatus=statusNSRedEWGreen; nSaveTimeCount=nStatusNSRedEWYellow; } else if(nSaveStatus==statusNSRedEWFlash || nSaveStatus==statusNSRedEWYellow) { nSaveStatus=statusNSGreenEWRed; nSaveTimeCount=0; } } nOldStatus=nNowStatus; switch(nNowStatus) { case statusNSGreenEWRed: uLightStatusEW=0x24;uLightStatusSN=0x49; SetLEDArray(20); 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; tKey=CTRCLKEY; if (nScanCode==SCANCODE_9) break;} EndICETEKCTR();exit(0);} // 定时器中断服务程序,进行时钟计数 void interrupt time(void){ nTimeCount++;nTimeCount%=nTotalTime;} // 设置发光二极管显示内容 void SetLEDArray(int nNumber){ int i,ShowNumber; ShowNumber=nNumber/2;if(ShowNumber>9)ShowNumber=0;CTRLCDCMDR=LCDCMDPAGE;// 设置操作页=0 Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);CTRLCDCMDR=LCDCMDVERADDRESS;// 起始列=0 Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);for(i=0;i<8;i++){ CTRLCDLCR=ledkey[ShowNumber][i]; Delay(LCDDELAY); CTRLCDCR=0; Delay(LCDDELAY);} } // 将缓存中点阵送发光二极管显示 void RefreshLEDArray(){ int i;for(i=0;i<8;i++){ CTRGR=ledx[i]; CTRLA=ledbuf[i];} } // 初始化DSP,设置运行速度=8MHz void InitDSP(){ REGISTERCLKMD=0;// 复位PLL REGISTERCLKMD=0x1007;// DSP原理及应用 速度设置=16MHz } // 设置定时器参数、允许中断 void InitTimer(){ unsigned int 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;// 清中断标志位 port3004=0; // 使能XINT2 asm(“ rsbx INTM”);// 开中断 } // 初始化ICETEK-CTR板上设备 void InitICETEKCTR(){ int k; CTRGR=0;// 初始化ICETEK-CTR CTRGR=0x80;CTRGR=0;CTRLR=0;// 关闭东西方向的交通灯 CTRLR=0x40;// 关闭南北方向的交通灯 CTRLR=0x0c1;// 开启发光二极管显示阵列 CTRLR=0xc8;//使能外部中断 for(k=0;k<8;k++){ ledbuf[k]=0x0ff;// 显示为空白 ledx[k]=(k<<4);// 生成显示列控制字 } k=CTRCLKEY;// 清除键盘 缓冲区 TurnOnLCD(); // 打开显示 LCDCLS(); // 清除显示内存 CTRLCDCMDR=LCDCMDSTARTLINE;// 设置显示起始行 CTRLCDCR=0;} void interrupt xint2(void)// XINT2中断服务程序 { bHold=1;} void EndICETEKCTR(){ int k;CTRLR=0;// 关闭东西方向的交通灯 CTRLR=0x40;// 关闭南北方向的交通灯 CTRLR=0x0c0;// 关闭发光二极管显示阵列 k=CTRCLKEY;// 清除键盘缓冲区 } void TurnOnLCD(){ CTRLCDCMDR=LCDCMDTURNON;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);CTRLCDCMDR=LCDCMDSTARTLINE;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);} void LCDCLS(){ int i,j;CTRLCDCMDR=LCDCMDSTARTLINE;Delay(LCDDELAY);CTRLCDCR=0;Delay(LCDDELAY);for(i=0;i<8;i++){ CTRLCDCMDR=LCDCMDPAGE+i; Delay(LCDDELAY); CTRLCDCR=0; Delay(LCDDELAY); CTRLCDCMDR=LCDCMDVERADDRE SS; Delay(LCDDELAY); CTRLCDCR=0; Delay(LCDDELAY); for(j=0;j<64;j++) { CTRLCDLCR=0; Delay(LCDDELAY); CTRLCDCR=0; Delay(LCDDELAY); } CTRLCDCMDR=LCDCMDPAGE+i; Delay(LCDDELAY); CTRLCDCR=0; Delay(LCDDELAY); CTRLCDCMDR=LCDCMDVERADDRESS; Delay(LCDDELAY); CTRLCDCR=0; Delay(LCDDELAY); for(j=0;j<64;j++) { CTRLCDRCR=0; Delay(LCDDELAY); CTRLCDCR=0; Delay(LCDDELAY); } } } void Delay(unsigned int nDelay){ int ii,jj,kk=0;for(ii=0;ii for (jj=0;jj<1024;jj++) { kk++; } } } 基于单片机的交通灯控制系统设计与实现 目的:本文以AT89S51 单片机为核心器件,设计了多功能交通灯控制系统。软件仿真和硬件实现的结果表明该系统具有红绿灯显示功能、时间倒计时显示功能、左转提示和紧急情况发生时手动控制等功能。 由于计算机技术、自动控制技术和人工智能技术不断发展,城市交通的智能控制有了良好的技术基础,各种交通方案实现的可能性大大提高。城市交通控制系统是用于城市交通数据监测、交通信号灯控制与交通疏导的计算机综合管理系统,它是现代城市交通监控指挥系统中最重要的组成部分。本文设计的交通灯管理系统在实现了现代交通灯系统的基本功能的基础上,增加了左转提示和紧急情况(重要车队通过、急救车通过等)发生时手动控制等功能。交通方案:东西、南北两干道交于一个十字路口,各干道有一组红、黄、绿三色的指示灯和一组红、绿两色的左转指示灯,指挥 车辆和行人安全通行。红灯亮禁止通行,绿灯亮允许通行。黄灯闪亮提示人们注意红、绿灯的状态即将切换,且黄灯闪亮时间为东西、南北两干道的公共停车时间.。当发生紧急情况发生时,所有信号灯转变为红色禁行信号。当深夜时, 信号灯呈黄灯缓行信号。2 电路设计 2.1 电源电路设计 由于单片机工作时需要的+ 5V 电压,所以在设计电源电路时,需要一个电子元件能提供+ 5V电压,本文采用7805 提供5V 的电压,即在7805 的1 脚和公共接地端(即2 脚)之间接入0.3μF 的电容,在公共接地端和三脚+ 5V电压输出端之间接入0.1μF 的电容。 2.2 复位电路设计 MCS51 提供了初始化的手段。有了它可以使程序从指定处开始执行,即从程序存储器中的0000H 地址单元开始执行程序。在MCS51循环复位。只有当RST 由高电平变低电平以后,MCS51 的时钟可以由两种方式产生,一种是内部方式,利用芯片内部的振荡电路;另外一种为外部方式。本文根据实际需要和简便,采用内部振荡方式.MCS51 虽然有内部振荡电路,但要形成时钟,必须外接元件所以实际构成的振荡时钟电路.外接晶体以及电容C1 和C2 构成并联谐振电路接在放大器的反馈回路中。对接电容的值虽然没有严格的要求,但电容的大小会影响振荡器频率的高低、振荡器的稳定性、起振的快速性和温度的稳定性。晶体频率可在1.2MHz~12MHz 之间任选,电容C1 和C2 的典型值在20pF~100pF 之间选择,考虑到本系统对于外接晶体的频率稳定性要求不高,所以采取比较廉价的陶瓷谐振器。由于本系统应用的机器周期为1μs ,所以晶振选择为12MHz ,根据调试电容选择30pF。 在硬件电路焊接时,晶体或陶瓷振荡器和电容应该尽可能地与单片机芯片靠近,以减少寄生电容,可以更好地保证振荡器稳定和可靠的工作。 2.4 数码时间显示电路 七段LED 数码管是有八个发光二极管构成,通过给其引脚不同的高低电平,从而显出0~9 的数字和小数点。本文的交通灯数字显示部分,通过将四个一位数码管并联通过P1口控制作为个位实时显示,四个数码管并联通过P3 口控制作为十位实时显示,但考虑到单片机的系统功耗问题以及焊接电路后的实际显示效果等, 本部分的电路中又引入一7805 进行单独供电。交通灯的时间倒计时显示部分是通过将数码管分别与单片机的P1 口和P3 口连接,通过单片机 内部已经烧录好的程序,对P1 口和P3 口进行电平输出控制,从而实现数码管的倒计时时间显示。 2.5 信号灯电路设计 本部分电路设计,应用单片机的P0 口对直行方向提示灯控制,P2 口对左转方向提示灯控制。其中P0.0 ,P0.1 ,P0.2 三个输出控制口,分别控制东西方向上的绿灯、黄灯、红灯。P0.3 , P0.4 , P0.5 三个输出控制口,分别控制南北方向上的绿灯、黄灯、红灯。P2.0 ,P2.1 ,两个输出控制口,分别控制东西道左转方向的绿灯和红灯.。P2.2 ,P2.3 两个输出控制口分别控制南北道左转方向的绿灯和红灯。3 软件设计 本设计使用keil 软件完成该系统的软件设计.通过新建源文件、建立工程文件、编译和连接,最后生成所需单片机烧录的HEX文件。依据硬件电路图和设计方案设计的本系统实现程序如下: ①东西红灯,南北绿灯,倒计时30s 部分程序: MOV P0 , # 0F3H;东西方向红灯,南北方 向绿灯 MOV P2 , # 09H;东西左转红灯,南北左转绿灯 MOV P1 , # 0C0H;倒计时时间个位显示0 MOV P3 , # 0B0H;倒计时时间十位显示3 ⋯⋯ ②黄灯闪烁,倒计时5s 部分程序: MOV P0 , # 0EDH;黄灯点亮 MOV P1 , # 92H;倒计时时间的个位显示5 MOV P3 , # 0C0H;倒计时时间的十位显示0 ⋯⋯ ③东西绿灯南北红灯,倒计时30s 部分程序: MOV P0 , # 0DEH;东西方向绿灯,南北方向红灯 MOV P2 , # 06H;东西左转绿灯,南北左转红灯 MOV P1 , # 0C0H;倒计时时间个位显示0 MOV P3 , # 0B0H;倒计时时间十位显示3 ⋯⋯ ④紧急状况控制程序 JB P2.7 ,L1 JMP L2 L1 : JMP ZHONGDUAN L2 : MOV P1 , # 0C0H MOV P3 , # 0B0H ⋯⋯ ZHONGDUAN: MOV P0 , # 0EDH 4 系统的硬件实现 通过对AT89S51 专用底座的焊接、时钟电路的焊接、复位电路的焊接、数码管和信号灯的焊接、电源电路的焊接,最后完成了本文设计的交通灯系统。 通电进行调试后证明该硬件系统实现了绿灯显示功能、时间倒计时显示功能、左转提示和紧急情况发生时手动控制等功能。5 结论 本设计利用AT89S51 单片机设计的城市交通灯控制系统,通过软件仿真和硬件实现证明了该系统在实现了交通灯控制系统基本功能的基础上还实现了车辆左转提示以及紧急事件手动控制等功能。 交通灯控制系统设计 摘要:本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。系统包括人行道、左转、右转、以及基本的交通灯的功能。系统除基本交通灯功能外,还具有倒计时、时间设置、紧急情况处理、分时段调整信号灯的点亮时间以及根据具体情况手动控制等功能。关键词:AT89S51,交通规则 一、方案比较、设计与论证 1 电源提供方案 为使模块稳定工作,须有可靠电源。我们考虑了两种电源方案 方案一:采用独立的稳压电源。此方案的优点是稳定可靠,且有各种成熟电路可供选用;缺点是各模块都采用独立电源,会使系统复杂,且可能影响电路电平。方案二:采用单片机控制模块提供电源。改方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。综上所述,我们选择第二种方案。2 显示界面方案 该系统要求完成倒计时、状态灯等功能。基于上述原因,我们考虑了三种方案: 方案一:完全采用数码管显示。这种方案只显示有限的符号和数码字苻,无法胜任题目要求。 方案二:完全采用点阵式LED 显示。这种方案实现复杂,且须完成大量的软件工作;但功能强大,可方便的显示各种英文字符,汉字,图形等。 方案三:采用数码管与点阵LED 相结合的方法因为设计既要求倒计时数字输出,又要求有状态灯输出等,为方便观看并考虑到现实情况,用数码管与LED灯分别显示时间与提示信息。这种方案既满足系统功能要求,又减少了系统实现的复杂度。权衡利弊,第三种方案可互补一二方案的优缺,我们决定采用方案三以实现系统的显示功能。3 输入方案: 题目要求系统能手动设灯亮时间、紧急情况处理,我们讨论了两种方案: 方案一:采用8155扩展I/O 口及键盘,显示等。该方案的优点是: 使用灵活可编程,并且有RAM,及计数器。若用该方案,可提供较多I/O 口,但操作起来稍显复杂。 方案二: 直接在IO口线上接上按键开关。因为设计时精简和优化了电路,所以剩余的口资源还比较多,我们使用四个按键,分别是K1、K2、K3、K4。由于该系统对于交通灯及数码管的控制,只用单片机本身的I/O 口就可实现,且本身的计数器及RAM已经够用,故选择方案二。 二、理论分析与计算 1.交通灯显示时序的理论分析与计算 对于一个交通路口来说,能在最短的时间内达到最大的车流量,就算是达到了最佳的性能,我们称在单位时间内多能达到的最大车流为车流量,用公式:车流量= 车流 / 时间 来表示。 先设定一些标号如图2-1 所示。 说明:此图为直方图,上边为北路口灯,右边为东路口灯,下边为南路口灯,左边为西 路口灯。 图2-2 所示为一种红绿灯规则的状态图,分别设定为S1、S2、S3、S4,交通灯以这四 的状态为一个周期,循环执行(见图2-3)。 请注意图2-1b和图2-1d,它们在一个时间段中四个方向都可以通车,这种状态能在 一定的时间内达到较大的车流量,效率特别高。 依据上述的车辆行驶的状态图,可以列出各个路口灯的逻辑表,由于相向的灯的状态图 是一样的,所以只需写出相邻路口的灯的逻辑表;根据图2-3 可以看出,相邻路口的灯它 们的状态在相位上相差180°。因此最终只需写出一组S1、S2、S3、S4的逻辑状态表。 如表2-1 所示。 表中的“×”代表是红灯亮(也代表逻辑上的0),“√”是代表绿灯亮(也代表逻辑上 的1),依上表,就可以向相应的端口送逻辑值。2.交通灯显示时间的理论分析与计算 东西和南北方向的放行时间的长短是依据路口的各个方向平时的车流量来设定,并且 S1、S2、S3、S4各个状态保持的时间之有严格的对应关系,其公式如下所示。T-S1+T-S2=T-S3 T-S2=T-S4 T-S1=T-S3 我们可以依据上述的标准来改变车辆的放行时间。按照一般的规则,一个十字路口可分 为主干道和次干道,主干道的放行时间大于次干道的放行时间,我们设定值时也应以此为参 考。 三、电路图及设计文件 1.灯控制电路设计 由于32个LED 来实现红绿灯状态,若直接接在单片机的口线,路口倒计时的显示就不 能实现,所以本次设计中采用一种新型的电路如图3-1 所示。 图中74LS04的作用是倒相和驱动,它输出的电流大约48mA,实际测试发现足以满足要 求,而且发光管也能达到足够的亮度。 观察图可以看出:两组发光管(一组红、一组绿)由于反相器的作用,其逻辑状态恰恰 相反。 图中和电阻串联的二极管的作用是为了分压,防止因上下两组发光管分压不同导致逻辑 的错误。 共四组和上述相同的电路分别代表东西南北四个方向的红绿灯,使用两片74LS04 作为 驱动。 2.倒计时显示电路设计 前面已经分析过相向的灯的状态和倒计时都是相同的,所以为了节省,采用两组四个数码管 作为倒计时的显示;同时为了节省口资源,采用串口显示的方式驱动数码管。见图3-2 所 示。 四、程序设计思路与流程图 1.主程序流程图 主程序中主要是一个死循环,不停的循环四个状态,如图4-1 所示。 2.按键子程序流程图 它包含倒计时调整和紧急状态两个状态。 主程序中放了一个按键的判断指令,当有按键按下的时候,程序就自动的跳转到按键子 程序处理。当检测到K2键按下的时候就自动返回到主程序。当出现紧急的情况的时候,按下K3或者K4 就切换到紧急状态,当紧急事件处理完毕 的时候,按下K2,就可以返回正常状态。 五、测试、数据及结果分析 1.状态灯显示测试 当电路连接完毕后,将写好的测试程序刷写到芯片内,K1 和K2分别给端口送高电平和 低电平,通电即可检测。2.数码管的测试 将串口的和电路板上的接口连接,将写好的测试程序刷写到芯片内,开电源即可测试。 3.整体电路测试 系统上电,刷写好程序即可开始测试,观测一个周期(共计S1~S4四个状态,默认140 秒)灯的显示状态是否正常,同时观察倒计的计数是否正常。 六、总结 由于使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。 但是在我们设计和调试的过程中,也发现了一些问题,譬如红灯和绿灯的切换还不够迅 速,红绿灯规则不效率还不是很高等等,这需要在实践中进一步完善。附录 系统总体电路图 1.满足南北向红绿灯亮,东西向红灯亮,占25秒——南北向黄灯亮,东西向红灯亮,占5秒——南北向红灯亮,东西向绿灯亮,占25秒——南北向红灯亮,东西向黄灯亮,占5秒。如此循环,周而复始。2.十字路口要有数字显示,提示行人把握时间:当某方向绿灯亮时,置显示器为24,然后以每秒减1计数方式工作,直到减为0,绿灯灭,黄灯亮。黄灯灭,红灯亮时,再次置显示器为29,并开始减计数,直到为0,十字路口红绿灯交换,完成一次工作循环。 3.可手动调整和自动调整,夜间为黄灯闪耀。下面是一个单片机交通灯程序 /* ****************************************************************************************** * * * Keil C 89S51 交通信号控制程序 * *(C)版权所有 Dai_Weis@hotmail.com * * * ****************************************************************************************** */ #include “reg51.h” #define UINT unsigned int #define ULONG unsigned long #define UCHAR unsigned char /* 信号灯变量 南北方向绿灯 sbit n_bike_g = P1^0;//自行车 sbit n_right_g = P1^1;//右转 sbit n_up_g = P1^2;//直行 sbit n_left_g = P1^3;//左转 调头 南北方向红灯 sbit n_bike_r = P1^4;//自行车 sbit n_right_r = P1^5;//右转 sbit n_up_r = P1^6;//直行 sbit n_left_r = P1^7;//左转 调头 南北方向黄灯 sbit n_bike_y = P3^0;//自行车 sbit n_right_y = P3^1;//右转 sbit n_up_y = P3^2;//直行 sbit n_left_y = P3^3;//左转 调头 东西方向绿灯 sbit e_bike_g = P2^0;//自行车 sbit e_right_g = P2^1;//右转 sbit e_up_g = P2^2;//直行 东西方向红灯 sbit e_bike_r = P2^4;//自行车 sbit e_right_r = P2^5;//右转 sbit e_up_r = P2^6;//直行 东西方向黄灯 sbit e_bike_y = P3^4;//自行车 sbit e_right_y = P3^5;//右转 sbit e_up_y = P3^6;//直行 */ //延时 void delay(UINT t, UINT s){ while(t){ UINT i; for(i = 0;i < s;i++){ } t--;} } //信号灯状态 void time_x(UCHAR P_P1, UCHAR P_P2, UCHAR P_P3){ P1 = P_P1;P2 = P_P2;P3 = P_P3;delay(150, 65535);} void time_s(UCHAR P_P1, UCHAR P_P2, UCHAR P_P3, UCHAR P_P11, UCHAR P_P22){ UINT i; for(i = 0;i < 3;i ++){ P1 = P_P1;P2 = P_P2;delay(5, 65535);P1 = P_P11;P2 = P_P22;delay(5, 65535);} P1 = P_P1;P2 = P_P2;P3 = P_P3;delay(10, 65535);} //主程序 void main(){ P1 = P2 = P3 = 0x0;while(1){ time_x(0xA5, 0x38, 0x0); time_s(0xA4, 0x38, 0x1, 0xA5, 0x38);time_x(0x96, 0x52, 0x0); time_s(0x92, 0x52, 0x4, 0x96, 0x52);time_x(0x5A, 0x52, 0x0); time_s(0x50, 0x50, 0x2A, 0x5A, 0x52);time_x(0xF0, 0x25, 0x0); time_s(0xF0, 0x24, 0x20, 0xF0, 0x25);time_x(0xD2, 0x16, 0x0); time_s(0xD0, 0x10, 0x62, 0xD2, 0x16);} } 给你一个定时控制的信号系统,我只做的简单的测试,至于延时我用的软件,你自己想办法。^_^ Dai_Weis 于 2005-5-4 13:43:23 重新给你说明 /* *********************************************************************************** * * * Keil C AT89S51 交通信号控制程序 * *(C)版权所有 Dai_Weis@hotmail.com * * * *********************************************************************************** 开发说明: 固定时间信号变换,南北设置调头、左传、直行、右转、自行车。 东西设置左传、直行、右转、自行车。 时序状态: 红 绿 红 绿 序号 左 前 右 自 左 前 右 自 前 右 自 前 右 自1 0 1 0 0 1 0 1 1 1 1 0 0 0 2 1 0 0 1 0 1 1 0 1 0 1 0 1 0 3 0 1 0 1 1 0 1 0 1 0 1 0 1 0 4 1 1 1 1 0 0 0 0 0 1 0 1 0 1 5 1 1 0 1 0 0 1 0 0 0 1 1 1 0 */ 另外修正个错误 while(1){ time_x(0xA5, 0x70, 0x0);time_s(0xA4, 0x70, 0x1, 0xA5, 0x70); 材料: 1、89S51 11.0592M 晶振 1K电阻、10UF电容 12个灯,红、黄、绿各四个,12个1K电阻 ,十字路口嘛。蜂鸣器一个。 按键一个,按键复位 采用AT89s51型号的单片机,由于交通十字路口的对称性,所以一个引脚可以同时控制两个灯,将发光二极管分别接到P1各个引脚,在其中加入一个时振荡当电路,来控制时间,在P3.0引脚接入蜂鸣器只黄灯亮的时候发出声响,这里我们让每次黄灯亮的时候发出六声响,通过C程序的控制就可以实现,每次循环是10秒。2、9cm*15cm万用板 1片 单片机及IC座 1套 12M晶振 1只 22P电容 2只 10uF电容 1只 10K电阻 1只 1K排阻 1只 两位一体数码管 2只 DC座 1只 自锁开关 1只 发光二极管红绿黄 各4只 按键 7只 USB电源线 1条 导线 若干 1、基于51系列单片机(型号:STC89C52、AT89C51/C52、AT89S51/S52,随机选择,如有特 殊要求请与店主讨论)设计实现。(以上几种单片机全部为51系列单片机,除了名字不一样外,功能及应用完全一样,互相 兼容) 2、两个两位一体数码管显示东西、南北方向时间。 3、四方向各有红绿黄三颗灯。 4、七个按键操作,分别是:禁止通行、东西通行、南北通行、时间加、时间减、切换方向、确认。 DSP课程设计报告--DSP交通灯的控制与实现 学 院:物 信 学 院 课 程 :DSP 技术及应用 班 级 :321100 姓 名 : 张 三 学 号 : *** 指导教师 : 李 四 目 录 1.课程设计目的 2.课程设计正文 2.1 课程设计要求 2.2F2812原理图 2.3F2812系统环境结构实图 2.4设计原理 2.5设计结果 2.6心得体会 3.参考文献 4.此次课程设计的程序 1.课程设计目的 这学期我们学习了《DSP》这一门课程,为了实现理论结合实践,锻炼我们的动手能力,我们针对这门课程进行的课程设计。通过这次的课程设计,更加深入的学习这门课程,掌握这门技术,加深对DSP控制器的原理的理解和掌握。利用DSP开发环境CCS C2000对源程序文件进行编译、链接、装载调试,以完成基本的DSP项目文件设计。 2.课程设计正文 2.1 课程设计要求 ⑴ 设计一个十字路口交通灯(带一个倒计时数码管),每个方向有三色(红、黄、绿)。 ⑵ 实现交通灯双向车道红绿灯切换功能、交通灯全亮功能、数码管全亮功能。⑶ 保证每次切换倒计时20秒,在此时熄灭绿灯。 2.2 F2812原理图 2.3 F2812系统调试环境结构实物 图2.3 F2812系统调试环境实物结构 2.4设计原理 1.交通灯控制要求 利用 ICETEK-EDU 实验箱提供的设备,设计模拟实际生活中十字路口交通灯控制的程序。 要求如下: -交通灯分红黄绿三色,东、南、西、北各一组,用灯光信号实现对交通的控制:绿灯信号 表示通行,黄灯表示警告,红灯禁止通行,灯光闪烁表示信号即将改变。 -计时显示:8×8 点阵显示两位计数,为倒计时,每秒改变计数显示。 -正常交通控制信号顺序:正常交通灯信号自动变换 (1)南北方向绿灯,东西红灯(20 秒)。 (2)南北方向绿灯闪烁。 (3)南北方向黄灯。 (4)南北方向红灯,东西方向黄灯。 (5)东西方向绿灯(20 秒)。 (6)东西方向绿灯闪烁。 (7)东西方向黄灯。 (8)返回(1)循环控制。 -紧急情况处理:模仿紧急情况(重要车队通过、急救车通过等)发生时,交通警察手动控制 (1)当任意方向通行剩余时间多于 10 秒,将时间改成 10 秒。 (2)正常变换到四面红灯(20 秒)。 (3)直接返回正常信号顺序的下一个通行信号(跳过闪烁绿灯、黄灯状态)。2.交通灯模拟 利用 ICETEK-CTR 上的一组发光二极管(共 12 只,分为东西南北四组、红黄绿三色)的亮灭实现交通信号的模拟。3.计时显示 利用 ICETEK-CTR 上的发光二极管显示阵列模拟显示。4.计时 使用 TMS320F2812DSP 片上定时器,定时产生时钟计数,再利用此计数对应具体时间。5.紧急情况 利用 ICETEK-CTR 上键盘产生外中断,中断正常信号顺序,模拟突发情况。6.程序设计 根据设计要求,由于控制是由不同的各种状态按顺序发生的,我们可以采用状态机制控制方法来解决此问题。这种方法是:首先列举所有可能发生的状态;然后将这些状态编号,按顺序产生这些状态;状态延续的时间用程序控制。对于突发情况,可采用在正常顺序的控制中插入特殊控制序列的方式完成。 2.5.设计结果 程序可以完成交通灯功能,顺序循环工作。在中断信号到来后,进入特殊过程:当前计时如果大于 10 改成 10,否则不变,等待状态切换;切换后进入四面禁行状态,计数 20 秒后返回断点后的通行(有两方向是绿灯)状态。设计结果部分截图 2.6心得体会 两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,和同学们相互探讨,相互学习。在此次的课程设计中,主要资料的查阅和对电路图的总体设计,对电路的设计包括绘制电路原理图。由于平时在对本课程的学习中,没有注重系统的设计,故在设计电路原理图的过程中也遇到了各种各样的问题。但是,这些问题在跟同组的同学讨论和向老师请教后也得到了解决。由此可以得出,我对本门课程的掌握还是很不好,动手的能力还是很欠缺的。在今后的学习过程中不仅要注意对理念知识的掌握,而且还要培养自己的对手操作能力。最后在老师的辛勤的指导下,终于迎刃而解,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。最后,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢! 3.参考文献 [1] 苏涛,蔺丽华,卢光跃.DSP实用技术.西安电子科技大学出版社.2002 [2] 赵红怡编.DSP技术与运用实例.2006.4.此次课程设计的程序 #include “DSP281x_Device.h” // DSP281x Headerfile Include File #include “DSP281x_Examples.h” // DSP281x Examples Include File void Delay(unsigned int nTime);void SetLEDArray1(int nNumber);// 修改显示内容 void RefreshLEDArray1(); // 刷新显示 interrupt void cpu_timer0_isr(void);interrupt void XINT2_isr(void);void EndICETEKCTR(); #define XINT2CR(*((unsigned int *)0x7071))#define XNMICR(*((unsigned int *)0x7077))#define T46uS 0x0d40 #define SCANCODE_0 0x70 #define SCANCODE_1 0x69 #define SCANCODE_2 0x72 #define SCANCODE_3 0x7A #define SCANCODE_4 0x6B #define SCANCODE_5 0x73 #define SCANCODE_6 0x74 #define SCANCODE_7 0x6C #define SCANCODE_8 0x75 #define SCANCODE_9 0x7D #define SCANCODE_Del 0x49 #define SCANCODE_Enter 0x5A #define SCANCODE_Plus 0x79 #define SCANCODE_Minus 0x7B #define SCANCODE_Mult 0x7C #define SCANCODE_Divid 0x4A #define SCANCODE_Num 0x77 #define CTRGR *(int *)0x108000 #define CTRLCDCMDR *(int *)0x108001 #define CTRKEY *(int *)0x108001 #define CTRLCDCR *(int *)0x108002 #define CTRCLKEY *(int *)0x108002 #define CTRLCDLCR *(int *)0x108003 #define CTRLCDRCR *(int *)0x108004 #define CTRLA *(int *)0x108005 #define CTRLR *(int *)0x108007 Uint16 var1 = 0;Uint16 var2 = 0;Uint16 var3 = 0;Uint16 test_count = 0;Uint16 Test_flag = 0;Uint16 Test_var = 0;Uint16 Test_status[32];#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 #define statusNSRedEWYellow 3 #define statusNSRedEWGreen 4 #define statusNSRedEWFlash 5 #define statusHold 6 int a=0;unsigned int uWork,nTimeCount,nTimeMS;unsigned int uLightStatusEW,uLightStatusSN;unsigned int bHold;unsigned char ledbuf[8],ledx[8];unsigned char led[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 }; 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; nNowStatus=0;nOldStatus=1;nOldTimeCount=0; //InitSysCtrl();//初始化cpu InitPll(0x0); DINT;//关中断 InitPieCtrl();//初始化pie寄存器 IER = 0x0000;//禁止所有的中断 IFR = 0x0000; InitPieVectTable();//初始化pie中断向量表 EALLOW;// This is needed to write to EALLOW protected registers PieVectTable.TINT0 = &cpu_timer0_isr;//指定中断服务子程序 PieVectTable.XINT2 = &XINT2_isr; EDIS; // This is needed to disable write to EALLOW protected registers //EALLOW;// This is needed to write to EALLOW protected registers //PieVectTable.XINT2 = &XINT2_isr; //EDIS; // This is needed to disable write to EALLOW protected registers CpuTimer0.RegsAddr = &CpuTimer0Regs;// Initialize timer period to maximum: CpuTimer0Regs.PRD.all = 0xffff;//CpuTimer0Regs.PRDH.all = 0xffff;// Initialize pre-scale counter to divide by 1(SYSCLKOUT): CpuTimer0Regs.TPR.all = 0xff09;CpuTimer0Regs.TIM.all = 0xffff;//CpuTimer0Regs.TIMH.all = 0xffff;CpuTimer0Regs.TPRH.all = 0;// Make sure timer is stopped: CpuTimer0Regs.TCR.bit.TSS = 1;CpuTimer0Regs.TCR.bit.SOFT = 1;CpuTimer0Regs.TCR.bit.FREE = 1;// Reload all counter register with period value: CpuTimer0Regs.TCR.bit.TRB = 1;CpuTimer0Regs.TCR.bit.TIE = 1;// Reset interrupt counters: CpuTimer0.InterruptCount = 0; // Enable TINT0 in the PIE: Group 1 interrupt 7 PieCtrlRegs.PIEIER1.bit.INTx5 = 1; PieCtrlRegs.PIEIER1.bit.INTx7 = 1; XINT2CR =0x1;/*打开管脚xint2外中断*/ //XNMICR=0x1;/*打开nmi中断*/ // Enable global Interrupts and higher priority real-time debug events: EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM 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);// 生成显示列控制字 } k=CTRLCDCR;// 清除键盘缓冲区 StartCpuTimer0();//启动定时器0 // 根据计时器计数切换状态 // 根据状态设置计数和交通灯状态 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 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):(0x40); 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):(0x00);break;case statusNSGreenEWRed: 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; SetLEDArray1(nWork2); } } break;case statusNSRedEWGreen: 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; SetLEDArray1(nWork2); } } break;case statusHold: nWork1=nStatusHold/20; if(nWork1>0) { nWork2=20-nTimeCount/nWork1; if(nOldTimeCount!=nWork2) { nOldTimeCount=nWork2; SetLEDArray1(nWork2); } } break; } } else { if(bHold) { nSaveStatus=nNowStatus; nSaveTimeCount=nTimeCount; nNowStatus=statusHold; nTimeCount=0; if(nSaveStatus==statusNSFlashEWRed nSaveStatus==statusNSYellowEWRed) { nSaveStatus=statusNSRedEWGreen; nSaveTimeCount=nStatusNSRedEWYellow; } else if(nSaveStatus==statusNSRedEWFlash nSaveStatus==statusNSRedEWYellow) { nSaveStatus=statusNSGreenEWRed; 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: uLightStatusEW=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;uLightStatusSN=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; } EndICETEKCTR();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){ nTimeMS=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;ii for(jj=0;jj<64;jj++) { kk++; } } } // 设置发光二极管显示内容 void SetLEDArray1(int nNumber){ 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];} } void RefreshLEDArray1(){ int i;for(i=0;i<8;i++){ CTRGR=ledx[i]; CTRLA=ledbuf[i];} } void EndICETEKCTR(){ int k;CTRLR=0; CTRLR=0x40;CTRLR=0x0c0;k=CTRLCDCR;} // 关闭东西方向的交通灯 // 关闭南北方向的交通灯 // 关闭发光二极管显示阵列// 清除键盘缓冲区 基于单片机的交通灯控制系统设计 摘要:十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的自动指挥系统。交通信号灯控制方式很多。本系统采用MSC-51系列单片机ATSC51和可编程并行I/O接口芯片8255A为中心器件来设计交通灯控制嚣,实现了能根据实际车流量通过8051芯片的P1口设置红、绿灯燃亮时间的功能;红绿灯循环点亮。倒计时剩5秒时黄灯闪烁警示;车辆闯红灯报警;绿灯时间可检测车流量并可通过双位数码管显示。本系统实用性强、操作简单、扩展功能强。 关键词:单片机;交通灯 单片机技术的发展对社会进步产生了巨大的影响。今天,单片机及其应用技术的发展速度、深度及其广度,在国防、科学研究、政治经济、教育文化等方面几乎无所不及。将之用于交通灯控制系统设计,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。 1、单片机涵义 一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入,输出设备(例如:串行口、并行输出口等)。在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就际=缸单片(单芯片)机,单片机即微控制器(Microniroller μC)有一些单片机中除了上述部份外,还集成了其它部份如AID,DIA,定时计数器,RTC,各种串行接口等。 2、MSC-51芯片简介 2.1 MSC-51结构 8051是MCS-51系列单片机的典型产品,8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时,计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。 2.2 8255芯片简介 8255可编程并行接口芯片有三个输入输出端口,即A口、B口和c口,对应于引脚PAT—PA0、PB7-PB0和PC7-PC0。其内部还有一个控制寄存器,即控制口。通常A口、B口作为输入输出的数据端口。c口作为控制或状态信息的端口,它在方式字的控制下,可以分成4位的端口,每个端口包含一个4位锁存器。它们分别与端口A/B配合使用,可以用作控制信号输出或作为状态信号输入。 8255有两种控制命令字;一个是方式选择控制字;另一个是c口按位置位/复位控制字。 2.3 74LS373简介 SN74LS373。SN74LS374常用的8d锁存器。常用作地址锁存和I/0输出,可以用74he373代换,74H373是高速CMOS器件,功能与74LS373相同,两者可以互换。74LS373内有8个相同的D型(三态同相)锁存器,由两个控制端(11脚c或EN;1脚OUT、CONT、OE)控制。当OE接地时,若G为高电平,741Ls373接收由PPU输出的地址信号;如果G为低电平,则将地址信号锁存。 3、系统硬件 3.1 交通管理的方案论证 东西、南北两干道交于一个十字路口,各干道有一组红、黄、绿三色的指示灯,指挥车辆和行人安全通行。红灯亮禁止通行。绿灯亮允许通行。黄灯亮提示人们注意红、绿灯的状态即将切换,且黄灯燃亮时间为东西、南北两千道的公共停车时问。设东西道比南北道的车流量。 3.2 系统硬件设计 选用设备8031单片机一片选用设备:8031弹片机一片,8255并行通用接口芯片一片,74LS07两片,MAX692‘看门狗’一片,共阴极的七段数码管两个双向晶闸管若干,7805三端稳压电源一个,红、黄、绿交通灯各两个。开关键盘、连线若干。 4、控制器的软件设计 4.1 每秒钟的设定 延时方法可以有两种:一种是利用NCS-51内部定时器才生溢出中断来确定1秒的时间,另一种是采用软延时的方法。 4.2 计数器硬件延时 4.2.1 初值计算 定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL中的。他是以加法记数的,并能从全1到全0时自动产生溢出中断请求。因此,我们可以把计数器记满为零所需的计数值设定为c和计数初值设定为TC。 4.2.2 1秒的方法 我们采用在主程序中设定一个初值为20的软件计数器和使TO定时5O毫秒,这样每当TO到50毫秒时cPu就响应它的溢出中断请求,进入他的中断服务子程序。在中断服务子程序中,cPu先使软件计数器减1,然后判断它是否为零。为零表示1秒已到可以返回到输出时间显示程序。 4.3 计数器软件延时 MCS-51的工作频率为2-12MHZ,我们选用的8031单片机的工作频率为6MHZ。机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12*(1/6M)=2us。我们可以知道具体每条指令的周期数,这样我们就可以通过指令的执行条数来确定1秒的时间。 4.4 时间及信号灯的显示 4.4.1 8051并行口的扩展 8051虽然有4个8位I/0端口,但真正能提供借用的只有Pl口。因为P2和P0口通常用于传送外部传送地址和数据,P3口也有它的第二功能。因此,8031通常需要扩展。由于我们用外部输入设定红绿灯倒计时初值、数码管的输出显示、红绿黄信号灯的显示都要用到一个I/0端口,显然8031的端口是不够,需要扩展。 扩展的方法有两种:(1)借用外部RAM地址来扩展I/0端口;(2)采用I/0接口新片来扩充。我们用8255并行接口信片来扩展I/0端口。 4.4.2 8255与8051的连接 用8051的PO口的pO.7连接8255的片选信号,我们用8031的地址采用全译码方式,当pO.7:0时片选有效,其他无效,pO.1用于选择8255端口。 5、结 论 本系统就是充分利用了8051和8255芯片的I/O引脚。系统统采用MSC-51系列单片机Intel8051和可编程并行I/0接口芯片8255A为中心器件来设计交通灯控制器,实现了能根据实际车流量通过8031芯片的Pl口设置红、绿灯燃亮时间的功能;红绿灯循环点亮,倒计时剩5秒时黄灯闪烁警示(交通灯信号通过PA口输出,显示时间直接通过8255的PC口输出至双位数码管);车辆闯红灯报警;绿灯时间可检测车流量并可通过双位数码管显示。 参考文献: [1]张毅刚,新编MCS-51单片机应用系统设计[M]哈尔滨:哈尔滨工业大学出版社,2006 [2]王义军,单片机原理及应用习题与实验指导书[M],北京:中国电力出版社,2006 [3]陈明荧8051单片机课程设计实训教材[M],北京:清华大学出版社。2004第二篇:基于单片机的交通灯控制系统设计与实现
第三篇:单片机:交通灯控制系统设计
第四篇:DSP 课程设计 交通灯的控制与实现
第五篇:基于单片机的交通灯控制系统设计