基于51单片机的交通灯控制系统设计.docx
《基于51单片机的交通灯控制系统设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机的交通灯控制系统设计.docx(13页珍藏版)》请在冰豆网上搜索。
基于51单片机的交通灯控制系统设计
一、摘要:
随着科技的飞速发展,越来越多的控制功能强大的芯片出现在我们生活中,但8051系列单片机,因为其的廉价几成本,在我们生活中依然处于十分重要的地位。
在实时检测和自动控制的单片机应用系统中,单片机是作为一个核心部件来使用,但是仅单片机方面知识是不够的,还需要根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。
交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
作为交通控制的重要组成部份单片机。
因此,本人选择制作交通灯作为课题加以设计并实现。
交通管制应当以人性化、智能化为目的,做出相应的改善。
以此为出发点,本系统采用的单片机控制的交通信号灯。
系统具有结构简单、可靠性高、成本低、实时性好、安装维护方便等优点,有广阔的应用前景。
关键词:
交通灯,51单片机,数码管
二、实习目的和意义
1.学习51单片机的最小系统及硬件接口设计与应用
2.熟练掌握电路原理图绘制软件DPX的使用。
3.熟练单片机的程序设计与调试。
4.自主设计出具有实际意义的能用于生活的电路系统。
5.本次课程设计对以后的毕业设计甚至工作打下了动手自己设计的基础。
三、实习要求
1. 完成以8051系列单片机为核心处理器的模拟十字路口交通灯控制的硬件设计(在altiumdesigner下画出硬件原理图)。
布线,印制电路板,并焊接原件搭载硬件电路,做出实物。
2. 完成交通灯控制系统的软件编程。
3. 软硬件综合调试,模拟实现对交通灯控制系统的控制。
4. 撰写实验报告:
报告中给出硬件方案、软件流程图、软件关键代码
四、实习内容
1.设计题目:
基于51单片机交通十字路口信号灯设计
2.实现功能:
具有红、绿、黄三种颜色彩灯,并有一个数码管进行倒计时显示倒计时时间为三十秒。
还应具有按键控制特殊情况下十字路口不需要红绿灯的显示(车流量很少的地段深夜可以不设红绿灯)。
五、系统实现
1.电路设计:
51单片机介绍:
本实验使用的51单片机为STC89C52
STC89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM)。
STC89C51是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口。
单片机外部引脚图如下:
管脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH执行 校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器执行 存取时,P2口输出地址的高八位。
在给出地址“1”时,它运用 内部上拉优势,当对外部八位地址数据存储器执行 读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为stc89C52的一些特殊功能口,如下所示:
RXD(串行输入口)
TXD(串行输出口)
/INT0(外部中断0)
/INT1(外部中断1)
T0(记时器0外部输入)
T1(记时器1外部输入)
/WR(外部数据存储器写选通)
/RD(外部数据存储器读选通)
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要留心的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP:
EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管能不能有内部程序存储器。
留心加密方式1时,/EA将内部锁定为RESET;当/EA端保持高
八段共阳极数码管:
顾名思义,八段二位共阳极数码管是由8x2个二极管组成的,全部点亮时可以显示为.,第一个8.的八个数码管的阳极是接在一起的,第二个也是如此,他们的共阳极分别为引脚8、7。
写程序的时候我们只需要8、7引脚接电源,控制其他八个引脚的信号就可以得到我们想要的数字。
2.元件清单:
器件
数量
STC89C52
1
晶振
1
瓷片电容30pf
2
八段2位共阳极数码管
1
自锁/轻触开关
1/2
电阻1k/10k
7/1
发光二极管红/绿/黄/
3/4/3
电解电容10uF
2
3.电路设计:
单片机最小系统应包含复位电路、外部时钟电路,即单片机能工作的必要条件。
设计电路图如下:
数码管
最小系统
Led彩灯
电源电路
4.软件流程图:
软件设计是红灯亮三十秒,绿灯亮27秒,黄灯亮3秒。
组成循环如下表:
1.1-27秒南北绿灯亮,东西方向红灯亮,数码管从30倒数到3
2.28-30秒南北黄灯亮,东西方向红灯亮,数码管从3倒数到1
3.31-57秒南北红灯亮,东西方向绿灯亮,数码管从30倒数到3
4.58-60秒南北黄灯亮,东西方向红灯亮,数码管从3倒数到1
程序从1-4往复循环。
程序流程图如下:
5.程序调试:
调试窗口
全速运行调试,观察单片机IO口信号变化,即可模拟观察程序是否正确,哪里出错。
编译通过,程序实现功能并把程序下载到单片机中装好,进行调试。
实物图:
六、实习总结:
经过三个星期的时间,从不会到会,从没思路到想法无限多。
终于还是把这个设计给弄出来了。
刚开始不知道从何入手,以前都是学一些书本上的知识,还不会灵活应用,而且也没做过什么具体的设计。
后来开始动手去做,大量的从网上摄取知识,去图书馆查找资料,复习编程,复习单片机原理。
等等。
一个小小的电路需要太多的知识,学以致用这个词在这次设计上有了更深刻的体会。
通过设计我对原来学过的知识有了更深的理解,原来想着在大学里学不到很多东西,直到做完实习,才知道是自己不会联系实际应用!
当设计接近尾声的时候回顾设计的整个流程,才发现有好多东西都需要更深一步的学习。
在调试的过程中遇到了很多问题,有时候是硬件上的错误自己却认为是软件的错误,有时候软件错又认为是硬件出错了。
总之我觉得学到知识最多的地方不是去查资料的时候,而是在调试过程中学到了很多东西,焊工技术、编程思想、设计电路铺板等等都会影响整个电路的工作情况。
而且到最后的时候发现自己设计的电路上面也有很大的不足,比如直接用P1口接数码管的阳极,由于单片机IO口输出电流都比较小,所以导致数码管的亮度不是很亮,所以在共阳极数码管的阳极与IO口相连是应加三极管或者锁存器提供更大的电流。
总之这次设计让我学会了很多东西,最主要的是学会了去查询资料,筛选资料,并大大培养了我的动手能力。
七、参考文献
[1]梅丽凤:
单片机原理与技术接口第三版,清华大学出版社
[2]谭浩强:
C语言程序设计第四版,清华大学出版社
[3]龙脉工作室:
单片机C语言入门,人民邮电出版社
[4]杨素行:
模拟电子技术基础简明教程第三版,高等教育出版社
[4]余孟尝:
数字电子技术基础简明教程第三版,高等教育出版社
交通灯程序:
#include<>
#defineucharunsignedchar
#defineuintunsignedint
sbitlight_R1=P2^0;
sbitlight_G1=P2^1;
sbitlight_Y1=P2^2;
sbitlight_R2=P2^3;
sbitlight_G2=P2^4;
sbitlight_Y2=P2^5;
sbitD1=P1^0;//十位段选
sbitD2=P1^1;//个位段选
/******共阳极数码管编码对应0~9
~0x3f,~0x06,~0x5b,~0x4f,~0x66,
~0x6d,~0x7d,~0x07,~0x7f,~0x6f
************************/
ucharcodetab[10]={
~0x3f,~0x06,~0x5b,~0x4f,~0x66,
~0x6d,~0x7d,~0x07,~0x7f,~0x6f
};
ucharT,shi,ge,s,k,kk;
voidmain(void)
{
uchartime1=60;
T=0;
k=0;//外部中断0控制变量
kk=0;//外部中断1控制变量
TMOD=0x01;//开定时器中断
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//定时器50ms中断一次
EA=1;//开总中断
ET0=1;
TR0=1;
IT0=1;//外部中断0选择下降沿触发
EX0=1;//开外部中断0
IT1=1;//外部中断1选择下降沿触发
EX1=1;
shi=3;
ge=0;
while
(1)
{
if(k==1)//判断K1是否按下
{
D1=0;
D2=0;
light_G1=1;
light_G2=1;
light_R1=1;
light_R2=1;
light_Y1=0;
light_Y2=0;
while(k)
{
if(kk==1)//判断K2是否按下
{
time1=60;
light_Y1=1;
light_Y2=1;
kk=0;
k=0;
}
}
}
if(time1==60)//初始状态
{
light_G1=0;
light_R2=0;
light_Y2=1;
light_R1=1;
}
D1=1;
D2=0;
P0=tab[shi];
s=50;
while(s--);
P0=0xff;
D1=0;
D2=1;
P0=tab[ge];
s=50;
while(s--);
P0=0xff;
D2=0;
if(T==20)
{
T=0;
time1--;
if(time1>30)
{
shi=(time1-30)/10;
ge=(time1-30)%10;
}
else
{
shi=time1/10;
ge=time1%10;
}
if((time1-30)==3)
{
light_G1=1;
light_Y1=0;
light_R2=0;
}
elseif(time1==30)//转东西方向
{
light_Y1=1;
light_R1=0;
light_R2=1;
light_G2=0;
}
elseif(time1==3)
{
light_G2=1;
light_Y2=0;
light_R1=0;
}
elseif(time1==0)
{
time1=60;
shi=3;
ge=0;
}
}
}
}
voidtimer0()interrupt1//定时器中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
T++;
}
voidinterrupt_0()interrupt0
{
k=1;
}
voidinterrupt_1()interrupt2
{
kk=1;
}
整体电路原理图:
(实际设计电路时应当不需要R11与R12(数码管太暗))
布线图: