51单片机红绿灯课程设计报告书

  • 格式:pdf
  • 大小:156.48 KB
  • 文档页数:6

51单⽚机红绿灯课程设计报告书

1 电源提供⽅案

为使模块稳定⼯作,须有可靠电源。因此考虑了两种电源⽅案:⽅案⼀:采⽤独⽴的稳压电源。此⽅案的优点是稳定可靠,且有各种成熟电路可供选⽤;缺点是各模块都采⽤独⽴电源,会使系统复杂,且可能影响电路电平。

⽅案⼆:采⽤单⽚机控制模块提供电源。改⽅案的优点是系统简明扼要,节约成本;缺点是输出功率不⾼。综上所述,选择⽅案⼆。2 显⽰界⾯⽅案

该系统要求完成倒计时功能。基于上述原因,我考虑了⼆种⽅案:

⽅案⼀:采⽤数码管显⽰。这种⽅案只显⽰有限的符号和数码字符,简单,⽅便。⽅案⼆:采⽤点阵式LED 显⽰。这种⽅案虽然功能强⼤,并可⽅便的显⽰各种英⽂字符,汉字,图形等,但实现复杂,成本较⾼。

综上所述,选择⽅案⼀。3 输⼊⽅案:

设计要求系统能调节灯亮时间,并可处理紧急情况,我研究了两种⽅案:⽅案⼀:采⽤8155扩展I/O ⼝及键盘,显⽰等。

该⽅案的优点是:使⽤灵活可编程,并且有RAM,及计数器。若⽤该⽅案,可提供较多I/O ⼝,但操作起来稍显复杂。

⽅案⼆:直接在I/O⼝线上接上按键开关。

由于该系统对于交通灯及数码管的控制,只⽤单⽚机本⾝的I/O ⼝就可实现,且本⾝的计数器及RAM已经够⽤。

综上所述,选择⽅案⼆。3.1单⽚机交通控制系统的通⾏⽅案设计

设在⼗字路⼝,分为东西向和南北向,在任⼀时刻只有⼀个⽅向通⾏,另⼀⽅向禁⾏,持续⼀定时间,经过短暂的过渡时间,将通⾏禁⾏⽅向对换。其具体状态如下图所⽰。说明:⿊⾊表⽰亮,⽩⾊表⽰灭。交通状态从状态1开始变换,直⾄状态6然后循环⾄状态1,周⽽复始,即如图2.1所⽰:

图1 交通状态

本系统采⽤MSC-51系列单⽚机AT89C51作为中⼼器件来设计交通灯控制器。实现以下功能:

初始东西绿灯亮,南北红灯亮,东西路⼝车通⾏,时隔24s,黄灯闪烁6次。之后,南北绿灯亮,东西红灯亮,⽅向开始通车,时隔24s,南北黄灯闪烁6次,然后⼜切换成东西⽅向通车,如此重复。

当发⽣交通意外(中断产⽣)时,全部亮红灯,进⾏交通事故的处理。当事故处理完毕(再次按中断键),重新按上述⽅式⼯作。

当南北路⼝的流量⼤时,可以增加南北路⼝亮绿灯的时间,当东西路⼝的流量⼤时,可以增加东西路⼝亮绿灯的时间,结束后调回正常状态。下⾯我们可以⽤图表表⽰灯状态和⾏⽌状态的关系如下

东西南北四个路⼝均有红绿黄3灯和数码显⽰管2个,在任⼀个路⼝,遇红灯禁⽌通⾏,转绿灯允许通⾏,之后黄灯亮警告⾏⽌状态将变换。状态及红绿灯状态如表1所⽰。说明:0表⽰灭,1表⽰亮。3.3单⽚机智能交通灯控制系统的基本构成及原理

单⽚机设计智能交通灯控制系统,可⽤单⽚机直接控制交通信号灯的状态变化,实现倒计时、紧急情况处理与时间调整等功能。

