基于ARM嵌入式系统的交通灯方案设计书文档格式.docx
《基于ARM嵌入式系统的交通灯方案设计书文档格式.docx》由会员分享,可在线阅读,更多相关《基于ARM嵌入式系统的交通灯方案设计书文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
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.1为LPC2138芯片的原理图,64个引脚,采用3.3V电源供电,设计所需外接器件的网络名已经标出。
图4.1LPC2138芯片的原理图
4.3系统电源电路设计
本电源运用5V的直流电源(图4.2所示)。
通过DS2434芯片将5V电压转换为3.3V电压,为LPC2138芯片供电,LPC2138芯片所能承受的电压范围是3V~3.6V。
图4.2直流电源电路设计
4.4晶振与复位电路
系统的晶振电路如图4.3所示LPC2138芯片采用11.0592MHz的晶振作为振荡时钟源,通过对芯片的进行软件设计可以将晶体振荡器的频率分频为所需的频率;
系统的复位电路如图4.4所示,SP708S芯片的7号引脚连接到主控芯片的复位引脚(nRST)上,按下复位键S2时,系统将会复位到初始的状态。
图4.3系统的晶振电路图图4.4系统的复位电路图
4.5LED循环显示设计
由南向北和由北向南车道各用一组红、绿、黄三色的指示灯,指挥车辆通行。
绿灯是通行信号,面对绿灯的车辆可以直行,红灯是禁止通行信号,面对红灯的车辆必须在路口的停车线后停车。
黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以继续行进。
具体红绿灯时间分配时间如表4—1所示。
表4—1:
红绿灯时间分配时间如表
50s
5s
南北通道
绿灯亮
绿灯闪
黄灯闪
红灯亮
红灯闪
人行道
上表说明南北通道绿灯亮、绿灯闪黄灯闪时人行道都是红灯亮,只有车道
红灯亮(车辆完全停下来)时人行道绿灯才亮,这样保证了过马路的行人人身安全,避免了不必要的交通事故。
硬件电路连接图如图4.5所示
图4.5硬件电路连接图
交通灯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.6数码管外形图及阴阳两极连接示意图
如图4.6所示,数码管由8个发光段(第八段表示小数点)的不同组合,从而实现十六进制数的显示。
通过段选端可以控制数码管显示内容,位选端用于控制整个数码管是否工作:
对于共阴极数码管,位选端要接低电平,对于共阳极数码管,位选端接高电平。
数码管有两种显示方式:
动态显示和静态显示。
静态显示让数码管要点亮的数码管同时持续点亮;
动态显示则利用了人眼的视觉暂留原理,在一个时间内只点亮一个数码管。
本次设计采用2位一体的数码管,数码管的2条位选线连接ARM的通用I/O口;
数码管的8个段选端连接74HC595芯片的并行I/O输出接口,74HC595再与ARM的SPI0模式进行通信,接受ARM发送过来的数据。
数码管硬件电路连接图如图4.7所示。
图4.7数码管硬件电路连接图
4.7蜂鸣器设计
将蜂鸣器正极端接电源,负极端通过三极管接地,三极管基极通过电阻接到LPC2138芯片的P0.8引脚上。
具体硬件电路连接图如图4.8所示
图4.8蜂鸣器硬件电路连接图
5软件设计
5.1交通灯控制软件流程图
图5.1为ARM模拟交通灯控制程序流程图,主程序主要完成倒计时显示及控制蜂鸣器,中断服务程序主要控制那些灯亮以及亮的时间。
图5.1ARM模拟交通灯控制程序流程图
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点亮的先后顺序以及点亮的时间,分别编写相应的程序。
6程序运行测试结果
程序:
#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<
flag)&
60))
{
i=IO1SET。
if((i&
Y)==0)
IO1SET=Y。
else
{
IO1CLR=Y。
}//黄灯闪烁
h--。
//黄灯时间秒减1
if((60<
=flag)&
110))
{
if(flag==60)nb=51。
IO1CLR=LED2|LED5|LED7。
//车道绿马路红
IO1SET=~(LED2|LED5|LED7)。
nb--。
//绿灯时间减1
if((110<
115))//计数慢一个周期后重新开始计数
G)==0)
IO1SET=G。
IO1CLR=G。
}//绿灯闪烁
//绿灯时间减1
if(flag==115)
h=5。
IO1CLR=LED3|LED6|LED7。
IO1SET=~(LED3|LED6|LED7)。
if((115<
120))
IO1CLR=Y。
}//黄灯闪烁
//黄灯时间减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初始化
***********************************************************/
voidSPImasterInit()
{
unsignedintfdiv。
fdiv=8。
S0PCCR=fdiv&
0xfe。
S0PCR=(0<
3)|(1<
4)|(1<
5)|(0<
6)|(1<
7)。
*HC595_SendDat()向74HC595发送一字节数据
voidHC595_SendDat(unsignedintdat)
IO0CLR=HC595_CS。
S0PDR=dat。
while(0==(S0PSR&
0x80))。
//等待数据发送完毕
IO0SET=HC595_CS。
}
Delay_NS()长软件1ms延时
***************************************************************/
voidDelay_Ns(unsignedintdly)
while(dly--)//dlyms延时
{
unsignedintj。
for(j=1。
j<
=613。
j++)//1ms延时
。
}
*voidLED_Display()*功能:
LED数码管显示************************************************************/
voidLED_Display()
if((flag<
55)||((60<
115)))
dat=nb/10。
//显示十位数据
HC595_SendDat(tab[dat])。
IO1SET=SEL1。
//打开数码管位选1
Delay_Ns(20)。
IO1CLR=SEL1。
//关闭数码管1
dat=nb%10。
//显示个位数据
IO1SET=SEL2。
//打开位选2
IO1CLR=SEL2。
//关闭位选2
elseif(((55<
60))||((115<
120)))
dat=h。
//显示黄灯倒计时间
HC595_SendDat(tab[dat])。
}
/*************************************************************
*main():
初始化I/O及定时器,然后不断的查询定时器中断标志。
*当定时时间到达时,取反BEEPCON控制口。
**************************************************************/
intmain(void)
PINSEL0=0x00000000。
//设置所有引脚连接GPIO
PINSEL1=0x00000000。
//设置管脚连接GPIO
IO1DIR=0xffffffff。
//设置I/O为输出
IO0DIR=0x000003f0。
//设置SPI控制口,BEEP和nCS为输出
IO1SET=0xffffffff。
IO0SET=BEEP。
flag=0。
Time0Init()。
//初始化定时器0
SPImasterInit()。
//SPI初始化
IRQEnable()。
//使能中断
while
(1)
if(flag==120)
flag=0。
if((flag==55)||(flag==115))
IO0CLR=BEEP。
if((flag==57)||(flag==117))
IO0SET=BEEP。
return(0)。
程序运行测试流程:
根据事先画好的程序流程图,用C语言编写程序,并成功生成HEX文件,编译结果如图6.1所示。
图6.1编译结果示意图
车道红灯、马路绿灯,一位数码管50秒倒计时显示如下图6.2所示。
图6.2车道红灯、马路绿灯50秒倒计时显示
车道红灯、马路绿灯,一位数码管50秒倒计时显示,倒计时5秒,马路方向亮黄灯,以提示即将亮红灯,如下图6.3所示。
图6.3东西方向亮黄灯提示即将亮红灯显示
设计为系统上电即点亮车道红灯以及马路绿灯,倒计时50s红灯开始闪烁,同时马路红灯亮,红灯闪5s接着转为黄灯闪5s,然后车辆通道转为绿灯亮,50s后绿灯闪5s,黄灯再闪5s之后又回到红灯亮,人行道只在车辆通道红灯时才亮绿灯。
这主要靠在中断服务程序中对计数值flag的判断来对正在点亮的灯进行定时实现程序详细清单见附录。
7设计心得体会及总结
通过这次交通灯设计,本人在多方面都有所提高。
通过这次交通灯设计,培养综合运用所学知识、独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训练。
了解所选择的ARM芯片各个引脚功能,工作方式,计数/定时,I/O口,中断等的相关原理,并巩固学习嵌入式的相关内容知识。
通过软硬件设计实现利用ARM芯片完成交通灯控制功能。
首先查阅相关文献资料,熟悉所选ARM芯片。
第二步总体设计方案规划,设计车辆遇到红灯停绿灯行情况,红绿灯时间均为60s,切换时间为10s,最后5s为黄灯闪烁