基于单片机的交通灯课程设计报告.docx
《基于单片机的交通灯课程设计报告.docx》由会员分享,可在线阅读,更多相关《基于单片机的交通灯课程设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
![基于单片机的交通灯课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-6/28/36f4cd3a-0571-49da-b824-fd206f1b86e4/36f4cd3a-0571-49da-b824-fd206f1b86e41.gif)
基于单片机的交通灯课程设计报告
单片机课程设计
专业:
机电一体化
学号:
姓名:
指导教师:
成都工业学院
2011年07月01日
姓名:
班级:
11411
学号:
46
课题编号:
6
课题名称:
交通灯控制
基本功能:
1.利用单片机完成交通信号灯控制。
2.该交通信号灯控制器由一条主干道和一条支干道汇合成十字路口。
3.在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外
4.设置了左转和右转灯,左转绿灯可以左转;左转红灯左转停;
右转转和左转类似。
5.设置了人行灯;直行绿灯亮,左右转红灯亮则人行绿灯亮;有转弯或直行为红灯则人行为红灯。
6设置紧急状态;当紧急按钮按下各方向全部变红灯。
扩展功能:
无
成绩:
评审老师:
一、需求分析:
(叙述该设计的使用场合、设计目的、立题意义)
设计目的:
模拟交通灯控制器就是使用单片机来控制一些LED和数码管,模拟真实交通灯的功能。
红、黄、绿交替闪亮,利用数码管倒计数显示间隔等,用于管理十字路口的车辆及行人交通,计时牌显示路口通行转换剩余时间等
使用场合:
使用于十字路口。
立题意义:
设计一个功能多点的交通灯,节省时间且交通更流畅。
二、硬件设计方案(画出系统框图即数据流向、硬件所用的器件,如单色灯、单片机等,并将芯片原理简要介绍)
硬件所用器件:
万用板
1块
AT89C51芯片
1块
共阳8段数码管
2*4个
导线
若干
12MHz晶振
1个
30P磁片电容
2个
74LS04
2块
74LS04片座
2个
51芯片座
1个
74LS10
3个
74LS10片座
1个
按键
2个
1OK排阻
1个
10K电阻
1个
LED发光二极管
3*20个
数码管座
2*4个
5V电源
1个
电解电容
1个
AT89C51芯片原理:
AT89系列单片机是ATMEL公司最早推出,也是功能最简单的一个系列,该系列都是内含Flash程序存储器的MCS-51兼容单片机,AT89C51就是其中一款可在线编程ISPFlash单片机。
AT89C51具有价格便宜、性能优良、可在线编程等特点。
其具体性能参数如下:
兼容MCS-51内核单片机;4KB可在线编程Flash存储器,可有效擦除/读写1000次;工作电压范围4.0~5.5V;完全静态工作:
0Hz~33MHz;ROM三级加密模式;128*8bit内置RAM;32位可控I/O引脚;2个16位的时钟源;5个中断源;全双工UART串行接口;低功耗工作模式;看门狗计时器;两个数据指针;快速编程特性。
系统硬件框图
单片机可选用AT89C51,它和8051系列单片机全兼容,但其内部带有4KB方便。
南北向和东西向各采用2个数码管计时,同时需要对该方向的指示灯的点亮时间进行倒计时
三、软件设计方案(画流程图、写出算法分析)
根据设计要求,程序框图如图所示。
软件可由汇编语言完成,也可由C语言完成。
软件设计可以分为以下几个功能模块:
计时程序模块:
为定时器的中断服务子程序,完成0.05秒(或其他时间)和1秒的时间定时。
显示程序模块:
完成60个发光二极管(实际上只需驱动30个)和8个LED数码管的显示驱动。
程序流程图
系统程序流程图
四、调试(针对该设计所用到的软件调试和硬件调试的方法)
软件调试:
软件调试主要是利用proteus仿真软件完成电路的搭建,运行以发现设计中的错误及时改正。
硬件调试:
硬件调试主要是检测硬件电路是否有短路、断路、虚焊等。
具体步骤及测试结果如下:
(1)检查电源和地线是否全部连接上,用万用表对照电路原理图测试各导线是否完全连接,对未连接的进行修复。
(2)参照原理图,检查各个器件之间的连接是否连接正确,是否存在虚焊,经测试,各连接不存在问题。
(3)以上两项检查并修复完后,给该硬件电路上电,电源指示灯点亮。
系统功能调试:
通过软件仿真显示,系统基本能完成要求。
五、心得体会(课程设计所遇到的问题以及解决方法,所收获到的知识点等)
做课程设计是为了让我们对平时学习的理论知识和实际操作相结合,在理论和实验教学基础上进一步巩固已学基本理论及使用知识并加以综合提高,学会将知识使用于实际的方法,提高分析和解决问题的能力。
对于交通灯这个题目,由于以前学单片机这个课程时,做过类似相关的实验,觉得这个比较简单而且做出的东西也比较直观,在确定题目之后,查阅了大量的资料,初步完成了电路设计方案。
虽然感觉交通灯程序没什么难的,就是数码管倒计时显示加几个闪烁的二极管就完事,但是也许是起初想的太简单,设计时到了细节处,也出了不少问题,而且很难被检查出来,比如在用定时器中断后用一些选择语句程序由于判断条件有疏漏程序很容易跑飞;但是最后经过我们的不断努力,还是写出来正确的代码。
接下来就是仿真了,在仿真也遇到了一些问题比如一些元器件的代号不知道;还有一开始交通灯想试试好不好用就接了一个脚怎么改程序都不亮;后来才试出来必须三个脚都接才能亮。
通过这次课设,对以前学过的知识进行了巩固,加深了理解,提高了使用的能力,而且提高了我们的发现、分析、解决问题的能力。
经历了从最初的设计到最后做出产品的开发过程,提高了对专业的认识及兴趣,对于我们工科来说,对以后就业有及其重大的影响。
附录1:
(程序代码)
#include
#defineucharunsignedchar//定义为uchar类型
#defineuintunsignedint//定义为uint类型
sbitdxgew=P3^6;
sbitnbgew=P3^4;
sbitdxsw=P3^7;
sbitnbsw=P3^5;
sbitnbr=P0^0;
sbitnby=P0^1;
sbitnbg=P0^2;
sbitdxr=P0^3;
sbitdxy=P0^4;
sbitdxg=P0^5;
sbitnbyzr=P0^6;
sbitnbyzy=P0^7;
sbitnbyzg=P2^0;
sbitdxyzr=P2^1;
sbitdxyzy=P2^2;
sbitdxyzg=P2^3;
sbitnbzzr=P2^4;
sbitnbzzy=P2^5;
sbitnbzzg=P2^6;
sbitdxzzr=P2^7;
sbitdxzzy=P3^0;
sbitdxzzg=P3^1;
ucharcodetable[]={0xc0,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示0~9
uchart=7,i;
uchartime_Count;//进行计时
ucharge=10,shi=3;//要显示的个位和十位
voiddelay(ucharz)//一个延时函数
{
uchara,b;
for(a=0;a<150;a++)
{
for(b=0;b}
}
voidInit_Timer()//定时器的初始化
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
ET0=1;
TR0=1;
EA=1;
}
voidSeg_Disp()//将个位十位分别显示在数码管上面
{
dxsw=0;
nbsw=0;
dxgew=1;
nbgew=1;
P1=table[ge];
delay
(1);
dxgew=0;
nbgew=0;
nbsw=1;
dxsw=1;
P1=table[shi];
delay
(1);
}
voidmain()//程序运行的主函数
{
SP=0x6f;
P1=0xff;
dxgew=0;
nbgew=0;
dxsw=0;
nbsw=0;
EX0=1;//开外部中断0
TCON=0x00;
dxr=0;
dxy=0;
dxg=0;
nbr=0;
nby=0;
nbg=0;
dxyzr=0;
dxyzy=0;
dxyzg=0;
nbyzr=0;
nbyzy=0;
nbyzg=0;
dxzzr=0;
dxzzy=0;
dxzzg=0;
nbzzr=0;
nbzzy=0;
nbzzg=0;
Init_Timer();
while
(1)
{
Seg_Disp();
if(time_Count==200)
{
time_Count=0;
ge--;
if(t==7)
{
dxr=1;
dxy=0;
dxg=0;
nbr=0;
nby=0;
nbg=1;
dxyzr=0;
dxyzy=0;
dxyzg=1;
nbyzr=0;
nbyzy=0;
nbyzg=1;
dxzzr=1;
dxzzy=0;
dxzzg=0;
nbzzr=1;
nbzzy=0;
nbzzg=0;
if(ge==0)
{
ge=10;
shi--;
if(shi==0)
{
shi=3;
t=6;
}
}
}
if(t==6)
{
dxr=1;
dxy=0;
dxg=0;
nbr=0;
nby=0;
nbg=1;
dxyzr=1;
dxyzy=0;
dxyzg=0;
nbyzr=1;
nbyzy=0;
nbyzg=0;
dxzzr=1;
dxzzy=0;
dxzzg=0;
nbzzr=1;
nbzzy=0;
nbzzg=0;
if(ge==0)
{
ge=10;
shi--;
if(shi==1)
{
shi=3;
t=5;
}
}
}
if(t==5)
{
for(i=0;i<5;i++)
{nbg=0;
delay(30000);
nbg=1;}
nby=1;
if(ge==0)
{
ge=10;
shi--;
if(shi==2)
{
shi=3;
t=4;
}
}
}
if(t==4)
{
dxr=1;
dxy=0;
dxg=0;
nbr=1;
nby=0;
nbg=0;
dxyzr=0;
dxyzy=0;
dxyzg=1;
nbyzr=0;
nbyzy=0;
nbyzg=1;
dxzzr=1;
dxzzy=0;
dxzzg=0;
nbzzr=0;
nbzzy=0;
nbzzg=1;
if(ge==0)
{
ge=10;
shi--;
if(shi==0)
{
shi=3;
t=3;
}
}
}
if(t==3)
{
dxr=0;
dxy=0;
dxg=1;
nbr=1;
nby=0;
nbg=0;
dxyzr=0;
dxyzy=0;
dxyzg=1;
nbyzr=0;
nbyzy=0;
nbyzg=1;
dxzzr=1;
dxzzy=0;
dxzzg=0;
nbzzr=1;
nbzzy=0;
nbzzg=0;
if(ge==0)
{
ge=10;
shi--;
if(shi==0)
{
shi=3;
t=2;
}
}
}
if(t==2)
{
dxr=0;
dxy=0;
dxg=1;
nbr=1;
nby=0;
nbg=0;
dxyzr=1;
dxyzy=0;
dxyzg=0;
nbyzr=1;
nbyzy=0;
nbyzg=0;
dxzzr=1;
dxzzy=0;
dxzzg=0;
nbzzr=1;
nbzzy=0;
nbzzg=0;
if(ge==0)
{
ge=10;
shi--;
if(shi==1)
{
shi=3;
t=1;
}
}
}
if(t==1)
{
for(i=0;i<5;i++)
{dxg=0;
delay(30000);
dxg=1;}
nby=1;
if(ge==0)
{
ge=10;
shi--;
if(shi==2)
{
shi=3;
t=0;
}
}
}
if(t==0)
{
dxr=1;
dxy=0;
dxg=0;
nbr=1;
nby=0;
nbg=0;
dxyzr=0;
dxyzy=0;
dxyzg=1;
nbyzr=0;
nbyzy=0;
nbyzg=1;
dxzzr=0;
dxzzy=0;
dxzzg=1;
nbzzr=1;
nbzzy=0;
nbzzg=0;
if(ge==0)
{
ge=10;
shi--;
if(shi==0)
{
shi=3;
t=7;
}
}
}
}
}
}
voidtimer0()interrupt1using1//定时器0的操作计时
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
time_Count++;
}
voidexter0()interrupt0
{
dxr=1;
dxy=0;
dxg=0;
nbr=1;
nby=0;
nbg=0;
dxyzr=1;
dxyzy=0;
dxyzg=0;
nbyzr=1;
nbyzy=0;
nbyzg=0;
dxzzr=1;
dxzzy=0;
dxzzg=0;
nbzzr=1;
nbzzy=0;
nbzzg=0;
}
附录2:
(电路原理图)