基于STC90C51单片机的智能交通灯设计.docx

上传人:牧羊曲112 文档编号:3384969 上传时间:2023-03-12 格式:DOCX 页数:24 大小:45.25KB
返回 下载 相关 举报
基于STC90C51单片机的智能交通灯设计.docx_第1页
第1页 / 共24页
基于STC90C51单片机的智能交通灯设计.docx_第2页
第2页 / 共24页
基于STC90C51单片机的智能交通灯设计.docx_第3页
第3页 / 共24页
基于STC90C51单片机的智能交通灯设计.docx_第4页
第4页 / 共24页
基于STC90C51单片机的智能交通灯设计.docx_第5页
第5页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《基于STC90C51单片机的智能交通灯设计.docx》由会员分享,可在线阅读,更多相关《基于STC90C51单片机的智能交通灯设计.docx(24页珍藏版)》请在三一办公上搜索。

1、基于STC90C51单片机的智能交通灯设计基于STC90C51单片机的交通灯设计 1、 设计题目 基于STC90C51单片机的智能交通灯设计 2、设计要求 2.1、系统功能 按照交通规则,控制宝田路和前进路方向及其人行道的交通信号灯的通断。 设置信号灯的通断时间。 可人工干预,使交通信号灯开启不同模式。 2.2、性能参数: 电源:5VDC LED灯电流:10mA 定时时间:10s-200s 3、总体设计 根据系统功能和设计要求,系统采用单片机控制的方案,基于HC6800S开发板,由STC90C51,74HC573,交通灯模块,动态数码显示管以及4*2独立按键组成。 3.1系统工作原理 在十字路

2、口,分为宝田路和前进路,正常情况下,在任一时刻只有一个方向通行,另一方向禁行,持续一定时间,经过短暂的过渡时间,将通行禁行方向对换。其具体状态如下: 普通模式: 状态一:宝田路通行阶段; 状态二:黄灯阶段; 状态三:前进路通行阶段; 状态四:黄灯阶段; 返回到状态一。 高峰期模式: 按下按键2,开启高峰期模式; 状态一:宝田路通行阶段; 状态二:黄灯阶段; 状态三:前进路通行阶段; 状态四:黄灯阶段; 返回到状态一; 按键2释放,回到普通模式。 紧急模式: 按下按键1,开启紧急模式,所有道路及其人行道均红灯亮,数码管不显示。释放按键1,回到普通模式。 3.2 单片机交通控制系统的功能要求 本设

3、计能模拟基本的交通控制系统,用红绿黄灯表示禁行,通行和等待的信号发生,还能进行倒计时显示,通行时间调整功能和紧急情况全面禁行。 倒计时显示 倒计时显示可以提醒驾驶员在信号灯灯色发生改变的时间、在“停止”和“通过”两者间作出合适的选择。驾驶员和行人普遍都愿意选择有倒计时显示的信号控制方式,并且认为有倒计时显示的路口更安全。倒计时显示是用来减少驾驶员在信号灯色改变的关键时刻做出复杂判断的一种方法,它可以提醒驾驶员灯色发生改变的时间,帮助驾驶员在“停止”和“通过”两者间作出合适的选择 。 时间的设置 本设计中对时间进行了人为控制设置,正常情况下宝田路和前进路的绿灯通行与红灯禁行时间均设置为30秒、黄

4、灯等待时间设置为5秒。假设前进路为主干道,考虑到主干道在上下班高峰期车流量和人流量较大,人为增加开关K2。当K2开启时,主干道前进路上绿灯通行时间和宝田路上的红灯禁行时间更改为60秒,其余设置均不变;当K1关闭时,又恢复正常情况下的时间设置。 紧急情况全面禁行 本设计中在紧急情况下增加了全面禁行状态,增加开关K1。当K1开启时,宝田路和前进路及其各自人行道均量红灯禁行;当K1关闭时,交通灯恢复正常状态。 4、详细设计硬件设计 为了实现本设计要求的具体功能,选用STC90C51单片机及外围器件构成最小控制系统,10个发光二极管分别分成两组红黄绿和两组红绿灯构成信号灯指示模块,4个LED动态数码管

