用单片机设计交通灯课设报告.docx
《用单片机设计交通灯课设报告.docx》由会员分享,可在线阅读,更多相关《用单片机设计交通灯课设报告.docx(19页珍藏版)》请在冰豆网上搜索。
![用单片机设计交通灯课设报告.docx](https://file1.bdocx.com/fileroot1/2023-2/6/f7924bbe-6627-416c-a839-60a2288be683/f7924bbe-6627-416c-a839-60a2288be6831.gif)
用单片机设计交通灯课设报告
单片机原理及接口技术
课程设计报告
设计题目:
人车分行交通信号指挥灯的控制
学号:
姓名:
指导教师:
信息与电气工程学院
二零一四年七月
人车分行交通信号指挥灯的控制
在生活中,我们在各个路口基本都可以看到交通信号灯,道路交通信号灯是交通安全产品中的一种类别,是为了加强道路交通管理,减少交通事故的发生,提高道路使用效率,改善交通状况的一种重要工具。
近年来,随着科技的飞速发展,电子器件也随之广泛应用,其中单片机也不断深入人民的生活当中。
本模拟交通灯系统利用单片机AT89C51作为核心元件,实现了通过信号灯对路面状况的智能控制。
系统具有结构简单、可靠性高、成本低等优点,有广泛的应用前景。
本模拟系统由单片机硬/软件系统,两位8段数码管和LED灯显示系统。
和复位电路、时钟产生电路等组成,较好的模拟了交通路面的控制,利用单片机良好的控制功能来进行设计,应用更灵活,功能更强大,也更智能化。
通过C语言编程,单片机做控制,加上8个LED灯指示交通红绿灯、8155控制数码管倒计时显示来实现基本功能,外加处理突发中断情况的的紧急按钮来模拟儿童在红灯过程中误闯的情况,并有带蜂鸣器报警。
1.设计任务
结合实际情况,基于AT89C51单片机设计一个人车分行交通信号指挥灯。
该系统应满足的功能要求为:
(1)交通红绿灯显示;
(2)倒计时设置;
(3)儿童过马路提示。
主要硬件设备:
AT89C51单片机、8个LED灯、两个数码管显示器、蜂鸣器、8155I/O口扩展芯片
列写交通灯变化表
表1-1利群超市门前路口交通灯变化情况表
状态延时(s)
状态
维持时间
亮:
人行绿灯,东西、南北直行红灯
20s
亮:
人行红灯,东西直行绿灯、南北直行红灯
60s
亮:
人行红灯,东西直行黄灯,南北直行红灯
3s
亮:
人行红灯,南北直行绿灯,东西直行红灯
30s
亮:
人行红灯,南北直行黄灯,东西红灯
3s
2.整体方案设计
人车分行交通信号指挥灯以AT89C51单片机作为整个系统的控制核心,应用其强大的接口功能,构成整个人车分行交通信号指挥灯控制的硬件系统。
该系统用8个LED灯模拟东西南北红黄绿灯以及人行红绿灯,用AT89C51的P1口的8个管脚与其连接,两位数码管显示器显示各个状态的倒计时,而数码管显示器由8155的PA口和PB口控制,PB口控制数码管的段选码,PA口控制数码管的位选码,实现动态显示,节省管脚的使用,AT89C51的管脚P3.0和P3.2分别连接蜂鸣器和应对突发状况的紧急开关。
本系统硬件主要AT89C51单片机、8155I/O口扩展芯片、LED输出模块、拨码开关、六位数码管显示器,蜂鸣器六部分组成。
各模块的主要功能如下:
(1)AT89C51作为整个系统的控制核心,通过编程控制各个模块;
(2)8155的功能是控制数码管显示器;
(3)LED输出模块的功能是指示两个路口的红黄绿灯、人行红绿灯灯变化情况;
(4)数码管显示器的功能是显示倒计时时间;
(5)拨码开关的功能是在儿童误闯状况时按下,使蜂鸣器发出报警声,防止发生交通事故。
系统的整体设计方案设计图如图2-2所示。
图2-2交通灯整体设计图
3.系统硬件电路设计
3.1复位电路
如图3-1是复位电路图
复位电路
3.2时钟产生电路
如图3-2是时钟产生电路
时钟产生电路
3.38155I/O口扩展芯片的基本介绍
3-38155I/O口扩展芯片引脚图
:
(1)其基本外型如图3-3所示
(2)其管脚说明如下:
a)AD7-AD0:
三态双向数据线
b)PA7-PA0:
A口输入输出线
c)PB7-PB0:
B口输入输出线
d)PC5-PC0:
C口输入输出线
e)CS:
片选信号
f)RD:
读信号
g)WR:
写信号
h)ALE:
地址锁存信号
i)IO/RAM:
I/O口、RAM选择信号
j)RESET:
复位信号
k)TIMERIN:
定时器输入
l)TIMEROUT:
定时器输出
3.4AT89C51单片机的基本介绍
(1)其基本引脚如图3-4所示
图3-4AT89C51单片机引脚图
(2)管脚说明:
a)VCC:
供电电压。
b)GND:
接地端。
c)P0口:
是一个8位漏极开路的双向I/O口,每脚可吸收8个TTL门流:
可用于外部程序数据存储器,可以被定义为数据/地址的低八位。
d)P1口:
是一个由内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4个TTL门电流。
e)P2口:
P2是一个带有内部上拉电阻的8位准双向I/O口,P2即可作为通用的I/O口使用,也可以作为片外存储器的高8位地址总线,与P0口配合,组成16位片外存储器单元地址。
f)P3口:
P3口是一组带有内部上拉电阻的8位准双向I/0口。
P3口除了作为通用的I/O口使用之外,每个引脚还具有第二功能,具体分配如表3-5所示。
表3-5P3口第二功能的引脚表
端口引脚
第二功能:
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
INT0*(外中断0)
P3.3
INT1*(外中断1)
P3.4
T0(定时/计数器0外部输入)
P3.5
T1(定时/计数器1外部输入)
P3.6
WR*(外部数据存储器写选通)
P3.7
RD*外部数据存储器读选通)
g)RST:
复位输入;当振荡器复位器件时,要保持RST引脚两个机器周期的高电平时间。
h)ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地址字节。
ALE端以固定不变的频率周期输出正脉冲信号,可用于对外部输入的脉冲计数或定时。
i)PSEN*:
外部程序存储器的选通信号。
j)EA*/VPP:
当/EA保持低电平时,访问外部程序存储器;————EA保持高电平时,访问内部程序存储器。
k)XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
l)XTAL2:
来自反向振荡器的输出。
3.4倒计时6位数码管显示电路
LED显示屏作为大型显示设备的一种,具有亮度高、价格低、寿命长、维护简便等优点。
LED数码管的结构简单,分为七段和八段两种形式,也有共阳和共阴之分。
以八段共阳管为例,它有8个发光二极管(比七段多一个发光二极管,用来显示dP,即点),每个发光二极管的阳极连在一起。
这样,一个LED数码管就有I根位选线和8根段选线,要想显示一个数值,就要分别对它们的高低电平来加以控制。
为方便起见,本文主要讨论共阳八段LED数码显示管,其他类形的显示管与其类似,如图3-6所示。
图3-6LDE数码管
3.58个LED灯输出模块电路
对于利群超市门前路口分东西直行,南北直行,东西南北人行三个状态,东西直行由黄绿红灯为L1、L2、L3表示;南北直行由黄绿红灯为L5、L6、L7表示;东西南北的人行红灯为L8表示,人行绿灯为L4表示。
共8个LED灯,为共阳极;L1-L8阴极依次连接到P1.7-P1.0,阳极都接到电源VCC上。
3.6开关量紧急按钮
防止由于紧急情况发生交通事故,故设置有紧急按钮,由AT89C51的P3.2的INT0*接收中断,连接一个开关K。
4.系统程序设计
4.1主程序及控制子程序流程图
主程序及控制子程序工作流程:
路口共五个状态:
人行绿灯、人行红灯、东西直行绿灯、东西直行黄灯、南北直行绿灯、南北直行黄灯。
开始先确定指示灯倒计时时间,扫描显示6个数码管,扫描满20次的话倒计时时间减1,;扫描不满20次的话返回继续扫描数码管;再确定路口指示灯状态,调用之前定义的数组变量,并依据状态顺序选择8个LED灯的亮灭。
图4-1系统主程序流程
4.2中断子程序流程图
中断子程序工作流程:
外部中断0:
开启定时器0,如图4-2所示。
图4-2外部中断0程序流程图
定时器0:
每次中断前计时50ms,计时4次总计200ms,使p3.0输出电平每200ms变化一次,以控制蜂鸣器发出的声音,并循环,如图4-3所示。
图4-3定时器0中断程序流程图
定时器1:
每次中断前计时50ms,计时20次共1s,每经过1s交通灯计时数据减小,当交通灯计时数据减小为0时,交通灯计时数据,数码管显示以及灯的显示情况进入下一个状态,状态循环,如图4-4所示。
图4-4定时器1中断程序流程图
5.系统调试
5.1Proteus软件仿真调试
(1)一开始用Proteus仿真时,由P0口控制数码管的段选,而每次选择开关数码管的位选信号改变较快,使得本应该控制前一位数码管的段选信号却能在后一位数码管上显示出来,。
后改用P2口控制数码管段选信号,P3.6、P3.7做片选信号。
P1口做LED灯的控制信号。
(2)在Proteus仿真软件中6个独立的7SEG-COM-ANODE型号的数码管和单片7SEG-MPX6-CA的用法不同,前者是理想的数码管(即不同于实际数码管在关断时仍有余晖的现象,该型数码管只在位选选中或电源端供电时才亮),而后者由于存在余晖现象,所以运行时表现出每位数码管都亮的现象。
(3)在循环控制数码管计数自减1时,只注意循环次数,忘记在循环体中给数码管赋新的值,使得数码管显示的数字没有隔一秒自减1,只在下一个循环时突然减小。
改进后,在循环体中每次循环都对倒计时的数字自减1。
(4)用三组两位数码管倒计时模拟十字路口红绿灯倒计时,用红绿灯分别模拟东西南北直行的状态灯。
(5)用蓝灯闪烁模拟硬件中突发状况下,蜂鸣器报警时“滴、滴、滴、滴”的报警声。
(6)软件仿真时由于软件中8155芯片的各控制口地址与硬件中8155的地址计算方法不同,无法正常输出期望的信号,故软件仿真时,未采用8155芯片,而是采取了直接连数码管段选、位选信号的措施。
(7)经过数次调试,最终用Proteus仿真软件实现了模拟十字路口交通灯的控制。
改进前仿真电路原理,如图5-1所示。
图5-1改进前的Proteus软件仿真原理图
改进后仿真电路原理,如图5-2所示。
图5-2改进后的Proteus软件仿真原理图
5.2硬件调试
硬件调试是利用开发系统、基本测试仪器(万用表、示波器等),检查用户系统硬件中存在的故障。
硬件调试分为静态调试与动态调试两步进行。
(1)使用菊阳仿真器和菊阳仿真软件时,没有对编译器初始化,所以不能实现单片机和PC机的通讯。
(2)程序中使用跳沿触发中断服务子程序,如果把开关打到低电平位置上,于是在实验箱刚上电时,P3.2中断引脚会先置高电平,再被开关拉到低点电平,相当于产生了负跳沿,所以一开机就进入中断程序。
为了避免出现上述现象,在程序中先把中断触发开关置高电平,这样就能使得中断引脚不会被拉低,没有误动作。
(3)实验箱上的LED数码管模块和按键模块都可以由8155控制,本次课程设计,选择用8155控制数码管模块。
6.程序清单
#include
#include
sbitdi=P3^0;
sbitd=P3^2;
#defineucharunsignedchar
#defineuintunsignedint
#defineCOMXBYTE[0xff20]
#definePAXBYTE[0xff21]
#definePBXBYTE[0xff22]
#definePCXBYTE[0xff23]
Ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
ucharxianshi[]={20,60,3,30,3};
uchardeng[]={0xb3,0x3d,0x3e,0x5b,0x6b};
voiddelayms(uint);
voiddisplay(uchar,uchar);
ucharnum,num1,num2,shi,ge,i;
voidmain()
{
di=1;
COM=0x43;
i=0;
P1=0xb3;
num=15;
EX0=1;
IT0=1;
TMOD=0x11;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET1=1;
TR1=1;
while
(1)
{
if(d==1)
{
di=1;
TR0=0;
}
display(shi,ge);
}
}
voiddisplay(ucharshi,ucharge)
{
PB=table[shi];
PA=0xfd;
delayms(5);
PB=table[ge];
PA=0xfe;
delayms(5);
}
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voiddidi()interrupt0
{
ET0=1;
TR0=1;
}
voiddididi()interrupt1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==4)
{
num1=0;
di=~di;
}
}
voidT1_time()interrupt3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
num2++;
if(num2==20)
{
num2=0;
num--;
if(num==0)
{
if(i==4)
i=0;
else
i++;
num=xianshi[i];
P1=deng[i];
}
shi=num/10;
ge=num%10;
}
}
7.小结
本次课程设计题目为百货大楼十字路口人车分行交通信号灯系统,由于与上次的PLC课程设计题目一致,所以就用上次实地测得的交通信号数据进行了本次单片机课程设计的设计。
具体设计步骤是,先在KAIL中创建一个工程,在工程中用C语言进行编程,具体编程思路是在定时器中完成及时,从而完成对输出数据、输出灯状态、蜂鸣器的操作,同时再通过数码管译码及动态扫描,完成输出数据在数码管上的显示,完成编程并编译通过后,再通过JY2X00IDE软件进行硬件仿真,如有问题再进行程序的修改,直到硬件功能的实现,最后再在Proteus软件中画出仿真电路再进行软件仿真,直到实现功能即可。
本次课程设计遇到了如下问题,首先在未软件仿真的情况下,直接将程序拷了进去进行了硬件仿真,虽然8个LED灯实现了红绿灯的基本功能,即东西直行红绿黄,南北直行红绿黄,左转白灯,人行白灯,但是倒计时数码管却六位全亮,并没有实现倒计时的功能。
经过小组成员讨论后发现,P0口无法实现给高电平,所以不能直接接数码管,但用别的口又存在口不够用的问题,所以就用了8155,改了之后发现还是不行,通过探讨发现是接错了引脚,实验箱的8155模块引脚地址与教科书上给出的不太一样,查询实验箱的说明手册更改引脚之后成功的解决了这一问题,实现了数码管的倒计时显示。
在软件仿真方面也出现了不会画总线的问题,最终通过查阅网上的相关资料得以解决并成功的画出电路图并实现了软件仿真。
这次课程设计收获很多,首先能利用KAIL软件进行C语言编程,学会了用Proteus软件进行画仿真图并进行软件仿真,还进一步熟练了JY2X00IDE软件的硬件仿真,通过努力探讨和学习,和对问题的发现与解决,使学到了很多课本上没有的东西,加强了动手能力,收益甚多。
在答辩的基础上,依据老师的指导,对软件仿真再次进行了完善,同时将老师提出的几个问题进行了查阅,对于延时,delayms(300)表示希望系统延时300毫秒,首先系统如何来计算这300毫秒,是通过系统的RTC来实现的,先根据硬件的晶振可以计算出一次振荡大约多少耗时,然后就能近似算出1ms需要多少次振荡,简单比喻一次振荡需要1us,那1ms就是1000次振荡,300ms就是300*1000次振荡,这样就能大概计算出300ms的延时了,然而具体的程序实现则通过for循环来实现,通过上面的原理可以求出一次for循环耗时2.5ms,如果要延时300ms,只需进行120次for循环即可,这样就解决了老师提出的问题。
对于以后的展望方面,自然是希望多做些像这样能锻炼动手能力和自学能力的课程设计,对于单片机还研究的不是很多,希望能借用这个课程设计的机会以后对单片机进行更深入的研究。