模拟交通灯控制器课程设计.docx
《模拟交通灯控制器课程设计.docx》由会员分享,可在线阅读,更多相关《模拟交通灯控制器课程设计.docx(25页珍藏版)》请在冰豆网上搜索。
模拟交通灯控制器课程设计
.
《嵌入式系统原理与应用》综合设计
交通信号灯控制器设计
系部:
电子与信息工程系
专业班级:
姓名:
学号:
小组成员:
指导教师:
时间:
2011.5.30~2011.6.24
完成日期2011年6月
1.绪论..............................................................2
2.课程设计要求及实验设备与器材......................................2
2.1课程设计题目...............................................2
2.2课程设计目的...............................................2
2.3设计要求...................................................3
2.4工作流程...................................................3
2.5实验设备与器材.............................................3
3.硬件设计..........................................................4
3.1设计系统介绍及原理框图.....................................4
3.2电源供电系统...............................................4
3.3ARM开发板..................................................5
3.4LED显示系统...............................................5
3.5键盘系统...................................................7
3.6原理电路图.................................................9
4.软件设计方案......................................................5
4.1程序流程图.................................................5
4.2方案论证...................................................7
4.3调试过程...................................................7
4.4运行结果...................................................7
4.4.1结果分析..............................................8
4.4.2体会与收获............................................8
参考文献...........................................................10
特别致谢...........................................................10
附录...............................................................15
1.绪论
嵌入式计算机系统的出现,是现代计算机发展历史山的里程碑。
嵌入式系统诞生于微型计算机时代,与通用计算机的发展道路完全不同,形成了独立的单芯片的技术发展道路。
由于嵌入式系统的诞生,现代计算机领域出现了通用计算机与嵌入式计算机两大分支。
不可兼顾的技术发展道路,形成了两大分支的独立发展:
通用计算机按照高速、海量的技术发展;嵌入式计算机系统则为满足对象系统按照嵌入式智能化控制要求发展。
由于独立的分工发展,20世纪末,现代计算机的两大分支都得到了迅猛的发展。
2.课程设计要求及实验设备与器材
2.1课程设计题目
模拟交通灯控制器设计
2.2课程设计目的
通过本次综合设计,运用已学的课程知识,根据题目要求进行软硬件系统的设计和调试,对《嵌入式系统原理与应用》课程中涉及的芯片结构、控制原理、硬件和编程等方面有一定的感性认识和实践操作能力,从而加深对本课程知识点的理解,使学生应用知识能力、设计能力、调试能力以及报告撰写能力等方面有显著提高。
2.3设计要求
利用实验系统的资源来设计一个“模拟交通灯控制器”。
控制面板包括:
8位数码显示器、2组交通灯(每组交通灯包括红、黄和绿3个灯)、十个数字按键键盘、电源按键、电源指示灯和一个运行键。
具体设计要求如下:
1.设计一交通灯控制系统,其结构如图1.1所示,工作方式满足上述要求。
2.主干道和次干道的通行时间及黄灯点亮的时间可以手动设置。
3.在没有手动设置通行时间时,系统自动按表1.1的模式进行工作。
十字交叉路口的交通灯控制系统的结构图1.1所示
往南和往北的信号一致,即红灯(绿灯或黄灯)同时亮或同时熄灭。
用两个数码管来显示被点亮的指示灯还将点亮多久。
往东和往西的方向的信号一致。
其工作方式与南北方向一样。
也采用两个数码管来倒计时,当南北方向为绿灯和黄灯时,东西向的红灯点亮禁止通行,而东西方向为绿灯和黄灯时,南北向的红灯点亮禁止通行。
假设南北方向为主干道,通行时间为60秒,东西方向是次干道,通行时间为30秒,黄灯点亮的时间均为4秒,则其工作方式如表1.1所示循环点亮信号灯。
表1.1交通信号灯工作模式
南北向
绿灯亮60秒
黄灯亮4秒
红灯亮34秒
东西向
红灯亮64秒
绿灯亮30秒
黄灯亮4秒
2.4工作流程
A.按下电源键,电源指示灯亮;
B.按下运行键,模拟交通灯控制器工作;
C.LED实时显示当前的交通状况;
D.红灯和绿灯的工作顺序如下:
图2.1红灯工作顺序图
图2.2绿灯工作顺序图
E.用2位数码管实时倒计时时间,倒计时流程如下:
图2.3LED等结合数码管工作顺序图
F.运行过程中,若再按下电源键,则控制器停止工作,电源指示灯灭。
2.5实验设备与器材
(1)电源模块
(2)ARM开发板LM3S2110
(3)1602液晶显示
3.硬件系统设计
3.1设计系统介绍及原理框图
(1)接通电源时或系统复位后,系统按程序给定的时间工作,即南北向通行60秒,东西向通行30秒,黄灯亮4秒,工作模式如表1.1所示。
首先南北向通行,然后东西向通行,如此循环。
(2)通行时间的设置:
当需要更改主、次干道的通行时间时,可以用“设置键、增加键、减少键”进行设置。
第一次按“设置键”时,南北向的绿灯亮,南北向的数码管显示当前南北向的通行时间,并且按每秒3次的频率闪烁(每秒亮3次暗3次),其余的信号指示灯和东西向的数码管熄灭,此时可以用“增加键”和“减少键”来改变南北向的通行时间。
按一次“增加键”或“减少键”,数码管的显示增加一秒或减小一秒,长按“增加键”或“减少键”(按下的时间超过一秒钟以上)则数码管显示的时间按每秒钟增加或减少10的速度快速变化。
第二次按“设置键”时,南北向的黄灯亮,南北向的数码管显示当前南北向黄灯点亮时间,并且按每秒3次的频率闪烁每秒亮3次暗3次),其余的信号指示灯和东西向的数码管熄灭,此时可以用“增加键”和“减少键”来改变南北向黄灯的点亮时间。
第三次按“设置键”时,东西向的绿灯亮,东西向的数码管显示当前东西向的通行时间,并且按每秒3次频率闪烁,此时可以用“增加键”和“减少键”来改变东西向的通行时间。
第四次按“设置键”时,东西向的黄灯亮,东西向的数码管显示当前东西向黄灯的点亮时间,并且按每秒3次频率闪烁,此时可以用“增加键”和“减少键”来改变东西向黄灯的点亮时间。
第五次按“设置键”时,系统退出设置状态,回到交通信号灯状态,并且南北向先通行,东西向后通行。
“设置键”的功能表图1.2所示。
表1.2设置键的功能
按“设置键”的次数
第1次
第2次
第3次
第4次
第5次
调整内容
南北向的绿灯点亮时间
南北向的黄灯点亮时间
东西向的绿灯点亮时间
东西向的黄灯点亮时间
恢复交通灯工作状态
调整范围
0~99秒
0~9秒
0~9秒
0~9秒
3.2电源供电系统
本系统采用220V电源供电,应设计相应的稳压电源电路。
但课程设计受时间限制,也可采用现成的5V直流稳压电源供电,这样可节约设计时间,简化设计过程。
图3.1电源模块硬件图
3.3ARM开发板
ARM建设选用TILM3S2110芯片,便于设计和调试。
3.4LED显示系统
南北向和东西向各采用2个数码管计时,对该方向的指示灯的点亮时间进行倒计时,最长计时范围为99秒。
设计时可利用芯片的PD口和PA口作为字段和位选信号输出,经驱动芯片后驱动数码管显示倒计时时间,数码管采用动态扫描方式显示。
图3.2数码管模块硬件图
图3.3LED模块硬件图
3.5键盘系统
设置3个程序按键:
设置键、增加键、减少键,因键盘使用频率很小,建议采用查询方式来读取键盘。
另需配置一个非程序按键:
系统复位键。
图3.4矩阵键盘模块硬件图
3.6原理电路图
图3.5硬件电路图
4.软件设计方案
4.1程序流程图
图3.6软件流程图
4.2方案论证
电源模块采用单片机控制模块提供电源。
改方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。
显示模块用数码管与点阵LED相结合的方法因为设计既要求倒计时数字输出,又要求有状态灯输出等,为方便观看并考虑到现实情况,用数码管与LED灯分别显示时间与提示信息。
这种方案既满足系统功能要求,又减少了系统实现的复杂度。
输入模块采用4*4矩阵键盘,由于单片机/嵌入式实践平台的试验箱对于交通灯及数码管的控制,只用LM3S2110芯片本身与试验箱管脚相连,通过程序就可实现。
综上所述,以LM3S2110芯片为核心器件,采用连接8段LED数码显示管,4*4矩阵键盘电路组成。
利用单片机的优势设计电路直接在管脚上接上按键开关。
因为设计的时候仅见和优化了电路,所以剩余的管教资源还比较多。
由于该系统对于交通灯以及数码管的控制,只需要单片机本身就可以实现,所以选择这种方案。
4.3调试过程
我们的程序分为2大部分,第一部分是嵌入式LM3S2110芯片上的LED灯程序的调试;第二部分是试验箱上数码显示管与4*4矩阵键盘程序的调试。
先把嵌入式LM3S2110芯片与PC机连接,在PC机上安装芯片的驱动,路径为C:
\ProgramFiles\IARSystem\EmbeddedWorkbench5.4Kickstart
\arm\drivers\LuminaryFTDI,设定管脚为GPIOB
口的PIN1~PIN4,即为芯片上的LED3~LED6。
我们的程序是先让LED3和LED6点亮50秒,再闪烁5次,再让LED4和LED5点亮10秒。
可是起初是LED3和6亮完之后就是LED4和5亮,没有闪烁的过程,后来发现是程序中的延时循环出现了问题,然后经过了一次次更改,一次次错误,最后终于成功的让交通灯正确点亮。
第二部分是把试验箱与嵌入式LM3S2110芯片的管脚依次相连。
这次程序还没有调试就有一个大问题出现,就是管脚怎么连接。
我们需要的是8位显示管模块和矩阵键盘模块,8位公阳显示管模块中的段和位我们分别定义为GPIOD口的PIN1~PIN7,GPIOE口的PIN0~PIN1;矩阵键盘中的横向以及纵向分别定义为GPIOA口的PIN2~PIN5,GPIOC口的PIN4~PIN7。
然后根据我们找到的资料YCHD-3和ARM2110的管脚图依次相连,然后再连接地线。
第一次的问题是8个8位数码管一次只能显示一位,可是我们的倒计时需要十位和个位同时显示,正当我们无从着手时候,有同学给了我们一个建议:
利用人眼的视觉暂留,让数码管不断地刷不断的闪,只要时间足够短暂那我们看起来就像是2位数码管同时亮。
改程序,1秒内十位个位互相闪烁50次,果然成功了。
期间有许多失败的经历,就不赘述了。
第二次的问题是按键与数码管没有互相作用,程序中的提示也是定义按键为多余的警告。
使能了按键后,虽然警告没有了,可是数码管依然不受按键控制。
找了许多同学寻求帮助,虽然找出了我们程序中存在的问题,但是没有改变现状,又一次的束手无策。
最后终于发现原来是管脚的链接问题,我们忽略了矩阵键盘中的J1模块和J3模块的短接。
利用跳线帽短接J1模块的2个管脚和J3模块的两个管脚。
连接之后重新烧入程序,调试成功了。
当按下K1键时,倒计时50秒,按下K2键时,倒计时10秒,K3键40秒,一次类推,一直到100秒。
但是因为我们用了2位的8段数码管,所以当到99秒时候,自动归零。
4.4运行结果
4.4.1结果分析
把LM3S2110芯片与PC机连接后,把LED程序进行仿真,把程序烧入芯片内,LED1和LED6点亮(见图3.7),亮50秒后,闪烁5次。
让LED2和LED5点亮(见图3.8),亮10秒后,闪烁5次。
依次往复循环。
图4.1LED1和LED6亮
图4.2LED2和LED5亮
4.4.2体会与收获
这次课程设计带给我们的不仅仅是对课本知识的加深的理解,也锻炼了我们对于把书本知识运用到实践中的能力。
平时在课堂上学到的东西有的虽然明白了,但是毕竟没有实际操作经验,操作起来容易出错;有的只是一知半解,用于实践中就出现了问题。
对于知识的理解知识单纯的停留在书本阶段,自己动手尝试了以后,这些知识对于我们而言更加鲜活生动起来了。
从刚刚开始的无从下手,到逐步的知道自己该做什么,该怎么做。
不断地遇到新的问题,不断地尝试各种方法解决,即使失败了也有了经验。
渐渐的发现问题,解决问题,遇到新问题,再解决问题,这种循环让我们体会到了靠自觉解决问题的成就感。
从实践中直接得到的知识会比书本上老师传授所得到的知识更容易让我们掌握。
当然专业知识也收获不少,当初的C语言学的半吊子,考试阶段的临时抱佛脚让我们到了关键时刻都不知道各种语句怎么用,可是又不得不写出来。
当然就网上收集资料,学习别人的程序,在别人的模板上逐渐修改,渐渐地这段程序的绝大多数都是我们自己的成果了。
还有一些作图软件以前从未接触或者有少许接触的通过这次的锻炼也让我们熟练掌握了它们的用法。
参考文献
[1]李朝青.单片机原理及接口技术(第3版).北京:
北京航空航天大学出版社,2006
[2]何立民.单片机应用技术大全.北京:
北京航空航天大学出版社,1994第19页
[3]周立功,LM3S2110微控制器[EB/OL].
2010年6月。
[4]周立功,ARM嵌入式系统基础教程[M].北京:
北京航空航天大学出版社,2004P213~P216
[5]张齐朱宁西,单片机应用系统设计技术[M].北京:
电子工业出版社,2004P251~P255,P256~P260。
[6]张军宋涛AVR单片机C语言程序实例精粹[M].北京:
电子工业出版社,1997P122~P133。
[7]张大明,单片微机控制应用技术[M].北京:
机械工业出版社,2006P65~P70。
特别致谢
本次关于模拟交通灯设计与制作是在王永明老师和徐会彬老师以及其他辅导老师的悉心指导下,和同组内的其他两位成员的共同讨论,互相交流才得以顺利完成。
经过本次设计我们把大学里所学的理论知识转为成为实际的应用,既锻炼了我们的实际草操作能力,又使理论知识得到升华,激发了我们的创新意识。
特别感谢与我同组的两位组员,在工作中我们积极配合,互相帮助,勇于创新。
更要感谢身边的同学,虽然不是我们一组的,但是在我们遇到使我们措手不及的时候,在程序上给我们很多提示很多帮助,感谢他的无偿帮助。
用过本次设计使我们的动手能力得到很大的提高,让我们走出了实践盲区,为以后的毕业设计以及工作后的动手能力打下坚实的基础。
最后感谢学院为我们提供了这次机会。
再次感谢老师们和同学们的帮助!
附录
程序清单
#include"systemInit.h"
#definelcdenGPIO_PIN_0//PB0;
#definelcdrsGPIO_PIN_1//PB1;
unsignedchardata;//PD0-PD7;
unsignedintshi=48+5,ge=48;
voidwrite_com(unsignedcharcom)//写命令
{
GPIOPinWrite(GPIO_PORTB_BASE,lcdrs,0x00);//lcdrs=0;
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|
GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,com);//PD=com;
SysCtlDelay(5*(TheSysClock/4000));//延时5ms
GPIOPinWrite(GPIO_PORTB_BASE,lcden,0xFF);//lcden=1;
SysCtlDelay(5*(TheSysClock/4000));
GPIOPinWrite(GPIO_PORTB_BASE,lcden,0x00);//lcden=0;
}
voidwrite_data(unsignedchardate)
{
GPIOPinWrite(GPIO_PORTB_BASE,lcdrs,0xFF);//lcdrs=1;
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|
GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,date);//PD=date;
SysCtlDelay(5*(TheSysClock/4000));
GPIOPinWrite(GPIO_PORTB_BASE,lcden,0xFF);//lcden=1;
SysCtlDelay(5*(TheSysClock/4000));
GPIOPinWrite(GPIO_PORTB_BASE,lcden,0x00);//lcden=0;
}
voidinit()
{
SysCtlPeriEnable(SYSCTL_PERIPH_GPIOD);//使能A端口
GPIOPinTypeOut(GPIO_PORTD_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|
GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);
SysCtlPeriEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinTypeOut(GPIO_PORTB_BASE,GPIO_PIN_0|GPIO_PIN_1);
GPIOPinWrite(GPIO_PORTB_BASE,lcden,0x00);//lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);//在开始清屏
write_com(0x80+0x10);//数据指针地址
}
//定义LED
#defineLED1_PERIPHSYSCTL_PERIPH_GPIOF
#defineLED1_PORTGPIO_PORTF_BASE
#defineLED1_PINGPIO_PIN_1
#defineLED2_PERIPHSYSCTL_PERIPH_GPIOF
#defineLED2_PORTGPIO_PORTF_BASE
#defineLED2_PINGPIO_PIN_2
#defineLED3_PERIPHSYSCTL_PERIPH_GPIOB
#defineLED3_PORTGPIO_PORTB_BASE
#defineLED3_PINGPIO_PIN_0
#defineLED4_PERIPHSYSCTL_PERIPH_GPIOB
#defineLED4_PORTGPIO_PORTB_BASE
#defineLED4_PINGPIO_PIN_1
#defineLED5_PERIPHSYSCTL_PERIPH_GPIOB
#defineLED5_PORTGPIO_PORTB_BASE
#defineLED5_PINGPIO_PIN_2
#defineLED6_PERIPHSYSCTL_PERIPH_GPIOB
#defineLED6_PORTGPIO_PORTB_BASE
#defineLED6_PINGPIO_PIN_3
#defineBEEP_PERIPHSYSCTL_PERIPH_GPIOH
#defineBEEP_PORTGPIO_PORTH_BASE
#defineBEEP_PINGPIO_PIN_0
unsignedchari;
voidLED1FLASH()
{
unsignedcharucVal;
ucVal=GPIOPinRead(LED1_PORT,LED1_PIN);//翻转LED
GPIOPinWrite(LED1_PORT,LED1_PIN,~ucVal);
ucVal=GPIOPinRead(LED6_PORT,LED6_PIN);//翻转LED
GPIOPinWrite(LED6_PORT,LED6_PIN,~ucVal);
SysCtlDelay(500*(TheSysClock/3000));
GPIOPinWrite(LED1_PORT,LED1_PIN,ucVal);
GPIOPinWrite(LED6_PORT,LED6_PIN,ucVal);
SysCtlDelay(500*(TheSysClock/3000));
}
voidLED2FLASH()
{
unsignedcharucVal;
ucVal=GPIOPinRead(LED2_PORT,LED2_PIN);//翻转LED
GPIOPinWrite(LED2_PORT,LED2_PIN,~ucVal);
ucVal=GPIOPinRead(LED5_PORT,LED5_PIN);//翻转LED