5、构成各个方向倒计时显示模式,两个按键分别用来设置高峰期模式和紧急模式。 4.1、单片机系统设计 2 单片机设计交通灯控制系统,可用单片机直接控制信号灯的状态变化,基本上可以指挥交通的具体通行,当然,接入LED数码管就可以显示倒计时以提醒行使者,更具人性化。 单片机上电后,系统进入正常工作状态,执行交通灯状态显示控制,同时将时间数据倒计时输入到LED数码管上实时显示。 HC6800S整体结构视图: STC90C51内部结构图: 3 STC90C51芯片引脚图:4.2、LED数码管显示屏设计 LED动态数码管的显示原理为: 2位8段数码管电路采用“共阳”连接驱动代码,如右图所示。 段码和位码,段码

6、即段选信号 SEG,它负责数码管显示的内容,图中 ag、dp组成的数据就是段码。位码即位选信号 DIG,它决定哪个数码管工作,哪个数码管不工作。LED数码管显示代码表如下表所示: 显示数值 0 1 2 3 4 5 6 7 8 9 HC6800S开发板中动态数码管模块原理图如下图所示: dp,g,f,e,d,c,b,a 01111111 00000110 01011011 01001111 01100110 01101101 01111101 00001101 01111111 01101111 代码 0x3f 0x06 0x5b 0x4f 0x66 0x6d 0x7d 0x07 0x7f 0x

7、6f 4 4.3、交通灯设计 HC6800S开发板中交通灯模块原理图如下图所示,宝田路红黄绿灯及其人行道上的红绿灯和前进路上的红黄绿灯由JP1控制,前进路人行道上的红绿灯由J22控制。 5 5、详细设计软件设计 5.1、软件开发工具和环境 keil C51 Vision6.12 5.2、软件总体设计 5.2.1总体结构流程图如下 5.2.2子结构软件设计 普通模式 6 开始 主程序,即普通模式 检测是否为紧急模式? N Y 检测是否为高峰模式? Y N 检测按键1是否按下? N 执行相应程序,即紧急模式 Y 检测按键2是否按下? Y 执行相应程序,即高峰期模式 N 程序流程简图如下: 开始 初

8、始化 设定初值 红灯闪烁,倒 计时30秒 黄灯闪烁,倒 计时5秒 绿灯闪烁,倒 计时30秒 黄灯闪烁,倒 计时5秒 结束 程序源代码如下: while(1) if(S=71) S=0; /*宝田路通行,宝田路绿灯亮30秒*/ if(S31) Data0=0x00; Data1=0x00; Data2=duan(30-S)/10; Data3=duan(30-S)%10; Data4=0x00; Data5=0x00; Data6=Data2; Data7=Data3; 7 Display; led=0xFF; / 将所有的灯都熄灭 RED00=1; GREEN00=1; GREEN10=0;

9、/宝田路人行道绿灯亮 GREEN11=0; /宝田路绿灯亮 RED00=0; /前进路人行道红灯亮 RED01=0; /前进路红灯亮 /*黄灯阶段,5秒*/ else if(S36) Data0=0x00; Data1=0x00; Data2=duan(35-S)/10; Data3=duan(35-S)%10; Data4=0x00; Data5=0x00; Data6=Data2; Data7=Data3; Display; led=0xFF; /将所有的灯都熄灭 RED00=1; GREEN00=1; RED10=0; /宝田路人行道红灯亮 YELLOW11=0; /宝田路黄灯亮 RED

10、00=0; /前进路人行道红灯亮 YELLOW01=0; /前进路黄灯亮 /*前进路通行,前进路绿灯亮30秒*/ else if(S0;a-) for(b=110;b0;b-); 10 紧急模式 程序流程简图如下: 开始 普通模式 N 按下按键 1? Y 紧急模式 程序源代码如下: /*按下按键1,开启紧急模式,所有红灯亮,数码管不显示*/ if(key1=0) delayms; /去抖延时 if(key1=0) Data0=0x00; Data1=0x00; Data2=0x00; Data3=0x00; Data4=0x00; Data5=0x00; Data6=0x00; Data7=0

11、x00; Display; led=0xFF; RED00=1; GREEN00=1; RED10=0; RED11=0; RED00=0; 11 RED01=0; while(!key1); /按键1释放 keyscan; 高峰模式 程序流程简图如下: 开始 普通模式 N 按下按键 2? Y 高峰模式 程序源代码如下: /*按下按键2,开启上下班高峰期模式,主干道宝田路绿灯时间为60秒*/ void keyscan if(key2=0) delayms; /去抖延时 if(key2=0) while(1) if(key2!=0) break; /当按键2释放,跳出循环 if(M=101) M