据此,本设计系统以单⽚机为控制核⼼,连接成最⼩系统,由按键设置模块产⽣输⼊,信号灯状态模块、LED倒计时模块接受输出。系统的总体框图如上所⽰。

单⽚机上电后,系统进⼊正常⼯作状态,执⾏交通灯状态显⽰控制,同时将时间数据倒计时输⼊到LED数码管上实时显⽰。在此过程中随时通过键盘调⽤急停按键和时间调节中断。

交通灯系统硬件设计

此设计采⽤的是AT89C51单⽚机为部控制芯⽚,外部接有按键中断电路以及复位电路以外,还有4个两位数码管,⽤以倒计时和4个路⼝的灯,共12个LED灯。

信息职业技术学院毕业设计说明书(论⽂)

页 5

第⼆章交通灯系统硬件设计

此设计采⽤的是AT89C51单⽚机为部控制芯⽚,外部接有按键中断电路以及复位电路以外,还有4个两位数码管,⽤以倒计时和4个路⼝

的灯,共12个LED灯。2.1 系统框架图

电路板⼀块,AT89S51单⽚机⼀⽚,⼋段LED数码管四个。发光⼆极管12个(4个绿的,4个红,4个黄的),8个电阻,2个电容,1个晶振,1个电解电容,1个按键开关。(系统结构框图:图2.1)

2.3.1 MSC-51芯⽚简介

MCS-51单⽚机部结构

8051是MCS-51系列单⽚机的典型产品,我们以这⼀代表性的机型进⾏系统的讲解。

8051单⽚机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并⾏接⼝、串⾏接⼝和中断系统等⼏⼤单元及数据总线、地址总线和控制总线等三⼤总线,现在我们分别加以说明:·中央处理器:

中央处理器(CPU)是整个单⽚机的核⼼部件,是8位数据宽度的处理器,能处理8位⼆进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的⼯作,完成运算和控制输⼊输出功能等操作。·数据存储器(RAM)

8051部有128个8位⽤户数据存储单元和128个专⽤寄存器单元,它们是统⼀编址的,专⽤寄存器只能⽤于存放控制指令数据,⽤户只能访问,⽽不能⽤于存放⽤户数据,所以,⽤户能使⽤的RAM只有128个,可存放读写的数据,运算的中间结果或⽤户定义的字型表。

2.3.2 LED显⽰数码管

⼋段LED显⽰器由⼋个发光⼆极管组成。其中7个长条形的发光管排列成“⽇”字形,另⼀个圆点形的放光管在显⽰器的右下⾓作为显⽰⼩数点⽤,它能显⽰各种数字及部分英⽂字母。LED显⽰器有两种不同的形式:⼀种是8个发光⼆极管的阳极都连在⼀起的,称为共阳极LED显⽰器如图2-2所⽰;另⼀种是8个发光⼆极管的阴极都连在⼀起的,称为共阴极LED显⽰器3.3 晶体振荡器

⽯英晶体振荡器的特点是振荡频率准确、电路结构简单、频率易调整,作⽤是为系统提供基本的时钟信号。我们在晶体某⼀⽅向加⼀电场,

从⽽在与此垂直的⽅向产⽣机械振动,有了机械振动,就会在相应的垂直⾯上产⽣电场,从⽽使机械振动和电场互为因果,这种循环过程⼀直持续到晶体的机械强度限制时,才达到最后稳定,这种压电谐振的频率即为晶体振荡器的固有频率。

附录原程序代码#include

#define uint unsigned int//宏定义

#define uchar unsigned char//宏定义

uchar aa,cc,NBshi,NBge,DXshi,DXge,NBtemp,DXtemp;//定义变量

sbit NBR=P3^0;//南北红灯

sbit NBY=P3^1;//南北黄灯

sbit NBG=P3^4;//南北绿灯

sbit DXY=P3^5;//东西黄灯

