基于单片机的交通灯设计实验报告
《单片机原理及应用》课程设计
设计题目:基于51单片机的交通灯模拟系统设计
院系:物理工程学院 专业:电子信息科学与技术
年级:2013级
班级:电信1班
指导教师:苏建坡
学号:2012225105 姓名:郭可可
完成时间:
2016-10-26
摘要
本系统由单片机系统(STC89C52)、键盘、LED 显示、数码管、交通灯演示系统组成。系统除基本交通灯功能外,还具有倒计时、紧急情况处理以及根据具体情况手动控制等功能。
本设计是单片机控制的交通灯控制系统。单片机即单片微型计算机。其集定时、计数和多种接口与一体的微控制器。它体积小、成本低、功能强,广泛的应用于只能产业和工业自动化上。而51系列单片机是各类单片机中最为典型和富有代表性的一种。
本设计的意义在于通过具体控制系统的设计,掌握微机控制系统设计的一般方法和处理问题的思路,特别是一些常用的技术手段。能在实践教学环节中,积累设计经验,开拓思维空间,全面提高个人的综合能力。
红绿灯控制是智能交通系统的一个重要部分,本文给出了一个用单片机控制的简易交通红绿灯自动控制系统。该系统适用于十字路口,并对放行和禁行时间进行倒计时显示(秒)。
在车辆通行繁忙的十字交叉路口设置的交通灯控制系统,其特点是:道路较窄而车流量较大,主干道,支干道的车辆通行时间不等,,同时设有道路应急控制。具体的情况是:在正常的情况下,东西支干道通行时间为50秒,南北主干道通行时间为30秒,每个方向在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道。 关键字:单片机 红绿灯 STC89C52 倒计时
第一部分:设计思路
国内的交通灯一般设在十字路门,在醒目位置用红、绿、黄三种颜色的指示灯。加上一个倒计时的显示计时器来控制行车。一般来说,东西方向和南北方向的车流量是不同的,这就要求南北方向和东西方向要求车辆能通行的时间应该是不一样的。本系统的设计是基于东西方向为主干道,南北方向为支干道来设计的。
假设刚开始允许东西方向通车(此时东西方向绿灯亮其它灭),南北方向禁止通车(此时南北方向红灯亮其它灭)。这我们称为第一阶段。第二阶段东西方向绿灯灭,黄灯亮,此时南北方向依然为红灯。
第三阶段,东西方向黄灯灭,红灯亮,南北方向红灯灭,绿灯亮。第四阶段东西方向依然红灯,南北方向绿灯灭,黄灯亮。此时又转为第一阶段,如此循环往复,便可控制十字路口的车辆通行。此外我还考虑到了两个特殊情况,当警车或消防车通过时,此时应该只能允许一个方向通车,本系统设计了两个独立按键,可控制只允许东西方向通车或南北方向通车。
第二部分:系统硬件选择
由于是基于51系列单片机的交通灯模拟系统设计,所以我选用了宏晶公司的STC89C52型号单片机,这款单片机性价比不错,而且买的时候赠送了很多资料,里面的老师讲解非常详细,让我受益良多。 由于我设计交通灯主要是使用到了LED和数码管,所以我这里简单介绍一下它的引脚接口。LED1~LED8是接在了P1.0~P1.7引脚,低电平有效。数码管的位选是P2.7引脚。段选是P2.6引脚。数码管显示是
由P0口控制。本次我选用的是LED1、LED2、LED3分别代表东西向红、黄、绿,LED5、LED6、LED7分别代表南北向红、黄、绿。数码管选择第三第四位表示南北向倒计时,第七第八位代表东西向倒计时。下面是原理图:
第三部分:系统流程图
开始
第四部分:系统软件设计
源码:#include
#include
#define uint unsigned int
#define uchar unsigned char
void delay(uint i);
void displaydx(uint i);
void displaynb(uint i);
void key_ss2();
void key_ss3();
sbit wei = P2^7;
sbit duan = P2^6;
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P1^6;
sbit LED8 = P1^7;
sbit key_s2 = P3^0;
sbit key_s3 = P3^1;
sbit key_s4 = P3^2;
sbit key_s5 = P3^3;
uchar code table[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5" 0x7D, //"6" 0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A" 0x7C, //"B"
0x39, //"C"
0x5E, //"D" 0x79, //"E"
0x71, //"F"
0x76, //"H" 0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭 0x00 //自定义
};
void main()
{
uint i=0,j=50,k=55;
TR1 = 1;
TMOD = 0x10;
TH1 = 0x4b;
TL1 = 0xfc;
while(1)
{
j=50,k=55;
while(j>0)//第一阶段 东西绿灯 南北红灯 {
key_ss2();
key_ss3();
LED1 = 1;
LED2 = 1;
LED3 = 0;
LED4 = 1;
LED5 = 0;
LED6 = 1;
LED7 = 1;
LED8 = 1;
displaydx(j);
displaynb(k);
if(TF1==1)
{
}
if(i==50)
{
i=0;
j--;
k--;
}
}
{ while(j>0)//第二阶段 东西黄灯 南北红灯 j = 5; k = 5; TH1 = 0x4b; TL1 = 0xfc; TF1=0; i++;
key_ss2(); key_ss3();
LED1 = 1;
LED2 = 0;
LED3 = 1;
LED4 = 1;
LED5 = 0;
LED6 = 1;
LED7 = 1;
LED8 = 1;
displaydx(j);
displaynb(k);
if(TF1==1)
{
TH1 = 0x4b; TL1 = 0xfc; TF1=0;
i++;
}
if(i==50)
{
i=0;
j--;
k--;
}
}
//第三阶段 东西红灯 k = 30;
j = 35;
while(k>0) {
key_ss2();
key_ss3();
key_ss2();
LED1 = 0;
LED2 = 1;
LED3 = 1;
LED4 = 1;
LED5 = 1;
LED6 = 1;
LED7 = 0;
LED8 = 1; 南北绿灯
displaydx(j);
displaynb(k);
if(TF1==1)
{
}
if(i==50)
{
i=0;
j--;
k--;
}
}
k = 5;
j= 5;
//第四阶段 东西红灯 南北黄灯
{
key_ss2();
key_ss3();
key_ss2(); LED1 = 0; LED2 = 1; LED3 = 1; LED4 = 1; LED5 = 1; LED6 = 0; LED7 = 1; LED8 = 1; while(k>0) TH1 = 0x4b; TL1 = 0xfc; TF1=0; i++;
displaydx(j);
displaynb(k);
if(TF1==1)
{
}
if(i==50) TH1 = 0x4b; TL1 = 0xfc; TF1=0; i++;
{
i=0;
j--;
k--;
}
}
}
}
void delay(uint i)
{
uint z,y;
z=i;
for(;z>0;z--)
for(y=120;y>0;y--);
}
void displaydx(uint i)
{
P0 = 0xff;
wei = 1;
P0 = 0x7f;
wei = 0;
duan = 1;
P0 = table[i%10];
duan = 0;
delay(2);
P0=0xff;
wei = 1;
P0 = 0xbf;
wei = 0;
duan = 1;
P0 = table[i/10];
duan = 0;
delay(2);
}
void displaynb(uint i)
{
P0 = 0xff;
wei = 1;
P0 = 0xf7;
wei = 0;
duan = 1;
P0 = table[i%10];
duan = 0;
delay(2);
P0=0xff;
wei = 1;
P0 = 0xfb;
wei = 0;
duan = 1;
P0 = table[i/10];
duan = 0;
delay(2);
}
void key_ss2()
{
if(key_s2==0)
{
}
}
}
void key_ss3()
{
if(key_s3==0)
delay(5);
if(key_s3==0) delay(5); if(key_s2==0) { while(!key_s2); while(1) { LED1 = 1; LED2 = 1; LED3 = 0; LED4 = 1; LED5 = 0; LED6 = 1; LED7 = 1; LED8 = 1; wei = 1; P0 = 0xff; wei = 0; }
{
while(!key_s3);
while(1)
}
} { LED1 = 0; LED2 = 1; LED3 = 1; LED4 = 1; LED5 = 1; LED6 = 1; LED7 = 0; LED8 = 1; wei = 1; P0 = 0xff; wei = 0; }
第五部分:实验结果及分析
实验结果非常正确,模拟交通灯的情况非常符合现实。刚开始东西绿灯亮50秒,南北红灯亮55秒,然后绿灯灭,黄灯亮。再然后黄灯亮五秒,东西黄灯灭,红灯亮35秒,南北红灯灭,绿灯亮30秒。然后南北绿灯灭,黄灯亮。然后黄灯亮5秒,南北黄灯灭,红灯亮55秒,东西绿灯亮50秒.如此循环往复。按下S2键,只允许东西向通车,按下S3键,只允许南北向通车。
第六部分:实验心得体会
本系统就是充分利用了AT89C51芯片的I/O引角。系统统采用MSC-51系列单片机为中心器件来设计交通灯控制器,实现了能根据实际车流量通过单片机芯片的P1口控制红、黄、绿灯的燃亮与熄灭;P0口外接数码管来显示各个信号灯的时间。系统设计简便、实用性强、操作简单、程序设计简便。系统不足之处不能控制车的左、右转、以及自动根据车流改变红绿灯时间等。这是由于本身地理位子以及车流量情况所定,如果有需要可以设计扩充原系统来实现。
通过这次课程设计,我得到了一次用所学知识与技能分析和解决问题的可贵的锻炼机会,使我深刻邻会了单片机的基本原理和单片机应用系统开发的过程。在常用编程设计思路技巧的掌握方面都向前迈了一大步,为日后成为合格的应用型人才打下良好的基础。
通过本次的毕业设计,受益匪浅,充分意识到自己所学的东西还是非常有限的,不过通过设计,还是学到了一些书本上没有学到的东西,为自己以后的工作奠定了一定的基础。在撰写本文的过程中,深切地体会到当今科技技术飞速的发展,特别是单片机的发展使得许多技术难题迎刃而解,作者坚信,随着科学技术的不断发展,单片机技术的应用将是前途无量。
由于本设计涉及到的知识面比较广,再加上本人在相关领域知识的缺乏,所以本设计的性能指标还是有待改善的,然而,模拟仿真证明了本设计的设计思想和设计方法是现实可行的。