资源描述
1 交通灯的设计目的及方案介绍1设计课题的目的 通过单片机的课程设计,加深和巩固单片机知识,提高综合及灵活运用所学的知识来解决日常生活及工业控制的能力,提高针对知识的需要,选择和查阅其他资料书籍、灵活运用其中知识及自学能力,提高组成系统、编程、制版、调试的全方面能力,通过对课题设计方案的分析、选择、比较,熟悉单片机运用于系统开发、研制的过程,软硬件设计的方法、内容及步骤。培养发现问题、分析问题和解决问题的能力以及创新能力和创新思维的提高。1.2设计要求及说明 设计一个具有特定功能的十字路口交通灯。该交通灯上电或按键复位后能自动显示系统提示符“P.”, 进入准备工作状态。按开始键则开始工作,按结束键则返回“P.”状态。要求甲车道和乙车道两条交叉道路上的车辆交替运行,甲车道为主车道,每次通车时间为60秒,乙车道为次车道,每次通车时间为30秒,要求黄灯亮3秒,并且1秒闪烁一次。有应急车辆出现时,红灯全亮,应急车辆通车时间10秒,同时禁止其他车辆通过。1.3方案介绍及工作原理1.3.1 方案介绍系统整体框图如图1.1所示:1.3.2 工作原理 该系统采用的是使用现有单片机最小的硬件电路和P3口控制交通灯,P2口控制数码管各位,P0口控制数码管各段,P1.0、P1.1口线控制数码管各位和P1.2口接收紧急信号电路集合而成,构成交通灯的总体电路,即交通灯。通过对单片机编写对应的程序,控制各个部分,达到预期的效果。2 交通灯的硬件设计及PCB图2.1 交通灯原理图电路原理图如附录一,电路原理图由各功能模块组成。2.2 交通灯各模块功能2.2.1 单片机最小系统电路 单片机最小系统由CPU,复位电路,振荡电路三部分构成,CPU采用的是Atmel公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容的AT89S52芯片。AT89S52具有以下标准功能: 8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结, 单片机一切工作停止,直到下一个中断或硬件复位为止。8 位微控制器 8K 字节在系统可编程 Flash AT89S52 。复位电路用于产生复位信号,通过RST引脚送入单片机,进行复位操作。而复位电路又可以分为上电复位,按键电平复位和按键脉冲复位这三种,在这次设计中,选用的是按键电平复位电路。其功能为:上电的同时,RC回路开始充电,RST引脚端出现正脉冲,只要RST段保持10ms以上的高电平,就能够使单片机有效的复位。振荡电路是从AT89S52的XTAL1和XTAL2接入时钟信号的。由外接晶振及电容C1,C2所构成的并联谐振电路接在放大器的反馈回路中。在设计电路板时为减小干扰,晶振和电容应该尽可能的与单片机近些,以减少寄生电容,更好的保证振荡器稳定可靠。其功能为:产生振荡脉冲,为单片机运行提供时序。 上拉电阻是为了拉高电压,增强IO口的驱动能力。2.2.2 显示电路设计单片机应用系统最常用的显示器是LED(发光二极管显示器)、LED(液晶显示器)。这两种显示器可显示数字、字符及系统的状态。它们的驱动电路简单、易于实现且价格低廉,因此,得到了广泛应用。本次设计要显示数字倒计时,用数码管动态显示。将LED显示器各位数码管的所有段控端相应地并联在一起,由P0的8个口线控制,形成段选线多路复用,而各位数码管的共阳极分别由P2口的其中四个口线控制,实现各位的分时选通。共阳极数码管字形代码表如表2.1所示。表2.1 共阳极数码管字形代码表字型共阳代码字型共阳代码0C0H682H1F9H7F8H2A4H880H3B0H990H499HP.0CH592H灭FFH2.2.3 数码管驱动电路设计本设计采用的数码管驱动是采用PNP三极管驱动,有效增强数码管显示的亮度。当给P2口线与三极管的发射极相连,用于连接数码管位控与三极管的集电极相连,三极管的基极通过电阻与地相连,当给P2高电平的同时,输出高电平信号控制数码管的显示位显示。2.2.4 紧急按键电路设计紧急信号为低电平,通过设计紧急按键电路与P1.2口相连接,紧急信号通过P1.2输入单片机内部,当紧急事件过去后,单片机回到原来的地方继续工作。2.2.5 程序下载口电路设计ATMEL公司的89S5XX提供了支持ISP(在线下载程序) 并口下载功能,它只需一块八位锁存器就可以实现了,原理如下:MOSI:数据串行输出 (S52P1.5脚),MISO:串行数据输入(S52 P1.6脚),SCK:同步控制时钟(S51 P1.7脚),RST接单片机复位脚,当有足够的高电平使S51处于复位状态,它就会开启读写程序功能。2.2.6 电源电路设计因为本次设计所需电源的模块有单片机最小系统,数码管显示器,二极管交通灯,它们所需电源都为+5V,因而电源设计只需设计一个+5V电源。为了供电方便,我们直接在插孔处引一根数据线用USB接口供电。 2.2.7 交通灯元器件清单 交通灯元件清单如表2.2。表2.2 交通灯元件清单元件名称元件个数元件特性AT89S521电阻25 4.7K3 1K1 200电容2 33pF极性电容1 22FLED数码管2 4位一体共阳晶振1 12M发光二极管4 红色4 绿色按键9 四角开关1 六角USB电源接口12.3 PCB设计图我们可以根据设计电路原理图,以购买的元器件的尺寸、引脚,仔细封装各个元器件,如果不能在库里找到的我们自己根据实际需要,自己创建封装。2.3.1元器件布局图 交通灯元器件布局图如附录二所示2.3.2PCB图根据电路原理图,将每个元器件放置在适当的位子,按照PCB画线的原则,以正确,美观,认真将各个元器件连接起来。PCB图如附录三所示。3 交通灯的软件设计3.1 单片机资源分配由电路原理图可知,单片机AT89S52的资源分配如下:第9脚RST接复位电路和下载口复位端;第18脚XTAL1、第19脚XTAL2接振荡电路;P0口用于数码管显示器的段控控制;P1口接数码管的位控控制 P3口接LED灯3.2 软件系统各模块功能3.2.1 显示P.模块 该模块的功能是在单片机上电或者复位后,在数码管上显示“P.”,此时系统处于等待工作状态。在按下开始按钮后,跳出此模块,进入正常的工作状态。3.2.2 亮灯模块 该模块的功能是控制交通灯的亮与灭,在程序中,先控制主路的绿灯亮57S,再黄灯闪烁3秒,即每秒亮半秒灭半秒,同时支路上的红灯亮60S;再控制支路上的绿灯亮27S,再黄灯闪烁3秒,即每秒亮半秒灭半秒,同时主路上的红灯亮30S。正常情况下,随着主程序循环。当紧急按钮按下后,控制两个路口的红灯同时亮十秒,待紧急时间过去,主动跳出。3.2.3 显示模块 该模块的功能是主路和支路上的时间显示。当系统开始运行时,同时在主路和支路上显示60S的倒计时,待60S过后,同时在主路和支路上显示30S的倒计时,正常情况下,随着主程序循环。当按下紧急按钮之后,同时在主路和支路上显示10S的倒计时,之后主动跳出。3.2.4 紧急按钮模块 该模块的功能是在出现紧急情况下,按下紧急按钮,送入单片机信号,系统进入紧急状态,在数码管显示10S倒计时,同时主路和支路的红灯都亮。待10S过后,自动跳出。3.2.5 延时模块 该模块的功能是为其他各模块提供延时。不论是数码管显示的延时,红绿灯亮的延时,黄灯的闪烁,都需要此模块来提供延时。采用延时子程序,延时50ms。3.3 程序流程框图交通灯程序流程框图如图3.1所示。 图3.1 程序流程框图3.4 交通灯程序清单 交通灯程序清单如附录四所示。4 交通灯设计仿真4.1 仿真原理图仿真是我们检测我们的硬件设计和软件与硬件的结合好坏的重要方法,也能为我们做实物提供保障。我们采用Kiel结合Proteus仿真,仿真电路原理图如附录五所示。4.2 仿真结果(1)当开始键按下时,数码管显示“P.”。如图4.1所示。图4.1 “P.”显示(2)当按开始按钮时,数码显示管和交通灯均开始正常工作。如图4.2所示。图4.2 正常工作显示(3)当紧急按钮按下时,数码显示管和交通灯均按照计划工作。如图4.3所示。图4.3 紧急情况下显示5 设计体会及出现的问题5.1 设计体会通过这次对交通灯的设计,我们更加认识了单片机,更加熟悉了对单片机的应用。在这次设计的过程中,从电路原理图的设计,就透彻的理解了单片机最小系统的构成及其工作原理。从数码管的选择中,懂得了可以采用不同的元器件,只要我们运用相应的程序,就能达到同样的效果。从三极管的应用中,发现了理论跟实践存在的巨大差别。只有实践才能检验所学的理论,才能发自己对理论认识的误区和盲点。在软件的设计过程中,收获更大。通过此次设计程序,透彻的明白了每一个指令的应用方法和功能,很好的统一复习了单片机的指令系统。也正是在运用中也发现了自己对部分指令的错误认识和误区,在改正错误中获得了收获。在实验的基础上,再一次对keil软件进行了一次全面的运用,更加熟悉了keil软件的各项功能。在做实物的过程中,很好的锻炼了自己的动手能力,同时也提高了自己发现问题,解决问题的能力。当最终看到自己的成果握在手中时,有一种非常美妙的成就感,也激发了自己的学习兴趣。增强了自信,培养了自己的各个方面的能力。5.2 设计中出现的问题 在本次试验中,由于理论和实践经验缺乏,出现了很多问题。首先是先到倒计时的问题,我设计了1秒钟的子程序,然后再按键功能1中调用它,同时在最后3秒钟闪烁灯,后来发现这样根本不能实现灯闪烁一秒,而是两秒,针对这个问题,我就将1秒钟的子程序改为0.5秒,然后再程序里面两次调用它。其次出现了按了一个键实现了功能不能跳往另外一个键功能程序,我就想到了要分别在键功能程序里面再调用子程序,这个问题就解决了。最后在应急的时候我只想到了在应急里面循环,在老师的提点下,我想到了应急之后应该恢复原来的交通秩序,这个就要牵扯到现场的保护和恢复,于是我马上联想到刚学完不久的中断知识,首先我想用外部中断,但是发现外部中断的两根口线已经被LED灯占用,然后我就想到要用定时器中断,编好以后,发现又有新的问题出现了。6 鸣谢 附录一原理图 附录二 程序清单 附录三仿真电路图 附录四PCB图附录二;*;设计者:XX;设计日期:2010年12月24日;*;堆栈栈底:7FH;*;LED数码管设置:;P0.0-P0.7接段控线,分别接a,b,c,d,e,f,g,dp.;P2.0-P2.7接位控线,分别接(从右至左)LED1-LED8;显示缓冲区:LED1-LED8分别对应78H-7FH;*;独立式键盘:;八个按键S0-S7分别接P1.0-P1.7;*;LED流水灯设置:;八个LED灯LED1-LED8分别接P3.0-P3.7;*;项目名称:交通灯;KEYA (S0键键功能程序);KEYB (S1键键功能程序);KEYC (S2键键功能程序);*;常数表格;KKK(系统显示四位序号表);TAB(共阳数码管字型代码表);* ;子程序;DELAY(延时10ms子程序);DL(延时2ms子程序);KEY(键扫描子程序);LOOP0(P1.0口数据处理子程序);LOOP1(P1.1口数据处理子程序);LOOP2(P1.2口数据处理子程序);DISP(数码管显示子程序);KK0(0.5秒显示处理程序);*;起始程序区:ORG0000H LJMP MAIN ORG0030H;*程序初始化*MAIN: MOVSP, #7FH;堆栈初始化MOVR0, #20H ;对RAM区清零 MOVR2, #96QL:MOVR0, #00H INCR0DJNZR2, QL MOVP2, #7FH ;送位控MOVP0, #0CH;送段控显示P.;*监控程序*KEY: LCALL KEYK;监控程序 JB20H.0, LOOP0JB 20H.1, LOOP11JB 20H.2, LOOP22LJMPKEYLOOP11: LJMP LOOP1LOOP22: LJMP LOOP2;*键功能程序*LOOP0: MOVR3, #60;甲通道显示初值60秒 MOV R5, #57;乙通道显示初值57秒MM0:MOVP3, #33H;显示交通灯,甲通道绿,乙通道红LCALL KK0;调显示程序LCL0:LCALL KK0JNB P1.0, LCL0 ;判按键0是否按下 JNB P1.1, LOOP1;判按键1是否按下JNB P1.2, LL0;判按键2是否按下LJMP LK0LL0: LCALL LOOP2LK0:DEC R5 DEC R3CJNE R5, #00H,MM0M1: MOVR3, #03;等于3时显示乙通道黄灯处理 MOVR5, #03MM1: MOVP3, #33HLCL1:LCALL KK0 JNB P1.1, LOOP1JNB P1.2, LL1 JNB P1.0, LCL1MOVP3, #077H LCALL KK0LJMP LK1LL1: LCALL LOOP2LK1:DEC R3DEC R5CJNE R3, #00H,MM1M2: MOV R3, #30 ;乙通道亮绿灯,甲通道亮红灯 MOV R5, #27MM2:MOVP3, #0CCH ;点亮交通灯LCALL KK0LCL2:LCALL KK0JNB P1.0, LCL2 JNB P1.1, LOOP1JNB P1.2, LL2 LJMP LK2LL2: LCALL LOOP2LK2:DEC R3DEC R5 CJNE R5, #05H,MM2M3:MOVR3, #03 MOVR5, #03MM3: MOVP3, #0CCH;等于三秒时甲通道黄灯处理LCL3:LCALL KK0JNB P1.0, LCL3 JNB P1.1, LOOP1JNB P1.2, LL3 LJMP LK3LL3: LCALL LOOP2LK3:MOV P3, #0DDHLCALL KK0DEC R3DEC R5CJNE R3, #00H, MM3;等于三秒时乙通道黄灯处理LJMP LOOP0;没有按键按下则在此程序循环LOOP1: MOVP3, #0FFH;按键1按下处理程序 LCALLFUWEI JNB P1.0, KEY0JNB P1.2, LOOP2 LJMP LOOP1 ;没有按键按下则在此程序循环LOOP2:MOV 24H, R3;按键2按下处理程序 MOV 25H, R5;将原寄存器内容保存 MOVR3, #10 MOVR5, #10 MOVR7, #00HMOVP3, #55HMM5:LCALL KK0 LCALL KK0JNB P1.1, LOOP1DEC R3DEC R5 CJNE R3,#00H,MM5MOV R3, 24H;返回时将原寄存器内容还原MOV R5, 25H;保护现场RET;紧急十秒处理后返回KEY0: LJMP LOOP0KEY1:LJMP KEY;*显示子程序*DISP: PUSH DPH;保护DPTR内容 PUSHDPL PUSHACC PUSHPSW CLRRS0 SETBRS1 MOVR1,#78H MOVR5,#08H MOVR2,#0FEHDISP1: MOVA,R1 MOVDPTR,#TAB MOVCA,A+DPTR MOVP0,A MOVP2,R2 LCALL DL MOVA,R2 RLA MOVR2,A INCR1 DJNZR5, DISP1DISP2: POPPSW POPACC POPDPL POPDPH RET;*显示处理5秒钟处理程序*KK0:MOVDPTR,#KKKMOVR4,#08HMOVR0,#7FHMOVR6,#60G1: CLRA MOVCA,A+DPTRMOVR0,A DEC R0 INC DPTR DJNZR4, G1KK3:MOVA, R3MOVB, #10DIV ABMOV 7DH, AMOV7CH, BKK4: MOVA, R5MOVB, #10DIV ABMOV 79H, A MOV78H, BLS:LCALL DISPDJNZ R6, LS RET;*复位程序* FUWEI: MOVP2, #7FH;位控MOVP0, #0CH;段控显示P.RET;*键扫程序*KEYK: LCALLKEYSAO JZ EXTI LCALL DELAY LCALLKEYSAO JZEXTI MOVB,20HPSF: LCALLKEYSAO JZ EXTI1 LCALLDELAY LJMP PSFEXTI1: MOV20H,BEXTI: RETKEYSAO: PUSH PSW SETBRS0MOVA, P1;将P1口内容送ACPL AMOV20H, A ;按键值保存POPPSWRET;*制表区*KKK: DB 10,10,6,0,10,10,6,0 TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0CH;*延时区*DELAY:MOVR2,#10DL0:MOVR3,#0FFHLLL1:NOPNOP DJNZR3,LLL1DJNZR2,DL0RET DL:MOVR7, #02HDL1:MOVR6, #0FEHDL2:DJNZR6, DL2DJNZR7, DL1RETEND 17
展开阅读全文