资源描述
单片机应用技术课程设计报告 题目: 单片机控制的交通灯 姓 名: 欧阳圣棋 院 系: 电力学院 专业: 电子科学与技术 学 号: 201110722 指导教师: 朱安福 完成时间: 2014 年 7 月 3 日设计题目基于AT89C51单片机的交通灯设计要求1. 用单片机制作一个交通灯,控制十字路口的车辆运行状况。2. 在此基础上,加入“看门狗”功能。设计过程 1.选择实验课题,通过对不同课题的比较,选择了最贴近生活的交通灯设计。 2.选择所需要的元器件(AT89C51,交通灯)等,并构思原理图。 3.绘制原理图,将所选好的元器件放置在原理图中,并设置参数,接着把元器件对应管脚连接起来,并合理布局,使页面变得简单易读。 4.设计程序流程图,按照所要求的功能设计出满足所有需要的流程图, 5.按照流程图编写程序,并加入“看门狗”功能,在KEIL中编译,并生成“hex”文件 6.将生成的文件加入ISIS软件中,进行仿真,成功运行。 7.总结实验经验。完成设计成绩评定指导教师评语课程设计等级目 录1 概述 1.1课题名称5 1.2设计功能5 1.3设计意义52 系统总体方案及硬件设计 2.1芯片的选择与简单介绍52.2系统方框图72.3工作原理72.4电路原理图82.5单片机最小系统92.6时间显示电路 102.7交通灯电路 103 软件设计3.1整体系统分析 11 3.2相关参数计算 11 3.3程序流程图 124 Proteus软件仿真 4.1系统仿真电路图 13 4.2仿真结果分析 155课程设计体会参考文献附1:源程序代码附2:系统原理图摘要本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。系统除基本交通灯功能外,还具有倒计时、时间设置、紧急情况处理以及根据具体情况手动控制等功能。本设计是单片机控制的交通灯控制系统。单片机即单片微型计算机。其集定时、计数和多种接口与一体的微控制器。它体积小、成本低、功能强,广泛的应用于只能产业和工业自动化上。而51系列单片机是各类单片机中最为典型和富有代表性的一种。本设计的意义在于通过具体控制系统的设计,掌握微机控制系统设计的一般方法和处理问题的思路,特别是一些常用的技术手段。使大家能在实践教学环节中,积累设计经验,开拓思维空间,全面提高个人的综合能力。 红绿灯控制是智能交通系统的一个重要部分,本文给出了一个用单片机控制的简易交通红绿灯自动控制系统。该系统适用于十字路口,并对放行和禁行时间进行倒计时显示(秒)。 在车辆通行繁忙的十字交叉路口设置的交通灯控制系统,其特点是:道路较窄而车流量较大,主干道,支干道的车辆通行时间不等,同时设有道路应急控制。具体的情况是:在正常的情况下,东西支干道通行时间为20秒,南北主干道通行时间为30秒,每个方向在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道。并且能够在人工监控状态下,如果一道有车而另一道无车,交通灯控制系统能立即让有车道放行。而且有紧急车辆要求通过时,系统要能禁止普通车辆通行。 关键字:单片机 红绿灯 AT89C51 Proteus仿真1 概述1.1课题名称单片机控制的交通灯控制系统设计1.2设计功能1)南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替运行,主干道每次通行时间都设为25秒、支干道每次通行间为20秒,时间可设置修改;2)在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道;3)黄灯亮时,要求每秒闪亮一次;4)东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采用计时的方法);5)一道有车而另一道无车,交通灯控制系统能立即让有车道放行; 6)紧急情况时可以随时调成红灯或绿灯。1.3设计意义国内的交通灯一般设在十字路门,在醒目位置用红、绿、黄三种颜色的指示灯。加上一个倒计时的显示计时器来控制行车。对于一般情况下的安全行车,车辆分流尚能发挥作用,但根据实际行车过程中出现的情况,还存在以下缺点:1两车道的车辆轮流放行时间相同且固定, 在十字路口,经常一个车道为主干道,车辆较多,放行时间应该长些;另一车道为副干道,车辆较少,放行时间应该短些。2没有考虑紧急车通过时,两车道应采取的措施,臂如,消防车执行紧急任务通过时,两车道的车都应停止,让紧急车通过。基于传统交通灯控制系统设计过于死板,红绿灯交替是间过于程式化的缺点,智能交通灯控制系统的设计就更显示出了它的研究意义,它能根据道路交通拥护,交叉路口经常出现拥堵的情况。利用单片机控制技术提出了软件和硬件设计方案,能够实现道路的最大通行效率。2 系统总体方案及硬件设计2.1芯片的选择与简单介绍(图)主控芯片采用AT89C51单片机(其管脚图如图所示)。单片机,亦称单片微型计算机。它是把中央处理器(CPU)、数据存储器(RAM)、程序存储器(ROM)、输入/输出端口(I/0)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。计算机的产生加快了人类改造世界的步伐,但是它毕竟体积大。于是,微型计算机(即单片机)在这种情况下诞生了。纵观生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子 宠物等,这些都离不开单片机。单片机以体积小、功能全、性价比等诸多优点而独具特色,在工业控制、尖端武器、通信设备、家用电器等嵌入式应用领域中独占鳌头。如果说C语言程序设计课程设计的基础课,那么单片机以其系统硬件构架完整、价格低廉、学生能动手等特点,成为工科学生硬件设计基础课。MCS-51单片机是指由美国INTEL公司(大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS-51系列单片机。8051单片机包含中央处理器(CPU)、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:1.中央处理器(CPU)中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。2.数据存储器(RAM)8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。3.程序存储器(内部ROM):程序存储器用于存放程序和固定不变的常数等。通常采用只读存储器,且其又多种类型,在89系列单片机中全部采用闪存。AT89C51内部配置了4KB闪存。 3.1.定时/计数器(ROM): 定时/计数器用于实现定时和计数功能。AT89C51共有2个16位定时/计数器。3.2.并行输入输出(I/O)口: 8051共有4组8位I/O口(P0、 P1、P2或P3),用于对外部数据的传输。每个口都由1个锁存器和一个驱动器组成。它们主要用于实现与外部设备中数据的并行输入与输出,有些I/O口还有其他功能。4.全双工串行口:A89C51内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。5.时钟电路:时钟电路的作用是产生单片机工作所需要的时钟脉冲序列。6.中断系统:中断系统的作用主要是对外部或内部的终端请求进行管理与处理。AT89C51共有5个中断源,其中又2个外部中断源和3个内部中断源。7.定时/计数器8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。2.2系统方框图电 源交通灯AT89C51交通灯时间显示部分时钟按键复 位电 路2.3工作原理由软件设置交通灯的初始时间,南北方向通行25秒,东西方向通行20秒,数码管采用动态显示,P0口送字形码,P2口送字位选通信号,通过单片机的P1口控制各种信号灯的燃亮与熄灭。采用中断方式实现按键的功能。东西方向 EW G Y R 系统控制 电路南北方向 NS G Y R2.4电路原理图(图2)2.6时间显示电路(图3)因为系统要求南北和东西方向的信号灯时间不一样,所以就利用单片机的P0口送出数据的段码,位选信号用P2口送出,用动态扫描的方法显示东西、南北的倒计时间(如图-4所示)。2.7交通灯电路本设计利用单片机的p1口来驱动和控制各种信号灯的燃亮和燃亮时间,在实际中,交通灯的信号灯需要用高电压控制,在这里我们只是模拟一下它的控制信号,所以我们就只用单片机的信号引脚直接来控制交通灯。(图-5)3 软件设计3.1整体系统分析总体流程图(实现各种状态间的转换):东西绿灯南北红灯东西黄灯闪南北红灯亮东西红灯南北绿灯东西红灯亮南北黄灯闪 3.3程序流程图(图-6)4 Proteus软件仿真4.1系统仿真电路图1. 交通灯控制系统正常运行时仿真图(见图-7)。(图-7)2.交通灯南北方向绿灯向红灯转变,黄灯闪烁时仿真图(见图-8)。图-8(图-8)4.2仿真结果分析仿真实验实现南北方向车道和东西方向车道两条交叉道路的车辆交替运行,南北方向(主干道)每次通行时间设为30秒、东西方向通行时间设为20秒,时间可以在程序中修改。同时能够实现红灯、黄灯、绿灯状态转换,红绿灯转换时间为5秒,转黄期间黄灯亮。可以准确显示每个状态所剩余的时间,按下禁行普通车辆键,东西南北方向都亮红灯;按下南北放行键,南北绿灯亮,东西红灯亮;按下东西放行键,东西绿灯亮,南北红灯亮;任何时候按下返回键,此系统都将回到初始状态,当紧急状况出现时,按下紧急开关,可实现主干道和支干道全部禁止通行,允许紧急车辆安全通行,实现了课程设计的要求。5课程设计体会本系统就是充分利用了AT89C51芯片的I/O引角。系统统采用MSC-51系列单片机为中心器件来设计交通灯控制器,实现了能根据实际车流量通过单片机芯片的P1口控制红、黄、绿灯的燃亮与熄灭;P0口外接数码管来显示各个信号灯的时间。系统设计简便、实用性强、操作简单、程序设计简便。系统不足之处不能控制车的左、右转、以及自动根据车流改变红绿灯时间等。这是由于本身地理位子以及车流量情况所定,如果有需要可以设计扩充原系统来实现。通过这次课程设计,我得到了一次用所学知识与技能分析和解决问题的可贵的锻炼机会,使我深刻邻会了单片机的基本原理和单片机应用系统开发的过程。在常用编程设计思路技巧的掌握方面都向前迈了一大步,为日后成为合格的应用型人才打下良好的基础。通过本次的毕业设计,受益匪浅,充分意识到自己所学的东西还是非常有限的,不过通过设计,还是学到了一些书本上没有学到的东西,为自己以后的工作奠定了一定的基础。在撰写本文的过程中,深切地体会到当今科技技术飞速的发展,特别是单片机的发展使得许多技术难题迎刃而解,作者坚信,随着科学技术的不断发展,单片机技术的应用将是前途无量。 由于本设计涉及到的知识面比较广,再加上本人在相关领域知识的缺乏,所以本设计的性能指标还是有待改善的,然而,模拟仿真证明了本设计的设计思想和设计方法是现实可行的。参考文献1余发山 王福忠 单片机原理及应用技术 M.徐州:中国矿业大学出版社 2008.2吴黎明 单片机原理及应用技术M.北京:科学出版社 2003.3刘乐善 微型计算机接口技术及应用M.北京: 华中科技大学出版社 2004.4 李伯成.基于MCS-51单片机的嵌入式系统的设计M.北京:电子工业出版社,2004.5 吴黎明, 王桂棠, 洪添胜, 等. 单片机原理及应用技术 M . 北京: 科学出版社,2005.6 韩克, 柳秀山, 等. 电子技能与E D A 技术M.广州:暨南大学出版社,2004.附1:源程序代码#include #define uchar unsigned char#define uint unsigned intuchar data buf4;uchar data sec_dx=20; /东西数默认uchar data sec_nb=30;/南北默认值uchar data set_timedx=20;/设置东西方向的时间uchar data set_timenb=30;/设置南北方向的时间int n,led1=0;uchar data countt0;/定时器0中断次数sfr WDT_CONTR=0xA6;/定义5组开关sbit k4=P37; /切换方向sbit k1=P35;/时间加sbit k2=P36;/时间减sbit k3=P34;/确认sbit k5=P31;/禁止sbit k6=P15;/夜间模式/ P32/只允许东西方向通行,中断0/ P33/只允许南北方向通行,中断1sbit Red_nb=P26;/南北红灯标志sbit Yellow_nb=P25;/南北黄灯标志sbit Green_nb=P24; /南北绿灯标志sbit Red_dx=P23;/东西红灯标志sbit Yellow_dx=P22;/东西黄灯标志sbit Green_dx=P21;/东西绿灯标志sbit Buzz=P30;bit Buzzer_Indicate;bit set=0;/调时方向切换键标志 =1时,南北,=0时,东西bit dx_nb=0;/东西南北控制位bit shanruo=0;uchar code table11=/共阴极字型码0x3f, /-00x06, /-10x5b, /-20x4f, /-30x66, /-40x6d, /-50x7d, /-60x07, /-70x7f, /-80x6f, /-90x00 /-NULL;/函数的声明部分void delay(int ms);/延时子程序void key();/按键扫描子程序void key_to1();/键处理子程序void key_to2();void key_to3();void display();/显示子程序void logo(); /开机LOGOvoid Buzzer();/主程序void main()TMOD=0X11; /定时器设置TH0=0X3C;/定时器0置初值 0.05STL0=0XB0;EA=1;/开总中断ET0=1;/定时器0中断开启TR0=1;/启动定时0EX0=1;/开外部中断0EX1=1;/开外部中断1 logo();P2=0Xc3;/ 开始默认状态,东西绿灯,南北黄灯 sec_nb=sec_dx+5; /默认南北通行时间比东西多5秒while(1) key(); /调用按键扫描程序display(); /调用显示程序Buzzer();/函数的定义部分void key(void)/按键扫描子程序 if(k1!=1)/当K1(时间加)按下时display(); /调用显示,用于延时消抖if(k1!=1) TR0=0; /关定时器shanruo=0;P2=0x00;if(set=0)set_timedx+; /南北加1Selseset_timenb+; /东西加1Sif(set_timenb=100)set_timenb=1;if(set_timedx=100)set_timedx=1; /加到100置1sec_nb=set_timenb ; /设置的数值赋给东西南北sec_dx=set_timedx;/ do display();while(k1!=1);if(k2!=1)/当K2(时间减)按键按下时display(); /调用显示,用于延时消抖 if(k2!=1) TR0=0; /关定时器shanruo=0;P2=0x00;if(set=0)set_timedx-; /南北减1Selseset_timenb-; /东西减1Sif(set_timenb=0)set_timenb=99;if(set_timedx=0 )set_timedx=99; /减到1重置99sec_nb=set_timenb ; /设置的数值赋给东西南北sec_dx=set_timedx; do display(); /调用显示,用于延时while(k2!=1);if(k3!=1)/当K3(确认)键按下时display(); /调用显示,用于延时消抖if(k3!=1)TR0=1; /启动定时器Buzzer_Indicate=0;sec_nb=set_timenb;/从中断回复,仍显示设置过的数值sec_dx=set_timedx;/显示设置过的时间if(set=0)/时间倒时到0时 P2=0X00;/东西绿灯,南北红灯Green_dx=1;Red_nb=1;sec_nb=sec_dx+5; /回到初值else P2=0x00;/南北绿灯,东西红灯Green_nb=1;Red_dx=1;sec_dx=sec_nb+5; if(k4!=1)/当K4(切换)键按下 display(); /调用显示,用于延时消抖if(k4!=1) TR0=0;set=!set;/取反set标志位,以切换调节方向dx_nb=set;dodisplay(); while(k4!=1);if(k5!=1)/当K5(禁止)键按下时 display(); /调用显示,用于延时消抖 if(k5!=1) TR0=0;/关定时器P2=0x00;Red_dx=1;Red_nb=1;/全部置红灯sec_dx=00;/四个方向的时间都为00sec_nb=00;Buzzer_Indicate=1;dodisplay(); while(k5!=1); if(k6!=1)/当K6(夜间模式)按下 display(); /调用显示,用于延时消抖 if(k6!=1) TR0=0;/关定时器P2=0x00;Yellow_dx=1;Yellow_nb=1;/全部置黄灯 sec_dx=00;/四个方向的时间都为00sec_nb=00;Buzzer_Indicate=1;dodisplay(); while(k6!=1); void display(void) /显示子程序buf1=sec_nb/10; /第1位 东西秒十位buf2=sec_nb%10; /第2位 东西秒个位buf3=sec_dx/10; /第3位 南北秒十位buf0=sec_dx%10; /第4位 南北秒个位P1=0xff; / 初始灯为灭的P0=0x00;P1=0xfe; /片选LED1P0=tablebuf1;/送东西时间十位的数码管编码delay(1);/延时P1=0xff;/关显示P0=0x00;P1=0xfd; /片选LED2P0=tablebuf2;delay(1);P1=0xff;P0=0x00;P1=0Xfb; /片选LED3P0=tablebuf3;delay(1);P1=0xff;P0=0x00;P1=0Xf7;P0=tablebuf0;/片选LED4delay(1);void time0(void) interrupt 1 using 1 /定时中断子程序TH0=0X3C;/重赋初值TL0=0XB0;TR0=1;/重新启动定时器countt0+;/软件计数加1if(countt0=10)if(sec_nb=5)&(dx_nb=0)&(shanruo=1) /东西黄灯闪 Green_dx=0;Yellow_dx=0;Buzz=0; if(sec_dx=5)&(dx_nb=1)&(shanruo=1) /南北黄灯闪 Green_nb=0;Yellow_nb=0;Buzz=0;if(countt0=20) / 定时器中断次数=20时(即1秒时)countt0=0;/清零计数器sec_dx-;/东西时间减1sec_nb-;/南北时间减1if(sec_nb=5)&(dx_nb=0)&(shanruo=1) /东西黄灯闪 Green_dx=0;Yellow_dx=1;Buzz=1; if(sec_dx=5)&(dx_nb=1)&(shanruo=1) /南北黄灯闪 Green_nb=0;Yellow_nb=1;Buzz=1; if(sec_dx=0&sec_nb=5) /当东西倒计时到0时,重置5秒,用于黄灯闪烁时间 sec_dx=5;shanruo=1;if(sec_nb=0&sec_dx=5)/当南北倒计时到0时,重置5秒,用于黄灯闪烁时间 sec_nb=5;shanruo=1;if(dx_nb=0&sec_nb=0)/当黄灯闪烁时间倒计时到0时, Buzz=1;P2=0x00;/重置东西南背方向的红绿灯Green_nb=1;Red_dx=1;dx_nb=!dx_nb;shanruo=0;sec_nb=set_timenb;/重赋南北方向的起始值sec_dx=set_timenb+5;/重赋东西方向的起始值if(dx_nb=1&sec_dx=0)/当黄灯闪烁时间到P2=0X00;/重置东西南北的红绿灯状态Green_dx=1;Red_nb=1;dx_nb=!dx_nb;shanruo=0;sec_dx=set_timedx;/重赋东西方向的起始值sec_nb=set_timedx+5;/重赋南北方向的起始值/外部中断0void int0(void) interrupt 0 using 1 /只允许东西通行TR0=0;/关定时器P2=0x00;Green_dx=1;/东西方向置绿灯Red_nb=1;/南北方向为红灯Buzzer_Indicate=0;sec_dx=00;/四个方向的时间都为00sec_nb=00;/外部中断1void int1(void) interrupt 2 using 1 /只允许南北通行 TR0=0;/关定时器P2=0x00;Green_nb=1;/置南北方向为绿灯Red_dx=1;/东西方向为红灯Buzzer_Indicate=0;sec_nb=00;/四个方向的时间都为00sec_dx=00;void logo()/开机的Logo - - - - for(n=0;n50;n+) P0=0x40; P1=0xfe;delay(1); P1=0xfd;delay(1);P1=0Xfb;delay(1);P1=0Xf7;delay(1); P1 = 0xff; void watchdog() /*看门狗子函数*/ WDT_CONTR=0xE1; /*喂狗指令*/ led1=0; delay(500); led1=1; while(1) delay(1000); void Buzzer() if(Buzzer_Indicate=1) Buzz=!Buzz; else Buzz=1;void delay(int ms)/延时子程序uint j,k;for(j=0;jms;j+)/延时ms for(k=0;k124;k+);/大约1毫秒的延时附2:系统原理图
展开阅读全文