
专 业:
设计题目: 十字路口交通灯控制
班级: 学生姓名: 学号:
指导教师:
分院院长:
教研室主任:
电气工程学院
课题摘要:
如今单片机的应用已经扩展到社会各界和生活的方方面面.伴随着计算机,电子器件等的发展.单片机也迅速得到了应用,凭借这单片机的设计灵活,功能强大,扩展性强,成本低廉等等因素,单片机已经成为了设计多种电子控制课题的首选元器件.正因为如此.单片机的课程也已经走进各大校园,在完成了我们这学期的学习后,我们着手应用这所学习的知识来动手参与设计红绿灯的交通控制,这一个典型的然而又极具代表的课题作以设计.从而对学习到的知识进行更深入的理解和应用。
本设计是关于单片机控制的交通灯模拟系统的设计。主要内容有交通灯模拟系统设计方案,主要功能,各功能模块的介绍,电路设计,硬件部分设计,软件部分设计,硬件调试,设计方法以及课程设计的心得体会等等。该设计中用光二极管来模拟信号灯,紧急车的优先通过请求信号由外部中断技术来模拟。要求使ATc51定时/计数器0作为定时器,要求对通行时间进行倒计时,从P0 口输出,在LED上显示并进行递减,以此来实现十字路口交通灯的指示功能。根据交通灯系统所需要实现的功能要求,先画出实验程序框图和主程序流程图,然后根据流程图写出其子程序。最后将程序烧至单片机实验箱的芯片中,通过程序控制交通灯的亮灭。
一、系统功能…………………………………………………………….4
二、硬件电路设计及描述……………………………………………….6
三、源程序代码………………………………………………………….9
四、系统调试…………………………………………………………….12
五、课程设计总结……………………………………………………….13
六、心得体会…………………………………………………………….14
一、系统功能
1.交通灯基本功能的选择.
根据设计要求,此次的基本功能为十字路口的交通灯南北东西两个方向的路灯控制。在这个基本功能的前提下,设计附加功能来完善设计功能
2.附加功能的选择
1)设计一个十字路口交通灯控制器。用单片机控制LED灯模拟指示,用2位数码管显示倒计时剩余时间。模拟XY方向的十字路口交通信号控制情况。红、绿黄灯时间可通过键盘进行设定调整。
2)本项目为典型的LED显示和中断定时电路。利用定时器T0产生每10ms一次的中断,每100次中断为1s。对两个方向分别显示红、绿、黄灯,及相应的剩余时间即可。值得注意的是需要意识到,X方向红灯时间 = Y方向绿灯时间+黄灯缓冲时间这一常识。
3)用4个按键,结合红、黄、绿灯显示,设置红绿灯的倒计数的时间。
4)4个按键的功能分配可以自行设定,也可以按如下方法设定。
K1—功能键,每按下一次对应的LED灯亮,表示要设置该灯的倒计时时间。同时,十位数码管闪烁。
K2—移位键,每按下一次向后移一位。
K3—加1键。
K4—减1键。
3系统设计思路
3.1实际模型
图1 车道和人行道规划
说明:东西南北方向共有12个车道交通灯,各方向红黄绿各三个,由于东西方向与南北方向左右转交通灯意义相同,所以实际忽略东西方向的左右转红绿灯。人行道上的交通灯也是同样道理,每个路口各选择红绿灯两盏。
3.2硬件接口介绍
用P1口作为车道交通灯控制输出口,由低到高分别对应南北方向上的绿黄红灯、南北方向上的左右转红绿灯以及东西方向上的绿黄红灯。
用P3.1、P3.5、P3.6、P2.7口作为人行道交通灯控制输出口,分别对应南北口上的红绿灯及东西口上的红绿灯。
表1 各个方向机动车道人行道灯时序表
| 时间 | 0-15s | 15-20s | 20-25s | 25-40s | 40-45s |
| 南北车行道 | 绿灯 | 黄灯 | 红灯 | 红灯 | 红灯 |
| 东西车行道 | 红灯 | 红灯 | 红灯 | 绿灯 | 黄灯 |
| 南北人行道 | 绿灯 | 红灯 | 红灯 | 红灯 | 红灯 |
| 东西人行道 | 红灯 | 红灯 | 红灯 | 绿灯 | 红灯 |
| 南北转弯灯 | 红灯 | 红灯 | 绿灯 | 红灯 | 红灯 |
1.器件设备:
电脑1台,Keil uVision3仿真调试软件1套,西特尔写入器1台,C51单片机芯片1块,12M晶振1个,30pF电容2个,LED发光二极管12个,数码管,电阻若干。
2.硬件原理图:
三、源程序代码
bbbz#include #define uchar unsigned char #define uint unsigned int void Disp(uint disp_value); void Disp_ss(uint disp_value); void jtd(uint bcd_value); void Delay_ms(uint delay); void send_data(uchar send_dat); void sn_green(); void sn_yellow(); void ew_yellow(); void ew_green(); key_scan(); uchar x_time; uchar y_time; void key_deal(); uchar gms_timer,rms_timer,sum_timer; uchar code LED_Val[] = {0xC0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98}; uchar data num[4]; uchar data led_point[4]={0xfe,0xfd,0xfb,0xf7}; bit ewg_flag,ewy_flag,sng_flag,sny_flag; sbit s_n_red=P2^0; sbit s_n_yellow=P2^1; sbit s_n_green=P2^2; sbit e_w_red=P2^3; sbit e_w_yellow=P2^4; sbit e_w_green=P2^5; sbit e_w_red2=P3^0; sbit e_w_yellow2=P3^1; sbit e_w_green2=P3^2; sbit s_n_red2=P3^3; sbit s_n_yellow2=P3^4; sbit s_n_green2=P3^5; sbit key_function=P1^4; sbit key_move=P1^5; sbit key_add=P1^6; sbit key_sub=P1^7; uchar keyfun_flag,move_flag,add_flag,sub_flag,set_timer,set1_timer,set2_timer; /////////////// void Disp(uint disp_value) { uchar i; jtd(disp_value); for(i=0;i<4;i++) { P1=led_point[i]; P0=LED_Val[num[i]]; Delay_ms(3); } } ///////////////// void Disp_ss(uint disp_value) { uchar i; jtd(disp_value); for(i=0;i<4;i++) { if((i==0)&&(move_flag==1)) { P1=led_point[i]; P0=LED_Val[num[i]]; Delay_ms(500); P1=led_point[i]; P0=0xff; Delay_ms(500); Delay_ms(3); } else { P1=led_point[i]; P0=LED_Val[num[i]]; Delay_ms(3); } if((i==1)&&(move_flag==2)) { P1=led_point[i]; P0=LED_Val[num[i]]; Delay_ms(500); P1=led_point[i]; P0=0xff; Delay_ms(500); Delay_ms(3); } else { P1=led_point[i]; P0=LED_Val[num[i]]; Delay_ms(3); } } } ////////////////// void jtd(uint jtd_value) { num[1]=x_time/10; num[0]=x_time%10; num[2]=y_time/10; num[3]=y_time%10; } /////////////////////////// void ew_green() { s_n_red=0; s_n_yellow=1; s_n_green=1; e_w_red=1; e_w_yellow=1; e_w_green=0; } ///////////////////////// void ew_yellow() { s_n_red=0; s_n_yellow=1; s_n_green=1; e_w_red=1; e_w_yellow=0; e_w_green=1; } /////////////////////// void sn_green() { s_n_red=1; s_n_yellow=1; s_n_green=0; e_w_red=0; e_w_yellow=1; e_w_green=1; } /////////////////////// void sn_yellow() { s_n_red=1; s_n_yellow=0; s_n_green=1; e_w_red=0; e_w_yellow=1; e_w_green=1; } //////////////////////// void Delay_ms(uint delay) { uchar j; while(delay--) { for(j=125;j>0;j--) {;} } } ////////////////// void system_init() { TMOD=0X01; TH0=(65536-10000)/256; TL0=(65536-10000)%256; TR0=0; ET0=1; EA=1; } //////////////////////// void timer0() interrupt 1 { uchar ms_count; ms_count++; if(ms_count==100) { sum_timer--; ms_count=0; } TH0=(65536-10000)/256; TL0=(65536-10000)%256; } ///////////////////////// key_scan() { if(key_function==0) { Delay_ms(10); if(key_function==0) { while(key_function==0); keyfun_flag++; } } ////////////// if(key_move==0) { Delay_ms(10); if(key_move==0) { while(key_move==0); move_flag++; if(move_flag==3) { move_flag=1; } } } ////////////// if(key_add==0) { Delay_ms(10); if(key_add==0) { while(key_add==0); add_flag=1; } } if(key_sub==0) { Delay_ms(10); if(key_sub==0) { while(key_sub==0); sub_flag=1; } } } //////////////////// void key_deal() { if(keyfun_flag==1) { TR0=0; if((move_flag==1)&&(add_flag==1)) { add_flag=0; set1_timer++; } if((move_flag==1)&&(sub_flag==1)) {sub_flag=0; set1_timer--; } if((move_flag==2)&&(add_flag==1)) { add_flag=0; set2_timer++; } if((move_flag==2)&&(sub_flag==1)) { sub_flag=0; set2_timer--; } } if(keyfun_flag==2) { TR0=1; move_flag=0; } gms_timer=set2_timer*10+set1_timer; } ////////////////// void main() { P2=0XFF; rms_timer=3; system_init(); sum_timer=0; set1_timer=0; set2_timer=0; gms_timer=0; sng_flag=1; while(1) { key_scan(); key_deal(); Disp_ss(gms_timer); if(keyfun_flag==2) { break; } } sum_timer=gms_timer; while(1) { if(sng_flag==1) { sn_green(); if(sum_timer==rms_timer) { sng_flag=0; sny_flag=1; } ///////////// } if(sny_flag==1) { sn_yellow(); if(sum_timer<=0) { sny_flag=0; ewg_flag=1; sum_timer=gms_timer; } } /////////// if(ewg_flag==1) { ew_green(); if(sum_timer==rms_timer) { ewg_flag=0; ewy_flag=1; } } /////////////// if(ewy_flag==1) { ew_yellow(); if(sum_timer<=0) { sng_flag=1; ewy_flag=0; sum_timer=gms_timer; } } Disp(sum_timer); } } 四、系统调试 在这次单片机课题的开发与设计中,我们在软件与硬件的调试上都遇到了一些问题,通过组员们的互相帮助以及老师的悉心教导,我们得以解决这些问题,完成了本次课题设计的任务。 在软件调试中,我们遇到以下问题: 1.在应用P0、P1、P2以及P3这些准双向I/O口作为输入口时,应该先向这些I/O口赋初值“1”,并且无高阻的“浮空”状态。否则在读入值得时候会产生错误指令。 2.在应用外部中断程序时,P3.2口作为外部中断0的输入口,因此,在选择二极管连接的端口时应将P3.2口留出。 3.在程序调试过程中,应将外部中断控制窗口以及需要的P0、P1等窗口一并打开,并在进入中断前对中断请求标志位置“1”,以实现进入中断程序的功能。 4.在MCS-51单片机中,中断优先级分为两级,即高优先级和低优先级。为此设置由两个不可寻址的中断优先级触发器,分别指示两级中断服务。当CPU为高级中断请求服务时,高优先级触发器置“1”,否则清“0”。本课题设计中运用到外部中断0和定时/计数器0,同为相同优先级别的中断源,外部中断0优先于定时/计数器0 。 5.因设计程序中包含中断子程序,故在调试过程中应选用按键“F11”来进行逐步调试。 在硬件调试过程中,有可能因为电路焊接问题,如线路短路、断路,焊点虚焊、漏焊,元器件损坏,线路排布错误,导致错误的现象,影响实训进程。因此,在焊接电路之前应熟悉电路原理图,用万用表对元器件进行检测并进行合理排布,焊接过程中应仔细对照端口,正确接线。 五、课程设计总结 为了锻炼学生的动手能力及激发学生的创新能力,我们小组于第十五周在单片机实验室进行了单片机实训。在实训过程中首先我们要明确实训目的: 1、熟悉单片机应用系统的开发、研制过程。 2、能运用MCS-51单片机进行简单的单片机应用系统的硬件设计。 3、能采用MCS-51单片机C语言进行简单的单片机应用系统的软件设计。 4、掌握单片机应用系统的硬件、软件调试方法。 5、熟悉单片机仿真开发系统的作用,基本掌握运用单片机仿真开发系统进行在线仿真、调试和目标程序固化的方法。 6、为今后从事单片机应用系统的开发、生产和维护工作奠定基础。 在实训的第一天我们经过指导老师详细地为我们讲解了实训指导内容,让我们了解实训当中所学的内容与一些元器件和我们要实验的课题。在实验中我们的课题是十字路口交通信号灯的设计与制作为了能让我们更好的掌握知识,我们在小组里也分工合作,也可以培养我们同学之间的合作能力。在此有做硬件的,有做软件的,这样能够更好的加强自己的动手操作能力。我们的课题在组员们的认真操作下很快就完成了,几乎在第二天都得以完成。 在实训过程中,我们遇到了或多或少的问题,在老师的细心指导下,我们及时地解决了问题,并看到了我们的不足之处。与此同时,老师还对我们的设计进行了补充要求,使我们的课题设计能够更加完善。通过本次实训,我们深刻体会到,理论与实践是密不可分的。 时光飞逝,一转眼,一周又进入尾声了,实训就这样过去了,但我们不能满足于眼前的成绩,应该秉持对科学的严谨态度,博学笃行,追求卓越。 六、心得体会 为期一周的单片机十字路口交通灯系统课程设计已经接近尾声,在这一周中我的体会颇多。 最开始的工作是设计电路图,电路图大多来自网上还有各种资料书,但是在这个过程中,我们掌握了交通灯的电路图的设计理念以及方法,单片机芯片80C51各个管脚的作用,以及上电复位电路,时钟控制电路的作用及绘制方法,总体来说收获是非常的大的。 第二步则是要根据流程图将主程序编写出来,通过我们一组成员的配合,我们在第二天时大体完成了程序的编写,但是在调试的过程中出现了很多意想不到的问题,将程序放到keil中编译,出现了50多处错误,但是我们都通过查阅书籍,相互之间讨论,向指导老师求教等方法对程序进行了更正。在这个更正错误,调试程序的过程,可以说我们的收获是巨大的,我们了解到了更多汇编程序语句的用法,通过反复的阅读检查程序,也对程序的意义有了更多的体会和更熟练地理解。 通过这个调试过程,我认识到只要细心地去读程序,认真的去理解,真正将程序领悟透彻后,很多问题都可以迎刃而解,当然在这个过程中我们也应当发挥团队合作的精神,在相互讨论同学习。 在本次实训过程中,比较遗憾的一点就是由于线路板的空间,我们只能将意义相同的几盏红绿灯省略,无法将最真实的交通灯效果呈现出来。但是我们仍然花费了很多时间去理解程序内容,用心的专研其中的奥妙,尽可能的合理布线,完善交通灯的功能。 通过这次课设,对学过的知识进行了巩固,加深了理解,提高了应用的能力,而且提高了我们的发现、分析、解决问题的能力。最后,在此感谢指导老师对我们的帮助和关心,使我们在课程设计的过程中不只是学习到了知识,更有认真做事的态度和对科学的严谨态度。 七、心得体会 为期一周的单片机十字路口交通灯系统课程设计已经接近尾声,在这一周中我学到了很多,并有了很深刻的心得体会。 通过本次设计,让我很好的锻炼了理论联系实际,与具体项目、课题相结合开发、设计产品的能力。既让我们懂得了怎样把理论应用于实际,又让我们懂得了在实践中遇到的问题怎样用理论去解决。 在本次设计中,我们还需要大量的以前没有学到过的知识,于是图书馆和网络成了我们很好的助手。在查阅资料的过程中,我们要判断优劣、取舍相关知识,不知不觉中我们查阅资料的能力也得到了很好的锻炼。在设计过程中,总是遇到这样或那样的问题。有时发现一个问题的时候,需要做大量的工作,花大量的时间才能解决。自然而然,我的耐心便在其中建立起来了。为以后的工作积累了经验,增强了信心。 在实训过程中,我了解到单片机虽然是一个五脏俱全的微型计算机,但由于本身无自开发能力,必须借助于开发工具来开发应用软件以及对硬件资源进行诊断。进行一个完整应用系统开发必须经过以下步骤: (1)确定方案,选择芯片。(2)硬件电路设计、组装与调试。(3)应用软件的调试与仿真。(4)应用软件的固化。(5)应用软件脱机运行。 这次做实训的经历使我终身受益,我感受到要真真正正用心去做课程设计,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破。 我们学习的知识是有限的,在以后的工作中我们肯定会遇到许多未知的领域,所以我要将科学精神延展到生活、学习、工作等各个方面中去。这次的经历能让我在以后学习中激励我继续进步。 最后,我衷心地向我的指导老师说声谢谢,在我困惑不解的时候对我的耐心教导与悉心帮助,使我在学习能力上有了显著的提高。 七、心得体会 为期一周的单片机十字路口交通灯系统课程设计已经接近尾声,在这一周中我收获了很多,并有了很深刻的心得体会。 通过本次单片机实训,我对单片机用途有了更深刻的了解,并真正的把理论知识运用到实践中。从构思、到电路图的描绘,再经过实物的焊接,至最后对单片机的程序设计,整个过程着实费了我们不少的功夫。 由于对实践知识的缺乏,我们连引脚的功能都要查找资料。但在实训中,我们学到了许多平时在课本上学不到的东西。我们不仅更融会贯通地掌握了keil软件的使用方法,更掌握了 c51各端口的意义和功能。 在制作电路板中我们也遇到了不少困难,例如电路板刚焊好时,芯片的正负极间总是无法达到无穷大(这是不正常的),后来通过分别断开各部分地线的方法终于找出了问题所在并解决,解决问题后的成就感是笔墨难以形容的。同时也认识到了各端口正确选择的重要性,以及各个元器件的不可或缺性,如果断路或元器件损坏,将会产生错误的效果。 由于从设计、焊接、测试到修改一系列过程都是跟合作伙伴一起完成,这使得我们的协调能力、动手能力都有所提高,并对自己以后的应用设计更加有信心。在做板子的时候,最大的体会是,只要有信心和持之以恒的精神,任何困难的事情都变的简单了。不要轻易的说放弃,因为放弃就等于全盘皆输,而不放弃,也就是坚持,那就有成功的机会。 经历了从最初的设计到最后在电路板上实现,提高了我们对专业的认识及兴趣,对于我们工科来说,对以后就业有及其重大的影响。 非常感谢老师对我们的指导帮助,使我们这次单片机实训得以顺利完成,尽管实训花去了不少的时间,但也学到了不少的东西,我们衷心觉得在这方面的花费是值得的。
