交通灯课程设计说明书.docx
《交通灯课程设计说明书.docx》由会员分享,可在线阅读,更多相关《交通灯课程设计说明书.docx(26页珍藏版)》请在冰豆网上搜索。
交通灯课程设计说明书
编号:
微机综合实践课程说明书
题目:
交通灯控制系统
学 院:
机电工程学院
专业:
机械设计制造及其自动化
学生姓名:
------
学号:
---------------------
指导教师单位:
机械制造教研室
姓名:
恽志东
职称:
副教授
2013年12月20日
目录
1摘要………………………………………………………………………………………
(1)
2前言………………………………………………………………………………………
(1)
2.1设计题目及要求……………………………………………………………………
(2)
3设计方案论证………………………………………………………………………
(2)
3.1、方案选择……………………………………………………………………………
(2)
3.2、方案确定……………………………………………………………………………
(2)
4系统软件设计………………………………………………………………………(3)4.2.1、程序设计原理…………………………………………………………………(3)
4.2.2定时器初值计算………………………………………………………………(5)
4.2.3定时器中断服务子程序……………………………………………………(6)
4.2.4数码管显示函数………………………………………………………………(7)
5系统硬件设计………………………………………………………………………(7)
5.1硬件设计原理
5.1.1控制芯片介绍……………………………………………………………(7)
5.1.2时钟电路…………………………………………………………………(9)
5.1.3复位电路………………………………………………………………(10)
5.2制作工具及步骤…………………………………………………………(10)
5.2.1画原理图及pcb图……………………………………………………(11)
5.2.2制版主要工具及流程………………………………………………………(11)
5.3时间显示模块……………………………………………………………(14)
5.4原件清单…………………………………………………………………(14)
6调试与仿真………………………………………………………………(15)
7设计心得体会……………………………………………………………………(17)
8参考文献……………………………………………………………(18)
摘要
红绿灯控制系统是无需人为干预就能独立地驱动交通系统实现交通流的智能控制,减缓交通堵塞问题,优化交通体系的系统。
红绿灯控制系统主要实现功能分为自动控制四个阶段如下:
阶段一:
东西红灯与南北绿灯亮5S。
阶段二:
东西红灯亮南北黄灯亮3S。
阶段三:
南北红灯与东西绿灯亮5S。
阶段四:
南北红灯亮东西灯亮3S。
一个完整周期为16S,不断循环。
手动部分:
阶段一:
黄灯与2S周期不断闪烁。
阶段二:
东南西北红灯全亮(紧急控制)。
整个控制系统通过数码管显示时间。
关键字:
红绿灯交通灯控制系统数码管89c51
前言
设计任务:
1、设计一交通灯控制系统,控制东西方向的红黄绿灯及南北的红绿灯。
2、可以实现手动及自动控制p10=0自动控制p10=1手动控制手动控制时设置一开关(p11)当p11=0时各方向均为红灯。
当p11=1时各方向均为黄灯闪烁(周期为2s)
3、自动控制时实现东西红灯与南北绿灯亮5S。
东西红灯亮南北黄灯亮3S。
南北红灯与东西绿灯亮5S。
南北红灯亮东西灯亮3S,不断循环。
意义:
红绿灯的实现可以解决当今交通拥堵的城市病。
手动控制可以给警车、救护车等特种车辆让路。
3设计方案论证
3.1方案选择
1、显示模块
方案一:
采用4个1位数码管显示。
方案二:
用液晶屏显示。
方案三:
用点阵屏显示。
2、指示模块
方案一:
用四组红绿灯在四个路口显示。
方案二:
用4个可变彩灯在四个路口,控制其显示颜色进行显示。
方案三:
用字体显示
3、控制模块
选用at89s51或者stc89s51
4、时间控制
方案一:
用软件延时。
方案二:
用单片机内部定时器定时50ms计数20次为1s
3.2方案确立
由于只显示0-8,所以选用4个1位数码管,液晶屏价格比较高编程复杂,点阵屏占用io资源比较多,为了更加明显显示我们采用了每个路口3个灯,分别为红绿黄,方便控制,三色彩灯价格比较高,控制不方便,字体显示比较复杂,价格比较贵。
软件延时误差比较大,用单片机定时器精度高方便控制。
最终选型为,用3个单色灯在每个路口显示,用数码管显示倒计时。
采用静态显示,采用单片机定时器计数。
4系统软件设计
4.1、设计软件
Keilc51、
4.2.1、程序设计原理
交通灯控制系统软件主要分为主程序、定时器中断服务子程序、特种车中断服务子程序,数码管显示、led显示五部分。
其中led显示在中断服务函数中。
4.2.1、主函数
N
Y
N
Y
设在十字路口,分为东西向和南北向,在任一时刻只有一个方向通行,另一方向禁行,持续一定时间,经过短暂的过渡时间,将通行禁行方向对换。
其具体状态如下图所示。
说明:
黑色表示亮,白色表示灭。
交通状态从状态1开始变换,直至状态6然后循环至状1,周而复始,即如图(图2-1)所示:
直至状态6然后循环至状态1,通过具体的路口交通灯状态的演示分析我们可以把这四个状态归纳如下:
阶段一东西红灯南北绿灯亮,阶段二东西黄灯南北绿灯亮,阶段三东西绿灯南北红灯亮,阶段四,东西红黄南北红灯亮。
阶段一阶段二
阶段三阶段四
函数如下:
/*****************************************************************
文件名:
hongludeng.asm
*描述:
红绿灯的显示,通过数码管显示时间
*作者:
李波,2013年12月10日
***********************************************************************/
LED8EQUP0;//定义数码管
MUNEQU50H
DAB0BITP3.0
KEY1BITp1.0//用于控制程序选择
KEY2BITp1.1//控制红黄灯
P22BITP2.2//控制南北绿灯
P23BITP2.3//控制南北黄灯
P24BITP2.4//控制南北红灯
P25BITP2.7//控制东西红灯
P26BITP2.6//控制东西黄灯
P27BITP2.5//控制东西绿灯
ORG0000H
LJMPSTART//主函数
ORG000BH
LJMPINT_T0//定时器入口
START:
MOVDPTR,#TABLE
MOVLED8,#00H//数码管清空
MOVTMOD,#01H//模式一
MOVTH0,#4CH
MOVTL0,#00H//50ms初值
MOVIE,#82H//开中断
SETBTR0
MOVR2,#00H//计数初始化
MOVR1,#00H//数码管显示初始化
MOVP2,#00H//led清零
MAIN:
MOVA,R1//循环显示
MOVDPTR,#TABLE//数码管地址归零
MOVCA,@A+DPTR//数码管地址
MOVLED8,A//数码管显示
SJMPMAIN//while循环
4.2.2定时器初值计算
定时周期为50ms,定时20次达到1s,晶振11.0592
采用定时器0工作方式1
50ms初值计算
初值高位T0H=(65535-50000)/256
初值低位位T0L=(65535-50000)%256
也可以采用软件取值
4.2.3定时器中断服务子程序
在中断函数中进行计数赋值、数码管显示赋值、指示灯显示等判断其函数如下
N10:
MOVP2,#00H//led清零
JNBKEY2,N15//判断key2是否按下(没有按下p11=1执行n15红灯亮)
CJNER1,#01H,N11
SETBP23//key1按下执行手动控制
SETBP26//黄灯亮
SJMPLOOP//结束中断
N11:
CLRP23//黄灯灭
CLRP26
SJMPLOOP//结束中断
N15:
MOVP2,#00H//led全灭
MOVR1,#00H//显示清零
SETBP24//红灯亮
SETBP27//红灯亮
JNBKEY2,LOOP
/*****************自动控制***********************/
N20:
JBDAB0,N25
MOVP2,#00H//自动控制
CJNER1,#03H,N21//判断是否到达3秒
N21:
JCN22//<3跳到n21
SETBP24//控制南北红灯//南北绿灯亮
SETBP25//控制东西绿灯//东西红灯亮
SJMPLOOP
N22:
MOVP2,#00H
SETBP26//黄灯亮
SETBP24//红灯继续亮
CLRP25//绿灯灭
SJMPLOOP
N25:
MOVP2,#00H//自动控制
CJNER1,#03H,N31//判断是否到达3秒
N31:
JCN32//<3跳到n21
SETBP22//南北绿灯亮
SETBP27//东西红灯亮
SJMPLOOP
N32:
MOVP2,#00H
SETBP23//黄灯亮
SETBP27//红灯继续亮
CLRP22//绿灯灭
SJMPLOOP
/***************定时函数******************/
INT_T0:
MOVTL0,#00H//50ms初值
MOVTH0,#4CH//
INCR2//计数++
CJNER2,#14H,LOOP1//不到时间不执行
MOVR2,#00H//计数清零
DECR1//R1--
CJNER1,#0FFH,LOOP1//判断-1
JBKEY1,IN1//判断key1=1执行in1
MOVR1,#08H//按下直接赋值8
CPLDAB0//取反
SJMPLOOP1//判断key
IN1:
JBKEY2,IN2//判断是否按下key2
SJMPLOOP1
IN2:
MOVR1,#01H
SJMPLOOP1
LOOP1:
JBKEY1,N10//判断按键1没有按下手动控制
SJMPN20//判断按键1按下自动控制
LOOP:
RETI
4.2.4数码管显示函数
MAIN:
MOVA,R1//循环显示
MOVDPTR,#TABLE//数码管地址归零
MOVCA,@A+DPTR//数码管地址
MOVLED8,A//数码管显示
SJMPMAIN//while循环
数码管段显示取值数组
TABLE:
DB0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f////0123456789
5系统硬件设计
5.1控制模块
5.1.1控制芯片介绍
我们采用的是stc85c51单片机,AT89S52的晶振及复位电路按典型电路设计,元器件参数如图中所示,晶振频率选为11.0592MHz。
P0口用于控制数码管显示,P2口用于控制东西南北通行灯。
P10P11控制手动及自动控制由交警手动按切换按键实现全路口车辆禁行而行人通行状态。
stc85c51使用片内的8KB的Flash程序存储器,所以片内外程序存储器选择引脚
/VPP接+5V电源。
控制线共有4根:
(1)ALE/PROG:
地址锁存允许/片内EPROM编程脉冲;
ALE功能:
用来锁存P0口送出的低8位地址;
PROG功能:
片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
(2)PSEN:
外ROM读选通信号。
(3)RST/VPD:
复位/备用电源;
RST(Reset)功能:
复位信号输入端;
VPD功能:
在VCC掉电情况下,接备用电源。
(4)EA/VPP:
内外ROM选择/片内EPROM编程电源;
EA功能:
内外ROM选择端;
VPP功能:
片内有EPROM的芯片,在EPROM编程期间,施加编程电源VPP。
4.I/O引脚部分
(1)stc85c51共有4个8位并行I/O端口:
P0、P1、P2、P3口,共32个引脚。
P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。
(2)P3口第二功能:
P30RXD串行输入口;
P31TXD串行输出口;
P32INT0外部中断0;
P33INT1外部中断1;
P34T0定时计数器0;
P35T1定时计数器1;
P36WR外部数据存储器写选通(低电平有效);
P37RD外部数据存储器读选通(低电平有效)。
单片机内部结构如图3-3所示:
图3-38051单片机内部结构
stc85c51单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:
1.中央处理器
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
2.数据存储器(RAM)
stc85c51内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
3.程序存储器(ROM)
stc85c51共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。
4.定时/计数器(ROM)
8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。
5.并行输入输出(I/O)口
8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。
5.1.2时钟电路
在设计之前,让我们先了解下
51单片机上的时钟管脚:
XTAL1(19脚):
芯片内部振荡电路输入端。
XTAL2(18脚):
芯片内部振荡电路输出端。
XTAL1和XTAL2是独立的输入和输出反相放大器,它们可以被配置为使用石英晶振的片内振荡器,或者是器件直接由外部时钟驱动。
图2中采用的是内时钟模式,即采用利用芯片内部的振荡电路,在XTAL1、XTAL2的引脚上外接定时元件(一个石英晶体和两个电容),内部振荡器便能产生自激振荡。
一般来说晶振可以在1.2~12MHz之间任选,甚至可以达到24MHz或者更高,但是频率越高功耗也就越大。
在控制板中采用的11.0592M
的石英晶振。
和晶振并联的两个电容的大小对振荡频率有微小影响,可以起到频率微调作用。
当采用石英晶振时,电容可以在20~40pF之间选择(本实验套件使用30pF);当采用陶瓷谐振器件时,电容要适当地增大一些,在30~50pF之间。
通常选取33pF的陶瓷电容就可以了。
另外值得一提的是如果读者自己在设计单片机系统的印刷电路板
(PCB)时,晶体和电容应尽可能与单片机芯片靠近,以减少引线的寄生电容,保证振荡器可靠工作。
检测晶振是否起振的方法可以用示波器
可以观察到XTAL2输出的十分漂亮的正弦波,也可以使用万用表测量(把挡位打到直流挡,这个时候测得的是有效值)XTAL2和地之间的电压时,可以看到2V左右一点的电压。
5.1.3复位电路
在单片机系统中,复位电路是非常关键的,当程序跑飞(运行不正常)或死机(停止运行)时,就需要进行复位。
MCS-5l系列单片机的复位引脚
RST(第9管脚)出现2个机器周期以上的高电平时,单片机就执行复位操作。
如果RST持续为高电平,单片机就处于循环复位状态。
复位操作通常有两种基本形式:
上电自动复位和开关复位。
图2中所示的复位电路就包括了这两种复位方式。
上电瞬间,电容两端电压不能突变,此时电容的负极和RESET相连,电压全部加在了电阻上,
5.2制作工具及步骤
5.2.1画原理图及pcb图
转印到铜板
打印pcb
5.2.2制版主要工具及流程
腐蚀液
铜板转印机
打孔机及老铁
5.2通行灯显示模块
通行灯显示模块如图所示。
二极管每个路口三个,用102排阻驱动,用P2控制,
5.3时间显示模块
通行剩余时间显示模块如图所示
路口通行剩余时间采用高亮红色7段共阴LED发光数码管显示。
也是用排阻驱动电路图如下
数码管的使用方法与发光二极管没什么区别,只是把七或八只发光二极管组合在一个模件上组成了个8字和小数点,用以显示数字。
为了减少管脚,把各个发光管的其中同一个极接在一起作为共用点,因此就产生了共阳极和共阴极数码之说。
共阳管就是把各个发光管的正极接在一起,而共阴管就刚好相反。
见下图:
一般来说大部分的逻辑IC的吸收电流要强于输出电流。
因此,大家都爱使用共阴极的数码管,因为可选的iC多些
5.4原件清单
序号
原件
数量
1
stc51单片机
1
2
晶振11.05926
1
3
极性电容10uf
2
4
按键双引脚
5
5
自锁开关
1
6
usb母座接口
1
7
103排阻9引脚
2
8
10k电阻
2
9
电容22pf
2
10
40pic插座
1
11
led红色
1
12
红色led(5mm)
4
13
绿色led(5mm)
4
14
黄色led(5mm)
4
15
共阴数码管1位
4
6、仿真调试
仿真软件protues
调试程序:
/********************************************************************
*文件名:
hongludeng.c
*描述:
红绿灯的显示,通过数码管显示时间
*作者:
***********************************************************************/
#include//51头文件
#defineucharunsignedchar//定义初始化
#defineuintunsignedint//无符号整形
sbitKEY1=P1^0;//用于控制程序选择
sbitKEY2=P1^1;//控制红黄灯
sbitP22=P2^2;//控制南北绿灯
sbitP23=P2^3;//控制南北黄灯
sbitP24=P2^4;//控制南北红灯
sbitP25=P2^5;//控制东西红灯
sbitP26=P2^6;//控制东西黄灯
sbitP27=P2^7;//控制东西绿灯
bitfly;//标志位
ucharcodetable[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//123456789
ucharmun=0,n,m;
/**********************
名称;delya10ms()
功能:
延时函数
************************/
voiddelay10ms(uintdel)
{
uinti,j;
for(i=0;ifor(j=0;j<1827;j++)//这个是通过软件仿真得出的数
;
}
/******************************
名称:
show()
功能:
显示函数
输入:
要显示的数值
*****************************/
voidshow(ucharx)
{
P0=table[x];
}
/********************
名称:
T0_init()
功能:
定时器初始化
********************/
voidT0_init()
{
TMOD=0x01;
TH0=0x4c;//50ms赋初值
TL0=0x00;
IE=0x82;//开中断
TR0=1;//开定时器0
}
/********************************************************************
*名称:
T0_int()
*功能:
定时器中断子函数50ms
***********************************************************************/
voidT0_int()interrupt1
{
TH0=0x4c;//50ms赋初值
TL0=0x00;
m++;
if(m==20)//达到一秒
{
m=0;
mun--;//秒增加
if(mun==-1)
{
if(KEY1)
{
mun=8;
}
if(~KEY1)
{
mun=0;
}
delay10ms
(1);
fly=~fly;
P2=0x00;//全部关闭
}
}
}
/***************
主函数
***************/
voidmain(void)//主函数
{
//uchari;
T0_init();
P0=0x00;
while
(1)
{
while(KEY1)//主循环
{
P2=0X00;
while(~fly)
{
show(mun);
if(mun>3&&mun<9)
{
P22=1;//南北绿灯亮
P25=1;//东西红灯亮
}
if(mun<=3)
{