基于ARM嵌入式系统的交通灯设计.docx
《基于ARM嵌入式系统的交通灯设计.docx》由会员分享,可在线阅读,更多相关《基于ARM嵌入式系统的交通灯设计.docx(23页珍藏版)》请在冰点文库上搜索。
基于ARM嵌入式系统的交通灯设计
嵌入式系统
专业:
电子信息科学与技术
学号:
姓名:
学院:
基于ARM嵌入式系统的交通灯设计
摘要:
随着移动设备的流行和发展,嵌入式系统已经成为一个热点。
它并不是最近出现的新技术,只是随着微电子技术和计算机技术的发展,微控制芯片功能越来越大,而嵌入微控制芯片的设备和系统越来越多,从而使得这种技术越来越引人注目。
它对软硬件的体积大小、成本、功耗和可靠性都提出了严格的要求。
嵌入式系统的功能越来越强大,实现也越来越复杂,随之出现的就是可靠性大大降低。
最近的一种趋势是一个功能强大的嵌入式系统通常需要一种操作系统来给予支持,这种操作系统是已经成熟并且稳定的,可以是嵌入式的Linux,WINCE等等。
本文所要研究的就是基于ARM嵌入式系统的交通灯系统的设计与实现。
本设计采用了飞利浦的32位ARM微处理器LPC2138作为核心处理器
【关键词】嵌入式系统ARMLPC2138交通灯
UndertheARMembeddedsystem’sthesystemoftrafficlights
Abstract:
Withtheprevalenceofmobiledevicesanddevelopmentofembeddedsystemshasbecomeahotspot.Itisnotarecentemergenceofnewtechnology,justasmicro-electronicstechnologyandthedevelopmentofcomputertechnology,micro-chipcontrolfunctionsmoreandmore,andcontrolofmicro-chipsembeddedintheequipmentandsystemsmoreandmore,makingthetechnologymoreReplyPeopleattention.Hardwareandsoftwareofitssize,cost,powerconsumptionandreliabilityhavemadestringentrequirements.Embeddedsystemsfunctionmorepowerful,andmoreandmorecomplicated,thenthereisthereliabilitygreatlyreduced.Arecenttrendisapowerfulembeddedsystemsusuallyneedaoperatingsystemtosupporttheoperatingsystemisalreadymatureandstable,canbeembeddedLinux,WINCE,andsoon.ThispaperistostudyundertheARMembeddedsystem’sthesystemoftrafficlightsdesignandimplementation.ThisdesignusesPhilips's32astheLPC2138ARMmicroprocessorcoreprocessors.
【Keywords】EmbeddedSystemsARMLPC2138trafficlights
一设计的目的与意义
通过设计,培养自己综合运用所学知识、独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训练,加深对ARM芯片的了解;熟悉ARM芯片各个引脚的功能,工作方式,计数/定时,I/O口,中断等相关原理,巩固学习嵌入式的相关内容知识。
二设计的内容
利用ARM芯片模拟实现交通灯控制。
自行选择所需ARM芯片,查阅相关文献资料,熟悉所选ARM芯片,了解所选ARM芯片各个引脚功能,工作方式,计数/定时,I/O口,中断等相关原理,通过软硬件设计实现利用ARM芯片完成交通灯的模拟控制。
三设计方案
3.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为黄灯闪烁。
图3.1
3.2总体设计框图
用ARM7系列芯片LPC2138作为系统的主控芯片,控制交通灯的循环点亮并显示灯亮时间(采用倒计时显示),当定时时间到的时候控制蜂鸣器响来提醒人们注意红绿灯的状态。
图3.2
四硬件设计
根据设计任务要求,自行选择电子元件,画出电气原理图,并调试。
一个完整的系统除了主控芯片以外,还需配上电源系统、时钟电路、复位电路等。
独立的芯片是不能工作的。
4.1LPC2138芯片介绍及设计
LPC2138是基于一个支持实时仿真和嵌入式跟踪的32位ARM7TDMI-STMCPU的微控制器,并带有32kB的嵌入的高速Flash存储器。
128位宽度的存储器接口和独特的加速结构,使32位代码能够在最大时钟速率下运行。
对代码规模有严格控制的应用可使用16位Thumb.模式将代码规模降低超过30%,而性能的损失却很小。
较小的封装和极低的功耗使LPC2131可理想地用于小型系统中,具有以下一些特性:
●小型LQFP64封装
●8k的片内静态RAM和32k的片内Flash程序存储器。
●片内Boot装载软件实现在系统/在应用中编程(ISP/SAP)单扇
●区或整片擦除时间为400ms。
256字节行编程时间为1ms。
●1个10位D/A转换器
●两个32位定时器/计数器(带四路捕获和四路比较通道)、PWM
●单元(6路输出)和看门狗
●实时时钟具有独立的电源和时钟源,在节电模式下极大地降低了功耗
●多个串行接口,包括2个16C550工业标准UART、2个高速I2C接口
●(400kbit/s)、SPITM和具有缓冲作用和数据长度可变功能的SSP。
●多达47个5V的通用I/O口;向量中断控制器,可配置优先级和向量
●地址
●9个边沿或电平触发的外部中断引脚
●片内晶振频率范围:
1~30MHz。
●通过片内PLL可实现最大为60MHz的CPU操作频率,PLL的稳定时间
●为100us
●低功耗模式:
空闲和掉电。
●可通过个别使能/禁止外部功能和外围时钟分频来优化功耗。
●通过外部中断将处理器从掉电模式中唤醒。
●单电源,具有上电复位(POR)和掉电检测(BOD)电路:
●CPU操作电压范围:
3.0V~3.6V(3.3V±10﹪),I/O口可承受5V
●的电压。
4.2LPC2138芯片最小系统硬件设计
图4.5为LPC2138芯片的原理图,64个引脚,采用3.3V电源供电,设计所需外接器件的网络名已经标出。
图4.1
4.3系统电源电路设计
本电源运用5V的直流电源(图3.5所示)。
通过DS2434芯片将5V电压转换为3.3V电压,为LPC2138芯片供电,LPC2138芯片所能承受的电压范围是3V~3.6V(图4.2所示)。
通过滤波电路(图4.3所示)可以很好地滤去转换后电压中的毛刺。
图4.2图4.3
4.4晶振与复位电路
系统的晶振电路如图4.4所示LPC2138芯片采用11.0592MHz的晶振作为振荡时钟源,通过对芯片的进行软件设计可以将晶体振荡器的频率分频为所需的频率;系统的复位电路如图4.5所示,SP708S芯片的7号引脚连接到主控芯片的复位引脚(nRST)上,按下复位键S2时,系统将会复位到初始的状态。
图4.4图4.5
4.5LED循环显示设计
由南向北和由北向南车道各用一组红、绿、黄三色的指示灯,指挥车辆通行。
绿灯是通行信号,面对绿灯的车辆可以直行,红灯是禁止通行信号,面对红灯的车辆必须在路口的停车线后停车。
黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以继续行进。
具体红绿灯时间分配时间如表4—1所示。
表4—1:
50s
5s
5s
50s
5s
5s
南北通道
绿灯亮
绿灯闪
黄灯闪
红灯亮
红灯闪
黄灯闪
人行道
红灯亮
红灯亮
红灯亮
绿灯亮
红灯亮
红灯亮
上表说明南北通道绿灯亮、绿灯闪黄灯闪时人行道都是红灯亮,只有车道
红灯亮(车辆完全停下来)时人行道绿灯才亮,这样保证了过马路的行人人身安全,避免了不必要的交通事故。
硬件电路连接图如图4.6所示
图4.6
交通灯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.6数码管倒计时显示硬件设计
数码管是一种很普遍的显示器件,数码管的主要部分是七段发光二极管;数码管分为共阴极和共阳极两种,为了保护各段LED,需外加限流电阻。
有的产品还附加有一个小数点,因此有人也称之为八段式发光二极管。
图4.7
如图4.7所示,数码管由8个发光段(第八段表示小数点)的不同组合,从而实现十六进制数的显示。
通过段选端可以控制数码管显示内容,位选端用于控制整个数码管是否工作:
对于共阴极数码管,位选端要接低电平,对于共阳极数码管,位选端接高电平。
数码管有两种显示方式:
动态显示和静态显示。
静态显示让数码管要点亮的数码管同时持续点亮;动态显示则利用了人眼的视觉暂留原理,在一个时间内只点亮一个数码管。
本次设计采用2位一体的数码管,数码管的2条位选线连接ARM的通用I/O口;数码管的8个段选端连接74HC595芯片的并行I/O输出接口,74HC595再与ARM的SPI0模式进行通信,接受ARM发送过来的数据。
数码管硬件电路连接图如图4.8所示。
图4.8
4.7蜂鸣器设计
将蜂鸣器正极端接电源,负极端通过三极管接地,三极管基极通过电阻接到LPC2138芯片的P0.8引脚上。
具体硬件电路连接图如图4.9所示
图4.9
五软件设计
5.1交通灯控制软件流程图
图5.1为ARM模拟交通灯控制程序流程图,主程序主要完成倒计时显示及控制蜂鸣器,中断服务程序主要控制那些灯亮以及亮的时间。
图5.1
5.2ARM交通灯模拟控制程序设计
定时器控制原理:
定时器对外设时钟Fpclk周期进行计数,根据4个匹配寄存器的设定可设置为匹配(即达到匹配寄存器指定的定时值)时产生中断或执行其他操作。
ARMLPC2138有两个32位定时器,定时器0和定时器1,本次设计仅适用定时器0,选定定时器0中断为向量IRQ。
设置P0、P1口为GPIO输出状态,初始化定时器,选定定时器0中断为向量IRQ,对VICIntEnable、VICIntSelect、VICvectCntl进行设置,初始化SPI接口,根据设计要求编写软件程序。
根据事先画好的程序流程图,用C语言编写程序。
在主程序中对需要用到的I/O口进行定义,并设置相应的I/O口,比如要求P1.18~P1.25引脚为GPIO功能,则通过对引脚功能选择寄存器PINSEL1将对应的引脚设置为GPIO方式并设置GPIO方向,在GPIO方向寄存器IO1DIR里设置,之后对定时器0进行初始化,并开相应的中断。
然后进入大循环进行倒计时显示、控制蜂鸣器的蜂鸣与否并判断flag是否加到设定值,对flag加到设定值后进行清零,让flag重新计数。
中断服务程序的设计,每隔一秒钟定时器中断一次,每中断一次flag加1根据LED点亮的先后顺序以及点亮的时间,分别编写相应的程序。
设计为系统上电即点亮车道红灯以及马路绿灯,倒计时50s红灯开始闪烁,同时马路红灯亮,红灯闪5s接着转为黄灯闪5s,然后车辆通道转为绿灯亮,50s后绿灯闪5s,黄灯再闪5s之后又回到红灯亮,人行道只在车辆通道红灯时才亮绿灯。
这主要靠在中断服务程序中对计数值flag的判断来对正在点亮的灯进行定时实现程序详细清单见附录1
六设计心得体会及总结
一周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。
在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。
学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础.
通过这次交通灯设计,本人在多方面都有所提高。
通过这次交通灯设计,培养综合运用所学知识、独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训练。
了解所选择的ARM芯片各个引脚功能,工作方式,计数/定时,I/O口,中断等的相关原理,并巩固学习嵌入式的相关内容知识。
通过软硬件设计实现利用ARM芯片完成交通灯控制功能。
首先查阅相关文献资料,熟悉所选ARM芯片。
第二步总体设计方案规划,设计车辆遇到红灯停绿灯行情况,红绿灯时间均为60s,切换时间为10s,最后5s为黄灯闪烁。
接下来系统硬件设计,熟悉IO接口,定时器计数器工作原理。
最后系统软件设计,包括交通信号灯的工作流程软件实现,用C语言编程。
提高了计算能力,绘图能力,熟悉了规范和标准,同时各科相关的课程都有了全面的复习,独立思考的能力也有了提高。
在这次设计过程中,体现出自己单独设计模具的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。
在此感谢我们的徐老师.,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次模具设计的每个实验细节和每个数据,都离不开老师您的细心指导。
而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。
同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。
由于本人的设计能力有限,在设计过程中难免出现错误,恳请老师们多多指教,我十分乐意接受你们的批评与指正,本人将万分感谢。
七参考文献
【1】.周立功主编;ARM嵌入式系统基础教程[M](第2版);北京:
北京航空航天大学出版社;2008.
【2】.张崙编著;32位嵌入式系统硬件设计与调试[M];北京:
机械工业出版社;2005.
【3】.马洪连,等编著;嵌入式系统设计教程[M];北京:
电子工业出版社;2006.
【4】.王田苗主编;嵌入式系统设计与实例开发[M];北京:
清华大学出版社;2003.
【5】.符意德编著;嵌入式系统设计原理及应用[M];北京:
清华大学出版社;2004.
【6】.沈文斌主编;嵌入式硬件系统设计与开发实例详解[M];北京:
电子工业出版社;2005.
【7】.江思敏,陈明编著;Protel电路设计教程[M](第2版);北京:
清华大学出版社;2006.
【8】.罗蕾主编;嵌入式实时操作系统及应用开发[M];北京:
北京航空航天大学出版社;2005.
【9】.PHILIPS公司;LPC2114/2124/2138/2212/2214UserManual;2004.
【10】.谭浩强编著;C语言程序设计[M](第3版);北京:
清华大学出版社;2005.
【11】田泽.嵌入式系统开发与应用[M];.北京:
北京航空航天大学出版社,2005.
【12】马忠梅,英惠.ARM嵌入式处理器结构与应用基础(第2版)[M].;北京:
北京航空航天大学出版社,2007.
【13】严蔚敏,吴伟民.数据结构:
C语言版[M].北京:
清华大学出版社,1996.
【14】王宇行.ARM程序分析与设计[M].北京:
北京航空航天大学出版社,2008.
【15】胥静.嵌入式系统设计与开发实例详解:
基于ARM的应用[M].北京:
北京航空航天大学出版社,2005.
附录1:
#include"config.h"
#defineLED11<<18//P1.18南北红灯
#defineLED21<<19//P1.19南北绿灯
#defineLED31<<20//P1.20南北黄灯
#defineLED41<<21//P1.21南北红灯
#defineLED51<<22//P1.22南北绿灯
#defineLED61<<23//P1.23南北黄灯
#defineLED71<<24//P1.24马路红灯
#defineLED81<<25//P1.25马路绿灯
#defineY0x00900000
#defineR0x00240000
#defineG0x00480000
#defineSEL11<<26//数码管位选1
#defineSEL21<<27//数码管位选2
#defineHC595_CS0x00000200//P0.9
#defineBEEP0x00000100//P0.8为蜂鸣器控制
unsignedintdat,nb,h,flag;
unsignedchartab[]={0XC0,0XF9,0XA4,0XB0,0X99,
0X92,0X82,0XF8,0X80,0X90};
/************************************************************
定时器0中断服务子程序重装初值,计数增减
************************************************************/
void__irqIRQ_Time0(void)
{
unsignedinti;
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{
i=IO1SET;
if((i&Y)==0)
IO1SET=Y;
else
{
IO1CLR=Y;
}//黄灯闪烁
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)
IO1SET=G;
else
{
IO1CLR=G;
}//绿灯闪烁
nb--;//绿灯时间减1
}
if(flag==115)
{
h=5;
IO1CLR=LED3|LED6|LED7;//车道黄马路红
IO1SET=~(LED3|LED6|LED7);
}
if((115{
i=IO1SET;
if((i&Y)==0)
IO1SET=Y;
else
{
IO1CLR=Y;
}//黄灯闪烁
h--;//黄灯时间减1
}
flag++;
T0IR=0x01;//清除中断标志
VICVectAddr=0x00;//通知VIC中断处理结束
}
/************************************************************
**Time0Init()定时器0定时中断初始化
/************************************************************
voidTime0Init(void)
{
T0PR=99;//设置定时器0分频为100分频得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中断
}
/**********************************************************
*voidSPImasterInit()SPI初始化
*********************************************