基于51单片机的交通灯(红绿灯)设计论文报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通过单片机仿真交通灯
班级:10级电信
姓名:***
学号:***********
第一章概述
1.设计内容:
用AT89S52单片机控制一个交通信号灯系统,晶振采用12MHZ。
设A车道与B车道交叉组成十字路口,A是主道,B是支道。
设计要求如下:用发光二极管模拟交通信号灯,用按键开关模拟车辆检测信号。
正常情况下,A、B两车道轮流放行,A车道放行50s,其中5s用于警告;B车道放行30s,其中5s 用于警告。
交通繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥挤状况。
在B 车道放行期间,若A车道有车而B车道无车,按下开关K1 使 A车道放行15s;在 A车道放行期间,若B车道有车而A车道无车,按下开关K1 使B 车道放行15s。
有紧急车辆通过时,按下K2开关使 A、B车道均为红灯,禁行20s。
2.设计目的:
1)进一步熟悉和掌握单片机的结构和工作原理。
2)掌握单片机的接口技术及相关外围芯片的外特性,控制方法。
3)通过课程设计,掌握以单片机为核心的电路设计的基本方法和技术,了解有关电路参数的计算方法。
4)通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。
5)通过完成一个包括电路设计和程序开发的完整过程,为我们今后从事相应工作打下基础。
3.设计原理:
利用“自动控制”控制交通灯的方法。
将事先编制好的程序输入单片机,利用单片机的定时、查询、中断功能;能够根据十字路口两个方向上车辆动态状况,采用查询的方式,根据具体情况,自动给予时间通行,其中利用中断方式来处理特殊情况。
这样既方便驾驶员、路人,同时还可以紧急处理一些紧急实况。
同样具有红、黄、绿灯的显示功能,为驾驶员、路人“照明”。
使用AT89C51单片机控制 4个方向的交通灯(红﹑黄﹑绿)并用数码管显示其时间。
了解交通灯管理的基本工作原理,熟练掌握STC89C51的工作原理和应用编程,熟悉STC89C51单片机并行接口的各种工作方式和应用,并了解计数器/定时器的工作方式和应用编程外部中断的方法,掌握多位LED 显示问题的解决。
第二章 硬件设计
1. 设计框图:
图1-1
设计说明:
1)南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替运行,主干道每次通行时间都设为30秒、支干道每次通行间为20秒,时间可设置修改。
2)在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道; 3)黄灯亮时,要求每秒闪亮一次。
4)东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采用计时的方法)。
5)一道有车而另一道无车(实验时用开关 K0 和 K1 控制),交通灯控制系统能立即让有车道放行。
6)有紧急车辆要求通过时,系统要能禁止普通车辆通行,A 、B 道均为红灯,紧急车由K2 开关模拟。
4.设计任务:
1)东西、南北车辆交替运行,时间可设置修改。
2)绿灯转为红灯时,黄灯闪亮(间隔1秒)。
3)能显示剩余时间。
4)能对交通运行进行控制。
2.各元器件选择及其功能介绍:
1)元器件列表
元件名称型号数量/个用途
单片机 AT89C51 1 控制核心
晶振 12MHZ 1 晶振电路
电容 30pF 2 晶振电路
电解电容 10uF 1 复位电路
电阻 5.1K 1 复位电路
发光二极管 LED 12 红、黄、绿灯
集成块 74LS08 1 按键电路
电阻 220Ω 13 LED限流
电阻 470Ω 8 数码管电路
电阻 1K 7 数码管驱动、按键电路数码管 GC-3461BS 1 显示电路
微动开关 3 按键电路
三级管PNP 8550 4 数码管驱动电路
表1-1
2)2位8段数码管工作原理:
2位8段数码管电路采用“共阴”连接,阴极公共端(COM)由晶体管推动。
如图4-3所示:
段码和位码,段码即段选信号 SEG,它负责数码管显示的内容,图中 a~g、dp组成的数据(a 为最低位,dp 为最高位)
就是段码。
位码即位选信号 DIG,它决定哪个数码管工作,哪个数码管不工作。
当需要某一位数码管显示数字时,只需要先选中这位数码管的位信号,再给显示数字的段码。
3. 设计原理图:
红绿灯整体示意图
图1-2
交通信号灯的状态表
表1-2
共阳与共阴数码管自行代码
表1-3
1、时钟电路模块
时钟电路由一个晶体振荡器12MHZ和两个30pF的瓷片电容组成。
时钟电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。
单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信
号控制下严格地工作。
其电路如图1-3所示:
字型共阳极代码共阴极代码字型共阳极代码共阴极代码
0 C0H 3FH 9 90H 6FH
1 F9H 06H A 88H 77H
2 A4H 5BH B 83H 7CH
3 B0H 4FH C C6H 39H
4 99H 66H D A1H 5EH
5 92H 6DH E 86H 79H
6 82H 7DH F 8EH 71H
7 F8H 07H 灭FFH 00H
8 80H 7FH
图1-3
2、复位电路模块
复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状态,并从这状态开始工作,除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位电路以重新启动。
本设计采用的是按键复位电路。
其电路如图1-4所示:
图1-4
3、主控制系统模块
主控制器采用AT89C51,是ATMEL公司生产的一款性能稳定的8位单片机。
AT89C51具有1个8KB的FLASH程序存储器,1个512字节的RAM,4个8位的双向可位寻址I/O端口,3个16位定时/计数器及1个串行口和6个向量二级中断结构。
单片机的P0口分别用于控制南北及东西的通行灯,P2口和P3^4-P3^7口用于4组4位LED计时器的控制,紧急车辆通行时使用外中断0(P3^2)和外中断1(P3^3),进行手动按键,即可转换。
4、交通灯输出控制模块
道口交通灯指示采用高亮度红、黄、绿发光二极管进行提示。
当R=220欧时,按公式A=(5-1.8)/R计算,电路中的电流大小应为A=14.545mA.由于每个路口的通行双向指示处理相同,因此每个端口应具有3A的吸收电流能力。
5、时间显示电路模块
道口通行剩余时间采用高亮红色7段LED发光数码管显示,采用共阳数码管,如用单片机吸收电流驱动,列扫描驱动使用三极管,按每段6mA电流计算,全显示字形“8”时,每个数码需6mA*8=48mA,由于时间显示每个道口相同,共需要电流192mA,因此设计中也采用了中功率三极管8550.其显示电路如图1-6所示:
图1-5
6、紧急通车电路模块
为了实现此功能,利用单片机中断达到目的。
利用一个手动按钮开关接至单片机外部中断0,同时在软件设计时将其设定为最高优先级,当其按下时,四方全为红灯,同时将中断位置的PSW、ACC进栈保护,当其计时完了之后,回到原来的位置进行执行。
再利用一个手动按钮接至单片机外部中断1当其按下时,如果是东西道是红灯,而南北道是绿灯,则将其置为东西是绿灯,南北是红灯;如果是东西道是绿灯,而南北道是红灯,则将其置为东西是红灯,南北是绿灯。
两种情况都是执行完后,回到断点处继续执行。
第三章软件设计
1.程序:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define time 50000
#define on 0
#define off 1
sbit RED_ZHU = P0^0; //南北红灯
sbit YELLOW_ZHU = P0^1;//南北黄灯
sbit GREEN_ZHU = P0^2; //南北绿灯
sbit RED_ZHI = P0^3; //东西红灯
sbit YELLOW_ZHI = P0^4; //东西黄灯
sbit GREEN_ZHI = P0^5; //东西绿灯
sbit P23 = P3^4;
sbit P22 = P3^5; //东西方向数码管位选
sbit P21 = P3^6;
sbit P20 = P3^7; //南北方向数码管位选
sbit int0_key = P3^2;
sbit int1_key = P3^3;
void display1(uchar,uchar);
void display2(uchar,uchar);
void delayms(uint k);
uchar temp1,temp2,temp3,temp4,temp5,temp6;
/*===============倒计时=========================*/ uchar N = 50,Y = 45,Z = 50,M = 75,G = 80,U =80;
uchar C50ms,t0;
uchar seg = 1;
uchar flag=0,led_data_temp;
void InitialT1(void)
{
TMOD = 0x11; //定时器0,1工作在方式1
TH1 = (65536 - time)/256; //相当于(65536-time)/256;
TL1 = (65536 - time)%256;//初值为time(50ms)
TR1 = 1;//开定时器1中断
ET1 = 1;//允许定时器1中断
ET0 = 1;
TH0 = (65536 - time)/256;
TL0 = (65536 - time)%256;
EX0 = 1; //允许外部中断0
IE0 = 1;//启动外部中断0
PX0 = 1;
EX1=1;
IE1=1;
EA = 1; //开总中断
}
void int0(void) interrupt 0 //外中断0
{
flag = 0;
led_data_temp = P0;
t0 = 20;
if(!int0_key)
{
delayms(10);
if(!int0_key)
{
while(!int0_key);
TH0 = (65536 - time)/256;
TL0 = (65536 - time)%256;
TR1 = 0;
TR0 = 1;
EX0 = 0;
EX1 = 0;
C50ms = 0;
}
}
}
void int1(void) interrupt 2 //外部中断1
{
t0=15;
flag = 1;
led_data_temp = P0;
if(((RED_ZHU == 0) && (GREEN_ZHI == 0))||((YELLOW_ZHI == 0)&&(RED_ZHU == 0)))
{
P0 = 0xff;
GREEN_ZHU = 0;
RED_ZHI = 0;
}
else //if((RED_ZHI == 0)&&(GREEN_ZHU == 0))
{
P0 = 0xff;
GREEN_ZHI = 0;
RED_ZHU = 0;
}
if(!int1_key)
{
delayms(10);
if(!int1_key)
{
while(!int1_key);
TH0 = (65536 - time)/256;
TL0 = (65536 - time)%256;
TR1 = 0;
TR0 = 1;
EX0 = 0;
EX1 = 0;
C50ms = 0;
}
}
}
void ISRT0(void) interrupt 1//定时器0中断服务子程序
{
temp1 = N,temp2 = Y,temp3 = Z,temp4 = M,temp5 = G,temp6 = U;
TH0 = (65536 - time)/256;
TL0 = (65536 - time)%256; //重装初值time
YELLOW_ZHU=1; //如果在黄5S时进行熄灭黄灯
YELLOW_ZHI=1;
if(!flag)
{
P0 = 0xf6;
}
C50ms++;
if(C50ms > 19)
{
t0--;
C50ms = 0;
}
if(t0 == 0)
{
P0 = led_data_temp;
N = temp1,Y = temp2,Z = temp3,M = temp4,G = temp5,U = temp6;
TR0 = 0;//禁止定时器1中断
TR1 = 1;//开定时器1中
EX1 = 1;
//EX0 = 1;
C50ms = 0;
return;
}
}
void ISRT1(void) interrupt 3 //定时器1中断服务子程序
{
TH1 = (65536 - time)/256;
TL1 = (65536 - time)%256; //重装初值time
C50ms++;
if(C50ms > 19)
{
N--;
M--;
Y--;
Z--;
G--;
U--;
C50ms = 0;
}
}
/*=================延时=======================*/
void Delay10uS(uchar second)
{
uint i;
while((second--) != 0)
{
for(i = 0;i < 5;i++)
{}
}
}
void delayms(uint k)
{
uint i,j;
for(i = 0;i < k;i++)
for(j = 0;j < 120;j++);
}
/*==================数码管控制========================*/
uchar code discode[]=
{0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0-9代码
void display1(uchar num1,uchar num2) //控制南数码管显示
{
P2=discode[num1]; P21=on; Delay10uS(10); P21=off; //低位
P2=discode[num2]; P20=on; Delay10uS(10); P20=off; //高位
}
void display2(uchar num3,uchar num4) //控制东西数码管显示
{
P2 = discode[num3]; P23 = on; Delay10uS(10); P23 = off; //低位
P2 = discode[num4]; P22 = on; Delay10uS(10); P22 = off; //高位
}
/*===================主函数=================================*/
main()
{
/*=============初始状态:东西南北都红灯==================*/
RED_ZHU=on;
RED_ZHI=on;
delayms(1000);
RED_ZHU = off;
RED_ZHI = off;
InitialT1();
while(1)
{
// 初始化计时器
/*=============状态1:东西绿灯(45s) 南北红灯
(40s)==================*/
/*=============状态2:东西黄灯(5s) 南北红灯
(5s)=================*/
RED_ZHI = on;
GREEN_ZHU = on;
while(N != 0)
{
if(TR0 == 1)
{
display2(t0/10,t0%10);// 当t0=20时东西、南北红灯(20s)
display1(t0/10,t0%10);// 当t0=15时东西、南北红、绿灯交换点亮
}
else
{
if(N == 5)
{
while(Z != 0)
{
if(TR0 == 1)
{
display2(t0/10,t0%10);
display1(t0/10,t0%10);
}
else
{
display1(N/10,N%10); // 东西黄灯(5s)
display2(Z/10,Z%10); // 南北红灯(5s)
GREEN_ZHU = off;
YELLOW_ZHU = on;
}
}
}
else
{
display1(N/10,N%10); // 东西绿灯(45s)
display2(Y/10,Y%10); // 南北红灯(40s)
}
}
}
GREEN_ZHU = off;
RED_ZHI = off;
YELLOW_ZHU = off;
P0 = 0xff; //数码管全关掉
Delay10uS(1);
/*=============状态3:东西红灯(20s) 南北绿灯
(25s)==================*/
/*=============状态4:东西红灯(5s) 南北黄灯
(5s)==================*/
GREEN_ZHI = on;
RED_ZHU = on;
while(G != 0)
{
if(TR0 == 1)
{
display2(t0/10,t0%10);
display1(t0/10,t0%10);
}
else
{
if(G == 5)
{
while(U != 0)
{
if(TR0 == 1)
{
display2(t0/10,t0%10);
display1(t0/10,t0%10);
}
else
{
display2(G/10,G%10);// 东西红灯(5s)
display1(U/10,U%10);// 南北黄灯(5s)
GREEN_ZHI = off;
YELLOW_ZHI = on;
}
}
}
else
{
display2(G/10,G%10);// 东西红灯(25s)
display1(M/10,M%10);// 南北绿灯(20s)
}
}
}
GREEN_ZHI = off;
RED_ZHU = off;
YELLOW_ZHI = off;
P0 = 0xff;
Delay10uS(1);
/*=====================重新赋值
===============================*/
N =50,Y = 45,Z = 50,M = 75,G = 80,U =80;
}
}
第四章仿真结果及其总结
1.仿真结果图:
南北通行:
图1-6 通行警告:
图1-7
东西通行:
图1-8
2.总结:
通过这次交通灯的课程设计,使我得到了一次用专业知识、专业技能分析和解决现实问题的能力。
使我在单片机的基本原理、单片机应用学习过程中,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,为日后成为一名合格的应用型人才打下良好的基础。
综合课程设计让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更深层次的理解和认识。
在此,由于自身能力有限,在课程设计中碰到了很多的问题,我通过查阅相关书籍、资料以及和周围同学交流得到解决。
还有交通灯是我们生活中非常常见的一种东西,对于我们学以致
用的这种能力得到了很好锻炼,能够为我们以后的工作于学习打下基础。
通过合作,我们的合作意识得到加强。
合作能力得到提高。
上大学后,很多同学都没有过深入的交流,在设计的过程中,我们用了分工与合作的方式,每个人互责一定的部分,同时在一定的阶段共同讨论,以解决分工中个人不能解决的问题,在交流中大家积极发言,和提出意见,同时我们还向别的同学请教。
在此过程中,每个人都想自己的方案得到实现,积极向同学说明自己的想法。
能过比较选出最好的方案。
在这过程也提高了我们的表过能力。