单片机交通灯课程设计2Word格式文档下载.docx
《单片机交通灯课程设计2Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机交通灯课程设计2Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。
左右转弯的车辆都必须让合法的正在路口内行驶的车辆和过人行横道的行人优先通行。
红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。
黄灯是警告信号。
近年来随着科技的发展,单片机的应用正在不断地走向深入。
二、任务分析与设计思路
1、任务分析:
本次设计要求:
运用所学单片机原理、模拟和数字电路等方面的知识,设计出一台交通信号灯,模拟路口交通信号。
交通灯要求如下:
1)交通信号灯能够控制东西、南北两个方向的交通,红绿黄灯用对应颜色的发光二极管代替;
2)用四个2位数码管分别显示东、南、西、北方向的通行时间,东西或南北通行时间为25秒,红绿灯切换中间黄灯闪烁5秒。
目前,我们接触到的交通灯都位于十字路口,假设实际情况为东西南北走向的十字路口,如下图:
东西南北各三盏灯,每三盏分别为红、黄、绿三种颜色,总共十二盏灯,而实际情况下,东西方向灯亮灭一致,南北方向灯亮灭一致,故只需要按东西为一组,南北为一组,两组交错亮灭来设计控制系统,即可达到交通灯系统的控制目的。
根据以上分析那么只需要控制东南或者西北六盏灯亮灭规律就能实现控制,另外两组对应一致就行了。
根据设计要求,要求东西或者南北通行25秒,红绿灯切换中间黄灯闪烁5秒。
那么要求绿灯亮放行,放行线,绿灯持续亮(通行时间)25秒,黄灯亮(警告提醒时间)5秒,红灯亮禁止通行,禁止线,为了简化设计,也为25秒。
切换过程东西南北均为黄灯闪烁。
2、设计思路
基于完成以上任务分析,结合所学有关知识,尤其是本学期所学关于单片机的中断系统和定时/计数器的相关知识及应用,我们知道对于红、绿、黄两组各三盏灯的控制,可以通过把这六盏灯分别接到单片机的六个输出引脚,若用P1口进行输出,则分配如下:
AT89C51
P1.0P1.1P1.2P1.3P1.4P1.5
L1L2L3L4L5L6
(东西红)(东西黄)(东西绿)(南北红)(南北黄)(南北绿)
LED显示分布
通过对P1口P0~P5编程从而实现控制。
而时间的各盏灯的熄灭时间的延时情况,则用定时/计数和中断结合应用实现控制。
而输出的时间显示则每个方向分别用两个发光二极管显示,十位接在P0口,个位接在P2口,对P0口P2口编程即可实现控制。
三、总体设计
1、单片机内部资源分布图:
2、硬件原理框图:
交
通
灯
时钟电路
LED
数
码
管
振荡电路
上电复
位电路
3、软件结构图:
3、软件结构框图:
主
程
序
显示子程序调用实现
功能模块
4、软硬件分工
硬件实现实物连接,软件与硬件连接相对应,通过编写程序,使硬件实现期望的功能。
说的形象些,软件相当于其内在本质功能,而硬件是将该功能表现出来,让人们可见罢了。
3、详细设计
本设计使用的单片机为AT89C51。
AT89C51是带有4K字节闪存的低电压高性能微处理器。
其主要特性:
与MCS-51兼容 1、工作电压5V2、工作频率范围:
0~24MHZ3、应用程序空间:
4K字节4、RAM:
256字节5、4个8位并行I/O接口6、2个16位定时器/计数器7、5个中断源8、用单一+5v电源9、片内振荡器和时钟电路10、低功耗的闲置和掉电模式
1、设计电路:
设计电路主要由两部分组成,一部分为P1口与十二个发光二极管连接电路,另一部分是P0、P2口与八个七段显示器相连的电路,下面分别详细说明。
2、交通灯电路:
设计中采用发光二极管作为交通灯来使用,单片机的I/O接口直接和交通灯(发光二极管)连接。
在十字路口的四组红、黄、绿三色交通灯中,东西方向道路上的两组同色灯连接在一起,南北方向道路上的两组同色的灯也彼此连接在,受单片机P1.0~P1.5控制。
单片机的I/O接口与交通灯电路的具体连接方式为:
P1.0~P1.2分别接东西方向的红、黄、绿共6个放光二极管,P1.3~P1.5分别接南北方向的红、黄、绿共6个发光二极管。
12个发光二极管采用了共阳极的连接方式,因此I/O口输出低电平时,与之相连的发光二极管会亮,I/O口输出高电平时,相应的发光二极管会灭。
交通灯电路如图所示
3、倒计时显示电路:
该显示装置选用七段数码管来显示交通灯转换的剩余时间,根据控制要求,每个路口需要两个数码管,这样四个路口就要求八个数码管。
有序AT89C51单片机的I/O作为输出时,具有较强吸收电流能力,因此我们可以选用共阳型数码管,这样由单片机的I/O就可以直接驱动,从而简化硬件电路的设计。
四个路口倒计时显示被置在同一时刻显示相同的数字,期中P0口用来显示时间的十位,P2口用来显示时间的个位。
电路如下图所示
4、仿真电路及效果图:
(1)仿真电路:
(2)仿真效果:
5、元件清单:
名称
件数
参数
选择理由
电阻
8
10K
限流,以免烧坏数码管
发光二极管
12
3色
便于仿真显示
1
4K闪存
低电压,高性能八位微处理器
七段显示数码管
常用数字显示,便于仿真
开关
3
特殊情况使用
6、软件框图
(1)主程序流程图:
开始
初始化,全部为黄灯并按照初始化运行
东西红灯亮,南北绿灯亮
调用显示程序,将时间送显示
东西黄灯闪烁,南北黄灯烁
东西绿灯亮,南北红灯亮
东西黄灯闪烁,南北黄灯闪烁
(2)显示子程序流程图:
返回
7、程序及注释
主程序:
#include<
reg52.h>
#include<
intrins.h>
absacc.h>
#defineucharunsignedchar
sbitk1=P3^2;
//按键
sbitk2=P3^3;
sbitk3=P3^4;
sbitk4=P3^5;
voiddisplay(ucharm,ucharf,ucharF1);
voidkeyscan();
uchart,m,G1,g,o,f,M1,i,c,k1num,k2num;
unsignedcharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voidDelay(unsignedchara)
{
unsignedchari;
while(--a!
=0)
for(i=0;
i<
125;
i++);
}
voidinit()//初始化函数
TMOD=0x01;
//设定定时器0工作方式为1
TH0=(65536-46083)/256;
//高8位赋值
TL0=(65536-46083)%256;
//低8位赋值
EA=1;
//开总中断
ET0=1;
//开定时器0中断
TR0=1;
//启动定时器0
voidmain()
init();
G1=20;
g=10;
o=5;
M1=0;
c=0;
while
(1)
{
keyscan();
}
voidkeyscan()//K1键盘扫描函数
if(k2==0)
{
Delay(5);
{k2num++;
while(!
k2);
}
}
if(k2num!
switch(k2num)
{case1:
{
TR0=0;
P1=0xee;
P2=0x00;
};
break;
case2:
TR0=1;
k2num=0;
else{
if(k1==0)
if(k1==0)
{k1num++;
k1);
if(k1num!
{
switch(k1num)
{case1:
//南北绿灯通行显示时间
{
TR0=0;
//允许计时器T0工作位,0停止工作,可以设置南北方向绿灯通行时间
if(k4==0)//可以设置南北方向绿灯通行时间
{
if(k4==0)
{while(!
k4);
g++;
}
}
if(k3==0)
if(k3==0)
k3);
g--;
}P1=0xfd;
P2=0x22;
P0=tab[g%10];
P2=0x11;
P0=tab[g/10];
};
case2:
//东西绿灯通行时间
{
if(k4==0)
{
G1++;
G1--;
}P1=0xdf;
P2=0x88;
P0=tab[G1%10];
P2=0x44;
P0=tab[G1/10];
};
case3:
//可以设置黄灯时间
o++;
o--;
}if(o==10)
o=0;
P1=0xbd;
//黄灯显示时间
P0=tab[o];
case4:
TR0=1;
k1num=0;
}
elsedisplay(m,f,M1);
voidexter()interrupt1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==20)
t=0;
c--;
if(c==-1)
{
c=g+G1+2*o;
}
voiddisplay(ucharm,ucharf,ucharF1)
//东西灯南北灯
//76543210
//黄绿红黄绿红
if(c>
=0)//绿灯计时到0,黄灯闪烁o秒,红灯保持
{if(c>
=o)
=(G1+o))//
=(G1+2*o))
m=c-G1-o;
f=m-o;
P1=0xed;
//东西红灯:
1110南北绿灯:
1101
P2=0x22;
//南北绿灯显示时间
P0=tab[f%10];
P0=tab[f/10];
P2=0x88;
//东西红灯显示时间
P0=tab[m%10];
P0=tab[m/10];
else{f=c-G1-o;
P1=0xeb;
1110南北黄灯:
//南北灯显示时间
//东西灯显示时间
else{m=c-o;
P1=0xde;
//东西绿灯:
1101南北红灯:
1110
P0=tab[c%10];
P0=tab[c/10];
else{P1=0xbe;
//东西黄灯:
1011南北红灯:
1110
五、调试与运行
1、按照硬件连接图,相应的,P1.0接红灯,P1.1接黄灯,P1.2接绿灯,P1.3接红灯,P1.4接黄灯,P1.5接绿灯
2、从0100H单元开始连续运行,观察六个LED灯是否与交通显示情况对应,如果有偏差,则单步运行或断点运行,进行调试,直至满足设计要求。
3、调试完灯的显示后,从0100H开始连续运行,观察数码管显示的是否正常,如果不正常,则运用单步运行或断点运行进行分析和调试,直至满足要求。
4、整体运行,观察灯显示和时间显示是否都符合要求,如果不符合,则再调试。
直至满足要求。
六、设计资料及参考文献
1.高惠芳.单片机原理与应用技术.科学出版社,2010.4
2.胡汉才.单片机原理及其接口技术.清华大学出版社,2004
3.吴飞青等.单片机原理与应用实践指导.机械工业出版社2009.2
4.Proteus帮助文档
5.KeilC51帮助文档
七、心得体会
通过一个星期的交通灯课程设计,我对单片机相关知识有了更深的了解。
对于管脚及相关的控制寄存器,有了更进一步的巩固和了解,尤其是I/O口的实用及编程,相当于重新细细温习了一遍。
特别对protues软件画电路图及仿真的过程,我几乎是从零开始学习并使用的。
说到这里,得感谢小组里同学们的指导,同时也幸好大家都很繁忙,让我有更多的独立探索学习和思考的空间,将这些东西变成自己的。
这次课程设计的任务是通过单片机的I/O口来控制交通灯。
主要完成两大项任务,第一就是硬件连接图;
第二是编写相应的程序来实现硬件功能。
看似简单,实际上需要过硬的知识作为基础,平时看看书考试那样的过程,是难以完成这样的任务的。
这次设计过程中,遇到了很多棘手的问题,很多东西,动起手来束手无策,大多都只得先通过查阅资料或者参考别人做类似课题,才能自己动手设计画图,编程调试。
过程中还错误不少,就这个程序吧,我写了改,改了写,花了很长时间。
还有就是protues软件仿真原来及整个过程,虽然并不太难,但是我是通过这次才真正弄明白的。
通过这次课程设计,关于单片机的知识深入了解了更多,但更多是让我知道了知识的欠缺,很多环节,都慢慢翻书或者查找资料才能完成。
让我明白,在以后的学习中,应更注重知识的应用,更注重实质的掌握。
当然这次课程设计,提高了知识的应用能力和和实践能力,同时提高了独立思考独立完成任务的能力,当然同组之间,遇到了实在没办法解决的问题,也相互的咨询和讨论,加强了大家的合作精神和团结能力。
这对以后的学习和工作都有重要意义。