12、=0; if(M61) Data0=0x00; Data1=0x00; Data2=duan(60-M)/10; 12 Data3=duan(60-M)%10; Data4=0x00; Data5=0x00; Data6=Data2; Data7=Data3; Display; led=0xFF; RED00=1; GREEN00=1; GREEN10=0; GREEN11=0; RED00=0; RED01=0; else if(M66) Data0=0x00; Data1=0x00; Data2=duan(65-M)/10; Data3=duan(65-M)%10; Data4=0x00;

13、 Data5=0x00; Data6=Data2; Data7=Data3; Display; led=0xFF; RED00=1; GREEN00=1; RED10=0; YELLOW11=0; RED00=0; YELLOW01=0; else if(M96) Data0=0x00; Data1=0x00; Data2=duan(95-M)/10; 13 Data3=duan(95-M)%10; Data4=0x00; Data5=0x00; Data6=Data2; Data7=Data3; Display; led=0xFF; RED00=1; GREEN00=1; RED10=0;

14、RED11=0; GREEN00=0; GREEN01=0; else Data0=0x00; Data1=0x00; Data2=duan(100-M)/10; Data3=duan(100-M)%10; Data4=0x00; Data5=0x00; Data6=Data2; Data7=Data3; Display; led=0xFF; RED00=1; GREEN00=1; RED10=0; YELLOW11=0; RED00=0; YELLOW01=0; while(!key2); /等待按键释放 14 5.3、定时程序设计 进入主程序后,首先要对定时器和中断有关的寄存器初始化。初始

15、化过程如下: 对TMOD赋值,确定定时器的工作方式; 计算初值,并将初值写入; 中断方式时,则对IE赋值,开放中断; 使定时器运行控制端置位,启动定时器来计数。 本次设计使用了定时器0的工作方式,50ms中断一次,而交通信号灯倒计时计数需要定时1s,通过计算,确定TH0和TL0应装入的初值为60和176,即0x3C和0xB0。 定时程序源代码如下: void init TMOD=0x01; / 设置定时器工作方式 TH0=0x3C; / 装初值 TH1=0xB0; EA=1; ET0=1; TR0=1; void T0_timeinterrupt 1 TH0=0x3C; /重装初值 TH1=0

16、xB0; T+; if(T=20) S+; M+; T=0; /S计数 /M计数 /1秒时间到,T清0重新再计20次 /开启总中断 /开启定时器中断 /启动定时器 5.4、数码管显示程序设计 通过单片机的定时器中断程序设计,可以控制数码管在动态显示时每1秒变换一次,也就是计数一次,根据定义的全局变量和I/O口,在显示子函数中实现数码管的位选和段选并能够在主函数中调用实现倒计时循环显示。 显示子函数代码如下: void Display /显示子函数 uchar i; 15 uint j; for(i=0;i8;i+) Weixuan=weii; /送位选数据 Duanxuan=Datai; /送

17、段选数据 j=10; while(j-); Duanxuan=0x00; /消隐 /扫描间隔时间设定 6、系统制作、调试和实验 6.1、系统制作 1. 使用keil C 51编写程序; 2. 将编好的程序“.C”文件用Keil C 51转换成“.hex”文件; 3. 将开发板按照如图所示的连线方式连接成功; 4. 用普中科技自己的下载软件PAISP自动下载软件将“.hex”下载到开发板上,下载步骤如下: 1). 插上USB口,打开开发板电源开关,然后打开普中ISP下载软件,在usb转串口驱动安装成功后,打开软件应该有串口号; 2). 芯片类型选择STC90C5XX; 16 3). 同时需要把开

18、发板中J0跳线帽拔掉,设置成USB接口,加载我们要下载到单片机里的程序,单击 ,选择下载的后缀为.Hex的文件; 4). 点击下载程序,即可下载成功。 4. 观察运行现象是否与设计结果相符; 6.2、硬件调试 硬件部分是在51单片机上完成,所以调试过程比较简单。首先按照电路原理图进行检查,检查无误后进行按键、数码管和发光二极管的检测。 6.3、软件调试 首先用keil C51软件对程序进行编译和调试,经过对程序多次修改后,编译通过,结束软件调试。 6.4、联合调试 硬件调试和硬件调试结束之后,将最终调试好的程序下载到单片机上,观察结果并进行调试。 6.5、系统实验 经过多次调试,最终可以在单片

