单片机模拟交通灯设计说明书.docx
《单片机模拟交通灯设计说明书.docx》由会员分享,可在线阅读,更多相关《单片机模拟交通灯设计说明书.docx(21页珍藏版)》请在冰豆网上搜索。
单片机模拟交通灯设计说明书
华北水利水电学院
课程设计
模拟交通灯设计
说明书
2011—2012学年
第2学期
_
姓名:
学号:
班级:
指导教师:
院系:
目录
第一章、程设计的目的和要求
1.1课程设计的目的和要求……………………………………2
1.2课程设计的预备知识………………………………………2
1.3课程设计的任务……………………………………………3
第二章、总体设计…………………………………………………3
第三章、硬件设计…………………………………………………3
3.180C51简介…………………………………………………6
3.2LED数码管…………………………………………………6
3.3LED指示灯…………………………………………………6
第四章、软件设计…………………………………………………6
第五章、Proteus软件仿真………………………………………7
5.1正常模式仿真………………………………………………7
5.2紧急模式仿真………………………………………………7
5.3夜间模式仿真………………………………………………8
第六章、结束语……………………………………………………9
参考文献……………………………………………………………10
附录一、电路图……………………………………………………11
附录二、C语言程序………………………………………………12
第一章、课程设计的目的和要求
1.1课程设计的目的和要求
《单片机应用基础》课程设计是学好本门课程的又一重要实践性教学环节,课程设计的目的就是配合本课程的教学和平时实验,以达到巩固消化课程的内容,进一步加强综合应用能力及单片机应用系统开发和设计能力的训练,是以培养学生综合运用所学知识的过程,是知识转化为能力和能力转化为工程素质的重要阶段。
课程设计要求:
根据给定的任务要求选择合适的单片机和其他电子元器件,进行系统硬件电路设计和软件编程,根据系统制作并调试系统电路板,使之实现任务要求。
有关参数选择要求符合国家标准。
1.2课程设计预备知识
单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:
中央处理器、存储器和I/O接口电路等。
因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机经过1、2、3、3代的发展,目前单片机正朝着高性能和
多种方向发展,它们的CPU功能在增强,内部资源在增多,引角的多功能化,以及低电压底功耗。
信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
1968年,联合国《道路交通和道路标志信号协定》对各种信号灯的含义作了规定。
绿灯是通行信号,面对绿灯的车辆可以直行,左转弯和右转弯,除非另一种标志禁止某一种转向。
左右转弯车辆都必须让合法地正在路口内行驶的车辆和过人行横道的行人优先通行。
红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。
黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以进入交叉路口。
1.3课程设计的任务
设计一个能够控制十二盏交通信号灯的模拟系统。
第二章、总体设计
第三章、硬件设计
3.1MSC-51芯片简介
MCS-51单片机内部结构
8051是MCS-51系列单片机的典型产品,我们以这一代表性的机型进行系统的讲解。
8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:
·中央处理器:
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
·数据存储器(RAM)
8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
·程序存储器(ROM):
8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。
·定时/计数器(ROM):
8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。
·并行输入输出(I/O)口:
8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。
·全双工串行口:
8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。
·中断系统:
8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。
·时钟电路:
8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051单片机需外置振荡电容。
单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛(Harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(Princeton)结构。
INTEL的MCS-51系列单片机采用的是哈佛结构的形式,而后续产品16位的MCS-96系列单片机则采用普林斯顿结构。
MCS-51的引脚说明:
MCS-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。
现在我们对这些引脚的功能加以说明:
MCS-51的引脚说明:
MCS-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。
现在我们对这些引脚的功能加以说明:
如
图2
Pin9:
RESET/Vpd复位信号复用脚,当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。
初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指针写入07H,其它专用寄存器被清“0”。
RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。
然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态,8051的初始态。
·Pin30:
ALE/PORG当访问外部程序器时,ALE(地址锁存)的输出用于锁存地址的低位字节。
而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。
更有一个特点,当访问外部程序存储器,ALE会跳过一个。
·Pin29:
PESN当访问外部程序存储器时,输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上,外部程序存储器则把指令数据放到P0口上,由CPU读入并执行。
·Pin31:
EA/Vpp程序存储器的内外部选通线,8051和8751单片机,内置有4kB的程序存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据,而超过4kB地址则读取外部指令数据。
如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。
显然,对内部无程序存储器的8031,EA端必须接地。
在编程时,EA/Vpp脚还需加上21V的编程电压。
3.2LED数码管
使用八个7seg-com-cathode型数码管,其中显示十位的四个数码管七个引脚与单片机P3口相连,显示个位的四个数码管七个引脚与单片机P2口相连,下端的接口接地。
3.3LED指示灯
共使用12个,共六组LED指示灯,型号分别为:
4个LED-green,4个LED-yellow,4个LED-red.
第四章、软件设计
主程序框图
否
第五章、Proteus软件仿真
5.1正常运行仿真图
5.2紧急中断仿真图
5.2.1南北通行
5.2.2东西通行
5.3夜间模式仿真图
第六章、结束语
两周的单片机课程设计很快就结束了,在课程设计的这段时间里,我不仅学到了许多新的知识,而且加深了我对以前学习的理论知识的掌握。
以前我们学的东西仅限于课本,对实实在在的应用还比较模糊,这次课程设计有利于同学们学习目的的明确性和主动性。
通过这次课程设计,我们知道了哪些东西是应该确实掌握的,在学校里,没有实实在在的实习,我们总以为学的东西没太多用,当我们在课程设计过程中了解到我们学的东西是如此重要时,我们学习的积极性有了,目的性提高了。
通过单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
创新,是要我们学会将理论很好地联系实际,并不断地去开动自己的大脑,从为人类造福的意愿出发,做自己力所能及的,别人却没想到的事。
使之不断地战胜别人,超越前人。
同时,更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易放弃。
设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。
过程中,我们遇到过许多次失败的考验,就比如,自己对实际生活中的交通秩序的不了解给整个设计带来的困扰,真想要就此罢休,然而,就在想要放弃的那一刻,我们明白了,原来结果并不那么重要,我们更应该注重的是这一整个过程。
于是,我们坚持了下来。
当然最终,这个设计很成功,主要体现在,这一整个系统,几乎没有课本以外的参考书,程序由我们自己独立完成,制作的交通灯控制系统程序简单易读,结构清楚,最重要的是成本低。
在设计一个系统,除了达到所要求的性能指标以外,成本也是很重要的一个指标。
成本的高低也决定了产品的适用性。
参考文献
[1]李广第主编.单片机基础.第一版.北京航空航天大学出版社.北京.1994年6月
[2]王修才主编.单片机接口技术.第一版.复旦大学出版社.上海.1995年10月
[3]周志德主编.单片机原理及应用.第一版.高等教育出版社
[4]李运华主编.机电控制.第一版.北京航空航天大学出版社
[5]秦曾煌主编.电工学上册:
电工技术.第五版.高等教育出版社
附录一、电路图
附录二、C语言程序
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineON1//1的时候灯亮
#defineOFF0//0的时候灯灭
sbitPortDX_Yellow=P1^2;//东西方向黄灯
sbitPortDX_Red=P1^1;//东西方向红灯
sbitPortDX_Green=P1^0;//东西方向绿灯
sbitPortNB_Yellow=P1^5;//南北方向黄灯
sbitPortNB_Red=P1^4;//南北方向红灯
sbitPortNB_Green=P1^3;//南北方向绿灯
unsignedcharmsec,sec=0,rsec=0,sec1=2,flag=0,flags=0,tempflags=0;
//sec为以0.5为单位的数值,rsec为实际倒计时数值,flag用来记录计时器东西南北计时翻转,sec1为夜间模式的倒计时值,flags为按钮标志位,tempflags用来记录是否发生过模式切换
unsignedinttemp;//存放P0口的输入数据
unsignedcharsectNB=10;
unsignedcharsectDX=15;//存放倒计时初始数值
unsignedcharled[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//定义数字0~9字型显示码
voidT0_INT(void)interrupt1//定时器0中断类型号为1
{
TH0=0x3c;//50ms定时初值
TL0=0xb0;
msec++;//中断次数增1
if(msec==10)//中断次数到10次
{
msec=0;//是,0.5秒计时到,50ms计数单元清零
sec--;
if(sec==0)
{
if(flags!
=2)
{
//恢复正常模式初值
if(flag==0)
{//标志位翻转
flag=1;
sec=sectNB*2;//装入南北时间数据
}
else
{
flag=0;//标志位翻转
sec=sectDX*2;//装入东西时间数据
}
}
}
if(flags==2)
{
sec=sec1;//恢复夜间模式初值
if(flag==0)//标志位翻转
flag=1;
elseflag=0;
}
}
}
voiddisplay()//数码管显示函数
{
rsec=sec/2;
P2=led[rsec%10];//显示秒个位
P3=led[rsec/10];//显示秒十位
}
voidmode(intx,inty,intz)
{
inti,j,k;
i=x;
j=y;
k=z;
if(i==0)
{
if(z!
=0)//模式发生过切换则计时器和标志均恢复到初始值
{
sec=sectDX*2;
tempflags=0;
flag=0;
}
display();
if(j>=6&&flag==0)
{
PortNB_Yellow=OFF;PortNB_Red=ON;PortNB_Green=OFF;//南北红灯亮
PortDX_Yellow=OFF;PortDX_Red=OFF;PortDX_Green=ON;//东西绿灯亮
}
if(j<6&&flag==0)
{
if(j%2!
=0)//闪烁以0.5s为单位
{
PortNB_Yellow=OFF;PortNB_Red=ON;PortNB_Green=OFF;
//南北红灯亮
PortDX_Yellow=ON;PortDX_Red=OFF;PortDX_Green=OFF;
//东西黄灯亮
}
else
{
PortNB_Yellow=OFF;PortNB_Red=ON;PortNB_Green=OFF;
//南北红灯亮
PortDX_Yellow=OFF;PortDX_Red=OFF;PortDX_Green=OFF;
//东西黄灯灭
}
}
if(j>=6&&flag==1)
{
PortNB_Yellow=OFF;PortNB_Red=OFF;PortNB_Green=ON;//南北绿灯亮
PortDX_Yellow=OFF;PortDX_Red=ON;PortDX_Green=OFF;//东西红灯亮
}
if(j<6&&flag==1)
{
if(j%2!
=0)//闪烁以0.5s为单位
{
PortNB_Yellow=ON;PortNB_Red=OFF;PortNB_Green=OFF;
//南北红灯亮
PortDX_Yellow=OFF;PortDX_Red=ON;PortDX_Green=OFF;
//东西红灯亮
}
else
{
PortNB_Yellow=OFF;PortNB_Red=OFF;PortNB_Green=OFF;
//南北绿灯亮
PortDX_Yellow=OFF;PortDX_Red=ON;PortDX_Green=OFF;
//东西红灯亮
}
}
}
if(i==1)
{//模式2切换到东西绿灯南北红灯
P2=led[0];//显示个位为0
P3=led[0];//显示十位为0
PortNB_Yellow=OFF;PortNB_Red=ON;PortNB_Green=OFF;//南北红灯亮
PortDX_Yellow=OFF;PortDX_Red=OFF;PortDX_Green=ON;//东西绿灯亮
}
if(i==3)
{//模式4切换到东西红灯南北绿灯
P2=led[0];//显示个位为0
P3=led[0];//显示十位为0
PortNB_Yellow=OFF;PortNB_Red=OFF;PortNB_Green=ON;//南北绿灯亮
PortDX_Yellow=OFF;PortDX_Red=ON;PortDX_Green=OFF;//东西红灯亮
}
if(i==2)//模式3切换到夜间模式
{
P2=0x71;//显示个位F
P3=0x71;//显示十位F
if(flag==0)
{
PortNB_Yellow=OFF;PortNB_Red=OFF;PortNB_Green=OFF;
//南北黄灯灭
PortDX_Yellow=ON;PortDX_Red=OFF;PortDX_Green=OFF;
//东西黄灯亮
}
else
{
PortNB_Yellow=ON;PortNB_Red=OFF;PortNB_Green=OFF;
//南北黄灯亮
PortDX_Yellow=OFF;PortDX_Red=OFF;PortDX_Green=OFF;
//东西黄灯灭
}
}
}
voidmain()//主函数
{
sec=sectDX*2;
TMOD=0x01;//定时器0工作方式1
TH0=0x3c;//50ms定时初值
TL0=0xb0;
EA=1;//开总中断
ET0=1;//开定时器0中断
P0=0xff;//P0口做输入
TR0=1;//定时器0使能
while
(1)
{
temp=~P0;//读入P0口引脚状态并取反
temp=temp&0x0f;//屏蔽掉无关位,保留四位按键状态0000xxxx
if(temp!
=0)//判断有无按键按下
{
if(temp==0x01)//按下正常模式键
{
flags=0;
}
if(temp==0x02)//按下东西同行键
{
flags=1;
tempflags=1;//模式切换标志位置1
}
if(temp==0x04)//按下夜间模式键
{
flags=2;
tempflags=1;//模式切换标志位置1
}
if(temp==0x08)//按下南北通行键
{
flags=3;
tempflags=1;//模式切换标志位置1
}
}
mode(flags,sec,tempflags);
}
}