模拟交通信号灯.docx
《模拟交通信号灯.docx》由会员分享,可在线阅读,更多相关《模拟交通信号灯.docx(15页珍藏版)》请在冰豆网上搜索。
模拟交通信号灯
工程技术综合实践
项目设计报告
(电类)
项目:
模拟交通信号灯
A-3
西安理工大学工程训练中心
2011年6月10日
一概述
近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。
交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
本系统采用单片机AT89s52为中心器件来设计模拟交通信号灯,系统实用性强、操作简单、有扩展性。
二总体设计
通过控制单片机P1口管脚输出高低电平,实现红绿黄灯交替点亮和熄灭,并且用4只数码管显示十字路口两个方向的剩余时间,P0口为位选,P2口段选。
系统的工作符合一般交通灯控制要求。
1.交通灯控制系统设计
主要由单片机系统,发光二极管,数码管组成。
系统可以完成交通灯的基本功能。
系统除了基本功能外,还可以完成倒计时数字显示,使得功能在视觉效果上有更好的控制。
2.硬件设计
2.1时序图
图1时序图
三、电路图及设计文件
1.灯控制电路设计
观察图可以看出:
六组发光二极管(南北,东西各一组红、一组绿、一组黄)通过单片机P1口的高低电平控制。
用510欧姆的排阻起分压作用,让二极管正常发光。
图2LED显示部分
2.倒计时显示电路设计
前面已经分析过相向的灯的状态和倒计时都是相同的,所以为了节省,采用两组四个数码管作为倒计时显示,用三极管驱动数码管
图3数码管显示部分
3.单片机最小系统
单片机最小系统包括晶振和复位系统,晶振连接方式采用片内时钟振荡方式,在单片机18、19脚外接石英晶体和振荡电容,电容值为30p,复位系统接在单片机第九管脚,主要用来完成单片机的复位初始化操作。
图4单片机最小系统
2.2逻辑原理图
由于12个LED来实现红黄绿灯状态;采用两组二个数码管作为倒计时的显示;
图5电路原理图
2.3PCB板设计:
用ProtelDXP生成的PCB图如下:
图6PCB图
3.程序设计
#include//包含51单片机寄存器定义的头文件
UnsignedcharcodeTab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
unsignedcharcodeTaba[80]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
unsignedcharcodeTabb[80]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0};
unsignedcharcodeTabc[80]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,1,1,1,1,1};
unsignedcharcodeTabd[80]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsignedcharcodeTabe[80]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
unsignedcharcodeTabf[80]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
sbitnbr=P1^3;
sbitnby=P1^5;
sbitnbg=P1^4;
sbitdxr=P1^0;
sbitdxy=P1^2;
sbitdxg=P1^1//数码管显示0~9的段码表
unsignedchart0,t1;//记录中断次数
unsignedcharsecond,p;//储存秒
/***********************************************************************函数功能:
快速动态扫描延时,延时约0.6毫秒************************************************************************/
voiddelay(void)
{unsignedchari;
for(i=0;i<200;i++)
{};
}
/***********************************************************************
函数功能:
显示秒
入口参数:
k
出口参数:
无
************************************************************************/
voidDisplaySecond(unsignedchark)
{unsignedcharm;
if(k>3)
m=k-3;
elsem=k;
P2=0xbf;//P2.6引脚输出低电平,DS6点亮
P0=Tab[k/10];//显示十位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
P2=0x7f;//P2.7引脚输出低电平,DS7点亮
P0=Tab[k%10];//显示个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
P2=0xef;//P2.7引脚输出低电平,DS7点亮
P0=Tab[m/10];//显示个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
P2=0xdf;//P2.7引脚输出低电平,DS7点亮
P0=Tab[m%10];//显示个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
P2=0xff;//关闭所有数码管
P0=0xff;//显示个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
}
voidmain(void)//主函数
{
TMOD=0x11;//使用定时器T0
TH0=(65536-46083)/256;//将定时器计时时间设定为46083×1.085微秒//=50000微秒=50毫秒
TL0=(65536-46083)%256;
TH1=(65536-46083)/256//将定时器计时时间设定为46083×1.085微秒
TL1=(65536-46083)%256;
EA=1;//开启总中断
ET0=1;
ET1=1;
TR0=1;
TR1=1;
second=20;
t0=0;
t1=0;
p=0;
while
(1)
{DisplaySecond(second);//调用秒的显示子程序
nbr=Taba[p];
nby=Tabb[p];
nbg=Tabc[p];
dxr=Tabd[p];
dxy=Tabe[p];
dxg=Tabf[p];
}
}
//********************************************************
//函数功能:
定时器T0的中断服务程序
//*******************************************************
voidtimer0(void)interrupt1
{TH0=(65536-46083)/256;//重新给计数器T0赋初值
TL0=(65536-46083)%256;
t0++;//每来一次中断,中断次数int_time自加1
if(t0==20)//够20次中断,即1秒钟进行一次检测结果采样
{t0=0;//中断次数清0
second--;//秒加1
if(second==0)
second=20;//秒等于60就返回0
}
}//函数功能:
定时器T0的中断服务程序
//*******************************************************
voidtimer1(void)interrupt3
{TH1=(65536-46083)/256;//重新给计数器T0赋初值
TL1=(65536-46083)%256;
t1++;//每来一次中断,中断次数int_time自加1
if(t1==10)
{t1=0;
p++;
if(p==80)
p=0;
}
}
三.元器件清单
元器件清单如下表所示:
序号
名称
规格
型号
单位
数量
单价
(元)
1
单片机
直插式
AT89S52
个
1
15
2
IC锁紧座
40P
DIP40
个
1
1
3
晶振
12MHz
49S
个
1
0.5
4
电阻
10K1K
个
7
0.1
5
数码管
0.36英寸
红色共阳
个
4
1
6
按键
6*6*5
个
1
0.5
7
锁存器
DIP20
74HC573
个
1
7
8
排阻
DIP-9
510欧
个
1
1
9
自锁开关
5.8mm*5.8mm
个
1
0.5
10
三极管
NPN
C9013
个
4
0.5
11
LED
Ф5
红、黄、绿
个
各2
0.1
12
瓷片电容
30P
个
2
0.5
13
电解电容
25v10uf
个
1
0.2
14
盒子
120*122*55mm
11—93
个
1
19
表4元器件清单
总花费:
53.2元
四、测试、数据及结果分析
1.状态灯显示测试
当电路连接完毕后,将写好的测试程序刷写到芯片内,分别给P1口送高电平和低电平,通电即可检测。
检测结果:
南北方向红灯亮20s,同时东西方向先绿灯亮15s再闪烁2s,接着东西方向黄灯亮3s;东西方向红灯连续亮20s,在此同时南北方向绿灯先亮15s再闪烁2s,再变为黄灯亮3s。
这样一个循环就结束了,后面依次重复此过程。
此结果符合交通灯设计,完全正确。
2.数码管的测试
将写好的测试程序刷写到芯片内,开电源即可测试。
检测结果:
数码管部分虽然可以亮,但是没有按照程序的要求,而是随意变化。
3.整体电路测试
系统上电,刷写好程序即可开始测试,观测一个周期内灯的显示状态是否正常,同时观察倒计的计数是否正常,并按复位键观察复位系统是否正常工作。
检测结果:
灯的部分工作正常,而数码管部分只是亮,没有达到预期效果。
按下复位键,程序可以从头开始执行。
以上结果除数码管部分外一切正常。
交通灯工作实景:
图7成品图
五、产品说明
本产品外形简单,价格低廉,美观大方,实用性强,时间变换合理,操作简单,且可以根据路况人流更改程序来调节时间,以达到时间合理利用。
使用说明:
将电源插到普通插座上,再按下开关,交通灯即可正常工作。
按下复位开关,交通灯将恢复初始状态,重新执行程序。
六、总结
经过十五周的努力后,我们通过团结合作终于完成了模拟交通信号灯的项目,从对单片机一窍不通开始,慢慢学习对单片机有了一定的了解和掌握。
我们的项目用单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。
但是在我们设计和调试的过程中还存在一些问题,数码管的部分还不能按照要求实现倒计时,主要原因是硬件设计时没有考虑周到,导致数码管不能按照程序要求变化。