19、机上观察到本次设计的实验结果: 用发光二极管模拟的红黄绿交通信号灯有序闪烁,实验现象正确; 动态数码管可以显示到信号灯颜色改变所剩时间,并采用倒计时方式计数; 按下按键1,所有道路及其人行道的红灯亮,数码管均不显示,开启紧急模式; 按下按键2,主干道绿灯时间变为60秒,其余均不变,开启高峰期模式。 7、总结 7.1、工作总结 在本次智能交通信号灯的设计中,我主要负责的是软件部分以及最后的联合调试部分。主要有: 编写代码。本次程序的编写我用的是C语言,一是因为之前在大一有上过C语言的课,对C语言不会感到很陌生,二是学习过程中,教材也都是C语言教程。一开始我们计划仅实现普通模式下的智能交通信号灯的

20、控制。同时我们参考了单片机自带的程序,后来经过深入学习,发现只有普通模式太过简单,所以我们就打算尝试一下能否实现紧急模式和高峰期模式。 联合调试。由于单片机自带交通灯模块,所以我觉得调试应该比较简单,直接将程序烧录到单片机上就可以了。没想到在这个过程中还出现了很多了问题。比如发光二极管一直亮或者不亮,数码显示管显示错误等。我以为是程序出了问题,就一直17 在修改程序,结果发现,很大一部分原因是由于我们太粗心了,把线接反了或者接触不良,原来是硬件的问题。所以在联合调试的过程中,一定要同时兼顾软件和硬件的调试。 本次设计还存在一些问题如下: 由于我主要负责软件部分,所以在后期的联合调试部分出了很多

21、问题,主要是由于我对硬件部分不够熟悉,这是本次实验中我主要需要改进的地方; 在编写代码的过程中,我还发现了一些自身存在的问题,比如说主函数写的过长,容易造成里面的括号丢失,代码后面不加注释,代码没有层次感,使程序看起来很乱,而且在查找问题时也不方便,还有就是对语句运用不够熟悉,容易犯一些语法错误,这一点还需要加以改进。 本次设计编译程序之后直接在单片机上调试较为麻烦,这一点需要改进,可加入仿真调试。 7.2、心得体会 本次科研训练接近尾声,从一开始根本不了解科研训练是什么,需要做什么,到确定题目,一起学习,编写程序,硬件软件调试到最后的报告撰写,我真的觉得自己收获了很多。不仅仅是感受到了我们这

22、个团队的合作精神,还有自己的那一份责任感,既然是小组合作完成一个项目,那就必须要每个人确确实实的做好自己的工作,只有这样,我们的设计才是完整的。 本次科研训练我们选择的是智能交通灯的设计,说实话,老师让我们确定题目时,我们也不知道自己能做什么擅长做什么,甚至不确定是否能完成这个项目。确定这个题目之后,也是没有头绪,不知道要怎么开始。后来我们明确了一下分工,我主要负责软件部分,硬件我们是用的单片机,所以我就开始学习单片机的C语言。我用的教材是郭天祥老师主编的51单片机C语言教程,我觉得这本书最大的好处就是通俗易懂,很适合我这样的单片机新手。一边看书学习,一边就开始编写程序,编写程序首先得确定算法

23、,我还是没有概念,所以我就参考了别的交通信号灯的程序,我觉得编程是一件很神奇的事情,我们的很多想法靠着这些代码就能够实现,这极大的激发了我的好奇心,就想一定要完成这个程序。我们本来是打算做个普通模式就结束,做出来之后又想挑战一下自己,就做了个紧急模式和高峰期模式。在做普通模式时还觉得很简单,想着变成也不是那么难的一件事,但是在做高峰期模式时,就出现了很多问题,反复调试了很多次还是不行,我们就去请教别人,别人一眼就发现了其中的问题,我们也恍然大悟了。所以以后还是要不断的学习,积攒经验,才能够少犯一些低级错误。 通过这次科研训练,真的学到了很多东西,也发现了自己本身的一些局限性,希望自己以后能够多

24、向优秀的人学习,弥补自身不足。本次科研训练使我们团队合作的结果,每一个人都不可缺少,真的很感谢此次训练,让我体会到了团队合作的重要性,感谢我的队友们。 18 附:交通信号灯程序源代码 #include #define uchar unsigned char #define uint unsigned int #define Weixuan P1 #define Duanxuan P0 #define led P2 sbit RED10 = P20; /上人行道红灯 /定义使用的I/O口 sbit GREEN10 = P21; /上人行道绿灯 sbit RED11 = P22; sbit YEL

25、LOW11= P23; sbit GREEN11 = P24; sbit RED00 = P30; sbit GREEN00 = P31; sbit RED01 = P25; sbit YELLOW01= P26; sbit GREEN01 = P27; sbit key1 = P33; sbit key2 = P35; uchar code wei= /右人行道红灯 /右人行道绿灯 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; /位选控制 uchar code duan = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0

