用单片机设计交通灯课设报告(汇编和C语言).doc

上传人:wux****ua 文档编号:9048632 上传时间:2020-04-02 格式:DOC 页数:17 大小:626KB
返回 下载 相关 举报
用单片机设计交通灯课设报告(汇编和C语言).doc_第1页
第1页 / 共17页
用单片机设计交通灯课设报告(汇编和C语言).doc_第2页
第2页 / 共17页
用单片机设计交通灯课设报告(汇编和C语言).doc_第3页
第3页 / 共17页
点击查看更多>>
资源描述
单片机原理及接口技术课程设计报告设计题目:人车分行交通信号指挥灯的控制学 号: 姓 名: 指导教师: 信息与电气工程学院 二零一五年六月人车分行交通信号指挥灯的控制在生活中,我们在各个路口基本都可以看到交通信号灯,道路交通信号灯是交通安全产品中的一种类别,是为了加强道路交通管理,减少交通事故的发生,提高道路使用效率,改善交通状况的一种重要工具。近年来,随着科技的飞速发展,电子器件也随之广泛应用,其中单片机也不断深入人民的生活当中。本模拟交通灯系统利用单片机AT89C51作为核心元件,实现了通过信号灯对路面状况的智能控制。系统具有结构简单、可靠性高、成本低等优点,有广泛的应用前景。本模拟系统由单片机硬/软件系统,两位8段数码管和LED灯显示系统。和复位电路、时钟产生电路等组成,较好的模拟了交通路面的控制,利用单片机良好的控制功能来进行设计,应用更灵活,功能更强大,也更智能化。通过C语言编程,单片机做控制,加上8个LED灯指示交通红绿灯、8155控制数码管倒计时显示来实现基本功能,外加处理突发中断情况的的按钮来模拟儿童过马路的情况。1设计任务结合实际情况,基于AT89C51单片机设计一个人车分行交通信号指挥灯。该系统应满足的功能要求为:(1) 交通红绿灯显示;(2) 倒计时设置;(3) 儿童过马路提示。主要硬件设备:AT89C51单片机、8个LED灯、两个数码管显示器、蜂鸣器、8155I/O口扩展芯片列写交通灯变化表表1-1 利群超市门前路口交通灯变化情况表 状态延时(s)状态 维持时间亮:人行红灯,主路绿灯亮辅路红灯亮30s亮:人行红灯,主路黄灯亮辅路红灯亮3s亮:人行绿灯,主路红灯亮辅路红灯亮17s亮:人行红灯,主路红灯亮辅路绿灯亮46s亮:人行红灯,主路红灯亮辅路黄灯亮 3s2. 整体方案设计人车分行交通信号指挥灯以AT89C51单片机作为整个系统的控制核心,应用其强大的接口功能,构成整个人车分行交通信号指挥灯控制的硬件系统。该系统用8个LED灯模拟东西南北红黄绿灯以及人行红绿灯,用AT89C51的P1口的8个管脚与其连接,两位数码管显示器显示各个状态的倒计时,而数码管显示器由8155的PA口和PB口控制,PB口控制数码管的段选码,PA口控制数码管的位选码,实现动态显示,节省管脚的使用,AT89C51的管脚P3.2分别连接应对突发状况的紧急开关。本系统硬件主要AT89C51单片机、LED输出模块、拨码开关、两位数码管显示器四部分组成。各模块的主要功能如下:(1) AT89C51作为整个系统的控制核心,通过编程控制各个模块;(2) 8155的功能是控制数码管显示器; (3) LED输出模块的功能是指示两个路口的红黄绿灯、人行红绿灯灯变化情况;(4) 数码管显示器的功能是显示倒计时时间; (5) 拨码开关的功能是在儿童过马路时按下,防止发生交通事故。系统的整体设计方案设计图如图2-2所示。图2-2 交通灯整体设计图3. 系统硬件电路设计3.1复位电路 如图3-1是复位电路图 复位电路3.2时钟产生电路 如图3-2是时钟产生电路 时钟产生电路3.4 AT89C51单片机的基本介绍(1) 其基本引脚如图3-4所示图3-4 AT89C51单片机引脚图(2) 管脚说明:a) VCC:供电电压。b) GND:接地端。c) P0口:是一个8位漏极开路的双向I/O口,每脚可吸收8个TTL门流:可用于外部程序数据存储器,可以被定义为数据/地址的低八位。d) P1口:是一个由内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4个TTL门电流。e) P2 口:P2 是一个带有内部上拉电阻的8 位准双向IO 口,P2即可作为通用的I/O口使用,也可以作为片外存储器的高8位地址总线,与P0口配合,组成16位片外存储器单元地址。f) P3 口:P3 口是一组带有内部上拉电阻的8 位准双向I0 口。P3 口除了作为通用的I/O口使用之外,每个引脚还具有第二功能,具体分配如表3-5所示。表 3-5 P3口第二功能的引脚表端口引脚第二功能:P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2INT0*(外中断0)P3.3INT1*(外中断1)P3.4T0(定时计数器0外部输入)P3.5T1(定时计数器1外部输入)P3.6WR*(外部数据存储器写选通)P3.7RD*外部数据存储器读选通)g) RST:复位输入;当振荡器复位器件时,要保持RST引脚两个机器周期的高电平时间。h) ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地址字节。ALE端以固定不变的频率周期输出正脉冲信号,可用于对外部输入的脉冲计数或定时。i) PSEN*:外部程序存储器的选通信号。j) EA*/VPP:当/EA保持低电平时,访问外部程序存储器;保持高电平时,访问内部程序存储器。k) XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。l) XTAL2:来自反向振荡器的输出。3.4 倒计时6位数码管显示电路LED显示屏作为大型显示设备的一种,具有亮度高、价格低、寿命长、维护简便等优点。LED数码管的结构简单,分为七段和八段两种形式,也有共阳和共阴之分。以八段共阳管为例,它有8个发光二极管(比七段多一个发光二极管,用来显示dP,即点),每个发光二极管的阳极连在一起。这样,一个LED数码管就有I根位选线和8根段选线,要想显示一个数值,就要分别对它们的高低电平来加以控制。为方便起见,本文主要讨论共阳八段LED数码显示管,其他类形的显示管与其类似,如图3-6所示。图3-6 LDE数码管3.5 8个LED灯输出模块电路对于槐云路口分南北直行,东路叉行,东西南北人行三个状态,南北直行由黄绿红灯为L1、L2、L3表示;东路叉行由黄绿红灯为L5、L6、L7表示;东西南北的人行绿灯为L4表示;儿童过马路的情况用L8表示。共8个LED灯,为共阳极;L1-L8阴极依次连接到P1.7-P1.0,阳极都接到电源VCC上。3.6 开关按钮 防止儿童过马路时发生交通事故,故设置有开关按钮,由AT89C51的P3.2的INT0*接收中断,连接一个开关K。4. 系统程序设计4.1 主程序及控制子程序流程图主程序及控制子程序工作流程:路口共五个状态:人行绿灯、东路叉行绿灯、东路叉行黄灯、南北直行绿灯、南北直行黄灯。开始先确定指示灯倒计时时间,扫描显示2个数码管,扫描满20次的话倒计时时间减1,;扫描不满20次的话返回继续扫描数码管;再确定路口指示灯状态,调用之前定义的数组变量,并依据状态顺序选择8个LED灯的亮灭。图4-1 系统主程序流程系统主程序流程图如图4-1所示。4.2 PID调节子程序流程图4.2 中断子程序流程图中断子程序工作流程:外部中断0:开启定时器0,如图4-2所示。图4-2 外部中断0程序流程图定时器0:每次中断前计时50ms,计时4次总计200ms,使p3.0输出电平每200ms变化一次,并循环,如图4-3所示。图4-3 定时器0中断程序流程图 4.3 控制子程序流程图定时器1:每次中断前计时50ms,计时20次共1s,每经过1s交通灯计时数据减小,当交通灯计时数据减小为0时,交通灯计时数据,数码管显示以及灯的显示情况进入下一个状态,状态循环,如图4-4所示。 控制子程序流程图如图4-4所示。图4-4 定时器1中断程序流程图5. 系统调试5.1 Proteus软件仿真调试(1) 一开始用Proteus仿真时,由P0口控制数码管的段选,而每次选择开关数码管的位选信号改变较快,使得本应该控制前一位数码管的段选信号却能在后一位数码管上显示出来,。后改用P2口控制数码管段选信号,P3.6、P3.7做片选信号。P1口做LED灯的控制信号。(2) 在Proteus仿真软件中2个独立的7SEG-COM-ANODE型号的数码管和单片7SEG-MPX6-CA的用法不同,前者是理想的数码管(即不同于实际数码管在关断时仍有余晖的现象,该型数码管只在位选选中或电源端供电时才亮),而后者由于存在余晖现象,所以运行时表现出每位数码管都亮的现象。(3) 在循环控制数码管计数自减1时,只注意循环次数,忘记在循环体中给数码管赋新的值,使得数码管显示的数字没有隔一秒自减1,只在下一个循环时突然减小。改进后,在循环体中每次循环都对倒计时的数字自减1。(4)用三组两位数码管倒计时模拟十字路口红绿灯倒计时,用红绿灯分别模拟东西南北直行的状态灯。(5) 用LED灯模拟硬件中儿童过马路状况下。(6) 经过数次调试,最终用Proteus仿真软件实现了模拟十字路口交通灯的控制。 5.2 硬件调试硬件调试是利用开发系统、基本测试仪器(万用表、示波器等),检查用户系统硬件中存在的故障。硬件调试分为静态调试与动态调试两步进行。(1) 使用菊阳仿真器和菊阳仿真软件时,没有对编译器初始化,所以不能实现单片机和PC机的通讯。(2) 程序中使用跳沿触发中断服务子程序,如果把开关打到低电平位置上,于是在实验箱刚上电时,P3.2中断引脚会先置高电平,再被开关拉到低点电平,相当于产生了负跳沿,所以一开机就进入中断程序。为了避免出现上述现象,在程序中先把中断触发开关置高电平,这样就能使得中断引脚不会被拉低,没有误动作。6. 程序清单#include reg52.hsbit led_red1=P32;sbit led_green1=P31;sbit led_yellow1=P30;sbit led_red2=P36;sbit led_green2=P35;sbit led_yellow2=P34;sbit renxingdao=P33;sbit key=P37;/*数码管*/unsigned char shumaguan10=0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09;/*数码管*/*变量定义区*/unsigned int time0=0;/时间变量unsigned int time1=0;/时间变量unsigned int second=99;unsigned int second_2=0;unsigned int num1=30,num1_1=0;unsigned int gewei_1=0;unsigned int shiwei_1=0;unsigned int key_fig=0;/*变量定义区*/void main() TMOD=0X11;TH0=(65535-50000)/256; /每一次定时50msTL0=(65535-50000)%256;ET0=1; TH1=(65535-1000)/256; /每一次定时1msTL1=(65535-1000)%256;ET1=1; TR0=1;TR1=1; EA=1; led_red1=1; led_red2=0; led_green1=0; led_green2=1; led_yellow1=1; led_yellow2=1; while(1) if(led_red1=0&led_red2=0) renxingdao=0; else renxingdao=1; if(key=0&key_fig=0) led_red1=0; led_red2=0; led_green1=1; led_green2=1; led_yellow1=1; led_yellow2=1; num1_1=num1; second_2=second; key_fig=1; TR0=0; else if(key=1&key_fig=1&second_269) led_red1=1; led_red2=0; led_green1=0; led_green2=1; led_yellow1=1; led_yellow2=1; second=second_2; num1=num1_1; key_fig=0; TR0=1; else if(key=1&key_fig=1&second_266) led_red1=1; led_red2=0; led_green1=1; led_green2=1; led_yellow1=0; led_yellow2=1; second=second_2; num1=num1_1; key_fig=0; TR0=1; else if(key=1&key_fig=1&second_249) led_red1=0; led_red2=0; led_green1=1; led_green2=1; led_yellow1=1; led_yellow2=1; second=second_2; num1=num1_1; key_fig=0; TR0=1; else if(key=1&key_fig=1&second_23) led_red1=0; led_red2=1; led_green1=1; led_green2=0; led_yellow1=1; led_yellow2=1; second=second_2; num1=num1_1; key_fig=0; TR0=1; else if(key=1&key_fig=1&second_2=0) led_red1=0; led_red2=1; led_green1=1; led_green2=1; led_yellow1=1; led_yellow2=0; second=second_2; num1=num1_1; key_fig=0; TR0=1; timer0() interrupt 1TH0=(65535-50000)/256;TL0=(65535-50000)%256;time0+; /每50毫秒加一if(time0=20)time0=0; if(second=99) num1=31; / num1为要显示的秒数 P3=0XFF; /熄灭所有的灯 led_red1=1; led_red2=0; led_green1=0; led_green2=1; led_yellow1=1; led_yellow2=1; else if(second=69) num1=4; led_red1=1; led_red2=0; led_green1=1; led_green2=1; led_yellow1=0; led_yellow2=1; else if(second=66) num1=67; led_red1=0; led_red2=0; led_green1=1; led_green2=1; led_yellow1=1; led_yellow2=1; else if(second=49) led_red1=0; led_red2=1; led_green1=1; led_green2=0; led_yellow1=1; led_yellow2=1; else if(second=4) led_red1=0; led_red2=1; led_green1=1; led_green2=1; led_yellow1=1; led_yellow2=0; else if (second=0) second=100; second-; num1-; if(num1=0) num1=0;timer1() interrupt 3TH1=(65535-1000)/256;TL1=(65535-1000)%256; shiwei_1=num1/10; gewei_1=num1%10; switch(time1) case 0: P2=0xff; P1=shumaguangewei_2; break; case 1: P2=0xff; P1=shumaguanshiwei_2; break; case 2: P2=0xfb; P1=shumaguangewei_1; break; case 3: P2=0xf7; P1=shumaguanshiwei_1; break; time1+; if(time1=4) time1=0;7.小结本次课程设计题目为槐云路口人车分行交通信号灯系统,具体设计步骤是,先在KAIL中创建一个工程,在工程中用C语言进行编程,具体编程思路是在定时器中完成及时,从而完成对输出数据、输出灯状态的操作,同时再通过数码管译码及动态扫描,完成输出数据在数码管上的显示,完成编程并编译通过后,再通过JY2X00 IDE软件进行硬件仿真,如有问题再进行程序的修改,直到硬件功能的实现,最后再在Proteus软件中画出仿真电路再进行软件仿真,直到实现功能即可。本次课程设计遇到了如下问题,首先在未软件仿真的情况下,直接将程序拷了进去进行了硬件仿真,虽然2个LED灯实现了红绿灯的基本功能,即东西叉行红绿黄,南北直行红绿黄,人行白灯,但是倒计时数码管却二位全亮,并没有实现倒计时的功能。经过小组成员讨论后发现,P0口无法实现给高电平,改了之后发现还是不行,通过探讨发现是接错了引脚,实现了数码管的倒计时显示。在软件仿真方面也出现了不会画总线的问题,最终通过查阅网上的相关资料得以解决并成功的画出电路图并实现了软件仿真。这次课程设计收获很多,首先能利用了C语言编程,学会了用Proteus软件进行画仿真图并进行软件仿真,还进一步熟练了JY2X00 IDE软件的硬件仿真,通过努力探讨和学习,和对问题的发现与解决,使学到了很多课本上没有的东西,加强了动手能力,收益甚多。对于以后的展望方面,自然是希望多做些像这样能锻炼动手能力和自学能力的课程设计,对于单片机还研究的不是很多,希望能借用这个课程设计的机会以后对单片机进行更深入的研究。
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!