sbit DXG=P3^6;//东西绿灯

sbit DXR=P3^7;//东西红灯

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f}; //数字的代码从0-9

//数字的代码从0-9

void init();//初始化⼦程序的申明

void displayNB(uchar NBshi,uchar NBge);//显⽰⼦程序的申明void delay(uint z);//延时⼦程序的申明

void fenjieNB();//南北数码管显⽰数字的分解函数void fenjieDX();//东西数码管显⽰数字的分解函数

void main()

void init();//初始化⼦程序的申明

void displayNB(uchar NBshi,uchar NBge);//显⽰⼦程序的申明

void delay(uint z);//延时⼦程序的申明

void fenjieNB();//南北数码管显⽰数字的分解函数

void fenjieDX();//东西数码管显⽰数字的分解函数

void main()

{

init();//初始化⼦程序while(1) {

if(cc==82)//循环⼀次结束{ cc=0;//从新进⾏下⼀次循环

}

}

void delay(uint z)//带参数的延时函数

void delay(uint z)//带参数的延时函数

{ uchar x,y;//定义两个变量for(x=z;x>0;x--)//循环延时

for(y=110;y>0;y--);//循环延时}

void init()//初始化⼦程序{ EA=1;//开总中断

ET0=1;//允许定时器0中断EX0=1;//允许外部中断0中断TR0=1;//启动定时器0

TMOD=0x01;//设置定时器0⼯作⽅式1

TH0=(65536-50000)/256;//给定时器的⾼8为赋初值

TL0=(65536-50000)%256;//给定时器的低8为赋初值

}

void fenjieNB()//南北数码管显⽰数字的分解函数

{ NBshi=NBtemp/10;//将要显⽰的时间的⼗位赋给变量

NBge=NBtemp%10;//将要显⽰的时间的个位赋给变量

NBtemp--;

}

void fenjieDX()//东西数码管显⽰数字的分解函数

{ DXshi=DXtemp/10; DXge=DXtemp%10; DXtemp--;

}

void displayNB(uchar NBshi,uchar NBge)//带参数的数码管显⽰函数

{

//显⽰南北⼗位P2=0xfe;

P0=table[NBshi];

delay(5);

//显⽰南北个位

P2=0xfd;

P0=table[NBge];

delay(15);

}

void displayDX(uchar DXshi,uchar DXge) {

//东西⼗位

P2=0xfb;

P1=table[DXshi];

delay(5);

//东西个位

P2=0xf7;

P1=table[DXge];

delay(5);

}void timer0() interrupt 1//定时器0的中断函数

{

TH0=(65536-50000)/256;//重装计数初值

TL0=(65536-50000)%256;//重装计数初值

aa++;

if(aa==20)//判断定时1分钟是否到

{

aa=0;//计数次数清0

if(cc==0)//南北亮红灯40秒,东西亮黄灯5秒

{

DXY=0;//东西的黄灯亮

DXG=1;//东西的绿灯不亮

DXR=1;//东西的红灯不亮

NBY=1;//南北的黄灯不亮

NBG=1;//南北的绿灯不亮

NBR=0;//南北的红灯亮

DXtemp=5;//东西的黄灯亮5秒

NBtemp=40;//南北的红灯亮40秒

}

else if(cc==6)//南北继续亮红灯40秒,东西亮绿灯34秒

{

DXG=0;//东西的绿灯亮

DXR=1;//东西的红灯不亮

NBY=1;//南北的黄灯不亮

NBG=1;//南北的绿灯不亮

NBR=0;//南北的红灯亮

DXtemp=34;//东西的绿灯亮34秒

}

else if(cc==41)//南北亮黄灯5秒,东西亮红灯40秒

{

DXY=1;//东西的黄灯不亮

DXG=1;//东西的绿灯不亮

DXR=0;//东西的红灯亮

NBY=0;//南北的黄灯亮

NBG=1;//南北的绿灯不亮