基于STC90C51单片机的智能交通灯设计.docx
- 文档编号:24997772
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:24
- 大小:436.52KB
基于STC90C51单片机的智能交通灯设计.docx
《基于STC90C51单片机的智能交通灯设计.docx》由会员分享,可在线阅读,更多相关《基于STC90C51单片机的智能交通灯设计.docx(24页珍藏版)》请在冰豆网上搜索。
基于STC90C51单片机的智能交通灯设计
基于STC90C51单片机的交通灯设计
1、设计题目
基于STC90C51单片机的智能交通灯设计
2、设计要求
、系统功能
(1)按照交通规则,控制宝田路和前进路方向及其人行道的交通信号灯(红﹑黄﹑绿)的通断。
(2)设置信号灯的通断时间。
(3)可人工干预,使交通信号灯开启不同模式。
、性能参数:
(1)电源:
5VDC
(2)LED灯电流:
10mA
(3)定时时间:
10s-200s
3、总体设计
根据系统功能和设计要求,系统采用单片机控制的方案,基于HC6800S开发板,由STC90C51,74HC573,交通灯模块,动态数码显示管以及4*2独立按键组成。
系统工作原理
在十字路口,分为宝田路和前进路,正常情况下,在任一时刻只有一个方向通行,另一方向禁行,持续一定时间,经过短暂的过渡时间,将通行禁行方向对换。
其具体状态如下:
?
(1)普通模式:
状态一:
宝田路通行阶段(宝田路及其人行道亮绿灯30秒、前进路及其人行道亮红灯30秒);
状态二:
黄灯阶段(宝田路和前进路亮黄灯5秒、两侧人行道亮红灯5秒);
状态三:
前进路通行阶段(前进路及其人行道亮绿灯30秒、宝田路及其人行道亮红灯30秒);
状态四:
黄灯阶段(宝田路和前进路亮黄灯5秒、两侧人行道亮红灯5秒);
返回到状态一。
(2)高峰期模式(设宝田路为主干道):
按下按键2(key2),开启高峰期模式;
状态一:
宝田路通行阶段(宝田路及其人行道亮绿灯60秒、前进路及其人行道亮红灯30秒);
状态二:
黄灯阶段(宝田路和前进路亮黄灯5秒、两侧人行道亮红灯5秒);
状态三:
前进路通行阶段(前进路及其人行道亮绿灯30秒、宝田路及其人行道亮红灯30秒);
状态四:
黄灯阶段(宝田路和前进路亮黄灯5秒、两侧人行道亮红灯5秒);
返回到状态一;
按键2释放,回到普通模式。
(3)紧急模式:
按下按键1(key1),开启紧急模式,所有道路及其人行道均红灯亮,数码管不显示。
释放按键1,回到普通模式。
?
单片机交通控制系统的功能要求?
本设计能模拟基本的交通控制系统,用红绿黄灯表示禁行,通行和等待的信号发生,还能进行倒计时显示,通行时间调整功能和紧急情况全面禁行。
?
(1)倒计时显示?
倒计时显示可以提醒驾驶员在信号灯灯色发生改变的时间、在“停止”和“通过”两者间作出合适的选择。
驾驶员和行人普遍都愿意选择有倒计时显示的信号控制方式,并且认为有倒计时显示的路口更安全。
倒计时显示是用来减少驾驶员在信号灯色改变的关键时刻做出复杂判断的一种方法,它可以提醒驾驶员灯色发生改变的时间,帮助驾驶员在“停止”和“通过”两者间作出合适的选择?
。
?
(2)时间的设置?
本设计中对时间进行了人为控制设置,正常情况下宝田路和前进路的绿灯通行与红灯禁行时间均设置为30秒、黄灯等待时间设置为5秒。
假设前进路为主干道,考虑到主干道在上下班高峰期车流量和人流量较大,人为增加开关K2。
当K2开启时,主干道前进路上绿灯通行时间和宝田路上的红灯禁行时间更改为60秒,其余设置均不变;当K1关闭时,又恢复正常情况下的时间设置。
(3)紧急情况全面禁行
本设计中在紧急情况下增加了全面禁行状态,增加开关K1。
当K1开启时,宝田路和前进路及其各自人行道均量红灯禁行;当K1关闭时,交通灯恢复正常状态。
4、详细设计—硬件设计
为了实现本设计要求的具体功能,选用STC90C51单片机及外围器件构成最小控制系统,10个发光二极管分别分成两组红黄绿和两组红绿灯构成信号灯指示模块,4个LED动态数码管构成各个方向倒计时显示模式,两个按键分别用来设置高峰期模式和紧急模式。
、单片机系统设计
单片机设计交通灯控制系统,可用单片机直接控制信号灯的状态变化,基本上可以指挥交通的具体通行,当然,接入LED数码管就可以显示倒计时以提醒行使者,更具人性化。
单片机上电后,系统进入正常工作状态,执行交通灯状态显示控制,同时将时间数据倒计时输入到LED数码管上实时显示。
HC6800S整体结构视图:
STC90C51内部结构图:
STC90C51芯片引脚图:
、LED数码管显示屏设计
LED动态数码管的显示原理为:
2位8段数码管电路采用“共阳”连接驱动代码,如右图所示。
段码和位码,段码即段选信号SEG,它负责数码管显示的内容,图中a~g、dp组成的数据(a为最低位,dp为最高位)就是段码。
位码即位选信号DIG,它决定哪个数码管工作,哪个数码管不工作。
LED数码管显示代码表如下表所示:
显示数值
dp,g,f,e,d,c,b,a
代码
0
01111111
0x3f
1
00000110
0x06
2
01011011
0x5b
3
01001111
0x4f
4
01100110
0x66
5
01101101
0x6d
6
01111101
0x7d
7
00001101
0x07
8
01111111
0x7f
9
01101111
0x6f
HC6800S开发板中动态数码管模块原理图如下图所示:
、交通灯设计
HC6800S开发板中交通灯模块原理图如下图所示,宝田路红黄绿灯及其人行道上的红绿灯和前进路上的红黄绿灯由JP1控制,前进路人行道上的红绿灯由J22控制。
5、详细设计—软件设计
、软件开发工具和环境
keilC51μ
、软件总体设计
总体结构流程图如下
NYYN
NYYN
子结构软件设计
(1)普通模式
程序流程简图如下:
程序源代码如下:
while
(1){
if(S==71)
S=0;
/*宝田路通行,宝田路绿灯亮30秒*/
if(S<31){
Data[0]=0x00;
Data[1]=0x00;
Data[2]=duan[(30-S)/10];
Data[3]=duan[(30-S)%10];
Data[4]=0x00;
Data[5]=0x00;
Data[6]=Data[2];
Data[7]=Data[3];
Display();
led=0xFF;使用keilC51编写程序;
2.将编好的程序“.C”文件用KeilC51转换成“.hex”文件;
3.将开发板按照如图所示的连线方式连接成功;
4.用普中科技自己的下载软件PAISP自动下载软件将“.hex”下载到开发板上,下载步骤如下:
1).插上USB口,打开开发板电源开关,然后打开普中ISP下载软件,在usb转串口驱动安装成功后,打开软件应该有串口号;
2).芯片类型选择STC90C5XX;
3).同时需要把开发板中J0跳线帽拔掉,设置成USB接口,加载我们要下载到单片机里的程序,单击
,选择下载的后缀为.Hex的文件;
4).点击下载程序
,即可下载成功。
4.观察运行现象是否与设计结果相符;
、硬件调试
硬件部分是在51单片机上完成,所以调试过程比较简单。
首先按照电路原理图进行检查,检查无误后进行按键、数码管和发光二极管的检测。
、软件调试
首先用keilC51软件对程序进行编译和调试,经过对程序多次修改后,编译通过,结束软件调试。
、联合调试
硬件调试和硬件调试结束之后,将最终调试好的程序下载到单片机上,观察结果并进行调试。
、系统实验
经过多次调试,最终可以在单片机上观察到本次设计的实验结果:
(1)用发光二极管模拟的红黄绿交通信号灯有序闪烁,实验现象正确;
(2)动态数码管可以显示到信号灯颜色改变所剩时间,并采用倒计时方式计数;
(3)按下按键1,所有道路及其人行道的红灯亮,数码管均不显示,开启紧急模式;
(4)按下按键2,主干道绿灯时间变为60秒,其余均不变,开启高峰期模式。
7、总结
、工作总结
在本次智能交通信号灯的设计中,我主要负责的是软件部分以及最后的联合调试部分。
主要有:
(1)编写代码。
本次程序的编写我用的是C语言,一是因为之前在大一有上过C语言的课,对C语言不会感到很陌生,二是学习过程中,教材也都是C语言教程。
一开始我们计划仅实现普通模式下的智能交通信号灯的控制。
同时我们参考了单片机自带的程序,后来经过深入学习,发现只有普通模式太过简单,所以我们就打算尝试一下能否实现紧急模式和高峰期模式。
(2)联合调试。
由于单片机自带交通灯模块,所以我觉得调试应该比较简单,直接将程序烧录到单片机上就可以了。
没想到在这个过程中还出现了很多了问题。
比如发光二极管一直亮或者不亮,数码显示管显示错误等。
我以为是程序出了问题,就一直在修改程序,结果发现,很大一部分原因是由于我们太粗心了,把线接反了或者接触不良,原来是硬件的问题。
所以在联合调试的过程中,一定要同时兼顾软件和硬件的调试。
本次设计还存在一些问题如下:
(1)由于我主要负责软件部分,所以在后期的联合调试部分出了很多问题,主要是由于我对硬件部分不够熟悉,这是本次实验中我主要需要改进的地方;
(2)在编写代码的过程中,我还发现了一些自身存在的问题,比如说主函数写的过长,容易造成里面的括号丢失,代码后面不加注释,代码没有层次感,使程序看起来很乱,而且在查找问题时也不方便,还有就是对语句运用不够熟悉,容易犯一些语法错误,这一点还需要加以改进。
(3)本次设计编译程序之后直接在单片机上调试较为麻烦,这一点需要改进,可加入仿真调试。
、心得体会
本次科研训练接近尾声,从一开始根本不了解科研训练是什么,需要做什么,到确定题目,一起学习,编写程序,硬件软件调试到最后的报告撰写,我真的觉得自己收获了很多。
不仅仅是感受到了我们这个团队的合作精神,还有自己的那一份责任感,既然是小组合作完成一个项目,那就必须要每个人确确实实的做好自己的工作,只有这样,我们的设计才是完整的。
本次科研训练我们选择的是智能交通灯的设计,说实话,老师让我们确定题目时,我们也不知道自己能做什么擅长做什么,甚至不确定是否能完成这个项目。
确定这个题目之后,也是没有头绪,不知道要怎么开始。
后来我们明确了一下分工,我主要负责软件部分,硬件我们是用的单片机,所以我就开始学习单片机的C语言。
我用的教材是郭天祥老师主编的《51单片机C语言教程》,我觉得这本书最大的好处就是通俗易懂,很适合我这样的单片机新手。
一边看书学习,一边就开始编写程序,编写程序首先得确定算法,我还是没有概念,所以我就参考了别的交通信号灯的程序,我觉得编程是一件很神奇的事情,我们的很多想法靠着这些代码就能够实现,这极大的激发了我的好奇心,就想一定要完成这个程序。
我们本来是打算做个普通模式就结束,做出来之后又想挑战一下自己,就做了个紧急模式和高峰期模式。
在做普通模式时还觉得很简单,想着变成也不是那么难的一件事,但是在做高峰期模式时,就出现了很多问题,反复调试了很多次还是不行,我们就去请教别人,别人一眼就发现了其中的问题,我们也恍然大悟了。
所以以后还是要不断的学习,积攒经验,才能够少犯一些低级错误。
通过这次科研训练,真的学到了很多东西,也发现了自己本身的一些局限性,希望自己以后能够多向优秀的人学习,弥补自身不足。
本次科研训练使我们团队合作的结果,每一个人都不可缺少,真的很感谢此次训练,让我体会到了团队合作的重要性,感谢我的队友们。
附:
交通信号灯程序源代码
#include<>
#defineucharunsignedchar
#defineuintunsignedint
#defineWeixuanP1//定义使用的I/O口
#defineDuanxuanP0
#defineledP2
sbitRED10=P2^0;//上人行道红灯
sbitGREEN10=P2^1;//上人行道绿灯
sbitRED11=P2^2;
sbitYELLOW11=P2^3;
sbitGREEN11=P2^4;
sbitRED00=P3^0;//右人行道红灯
sbitGREEN00=P3^1;//右人行道绿灯
sbitRED01=P2^5;
sbitYELLOW01=P2^6;
sbitGREEN01=P2^7;
sbitkey1=P3^3;
sbitkey2=P3^5;
ucharcodewei[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制
ucharcodeduan[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//段选显示码
ucharData[8];
ucharT,S,M;
/*声明全局函数*/
voidDisplay();
voidinit();
voiddelayms();
voidkeyscan();
voidmain(){
S=0;
M=0;
init();//初始化函数
while
(1){
if(S==71)
S=0;
/*宝田路通行,宝田路绿灯亮30秒*/
if(S<31){
Data[0]=0x00;
Data[1]=0x00;
Data[2]=duan[(30-S)/10];
Data[3]=duan[(30-S)%10];
Data[4]=0x00;
Data[5]=0x00;
Data[6]=Data[2];
Data[7]=Data[3];
Display();
led=0xFF;//将所有的灯都熄灭
RED00=1;
GREEN00=1;
GREEN10=0;//宝田路人行道绿灯亮
GREEN11=0;//宝田路绿灯亮
RED00=0;//前进路人行道红灯亮
RED01=0;//前进路红灯亮
}
/*黄灯阶段,5秒*/
elseif(S<36){
Data[0]=0x00;
Data[1]=0x00;
Data[2]=duan[(35-S)/10];
Data[3]=duan[(35-S)%10];
Data[4]=0x00;
Data[5]=0x00;
Data[6]=Data[2];
Data[7]=Data[3];
Display();
led=0xFF;//将所有的灯都熄灭
RED00=1;
GREEN00=1;
RED10=0;//宝田路人行道红灯亮
YELLOW11=0;//宝田路黄灯亮
RED00=0;//前进路人行道红灯亮
YELLOW01=0;//前进路黄灯亮
}
/*前进路通行,前进路绿灯亮30秒*/
elseif(S<66){
Data[0]=0x00;
Data[1]=0x00;
Data[2]=duan[(65-S)/10];
Data[3]=duan[(65-S)%10];
Data[4]=0x00;
Data[5]=0x00;
Data[6]=Data[2];
Data[7]=Data[3];
Display();
led=0xFF;
RED00=1;
GREEN00=1;
RED10=0;
RED11=0;
GREEN00=0;
GREEN01=0;
}
/*黄灯阶段,5秒*/
else{
Data[0]=0x00;
Data[1]=0x00;
Data[2]=duan[(70-S)/10];
Data[3]=duan[(70-S)%10];
Data[4]=0x00;
Data[5]=0x00;
Data[6]=Data[2];
Data[7]=Data[3];
Display();
led=0xFF;
RED00=1;
GREEN00=1;
RED10=0;
YELLOW11=0;
RED00=0;
YELLOW01=0;
}
/*按下按键1,开启紧急模式,所有红灯亮,数码管不显示*/
if(key1==0){
delayms();//去抖延时
if(key1==0){
Data[0]=0x00;
Data[1]=0x00;
Data[2]=0x00;
Data[3]=0x00;
Data[4]=0x00;
Data[5]=0x00;
Data[6]=0x00;
Data[7]=0x00;
Display();
led=0xFF;
RED00=1;
GREEN00=1;
RED10=0;
RED11=0;
RED00=0;
RED01=0;
while(!
key1);//按键1释放
}}
keyscan();
}
}
/*按下按键2,开启上下班高峰期模式,主干道宝田路绿灯时间为60秒*/
voidkeyscan(){
if(key2==0){
delayms();//去抖延时
if(key2==0){
while
(1){
if(key2!
=0)break;//当按键2释放,跳出循环
if(M==101)
M=0;
if(M<61){
Data[0]=0x00;
Data[1]=0x00;
Data[2]=duan[(60-M)/10];
Data[3]=duan[(60-M)%10];
Data[4]=0x00;
Data[5]=0x00;
Data[6]=Data[2];
Data[7]=Data[3];
Display();
led=0xFF;
RED00=1;
GREEN00=1;
GREEN10=0;
GREEN11=0;
RED00=0;
RED01=0;
}
elseif(M<66){
Data[0]=0x00;
Data[1]=0x00;
Data[2]=duan[(65-M)/10];
Data[3]=duan[(65-M)%10];
Data[4]=0x00;
Data[5]=0x00;
Data[6]=Data[2];
Data[7]=Data[3];
Display();
led=0xFF;
RED00=1;
GREEN00=1;
RED10=0;
YELLOW11=0;
RED00=0;
YELLOW01=0;
}
elseif(M<96){
Data[0]=0x00;
Data[1]=0x00;
Data[2]=duan[(95-M)/10];
Data[3]=duan[(95-M)%10];
Data[4]=0x00;
Data[5]=0x00;
Data[6]=Data[2];
Data[7]=Data[3];
Display();
led=0xFF;
RED00=1;
GREEN00=1;
RED10=0;
RED11=0;
GREEN00=0;
GREEN01=0;
}
else{
Data[0]=0x00;
Data[1]=0x00;
Data[2]=duan[(100-M)/10];
Data[3]=duan[(100-M)%10];
Data[4]=0x00;
Data[5]=0x00;
Data[6]=Data[2];
Data[7]=Data[3];
Display();
led=0xFF;
RED00=1;
GREEN00=1;
RED10=0;
YELLOW11=0;
RED00=0;
YELLOW01=0;
}}
while(!
key2);//等待按键释放
}
}
}
voiddelayms(){//延时子函数,延时约10ms
uinta,b;
for(a=10;a>0;a--)
for(b=110;b>0;b--);
}
voidinit(){
TMOD=0x01;//设置定时器工作方式
TH0=0x3C;//装初值
TH1=0xB0;
EA=1;//开启总中断
ET0=1;//开启定时器中断
TR0=1;//启动定时器
}
voidDisplay()//显示子函数
{uchari;
uintj;
for(i=0;i<8;i++){
Weixuan=wei[i];//送位选数据
Duanxuan=Data[i];//送段选数据
j=10;//扫描间隔时间设定
while(j--);
Duanxuan=0x00;//消隐
}}
voidT0_time()interrupt1{
TH0=0x3C;//重装初值
TH1=0xB0;
T++;
if(T==20){
S++;//S计数
M++;//M计数
T=0;//1秒时间到,T清0重新再计20次
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC90C51 单片机 智能 交通灯 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)