《十字路口交通灯Proteus仿真(21页).doc》由会员分享,可在线阅读,更多相关《十字路口交通灯Proteus仿真(21页).doc(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、- 微机原理与接口技术课程设计报告 题目:十字路口交通灯设计 学院:信息工程学院 专业:通信工程 目录 1、摘要.12、硬件电路图.2 3、AT89C51功能介绍.34、交通灯程序设计思路.55、交通灯运行流程图.66、源代码函数说明.67、交通灯设置红绿灯时间结果图.88、心得与体会.9 9、源程序代码.10 -第 18 页- 摘要十字道口的红绿灯是交通法规的无声命令,是司机和行人的行为准则。十字道口的交通红绿灯控制是保证交通安全和道路畅通的关键。当前,国内大多数城市正在采用“自动”红绿交通灯,它具有固定的“红灯绿灯”转换间隔,并自动切换。它们一般由“通行与禁止时间控制显示、红黄绿三色信号灯
2、和方向指示灯”三部分组成。通常,生活中常见的红绿灯控制为,红灯六十秒,绿灯四十五秒,黄灯三秒等,因道路,车辆,城市交通规划而异,此次,基于proteus仿真十字路口的交通灯控制系统,设定南北方向绿灯15秒,黄灯5s,东西方向绿灯10s,黄灯5s。系统基于MSC-51系列单片机89C51为中心器件来设计交通灯,显示器件为LED红绿灯,LCD数码管。采用c51编程,简单易懂,将功能模块化,除了可以实现红绿灯按要求变化,还通过proteus里的按钮,设置了键盘函数,可以按要求调整红绿灯亮的时间,并且还有重置(初始化)按钮。一. 功能概述1. 设计任务:交通灯的硬件设计和软件设计2.设计目的:(1).
3、初步了解和认识51单片机的工作原理,引脚图。(2).掌握单片机相关接口技术和相关外围芯片的特性。 ( 3 ).通过实际的设计程序,查找资料,调试程序,熟悉keil和proteus软件仿真,理解并熟悉模块化程序设计方法和调试。3. 基本要求:利用单片机的定时器产生秒信号,控制十字路口的红、绿、黄灯交替点亮和熄灭,并且用 4 只 LED 数码管显示十字路口两个方向的剩余时间。当东西方向亮绿灯时,南北方向红灯亮起;反之,如果南北方向亮绿灯,同时东西方向亮绿灯;绿灯亮时车辆行驶,红灯亮时车辆停止。即在同一时间内保证只有两个对应方向的车辆可以行驶。要求能用按键设置两个方向的通行时间(绿、红等点亮的时间)
4、和暂缓通行时间(黄灯点亮的时间)。系统的工作应符合一般交通灯控制的要求。4. 设计方案设计系统单片机 89C51 为中心器件来设计交通灯控制器,系统实用性强、操作简单、扩展性强、成本较低。本设计就是采用单片机模拟十字路口交通灯的各种状态显示。利用单片机完成交通信号灯控制器的设计,该交通信号灯控制器由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,数码管显示剩余时间。红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。用红、绿、黄发光二极管作信号灯,8 管共阴极数码管显示剩余时间,矩阵键盘用来设置交通灯的显示时间和状态。二 硬件电路图一总体电路图
5、二部分电路图。 VCC:供电电压GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。P2口:P
6、2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于2 内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部
7、上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。选用P0口驱动数码管,由于选用的数码管是共阴极两位数码管,因此P0口必须接上拉电
8、阻才能驱动数码管显示。选用P1口驱动LED红绿灯亮,如此时P1=ox41;选用P2口来产生选通信号,用动态显示驱动的时候P2.0、P2.1、p2.2、p2.3为低电平对应的数码管点亮。XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择。电容取30PF左右交通灯程序思路:包含计时功能、动态扫描、以及状态的切换。南北方向各连接了一个数码管,东西方向也各连接了一个数码管,因此定义两组显示时间nb
9、green,nbyellow,,dxgreen,dxyellow来分别表示南北东西绿灯时间,黄灯时间。为了让数码管正确显示时间,需要定义四个变量,shi1,ge1,shi2,ge2,将数码管中的“十位”和“个位”提取出来,用动态方式在数码管中显示出来,为了实现红绿灯状态的切换,定义了两个标志变量,count1,count2,通过判断标志变量的取值,来确定红绿灯和数码管显示的值。采用倒计时的方法,运用51单片机的计时电路,产生秒脉冲,当一个数码管的值倒计时到0时,切换成新的状态。状态表 南北方向 东西方向 序号状态 序号状态1绿灯亮15s,红黄灯灭1红灯亮20s,黄绿灯灭2黄灯亮5s,红绿灯灭3
10、红灯亮15s,黄绿灯灭2绿灯亮10s,红黄灯灭3黄灯亮5s,红绿灯灭系统结构图LED共阴极数码管显示LED红黄绿灯 89c511*4按钮控制流程图 开始 交通初始化,南北绿灯,东西红灯 定时器开始计时调用键盘按钮调用子程序源代码说明:1.延时函数:delay(int x)主要用来控制数码管动态显示,x控制延时长短。2.字路口剩余时间数码管显示函数:display(uchar,uchar,uchar,uchar);给P0东西南北方向的数码管的十位和个位送数据 例如,P2=oxfe,P2.0P2.7=11111110, W0=0,W1=W2=W3=1,(W0.W1,分别接上了南北数码管的控制端,W
11、2,W3分别接上了东西数码管的控制端),W0=0表示南北共阴数码管的十位有效,(共阴极数码管控制端低电平有效),显示shi1(南北数码管值的十位),同理,P2=oxfd,显示ge1(南北数码管值的个位), P2=oxfb,显示shi2(东西数码管值的十位),P2=oxf7,显示ge2(东西数码管值的个位)。3. 交通南北东西灯红黄绿工作顺序函数:traffic()。控制交通灯的运行规则count1=2,nbnum=15count2=1,dxnum=10调整状态,南北红灯亮值为15,东西绿灯亮值为10nbnum=0dxnum=5当南北绿灯减到0时,东西的红灯显示5snbnum=0dxnum=0南
12、北黄灯,东西红灯都减到0count=1nbnum=5调整状态南北黄灯亮,显示5snbnum=0dxnum=0南北红灯,东西黄灯都减到0count1=3,nbnum=15count2=3,dxnum=20调整状态,南北绿灯亮值为15,东西红灯亮值为20count2=2dxnum=5,nbnum=5调整状态,东西黄灯亮5sdxnum=0nbnum=5东西绿灯减到0时,南北红灯显示为5s4.键盘子函数mkeys()设定四乘四的键盘,从P3口输出数据,P3.0P3.3作为行输出,P3.4P3.7作为列输出。 P3.4 P3.5 P3.6 P3.7P3.0 暂停 (按钮1) 设置(按钮2)设置完成后重启
13、(按钮3)P3.1南北绿灯+(按钮5)南北绿灯(按钮6)南北黄灯+(按钮7)南北黄灯(按钮8)P3.2东西绿灯+(按钮1)东西绿灯(按钮1)东西黄灯+(按钮1)东西黄灯(按钮1)P3.3例如设计南北绿灯10s,黄灯3s,东西绿灯15s,黄灯3s1.先按下“设置”按钮2.然后按下“按钮5”和“按钮6”,观察南北数码管,此时显示的是绿灯的值。根据观察,设定好绿灯值为10。3.按下“按钮7”和“按钮8”,设定南北数码管,此时显示的是要设定的黄灯的值。根据观察,设定好黄灯值为34.按下“按钮9”和“按钮10”,设定东西数码管,此时显示的是要设定的绿灯的值。根据观察,设定好绿灯值为155.按下“按钮11
14、”和“按钮12”,设定东西数码管,此时显示的是要设定的黄灯的值。根据观察,设定好黄灯值为3结果如图:(1).初始时,南北绿灯,东西红灯(2).南北黄灯,东西红灯(3).南北红灯,东西绿灯。心得与体会通过这次课程设计,使我掌握了交通灯控制的基本思想与原理,学习到了一些有用的专业知识、专业技能分析和解决问题全面系统的锻炼。使我在单片机的基本原理、单片机应用系统开发过程,电路图的绘制以及在常用编程设计思路技巧的掌握方面都向前迈了一大步。期间我查阅了许多资料,看了许多例子,也自己试着学习编程与调试。决定做交通灯的设计,是因为它具有实用性,原理很简单,程序思想明确,proteus内置了许多红绿灯的元件,
15、如led灯,数码管等,程序编好后,出现了许多问题,如程序结果不是预期的结果,做好交通灯显示模块后,我参考网上的资料,加入了键盘函数,可以控制交通灯的运行,可以自己设置交通灯亮的时间,键盘的每个按钮的功能虽然简单,但是将其模块化却十分复杂,我体会到编程模块化思想的重要性,程序冗长但不失条理,添加一定的注释方便理解并运用。由于使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。但是在设计和调试的过程中,也发现了一些问题,不过设计也有很多不足之处,譬如红灯和绿灯的切换还不够迅速,红绿灯规则不效率还不是很高,键盘效率不太高等等,这需要在
16、实践中进一步完善,希望在今后的学习中学习更多新知识然后得以完善。当然,通过这次课程设计,我也发现了自身的很多不足之处,在以后的学习中,我会不断的完善自我,将课本中的知识运用到实际的程序运用中。源程序代码#include#define uchar unsigned char /定义unsigned char 为uchar#define uint unsigned int /定义unsigned int 为uintuchar code table= /共阴数码管管表0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x
17、5e,0x79,0x71,0xC9,0xFF,0x40;/设置码,测试码,不计时码void delay(uint x);/延时函数void display(uchar,uchar,uchar,uchar);/数码管显示函数void traffic();/交通灯函数uchar num,nbnum,dxnum, /nbnum表示南北方向数码管 dxnum表示东西方向数码管shi1,ge1,shi2,ge2,nbgreen,nbyellow,/南北方向的 绿灯时间 黄灯时间dxgreen,dxyellow,/东西方向的 绿灯时间 黄灯时间count1,count2,flag1,flag2; /南北标
18、记 东西标记void main()TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1; /c51的外部访问端接高电平ET0=1; TR0=1;/*初状态南北方向的绿灯亮15s黄灯亮5s,东西方向的红灯亮20s*/nbgreen=15; /南北方向 绿灯默认值为15s,黄灯默认时间为5snbyellow=5; dxgreen=10; /东西方向 绿灯默认时间为10s,黄灯默认时间为5sdxyellow=5; nbnum=nbgreen; /南北数码管初始显示绿灯时间 初始值15sdxnum=nbyellow+nbgreen;/东西
19、红灯时间=南北方向的绿灯时间+南北方向的黄灯时间 初始值20sshi1=nbnum/10; /南北数码管的十位ge1=nbnum%10; /南北数码管的个位shi2=dxnum/10; /东西数码管的十位ge2=dxnum%10; /东西数码管的个位P1=0x41;/初始状态:41H=10000010B,观察P1.0-1.7可知东西红灯亮 南北绿灯亮 /*这是交通灯运行过程,南北方向绿灯亮15s,然后亮黄灯5s,接着亮红灯15s,东西方向红灯亮20s,接着绿灯10s,黄灯5s*/while(1)if(num=20) /定时器1snum=0;nbnum-;dxnum-;traffic();shi
20、1=nbnum/10;ge1=nbnum%10; shi2=dxnum/10;ge2=dxnum%10; display(shi1,ge1,shi2,ge2); void traffic() /红绿灯主控制程序if(nbnum=0)count1+; if(count1=1)P1=0x42;/东西红灯 南北黄灯5 5nbnum=nbyellow;if(count1=2)nbnum=dxgreen+dxyellow;/东西绿灯 南北红灯10 15P1=0x14; if(count1=3)P1=0x41;/ 东西黄灯 南北红灯5 5nbnum=dxyellow;count1=0;if(dxnum=0
21、)count2+;if(count2=1) /P1=0x14;/东西绿灯 南北红灯dxnum=dxgreen;if(count2=2)P1=0x24;/东西黄灯 南北红灯 dxnum=dxyellow;if(count2=3)dxnum=nbgreen+nbyellow; /东西红灯 南北绿灯nbnum=nbgreen;count2=0;void display(uchar shi1,uchar ge1,uchar shi2,uchar ge2)/数码管显示子函数uchar temp;temp=P2;P2=0xfe;P0=tableshi1;delay(5); P2=0xfd;P0=table
22、ge1;delay(5);P2=0xfb;P0=tableshi2;delay(5);P2=0xf7;P0=tablege2;delay(5);void delay(uint x)/延时子函数uint i,j;for(i=x;i0;i-)for(j=110;j0;j-);void T0_time() interrupt 1 /定时器T0 中断子程序TH0=(65536-45872)/256;TL0=(65536-45872)%256;num+;void mkeys() /4*4矩阵键盘功能子函数uchar temp,key;P3=0xfe;/第一行线temp=P3;temp=temp&0xf0
23、;if(temp!=0xf0)delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0)temp=P3;switch(temp)case 0xee:key=0;break;case 0xde:key=1;break;case 0xbe:key=2;break;case 0x7e:key=3;break;while(temp!=0xf0)temp=P3;temp=temp&0xf0;if(key=0) /按键1:暂停TR0=TR0; /定时器取反flag1=flag1;/南北能够设置标志 0有效flag2=flag2;/东西能够设置标志if(key=1&fla
24、g1=0)/按键2:设置时间按钮TR0=0;P1=0x44;/禁止东南西北车辆 全为红灯 可以设置shi1=ge1=shi2=ge2=16;if(key=2&flag2=0)/按键3:设置完成 重启TR0=1;num=0; /定时器 初始化P1=0x41; /重新开始初状态nbnum=nbgreen; /南北数码管先绿灯时间dxnum=nbyellow+nbgreen;/东西红灯时间shi1=nbnum/10;ge1=nbnum%10;shi2=dxnum/10;ge2=dxnum%10; /P3=0xfd;/第二行线temp=P3;temp=temp&0xf0;if(temp!=0xf0)d
25、elay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0)temp=P3;switch(temp)case 0xed:key=0;break;case 0xdd:key=1;break;case 0xbd:key=2;break;case 0x7d:key=3;break;while(temp!=0xf0)temp=P3;temp=temp&0xf0; if(key=0&P1=0x44)/按键5:设置南北绿灯时间+ nbnum=nbgreen;if(dxnum!=159) nbnum+;nbgreen=nbnum; shi1=nbnum/10;ge1=nbnu
26、m%10; dxnum=nbgreen+nbyellow;/显示东西红灯时间shi2=dxnum/10;ge2=dxnum%10; if(key=1&P1=0x44)/按键6:设置南北黄灯时间+nbnum=nbyellow;if(dxnum!=159)nbnum+;nbyellow=nbnum; shi1=nbnum/10;ge1=nbnum%10;dxnum=nbgreen+nbyellow;/显示东西红灯时间shi2=dxnum/10;ge2=dxnum%10; if(key=2&P1=0x44&nbgreen3)/按键7:设置南北绿灯时间- nbnum=nbgreen; nbnum-;n
27、bgreen=nbnum; shi1=nbnum/10;ge1=nbnum%10;dxnum=nbgreen+nbyellow;/显示东西红灯时间shi2=dxnum/10;ge2=dxnum%10; if(key=3&P1=0x44&nbyellow3)/按键8:设置南北黄灯时间- nbnum=nbyellow; nbnum-;nbyellow=nbnum; shi1=nbnum/10;ge1=nbnum%10;dxnum=nbgreen+nbyellow;/显示东西红灯时间shi2=dxnum/10;ge2=dxnum%10; /| P3=0xfb;/第三行线temp=P3;temp=te
28、mp&0xf0;if(temp!=0xf0)delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0)temp=P3;switch(temp)case 0xeb:key=0;break;case 0xdb:key=1;break;case 0xbb:key=2;break;case 0x7b:key=3;break;while(temp!=0xf0)temp=P3;temp=temp&0xf0;if(key=0&P1=0x44)/按键9:设置东西绿灯时间+ dxnum=dxgreen;if(nbnum!=159)dxnum+;dxgreen=dxnum; s
29、hi2=dxnum/10;ge2=dxnum%10; nbnum=dxgreen+dxyellow;/显示南北红灯时间shi1=nbnum/10;ge1=nbnum%10; if(key=1&P1=0x44)/按键10:设置东西黄灯时间+dxnum=dxyellow; if(nbnum!=159)dxnum+;dxyellow=dxnum; shi2=dxnum/10;ge2=dxnum%10;nbnum=dxgreen+dxyellow;/显示南北红灯时间shi1=nbnum/10;ge1=nbnum%10; if(key=2&P1=0x44&dxgreen3)/按键11:设置东西绿灯时间-dxnum=dxgreen; dxnum-;dxgreen=dxnum; shi2=dxnum/10;ge2=dxnum%10; nbnum=dxgreen+dxyellow;/显示南北红灯时间shi1=nbnum/10;ge1=nbnum%10; if(key=3&P1=0x44&dxyellow3)/按键12:设置东西黄灯时间-dxnum=dxyellow; dxnum-;dxyellow=dxnum; shi2=dxnum/10;ge2=dxnum%10;nbnum=dxgreen+dxyellow;/显示南北红灯时间shi1=nbnum/10;ge1=nbnum%10;
限制150内