毕业设计基于AT89S52单片机的简易十字路口交通灯设计.doc
单片机技术课程设计说明书 基于单片机的简易交通灯设计 院 、 部: 电气与信息工程学院 学生姓名: 方 挣 挣 指导教师: 桂友超 职称 讲师 专 业: 电子信息工程 班 级: 电子1004班 完成时间: 2013-6-4 摘 要 对基于单片机的交通灯控制系统进行了设计。系统功能为:以MCS-51 系列单片机作为控制核心,设计并制作交通灯控制系统,东西南北四个方向具有左拐、右拐、直行及行人4 种通行指示灯,用计时器显示路口通行转换剩余时间,在特种车辆如119、120 通过路口时,系统可转为特种车辆放行,其他车辆禁止通行状态。 在对系统功能分析的基础上,选择性能较优的LED 动态循环显示方案进行了设计。设计包括硬件和软件两大部分。硬件部分包括单片机最小系统、交通灯显示二部分。选用Atmel公司的AT89S52单片机作为控制核心,东西南北四个方向设置了LED 时间显示和交通灯显示,时间显示采用二位LED显示器,交通灯显示则采用红绿黄三种高亮发光二极管来模拟。软件采用了模块化的设计方法,主要分为主程序、定时器中断服务子程序、倒计时显示子程序、交通灯模拟显子程序四部分。 关键词:单片机; AT89S52; 交通灯ABSTRACT Traffic light control system based on SCM (Single Chip Microcomputer) is designed in this paper. System requires that MCS-51 series SCM is used as CPU. Traffic light control system should be designed and made .There are four groups light which indicate to turn left, turn right, and go straight ahead and pedestrian access in east, west, north and south four directions. Timer shows traffic conversion remainder time.When special vehicles, such as 119,120 go through, the system can automatically allow special vehicles running and other vehicles is prohibited. Based on analysis of the system functions, three schemes areput forward .By comparison, LED dynamic cycle display scheme has better functions and it is selected to be designed. The design includes hardware part and software part. Hardware hasthree parts .They are SCM system, LED time display, traffic lights. AT89S52 SCM is selected as control CPU. LED display and traffic lights are set in east, west, north and south four directions. Three LED monitors are used to show time. Highlight and red-green two clor traffic lights are used as traffic lights. Software is designed by module. It is divided into main program, timer interrupting service subroutine, LED display subroutine, traffic display subroutine.Key words: scm;AT89S52 ;traffic light目 录1 设计课题任务、功能要求说明及总体方案介绍11.1设计课题任务与功能要求11.2设计课题总体方案介绍及工作原理说明12 设计课题硬件系统的设计22.1 设计课题硬件系统各模块功能简要介绍22.1.1 主控制系统模块22.1.2 按键电路22.1.3流水灯电路32.1.4 数码管电路32.1.5下载口电路43 设计课题软件系统的设计43.1设计课题软件系统各模块功能简要介绍43.1.1数码管显示子程序43.1.2延时子程序53.1.3 主程序53.1.4初始化函数53.1.5定时器0中断函数53.1.6定时器1中断函数53.2 设计课题软件系统程序流程框图63.2.1主程序流程图63.2.2数码管显示函数流程图63.2.3 定时器中断0函数流程图83.2.4 定时器中断1函数流程图94设计结论及体会104.1设计课题的设计结论及使用说明104.2设计课题的误差分析104.3仿真结果图114.4 实物结果图124.5 心得体会16结束语17致 谢18参考文献19附录A20附录B22附录C231 设计课题任务、功能要求说明及总体方案介绍1.1 设计课题任务与功能要求设计一个具有特定功能的十字路口交通灯。该交通灯上电或按键复位后能自动显示系统提示符“P.”, 进入准备工作状态。按开始键则开始工作,按结束键则返回“P.”状态。要求甲车道和乙车道两条交叉道路上的车辆交替运行,甲车道为主车道,每次通车时间为60秒,乙车道为次车道,每次通车时间为30秒,要求黄灯亮3秒,并且1秒闪烁一次。有应急车辆出现时,红灯全亮,应急车辆通车时间10秒,同时禁止其他车辆通过。1.2 设计课题总体方案介绍及工作原理说明本设计采用单片机以及其外部设备组成硬件电路,其中包括单片机、数码管显示器、按键。数码管的P0口接段控,P2口接位控。键盘接在P1口上。除此之外还有晶振电路,复位电路,电源电路和下载口电路。 方案设计框图如图1所示:AT89S52晶振电路复位电路数码管显示驱动电路交通灯状态显示电路键控电路 图 1 系统设计框2 设计课题硬件系统的设计2.1 设计课题硬件系统各模块功能简要介绍2.1.1 主控制系统模块图 2.1.1主控制系统模块2.1.2 按键电路图2.1.2 按键电路按键电路的设计就是在一端公共接地,另一端通过上拉电阻接到P1口,当有按键按下,相应的口就会变成低电平,产生一个下降沿。2.1.3流水灯电路图2.1.3 流水灯电路流水灯电路直接挂接在单片机的P3口上,采用共阳接法。2.1.4 数码管电路图2.1.4 数码管电路数码管的段控口接在单片机的P0上,而位控口通过三极管接在单片机的P2口上。2.1.5下载口电路 图 2.1.5 下载口电路下载口的1脚接P1.5口,2脚悬空,3脚接单片机的复位口,4脚接P1.7口,5脚接P1.6口,6脚接vcc,7、8、9、10脚接地。3 设计课题软件系统的设计3.1设计课题软件系统各模块功能简要介绍3.1.1数码管显示子程序显示函数主要完成数码管的动态显示,将相应的段控码送往P0口,相应的位控码送往P2口。实现显示需要的字符信息。3.1.2延时子程序其中包括延时1ms函数。延时函数在显示函数中用到,由于时间比较短,就采用纯软件的方法延时。3.1.3 主程序主函数是程序的入口,在主函数中一直键扫描,当没有键按下时一直保证显示P点。当S1键按下后,开启交通灯;当S2键按下后,关闭交通灯,当S3键按下后,是应急车道通车。3.1.4初始化函数初始化函数主要是对定时计数器0、定时计数器1的一些设置和中断的一些控制。3.1.5定时器0中断函数 函数是对交通灯主通道和次通道进行定时,以刷新数码管显示;还控制黄、绿、红灯的显示。3.1.6定时器1中断函数 此函数主要是对应急事件10s的定时,以及对主、次通道黄灯闪烁的定时控制。3.2 设计课题软件系统程序流程框图3.2.1主程序流程图图 3.2.1 主程序流程图3.2.2数码管显示函数流程图图 3.2.2 数码管显示函数流程图3.2.3 定时器中断0函数流程图 图 3.2.3 定时器0中断函数流程图3.2.4 定时器中断1函数流程图 图 3.2.4 定时器1中断函数流程4 设计结论及体会4.1设计课题的设计结论及使用说明本次课程设计完成了交通灯所要求的基本功能,经测试,也看到了各灯亮的情况。在设计过程中,遇到了很多困难,但积累了许多宝贵经验。本次设计中, S1键按下后,开启交通灯;当S2键按下后,关闭交通灯,当S3键按下后,是应急车道通车。4.2 设计课题的误差分析该交通灯在运行中存在一定的误差。由于编程时采用的是定时器定时,时间不能保证的很精确,因此会产生一定的误差。同时也存在很多硬件系统上的问题。如12MHZ晶振,虽说频率稳定度很高,但终究还是有误差的。并且也有外部因素的影响,如温度温度、湿度等干扰。故应该让单片机工作在适宜的环境下,同时采用实时时钟芯片,这样能将误差降低到最小。4.3仿真结果图图4.3.1 上电显示班级、学号图4.3.2 应急时间图4.3.3 红灯等待时间4.4 实物结果图图4.4.1 上电显示班级、学号图4.4.2通车时间图4.4.3 红灯等待时间图 4.4.4应急时间4.5 心得体会第一,在编写软件中,在此过程中我更为熟练得掌握汇编语言各种指令的使用方法,掌握了keil软件的使用。第二,在软件调试过程中,使我又一次复习了keil和proteus联合使用的方法。在调试时曾经遇到数码管倒计时显示时间两位不能同时显示,后来经过查找资料不断调试才领悟到原来在显示的过程中要循环显示才能使得显示稳定下来。 第三,通过这次课程设计,我掌握了用单片机设计交通灯的基体方法,增强了我寻找问题,解决问题的能力。培养了我的设计思维,此次课程设计的成功不仅帮助我更好地掌握书本知识,尤其重要的是增强了我的自信,培养了我独立思考的能力。但是此次设计不中之处是不能实现左右弯灯,不有人行道控制灯,不能进行流量控制。结束语 本次课程设计的过程是艰辛的,不过收获却是很大的。本次课程设计让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更进一步的理解和认识。在此,由于自身能力有限,在课程设计中碰到了很多的问题,但通过查阅相关书籍、资料以及和周围同学交流后都得以一一解决。 由于使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。但是在我们设计和调试的过程中,也发现了一些问题,譬如红灯和绿灯的切换还不够迅速,红绿灯规则效率还不是很高等等,这需要在实践中进一步完善。致 谢本课题在选题及进行过程中得到了桂友超老师的指导以及同学的热心帮助,在这里特意感谢在课程设计中帮助过我的老师和同学们。感谢桂老师的严格要求,严教之下才会更加认真的去学,将知识归于己用,所以很感谢桂老师。在此,谨向老师们致以衷心的感谢和崇高的敬意!另外,还要感谢所有同学对我的指导和帮助,是他们不厌其烦的帮助我学习自己不懂的东西。正是由于他们的帮助才让这此课程设计最终可以顺利有效的做完。参考文献1 李广弟、朱月秀、冷祖祁,单片机基础,北京航空航天大学出版社。2 华成英 童诗白, 模拟电子技术基础(第四版),高等教育出版社。3 康华光,电子技术基础 数字部分(第五版),高等教育出版社。4 杨居义,单片机课程设计指导,清华大学出版社。 附录A图A1 电路原理图图A2 PCB图附录B表1 设计所用元器件清单序号名称、大小数量1电阻2001个2电阻47024个3电阻1K3个4 电阻4.7K1个5电容22F1个6电容33pF2个718B201个8AT89S521个9单排插40个11四位一体共阳极数码管2个12LED9个13PNP9个14四脚按钮9个15六脚开关1个16USB电源接口1个17下载口1个18晶振12MHz1个附录C/*项目名称:交通灯*/*时间:2013.6.1*/*作者:方挣挣 */* P2口位控口,P0口段控口,P1口按键,P3口发光二极管 */*/#include<reg52.h>#define uchar unsigned char#define uint unsigned int/*共阳数码管字型码数组*/*0,1,2,3,4,5,6,7,8,9,P.,灭*/char code dis_code=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x21,0xff; /*共阳数码管位控码数组(从右往左点亮,反向驱动)*/char code weikong_code=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;char find_code8;sbit S2=P10; /S1键启动交通灯控制器sbit S3=P11; /S2键回归“班级”状态sbit S4=P12; /S3键处理紧急状况uchar time;void DelayX1ms(uint count) /1ms延时函数 uint j;while(count-!=0) for(j=0;j<80;j+);/*显示函数*/void disp()char i;char k;for(i=0;i<8;i+)P2=weikong_codei;k=find_codei;P0=dis_codek;DelayX1ms(1);/*1s延时*/void delay1s() TMOD=0X01;EA=1;ET0=1;TH0=0x3C; /定时器定时50MsTL0=0XB0; TR0=1;PT0=1;dodisp(); while(time!=20&&S3&&S4); /有条件转移TR0=0;time=0; void time_() interrupt 1 /中断程序time+;TH0=0x3C;TL0=0XB0; /*500ms函数*/void delay500ms()TMOD=0X01;EA=1;ET0=1;TH0=0x3C;TL0=0XB0; TR0=1;PT0=1;dodisp(); while(time!=10); /有条件转移TR0=0;time=0;/*紧急函数*/void jinji() uchar f;for(f=10;f>0;f-) P3=0x6F;find_code1=f/10;find_code0=f%10; delay500ms();delay500ms();disp(); /*主函数*/ void main()while(1) char m,a; /上电显示“班级、学号”状态TR0=0;find_code0=9;find_code1=1;find_code2=10;find_code3=4;find_code4=0;find_code5=0;find_code6=1;find_code7=11; disp();while(!S2) TR0=1;find_code0=12;find_code1=12;find_code2=12;find_code3=12;find_code4=12;find_code5=12;find_code6=12;find_code7=12;while(S3) P3=0XAF; for(m=60;m>0&&(S3);m-)if(!S4)jinji();find_code1=m/10;find_code0=m%10;delay1s();disp();for(a=3;a>0&&S3;a-) if(!S4)jinji(); find_code1=a/10;find_code0=a%10;P3=0xeF;delay500ms();P3=0xcF;delay500ms();disp();P3=0X77; for(m=30;m>0&&(S3);m-)if(!S4)jinji();find_code1=m/10;find_code0=m%10;delay1s();disp(); for(a=3;a>0&&S3;a-) if(!S4)jinji();find_code1=a/10;find_code0=a%10;P3=0X7F;delay500ms();P3=0X7B;delay500ms();disp(); P3=0xFF;