26、x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /段选显示码 uchar Data8; uchar T,S,M; /*声明全局函数*/ void Display; void init; void delayms; 19 void keyscan; void main S=0; M=0; init; /初始化函数 while(1) if(S=71) S=0; /*宝田路通行,宝田路绿灯亮30秒*/ if(S31) Data0=0x00; Data1=0x00; Data2=duan(30-S)/10; Data3=duan(30-S)%10; Data4=0x00

27、; Data5=0x00; Data6=Data2; Data7=Data3; Display; led=0xFF; / 将所有的灯都熄灭 RED00=1; GREEN00=1; GREEN10=0; /宝田路人行道绿灯亮 GREEN11=0; /宝田路绿灯亮 RED00=0; /前进路人行道红灯亮 RED01=0; /前进路红灯亮 /*黄灯阶段,5秒*/ else if(S36) Data0=0x00; Data1=0x00; Data2=duan(35-S)/10; Data3=duan(35-S)%10; Data4=0x00; 20 Data5=0x00; Data6=Data2; D

28、ata7=Data3; Display; led=0xFF; /将所有的灯都熄灭 RED00=1; GREEN00=1; RED10=0; /宝田路人行道红灯亮 YELLOW11=0; /宝田路黄灯亮 RED00=0; /前进路人行道红灯亮 YELLOW01=0; /前进路黄灯亮 /*前进路通行,前进路绿灯亮30秒*/ else if(S66) Data0=0x00; Data1=0x00; Data2=duan(65-S)/10; Data3=duan(65-S)%10; Data4=0x00; Data5=0x00; Data6=Data2; Data7=Data3; Display; l

29、ed=0xFF; RED00=1; GREEN00=1; RED10=0; RED11=0; GREEN00=0; GREEN01=0; 黄灯阶段,5秒*/ else Data0=0x00; 21 /* Data1=0x00; Data2=duan(70-S)/10; Data3=duan(70-S)%10; Data4=0x00; Data5=0x00; Data6=Data2; Data7=Data3; Display; led=0xFF; RED00=1; GREEN00=1; RED10=0; YELLOW11=0; RED00=0; YELLOW01=0; /*按下按键1,开启紧急模

30、式,所有红灯亮,数码管不显示*/ if(key1=0) delayms; /去抖延时 if(key1=0) Data0=0x00; Data1=0x00; Data2=0x00; Data3=0x00; Data4=0x00; Data5=0x00; Data6=0x00; Data7=0x00; Display; led=0xFF; RED00=1; GREEN00=1; RED10=0; RED11=0; 22 RED00=0; RED01=0; /按键1释放 while(!key1); keyscan; /*按下按键2,开启上下班高峰期模式,主干道宝田路绿灯时间为60秒*/ void k

31、eyscan if(key2=0) delayms; if(key2=0) while(1) if(key2!=0) break; /当按键2释放,跳出循环 if(M=101) M=0; if(M61) /去抖延时 Data0=0x00; 23 Data1=0x00; Data2=duan(60-M)/10; Data3=duan(60-M)%10; Data4=0x00; Data5=0x00; Data6=Data2; Data7=Data3; Display; led=0xFF; RED00=1; GREEN00=1; GREEN10=0; GREEN11=0; RED00=0; RED

32、01=0; else if(M66) Data0=0x00; Data1=0x00; Data2=duan(65-M)/10; Data3=duan(65-M)%10; Data4=0x00; Data5=0x00; Data6=Data2; Data7=Data3; Display; led=0xFF; RED00=1; GREEN00=1; RED10=0; YELLOW11=0; RED00=0; YELLOW01=0; else if(M0;a-) for(b=110;b0;b-); void init TMOD=0x01; / 设置定时器工作方式 TH0=0x3C; / 装初值 TH

33、1=0xB0; 25 EA=1; /开启总中断 ET0=1; /开启定时器中断 TR0=1; /启动定时器 void Display /显示子函数 uchar i; uint j; for(i=0;i8;i+) Weixuan=weii; /送位选数据 Duanxuan=Datai; /送段选数据 j=10; /扫描间隔时间设定 while(j-); Duanxuan=0x00; /消隐 void T0_timeinterrupt 1 TH0=0x3C; /重装初值 TH1=0xB0; T+; if(T=20) S+; /S计数 M+; /M计数 T=0; /1秒时间到,T清0重新再计20次 26

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号