目 录
1 需求分析 .......................................................................................................................... 1
1.1.1 背景....................................................................................................................... 1 1.1.2 意义....................................................................................................................... 1
2 概要设计 .......................................................................................................................... 2
2.1 设计思路................................................................................................................... 2 2.2 总体设计框图........................................................................................................... 2
3 详细设计 .......................................................................................................................... 3
3.1 交通灯控制软件流程图........................................................................................... 3 3.2 LPC2138芯片介绍及设计........................................................................................ 4 3.3 LED循环显示设计.................................................................................................... 4
4 编码 ................................................................................................................................... 5
4.1 部分功能的实现....................................................................................................... 5
5 调试分析 .......................................................................................................................... 7 6 测试结果及运行效果................................................................................................... 8 7 系统开发所用到的技术 .............................................................................................. 9 参考文献 ............................................................................................................................... 10 课程设计实践总结 ............................................................................................................ 11 附 录 ............................................................................................................................... 12
1 需求分析
1.1.1 背景
目前,大多交通路口的信号灯的控制都是固定的、局部的,不能随车流的变化而改变。这对缓解交通拥挤、减少交通事故、节约能耗、降低污染等带来不便。建立实时、准确、高效的交通路口车流自动统计分析及诱导控制系统,通过采集和分析动态信息,然后有针对性地控制诱导,也即建立智能交通系统,将各个交通路口车流信息及时送到控制中心,在控制中心使得整个城市得到实时监控。这对一个城市整体交通拥挤问题得到改善,交通事故能够降低有重大意义。
智能交通系统(简称ITS) ,是将先进的信息技术,计算机技术,数据通信技术,传感技术,电子控制技术,自动控制理论,运筹学,人工智能等有效地综合运用于交通运输,服务控制和车辆制造,加强了车辆,道路和使用者三者之间的联系,从而形成一种定时,准确,高效的综合运输系统。 1.1.2 意义
(1) 有利于缓解交通的阻塞问题。
因为我们在现实生活中经常碰到有很长的车队在等待着绿灯亮。有了这个智能交叉路口控制系统,就能够有效的解决这个问题,不仅提高了交通灯的利用效率,也及时的疏散车流,缓解了交通压力。
(2) 有利于减少交通事故
在我们的现实生活中经常听到报道,说某个人因抢红绿灯,而导致的车祸的情况也有很多的,追究其原因,那就是赶时间,因为有时交叉路口中的一个车道没有车但是该车道显示绿灯,而有车等待的却是绿灯,所以那些人就抢红绿灯,所以导致了车祸的发生。但是用了这个智能效能控制系统就是够避免这种情况,它能够让有车等待的车道显示绿灯让其通过。
[1]
1
2 概要设计
2.1 设计思路
利用LPC2131ARM芯片实现单路交通灯的控制:
A 实现红、绿、黄灯的循环控制。使用红、黄、绿三种不同颜色的LED灯实现此功能,由南往北方向红、黄、绿三个灯依次接在P1.18、P1.19、P1.20上,由北往南方向的红、黄、绿三个灯依次接在P1.21、P1.22、P1.23上,人行道用红、绿两个灯控制,依次接在P1.24、P1.25上,用软件控制灯的亮与灭来控制车辆和行人的通行。
B 用数码管显示倒计时。可以利用动态显示或静态显示,串行并出或者并行并出实现。
C 南北方向控制车辆的绿灯熄灭的同时,控制蜂鸣器响2秒来作为警报。蜂鸣器接P0.7引脚。
交通路口示意图如图3.1车辆遇到红灯停绿灯行的行走情况,红绿灯时间均为60s,切换时间为10s,最后5s为黄灯闪烁。 2.2 总体设计框图
用ARM7系列芯片LPC2138作为系统的主控芯片,控制交通灯的循环点亮并显示灯亮时间(采用倒计时显示),当定时时间到的时候控制蜂鸣器响来提醒人们注意红绿灯的状态。
交通等循环 LPC2131最小系统 蜂鸣器 图2-1 系统总设计框图
倒计时显示
2
3 详细设计
3.1 交通灯控制软件流程图
图3.1为ARM模拟交通灯控制程序流程图,主程序主要完成倒计时显示及控制蜂器,中断服务程序主要控制那些灯亮以及亮的时间。
开始 定时器0初始化 初始化中断,开中断 交通灯倒计 时显示 N flag==120 Y flag=0,清零计数变量 N flag==55or115 Y 控制蜂鸣器响2秒 系统保护现场 0<=Flag<车道红灯计50 数变量-1 N Y 50<=flag车道红灯闪<55 烁计数-1 N Y 55 3 图3.2 LPC2138芯片介绍及设计 LPC2138是基于一个支持实时仿真和嵌入式跟踪的32 位ARM7TDMI-STM CPU 的微控制器,并带有32kB 的嵌入的高速Flash 存储器。128 位宽度的存储器接口和独特的加速结构,使32 位代码能够在最大时钟速率下运行。对代码规模有严格控制的应用可使用16 位Thumb.模式将代码规模降低超过30%,而性能的损失却很小。较小的封装和极低的功耗使 LPC2131 可理想地用于小型系统中,具有以下一些特性: 1 小型LQFP64封装 2 8k的片内静态RAM 和32k的片内Flash 程序存储器。 3 片内Boot装载软件实现在系统/在应用中编程(ISP/SAP)单扇 4 区或整片擦除时间为400ms。256 字节行编程时间为1ms。 5 1个10位D/A转换器 6 两个32位定时器/计数器(带四路捕获和四路比较通道)、PWM 7 单元(6路输出)和看门狗 8 实时时钟具有独立的电源和时钟源,在节电模式下极大地降低了功耗 9 低功耗模式:空闲和掉电。 10 可通过个别使能/禁止外部功能和外围时钟分频来优化功耗。 3.3 LED循环显示设计 由南向北和由北向南车道各用一组红、绿、黄三色的指示灯,指挥车辆通行。绿灯是通行信号,面对绿灯的车辆可以直行,红灯是禁止通行信号,面对红灯的车辆必须在路口的停车线后停车。黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以继续行进。具体红绿灯时间分配时间如表3—1所示。 表3-1 红绿灯时间分配表 50s 5s 5s 南北通道 绿灯亮 绿灯闪 黄灯闪 人行道 红灯亮 红灯亮 红灯亮 50s 红灯亮 绿灯亮 5s 红灯闪 红灯亮 5s 黄灯闪 红灯亮 上表说明南北通道绿灯亮、绿灯闪黄灯闪时人行道都是红灯亮,只有车道 红灯亮(车辆完全停下来)时人行道绿灯才亮,这样保证了过马路的行人人身安全,避免了不必要的交通事故。交通灯LED的发光和熄灭的控制,是通过控制GPIO寄存器组来完成的,须先将引脚P1.18~P1.25通过引脚功能选择寄存器PINSEL1,设置为GPIO方式;再设置GPIO方向寄存器1(IO1DIR),对应的引脚设置为输出方向。要点亮LED1~LED8需要使用GPIO清零寄存器1(IO1CLR)的对应位设置为1,即在引脚P1.18~P1.25上加逻辑低电平,即可点亮这些灯。与之相反,要熄灭这些灯,则要用GPIO输出置位寄存器1(IO1SET)将对应的位置位即可。 4 4 编码 4.1 部分功能的实现 定时器0中断服务子程序,重装初值,计数增减 void __irq IRQ_Time0(void) { unsigned int i; if(flag<=50) { if(flag==0) nb=55; IO1CLR=LED1|LED4|LED8; //车道红马路绿 IO1SET=~(LED1|LED4|LED8); nb--; //南北红灯时间秒减1 } if((flag>50)&&(flag<55)) { i=IO1PIN; if((i&R)==0) IO1SET=R; else IO1CLR=R; //红灯每秒闪烁一次 nb--; //红灯时间减1 } if(flag==55) { IO1CLR=LED3|LED6|LED7; //车道黄马路红 IO1SET=~(LED3|LED6|LED7); h=5; } if((55 } //黄灯闪烁 h--; //黄灯时间秒减1 } 5 if((60<=flag)&&(flag<110)) { if(flag==60) nb=51; IO1CLR=LED2|LED5|LED7; //车道绿马路红 IO1SET=~(LED2|LED5|LED7); nb--; //绿灯时间减1 } if((110<=flag)&&(flag<115)) //计数慢一个周期后重新开始计数 { i=IO1SET; if((i&G)==0) IO1SET=G; else { IO1CLR=G; } //绿灯闪烁 nb--; //绿灯时间减1 } if(flag==115) { h=5; IO1CLR=LED3|LED6|LED7; //车道黄马路红 IO1SET=~(LED3|LED6|LED7); } if((115 } //黄灯闪烁 h--; //黄灯时间减1 } flag++; T0IR = 0x01; // 清除中断标志 VICVectAddr = 0x00; // 通知VIC中断处理结束 } 6 5 调试分析 在最初的程序编完之后,在软件上进行编译时没错,链接时,却出现第一句报错(DATA SEGMENT),顿时傻眼了,因为第一句肯定没错,问其他的同学,才知道其实是因为后面的出错而导致不能链接,有可能是有些分号和逗号不是用英文法输入的,全部用英文法替换之后,问题得到了解决。接着我在原程序中又添加了一些语句,利用masm进行编译时,报错:jump out of range。因为这种情况以前也没遇见过,所以有点不知所措,于是上网查找了一下,才知道:条件跳转指令缺省状况下是'short' ,一般情况下不做长远转,所以我在状态0和状态1的条件转移语句后又接了一个转移语句。结果没有报错了。 在整个程序编完没有报错之后,我在硬件实验室进行检测,连好线编译运行之后(没有报错),却发现交通灯只显示第一个状态,倒计时显示20也一直没有变化,重复了好几次一直如此,这让我有点困惑,于是不得不重新检查程序,因为想到显示状态和倒计时都不变,说明状态标记变量中的值没变,倒计时显示部分也有问题,看了好几遍之后,弄出了一点眉目:因为刚开始的状态转换标志变量我用的是DL,而在前面的倒计时显示程序中,会用到DX,这样就覆盖了作为标志变量DL中的值,不能按照我们所希望的进行跳转(每一次倒计时显示之后寄存器DX的值是一样的),于是我定义了变量FL来做状态转换标志。改了之后,交通灯功能实现了,但数码显示器还是不对,实在没办法,叫别人帮我看了一下,结果却发现我肯本就没有初始化8279.就这样,所有的问题才一一得到了解决。 7 6 测试结果及运行效果 1 东西方向的绿灯和南北方向的红灯同时点亮40秒钟; 2 40秒之后,东西方向的黄灯闪烁6秒钟(共闪烁3下),此时南北方向仍维持红灯点亮。 3 东西方向的黄灯闪烁6秒钟后,转为东西方向的红灯和南北方向的绿灯同时点亮20秒钟; 4 20秒钟后,转为南北方向的黄灯闪烁6秒钟,此时东西方向仍维持红灯点亮。 5 南北方向的黄灯闪烁6秒钟后,转东西方向的绿灯和南北方向的红灯同时点亮40秒。如此循环重复。 8 7 系统开发所用到的技术 Proteus是由英国Labcenter electronics公司开发的EDA工具软件。它从1989年出现到现在已经有十多年的历史,在全球广泛使用。Proteus安装以后,主要由两个程序组成:Ares和Isis。前者主要用于PCB自动或人工布线及其电路仿真,后者主要采用原理布图的方法绘制电路并进行相应的仿真。除了上述基本应用之外,Proteus革命性的功能在于它的电路仿真是互动的,针对微处理器的应用,可以直接在基于原理图的虚拟原型上编程,并实现软件代码级的调试,还可以直接实时动态地模拟按钮、键盘的输入,LED、液晶显示的输出,同时配合虚拟工具如示波器、逻辑分析仪等进行相应的测量和观测。 作为一款EDA仿真软件,Proteus与同类软件有着很多的相似之处。相比之下,其主要的特点有两个:一是对动态元件的实时仿真,它有着数量庞大的元件库。Labcenter公司与相关的第三方软件阵容共同开发了6000多个模拟和数字电路中常用的spice模型以及各种动态元件,基本元件如电阻、电容、各种二极管、三极管、MOS管、555定时器等;74系列TTL 元件和4000系列CMOS 元件;存储芯片包括各种常用的ROM, RAM,EEPROM, 还有常见I2C器件等。在丰富的库元件的支持下,所以它对“人机对话”的模拟增强了系统的真实性;二是虚拟工具箱的功能,Proteus的虚拟工具箱提供了电路测试中的常用工具和仪器,主要用于在实时仿真同时的电路参数观测,测量结果随仿真动态变化并显示,可以满足精度要求不是很高的测量分析,对于电路特性的定性分析可以起到事半功倍的效果,大大节约了测试时间和开发成本。 9 参考文献 [1] 曹东源,高爱坤.智能交通与城市交通缓堵.中国期刊网.2006.第23卷第4 期 [2] 沈文, 詹卫前. AVR单片机C语言开发入门指导.清华大学出版社.2004 [3] 黄超.Windows网络编程.人民邮电出版社.2003 [4] 李德水. 基于SOCKET编程接口的网络通信.中国期刊网.2005第20卷第2期 [5] 曹衍龙,刘海英.Visual C++网络通信编程实用案例精选.人民邮电出版社.2006 [6] 谢希仁.计算机网络.电子工业出版社.2005 10 课程设计实践总结 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,嵌入式系统已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握嵌入式的开发技术是十分重要的。 回顾起此次课程设计,我仍感慨颇多,在接近两个星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,通过这次课程设计之后,一定把以前所学过的知识重新温故。 11 附 录 #include \"config.h\" #define LED1 1<<18 //P1.18南北红灯 #define LED2 1<<19 //P1.19南北绿灯 #define LED3 1<<20 //P1.20南北黄灯 #define LED4 1<<21 //P1.21南北红灯 #define LED5 1<<22 //P1.22南北绿灯 #define LED6 1<<23 //P1.23南北黄灯 #define LED7 1<<24 //P1.24马路红灯 #define LED8 1<<25 //P1.25马路绿灯 #define Y 0x00900000 #define R 0x00240000 #define G 0x00480000 #define SEL1 1<<26 //数码管位选1 #define SEL2 1<<27 //数码管位选2 #define HC595_CS 0x00000200 //P0.9 #define BEEP 0x00000100 //P0.8为蜂鸣器控制 unsigned int dat,nb,h,flag; unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99, 0X92,0X82,0XF8,0X80,0X90}; /************************************************************ 定时器0中断服务子程序 重装初值,计数增减 ************************************************************/ void __irq IRQ_Time0(void) { unsigned int i; if(flag<=50) { if(flag==0) nb=55; IO1CLR=LED1|LED4|LED8; //车道红马路绿 IO1SET=~(LED1|LED4|LED8); nb--; //南北红灯时间秒减1 } if((flag>50)&&(flag<55)) { 12 i=IO1PIN; if((i&R)==0) IO1SET=R; else IO1CLR=R; //红灯每秒闪烁一次 nb--; //红灯时间减1 } if(flag==55) { IO1CLR=LED3|LED6|LED7; //车道黄马路红 IO1SET=~(LED3|LED6|LED7); h=5; } if((55 } //黄灯闪烁 h--; //黄灯时间秒减1 } if((60<=flag)&&(flag<110)) { if(flag==60) nb=51; IO1CLR=LED2|LED5|LED7; //车道绿马路红 IO1SET=~(LED2|LED5|LED7); nb--; //绿灯时间减1 } if((110<=flag)&&(flag<115)) //计数慢一个周期后重新开始计数 { i=IO1SET; if((i&G)==0) 13 IO1SET=G; else { IO1CLR=G; } //绿灯闪烁 nb--; //绿灯时间减1 } if(flag==115) { h=5; IO1CLR=LED3|LED6|LED7; //车道黄马路红 IO1SET=~(LED3|LED6|LED7); } if((115 IO1CLR=Y; } //黄灯闪烁 h--; //黄灯时间减1 } flag++; T0IR = 0x01; // 清除中断标志 VICVectAddr = 0x00; // 通知VIC中断处理结束 } /************************************************************ **Time0Init() 定时器0定时中断初始化 *************************************************************/ void Time0Init(void) { T0PR = 99; // 设置定时器0分频为100分频得 14 110592Hz T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC T0MR0 = 110592; // 比较值(1秒定时值) T0TCR = 0x03; // 启动并复位T0TC T0TCR = 0x01; VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断 VICVectCntl0 = 0x24; // 定时器0中断通道分配最高优先级 VICVectAddr0 = (uint32)IRQ_Time0; // 设置中断服务程序地址向量 VICIntEnable = 0x00000010; // 使能定时器0中断 } /********************************************************** * void SPImasterInit() SPI初始化 ***********************************************************/ void SPImasterInit() { unsigned int fdiv; fdiv=8; S0PCCR=fdiv&0xfe; S0PCR=(0<<3)|(1<<4)|(1<<5)|(0<<6)|(1<<7); } /************************************************************ * HC595_SendDat() 向74HC595发送一字节数据 ************************************************************/ void HC595_SendDat(unsigned int dat) { IO0CLR=HC595_CS; S0PDR=dat; while(0==(S0PSR&0x80)); //等待数据发送完毕 IO0SET=HC595_CS; } /************************************************************ Delay_NS() 长软件1ms延时 ***************************************************************/ void Delay_Ns(unsigned int dly) { 15 while(dly--) //dly ms延时 { unsigned int j; for(j=1;j<=613;j++) //1ms延时 ; } } /************************************************************ * void LED_Display()*功能: LED数码管显示 ************************************************************/ void LED_Display() { if((flag<55)||((60<=flag)&&(flag<115))) { dat=nb/10; //显示十位数据 HC595_SendDat(tab[dat]); IO1SET=SEL1; //打开数码管位选1 Delay_Ns(20); IO1CLR=SEL1; //关闭数码管1 dat=nb%10; //显示个位数据 HC595_SendDat(tab[dat]); IO1SET=SEL2; //打开位选2 Delay_Ns(20); IO1CLR=SEL2; //关闭位选2 } else if(((55<=flag)&&(flag<60))||((115<=flag)&&(flag<120))) { dat=h; //显示黄灯倒计时间 HC595_SendDat(tab[dat]); IO1SET=SEL2; Delay_Ns(20); IO1CLR=SEL2; } } /************************************************************* 16 * main():初始化I/O及定时器,然后不断的查询定时器中断标志。 * 当定时时间到达时,取反BEEPCON 控制口。 **************************************************************/ int main(void) { PINSEL0=0x00000000; //设置所有引脚连接GPIO PINSEL1 = 0x00000000; //设置管脚连接GPIO IO1DIR = 0xffffffff; IO0DIR=0x000003f0; IO1SET=0xffffffff; IO0SET=BEEP; flag=0; Time0Init(); SPImasterInit(); IRQEnable(); while(1) { if(flag==120) flag=0; if((flag==55)||(flag==115)) IO0CLR=BEEP; if((flag==57)||(flag==117)) IO0SET=BEEP; } return(0); } //设置I/O为输出 //设置SPI控制口,BEEP和nCS为输出 //初始化定时器0 //SPI初始化 // 使能中断 17 因篇幅问题不能全部显示,请点此查看更多更全内容