基于51单片机的十字路口交通灯控制系统设计(含源码及仿真图)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程名称单片机原理及应用课程设计院部名称信息技术学院
专业计算机科学与技术
班级09计(嵌入式系统方向)姓名
学号**********
指导教师刘钰
金陵科技学院教务处制
摘要
本文介绍了一个基于MCS-51及PROTEUS的十字路口交通灯控制系统的设计与仿真,通过对现实路况交通灯的分析研究,理解交通控制系统的实现方法。
十字路口交通灯控制系统通常要实现自动控制和在紧急情况下禁止普通车辆,而让紧急车辆优先通行。
本文还对MCS-51单片机的结构特点和重要引脚功能进行了介绍,同时对智能交通灯控制系统的设计进行了详细的分析。
最后介绍了PROTEUS嵌入式系统仿真与开发平台的使用方法,利用Proteus 软件对交通灯控制系统进行了仿真,仿真结果表明系统工作性能良好。
关键字:单片机,proteus仿真,中断,十字路口交通灯控制系统
前言
1,十字路口的交通控制系统指挥着人和各种车辆的安全运行,对交叉口实行科学的管理与控制是交通控制工程的重要研究课题,是保障交叉口的交通安全和充分发挥交叉口的通行能力的重要措施,是解决城市交通问题的有效途径。
交通灯信号灯的出现是人类历史上的一次重大改革,使人类的聚居生活,产生了深远的影响。
使交通得以有效管制,对于疏导交通流量,提高道路通行能力,减少交通事故有明显效果。
如何采用合适的控制方法,最大限度利用好耗费巨资修建的城市高速道路,缓解主干道与匝道、城区同周边地区的交通拥堵状况,越来越成为交通运输管理和城市规划部门亟待解决的主要问题。
随着电子技术的发展,利用单片机技术对交通灯进行智能化管理,已成为目前广泛采用的方法。
2,此十字路口交通灯控制系统,分东西道和南北道,设东西道为A道,南北道为B 道。
规定:A道放行时间为2分钟,B道放行1.5分钟;绿灯放行,红灯停止;绿灯转红灯时,黄灯亮2秒钟;若有紧急车辆要求通过时,此系统应能禁止普通车辆,而让紧急车辆通过。
3,应用单片机实现对交通灯的控制,在十字路口用红,黄,绿的指示灯,加上四个以倒计时显示的数码管来控制交通。
考虑到紧急车辆,设计紧急车辆开关。
一、正文
4.1芯片介绍
AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要特性:
·与MCS-51 兼容
·4K字节可编程闪烁存储器
·寿命:1000写/擦循环
·数据保留时间:10年
·全静态工作:0Hz-24MHz
·三级程序存储器锁定
·128×8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路
4.2 交通灯状态
B
○○○
○○
A ○○A
○○
○○○
B
S1
:东西通行,南北禁止 S2:东拐南,西拐北通行
S3:南北通行,东西禁止 S4:北拐东,南拐西通行
S1状态120秒,S2状态20秒,S3状态90秒,S4状态20秒,循环执行。
4.3设计步骤
1,利用proteus 7.5 sp3仿真软件绘制仿真实例
○1用traffic lights和一个绿色LED灯表示红、黄、绿,以及允许左拐的信号灯。
○2用P0口控制交通灯,用P1口控制数码管的段选,P2口控制数码管的位选。
○3P3.6和P3.7接收中断信号并返回给INT0接口处理。
2,利用Keil软件按要求编写程序实现相应功能。
五、硬件设计
5.1 通过proteus 7.5 sp3设计如下仿真图:
S1状态:
黄灯亮:
S2状态:黄灯亮:
S3状态:
黄灯亮:
S4状态:
黄灯亮:
六、软件设计
6.1系统流程图
6.2定时器原理
定时器工作的基本原理其实就是给初值,让它不断加1直至减完为模值,这个初值是送到TH 和TL 中的。
它是以加法记数的,并能从全1到全0时自动产生溢出中断请求。
因此,我们可以把计数器记满为零所需的计数值,即所要求的计数值设定为C ,把计数初值设定为TC 可得到如下计算通式:
TC=M-C
式中,M 为计数器模值。
计数值并不是目的,目的是时间值,设计1次的时间,即定时器计数脉冲的周期为T0,它是单片机系统主频周期的12倍,设要求的时间值为T ,则有C=T /T0。
计算通式变为:
T=(M -TC )T0
模值和计数器工作方式有关。
在方式0时M 为8192;在方式1时M 的值为65536;在方式2和3为256。
就此可以算出各种方式的最大延时。
如单片机的主脉冲频率为12MHZ ,经过12分频后,若采用方式0最大延时只有8.129毫秒,采用方式1最大延时也只有65.536毫秒。
这就是为什么扫描周期为50ms 的原因,
若使用软件则会耽搁程序流程,显然不可行。
相反,时间计时方面却不可能只用计数器,因为显然1秒钟已经超过了计数器的最大定时间,所以我们还必须采用定时器和软件相结合的办法才能解决这个问题。
6.3软件延时原理
MCS-51的工作频率为12MHZ ,机器周期与主频有关,机器周期是主频的12
倍,所
以一个机器周期的时间为12*(1/12MHZ)=1us。
我们可以知道具体每条指令的周期数,这样我们就可以通过指令的执行条数来确定1秒的时间,但同时由于单片机的运行速度很快其他的指令执行时间可以忽略不计。
6.4 外部中断原理
本系统主要使用了外部中断,中断信号有引脚INT0和INT1输入,低电平有效,CPU 每个时钟周期都会检测INT0和INT1上的信号,AT89C51允许外部中断以电平方式或负边沿方式两种中断方式输入中断请求信号,可由用户通过设置TCON中IT0和IT1位的状态来实现。
以IT0为例,IT0=0,为电平触发方式,IT0=1,为负边沿触发方式,本设计采用电平方式,IE0为其中断标志位,有中断信号则置位,中断服务子程序响应后,IE0自动清零。
IE中的EA为允许中断的总控制位,为1开启,EX0为外部中断允许控制位,为1开启。
在优先级的允许下,一旦有外部中断信号产生,单片机CPU首先保护断点,PC值进栈,然后执行相应的中断服务子程序,执行完后,用RETI指令返回,此时CPU会从堆栈中取保存的断点地址,送回PC,程序再正常执行。
6.5程序模块设计
6.5.1数码管显示子程序
6.5.2 T0中断子程序
6.5.3 INT0中断子程序
紧急状态按键连接到外部中断引脚P3.2,即INT0捕获到一个低电平,则进入该中断进行相关处理。
七 、系统软件调试
7.1.1 集成开发环境 定时计数初值
50ms 计数(count)加1
判断1S(count=20?)到否
count 清0 Time_SN--;Time_EW--
恢复现场
中断返回
N
Y
KEIL IDE Vision2集成开发环境主要由以下部分组成:
◆ u Vision2 IDE。
ision2 IDE包括:一个工程管理器,一个功能丰富并有交互式错误提
示的编辑器选项设置生成工具,以及在线帮助。
使用vision2创建源文件并组成应用工程加以管理。
vision2可以自动完成编译汇编链接程序的操作;
◆ C51编译器和A51汇编器。
Vision2 IDE创建的源文件可以被C51编译器或A51汇编器
处理生成可重定位的object文件。
KEIL C51编译器遵照ANSI C语言标准支持C语言的所有标准特性,另外还增加了几个可以直接支持at89C51结构的特性。
KEIL A51宏汇编器支持at89C51及其派生系列的所有指令集;
◆ LIB51库管理器。
B51库管理器可以从由汇编器和编译器创建的目标文件建立目标库,
这些库是按规定格式排列的目标模块,可在以后被链接器所使用当链接器处理一个库时仅仅使用了库中程序使用了的目标模块而不是全部加以引用;
◆BL51链接器定位器。
L51链接器使用从库中提取出来的目标模块和由编译器汇编器生成
的目标模块创建一个绝对地址目标模块,绝对地址目标文件或模块包括不可重定位的代码和数据所有的代码和数据都被固定在具体的存储器单元中。
利用KEIL开发和调试系统软件流程大致如下:
◆启动Vision2,进入KEIL软件的集成开发环境;
◆利用KEIL内置的文本编辑器进行程序源文件的编辑,因为KEIL集成的文本编辑器对中
文支持不是很好,可以选择其他的编辑器(本文使用的文本编辑器是Ultraedit—32),Vision2能够自动识别外部改变了的源文件;
◆建立工程,指定针对哪种单片机进行开发,指定对源程序的编译、链接参数,指定调试
方式(本文采用外部硬件仿真器仿真调试的方式,即使TKS仿真器仿真),然后对工程进行相关设置;
◆设置好工程后即可进行编译、链接。
连接仿真器对软件进行调试。
也可以生成下载到单片机存储器上的HEX文件。
7.1.2 系统仿真调试
系统的仿真调试借助于PROTEUS仿真器,在进行系统仿真的连续调试之前要先进行软件的初调,就是要使各个子程序模块运行正确,程序的运行流程正确,生成hex文件。
参考文献:
[l]边海龙,孙永奎. 单片机开发与典型工程项目实例详解[J].电子工业出版社,2008,(10):143-160.
[2]张鑫,华臻,陈书谦. 单片机原理及应用[J].电子工业出版社,2008(5).
[3]黄智伟.凌阳单片机课程设计指导[J].北京航空航天大学出版社,2007.8
[4]余锡存曹国华.单片机原理及接口技术[M].陕西:西安电子科技大学出
版社,2000.7
[5]雷丽文等.微机原理与接口技术[M].北京:电子工业出版社,1997.2
[6]柴钰.单片机原理和应用[M].西安电子科技大学出版社.
[7]张靖武.单片机系统的PROTUSE设计和仿真[M].电子工业出版社.2007.
附:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit Button_A=P3^6;
//sbit Button_B=P3^7;
uchar table[ ]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //共阴段码表0--9
char Time_EW; //东西方向倒计时
char Time_SN; //南北方向倒计时
uchar EW=89,SN=89,EWJ=29,SNJ=29,EWL=19,SNL=19; //程序初始化赋值uchar count=0;
/********************************************************/
void delay(unsigned char i) //延时i ms
{
unsigned char j;
while(i--)
{
for(j=0;j<115;j++);
}
}
/******************************************************/
void D isplay(void)
{
P2=0x08;
P1=table[Time_EW/10];
delay(2);
P2=0x04;
P1=table[Time_EW%10];
delay(2);
P2=0x02;
P1=table[Time_SN/10];
delay(2);
P2=0x01;
P1=table[Time_SN%10];
delay(2);
}
/******************T0中断*************************************/
void time_0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
count++;
if(count==20)
{
Time_SN--;
Time_EW--;
count=0;
}
}
void int0(void) interrupt 0
{
while(Button_A==0)
{
P0=0x09; //所有都是红灯
P1=0; //关数码管
}
}
/******************主程序*******************************/ void main()
{
TR0=1; //启动定时器0
TMOD=0x01; //定时器工作于方式1
TH0=(65536-50000)/256; //定时器赋初值
TL0=(65536-50000)%256;
EA=1; //CPU开中断总允许
ET0=1; //开定时中断
EX0=1; //开外部INTO中断
IT0=1; //INT0负跳变触发
while(1)
{
/*S1*****A道放行*******/ //S1状态
Time_EW=EW; //90s
Time_SN=SN; //90s
while(Time_EW>=0)
{
P0=0x0c;
Display();
}
/******A道+30s********/
Time_SN=SNJ; //SNJ=29
Time_EW=EWJ; //EWJ=29
while(Time_EW>=2)
{
P0=0x0c;
Display();
}
/******A道黄灯********/
while(Time_EW>=0)
{
P0=0x0a;
Display();
}
/*S2*****A道左拐******/ //S2状态Time_SN=SNL; //20 s
Time_EW=EWL; //20 s
while(Time_EW>=2)
{
P0=0x80;
Display();
}
/******A道黄灯*******/
while(Time_EW>=0)
{
P0=0x0a;
Display();
}
/*S3*****B道放行*****/ //S3状态Time_EW=EW; //90s
Time_SN=SN; //90s
while(Time_EW>=2)
{
P0=0x21;
Display();
}
/******B道黄灯*******/
while(Time_EW>=0)
{
P0=0x11;
Display();
}
/*S4*****B道左拐*****/ //S4状态Time_SN=SNL; //20 s
Time_EW=EWL; //20 s
while(Time_EW>=2)
{
P0=0x40;
Display();
}
/******B道黄灯******/
while(Time_EW>=0)
{
P0=0x11;
Display();
}
}
}。