软件工程大作业.docx

上传人:b****6 文档编号:13341784 上传时间:2023-06-13 格式:DOCX 页数:41 大小:1.40MB
下载 相关 举报
软件工程大作业.docx_第1页
第1页 / 共41页
软件工程大作业.docx_第2页
第2页 / 共41页
软件工程大作业.docx_第3页
第3页 / 共41页
软件工程大作业.docx_第4页
第4页 / 共41页
软件工程大作业.docx_第5页
第5页 / 共41页
软件工程大作业.docx_第6页
第6页 / 共41页
软件工程大作业.docx_第7页
第7页 / 共41页
软件工程大作业.docx_第8页
第8页 / 共41页
软件工程大作业.docx_第9页
第9页 / 共41页
软件工程大作业.docx_第10页
第10页 / 共41页
软件工程大作业.docx_第11页
第11页 / 共41页
软件工程大作业.docx_第12页
第12页 / 共41页
软件工程大作业.docx_第13页
第13页 / 共41页
软件工程大作业.docx_第14页
第14页 / 共41页
软件工程大作业.docx_第15页
第15页 / 共41页
软件工程大作业.docx_第16页
第16页 / 共41页
软件工程大作业.docx_第17页
第17页 / 共41页
软件工程大作业.docx_第18页
第18页 / 共41页
软件工程大作业.docx_第19页
第19页 / 共41页
软件工程大作业.docx_第20页
第20页 / 共41页
亲,该文档总共41页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

软件工程大作业.docx

《软件工程大作业.docx》由会员分享,可在线阅读,更多相关《软件工程大作业.docx(41页珍藏版)》请在冰点文库上搜索。

软件工程大作业.docx

软件工程大作业

软件工程大作业

 

交通灯控制系统

 

2012年12月20日

 

 

一、设计背景及需求分析

1.设计背景

随着人口快速的增多,交通工具的爆炸性的发展,以及道路资源的有限性,交通控制就应运而生,在人类的生活、工作环境中,交通扮演着极其重要的角色,人们的出行都无时不刻与交通打着交道。

要保证高效安全的交通秩序,除了制定一系列的交通规则,还必须通过一定的技术手段加以实现。

电子科学技术的发展和成熟能比较好的解决系统建立中硬软件方面要求的技术难题。

目前,交通控制方面的研究能完全实现自动智能化,甚至将整个区域整合成一个统一的系统范围,还能根据正常时段以及特定突发时段的情况进行科学的自动调整。

交通对于社会的工业经济和人们的生活生产中有着十分重要的意义。

随着单片机和传感技术的迅速发展,自动检测领域发生了巨大变化,交通自动监测控制方面的研究有了明显的进展,并且必将以其优异的性能价格比,逐步取代传统的交通控制措施。

城市道路交通自动控制系统的发展是以城市交通信号控制技术为前导,与汽车工业并行发展的。

在其各个发展阶段,由于交通的各种矛盾不断出现,人们总是尽可能地把各个历史阶段当时的最新科技成果应用到交通自动控制中来,从而促进了交通自动控制技术的不断发展。

在近百年的发展中,道路交通信号控制系统经历了手动到自动,从固定配时到灵活配时,从无感应控制到有感应控制,从单点控制到干线控制,从区域控制到网络控制的长远过程。

交通控制研究的发展,旨在解决人类交通因需求的增多而日益繁重带来的问题,局限于道路建设的暂时不足和交通工具的快速增长,就要使更多的车辆安全高效的利用有限的道路资源,避免因无序和抢行等无控制原因造成的不必要阻塞甚至瘫痪,另外,针对整个交通线路车辆的多少实时调整和转移多条线路的分流也十分必要。

2.需求分析

2.1实现交通信号灯(红灯、黄灯和绿灯)的基本定时控制。

2.2采用数码LED显示路口各个方向红灯、黄灯和绿灯的持续时间并进行倒计时提醒。

2.3可以通过键盘进行各个时间的设置。

实现对特殊需求的控制。

2.4实时检测车流量。

2.5闯红灯报警设置。

2.6换灯时进行声音提示。

二、系统设计

1.总体设计

本设计系统以单片机为控制核心,连接成最小系统,由车流量检测模块,违规检测模块,和按键设置模块等产生输入,信号灯状态模块,LED倒计时模块和蜂鸣器状态模块接受输出。

图1总体框图

2.可行性分析

2.1电源提供方案

为使模块稳定工作,须有可靠电源。

方案一:

采用电池供电。

此方案随着能量的耗尽电压下降便导致电路供电异常,且需要的电池数量多,经济性差。

方案二:

采用自制电源电路供电。

此方案提供稳定电压,且结构简单,制作方便,成本较低。

比较后选择方案二。

2.2单片机选择方案

方案一:

采用MSP430G2553。

此单片机的亮点是功耗较低,但其本身I/O接口数量少,不能满足系统需要,且价格较高。

方案二:

采用AT89S52。

此单片机是一种较低功耗、高性能CMOS8位微控制器,具有32位I/O接口线,有两个外部中断,两个定时器,能满足系统的基本需求,且价格较低廉。

比较后选择方案二。

2.3键盘选择方案

方案一:

一个I/O接口对应一个键。

浪费I/O接口,且设计的键数有限。

方案二:

用zlg7289A键盘控制芯片组成键盘模块,zlg7289A具有串行接口,同时可连接多达64键的键盘矩阵,单片即可完成键盘接口的全部功能,还具有多种控制指令。

比较后选择方案二。

2.4交通灯选择方案

LED灯构造简单、成本低廉、技术成熟度高.故选LED灯做为交通灯。

2.5显示选择方案

方案一:

液晶12864。

价格较高,可视角度有限制,操作较复杂。

虽然具有显示字符图画等多种功能,但是在本系统中,只需要显示相应的数字,没必用液晶12864。

方案二:

数码管。

数码管具有功耗较小,耐冲击,长寿命,价格低,响应速度快等优点。

比较后选择方案二。

2.6成本分析

单片机7元、键盘模块15元、导线10元、数码管5元、显示灯2元、电路板15元。

总计54元。

3.总体设计

3.1通行方案设计

 

图2交通状态图

通过具体的路口交通灯状态的演示分析我们可以把这四个状态归纳如下:

东西方向红灯灭,同时绿灯亮,南北方向黄灯灭,同时红灯亮,倒计时20秒。

此状态下,东西向禁止通行,南北向允许通行。

东西方向绿灯灭,同时黄灯亮,南北方向红灯亮,倒计时5秒。

此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。

南北方向红灯灭,同时绿灯亮,东西方向黄灯灭,同时红灯亮,倒计时20秒。

此状态下,东西向允许通行,南北向禁止通行。

④南北方向绿灯灭,同时黄灯亮,东西方向红灯亮,倒计时5秒。

此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。

下面我们可以用图表表示灯状态和行止状态的关系如下:

状态1

状态3

状态4

状态6

东西向

禁行

等待变换

通行

等待变换

南北向

通行

等待变换

禁行

等待变换

东西红灯

1

1

0

0

东西黄灯

0

0

0

1

东西绿灯

0

0

1

0

南北红灯

0

0

1

1

南北绿灯

1

0

0

0

南北黄灯

0

1

0

0

图3交通状态及红绿灯状态

东西南北四个路口均有红绿黄3灯和数码显示管2个,在任一个路口,遇红灯禁止通行,转绿灯允许通行,之后黄灯亮警告行止状态将变换。

状态及红绿灯状态如表1所示。

说明:

0表示灭,1表示亮。

3.2软件流程

图4软件流程1

图5软件流程2

三、模块设计及编码实现

1.键盘芯片控制模块

/********************************************************************

键盘控制芯片头文件

********************************************************************/

#ifndef_TM1638_H_

#define_TM1638_H_

 

voiddelay_us();

voiddelay_ms();

voiddelay();

voidTM1638_Write(unsignedcharDATA);//写数据函数

unsignedcharTM1638_Read(void);//读数据函数

voidWrite_COM(unsignedcharcmd);//发送命令字

unsignedcharRead_key(void);//读按键值

voidinit_TM1638(void);//芯片初始化

voidLED_display(unsignedcharddata0,unsignedcharddata1,unsignedcharddata2,unsignedcharddata3,//显示按键

unsignedcharddata4,unsignedcharddata5,unsignedcharddata6,unsignedcharddata7);

#endif

#defineucharunsignedchar

#defineuintunsignedint

uchardatadisbuffer[8]={0,0,0,0,0,0,0,0};

ucharcodetab_key[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0xef};

ucharflag_break;

ucharkey_value;

ucharred,green,time,yellow;

voidLED_display(uchardata0,uchardata1,uchardata2,uchardata3,uchardata4,uchardata5,uchardata6,uchardata7);

sbitDIO=P3^5;

sbitCLK=P3^6;

sbitSTB=P3^7;

voiddelay_us(unsignedinttime)

{

while(time--);

}

voiddelay_ms(unsignedinttime)

{

while(time--)delay_us(100);

}

voiddelay(unsignedlongcnt)

{

unsignedinti=0;

while(cnt--)

{

for(i=0;i<2;i++)

{

}

}

}

/*******************************************************************************************

函数功能:

向芯片写数据

*******************************************************************************************/

voidTM1638_Write(unsignedcharDATA)

{

unsignedchari;

for(i=0;i<8;i++)

{

CLK=0;

if(DATA&0X01)

DIO=1;

else

DIO=0;

DATA>>=1;

CLK=1;

}

}

/*******************************************************************************************

函数功能:

读芯片数据

*******************************************************************************************/

unsignedcharTM1638_Read(void)

{

unsignedchari;

unsignedchartemp=0;

DIO=1;//设置为输入

for(i=0;i<8;i++)

{

temp>>=1;

CLK=0;

if(DIO)

temp|=0x80;

CLK=1;

}

returntemp;

}

/*******************************************************************************************

函数功能:

向芯片写命令字

*******************************************************************************************/

voidWrite_COM(unsignedcharcmd)

{

STB=0;

TM1638_Write(cmd);

STB=1;

}

/*******************************************************************************************

函数功能:

读按键值

*******************************************************************************************/

unsignedcharRead_key(void)

{

unsignedcharc[4],i,key_value=0;

STB=0;

TM1638_Write(0x42);

delay_ms(100);

for(i=0;i<4;i++)

c[i]=TM1638_Read();

STB=1;

if(c[0]==0x04)key_value=1;

if(c[0]==0x40)key_value=2;

if(c[1]==0x04)key_value=3;

if(c[1]==0x40)key_value=4;

if(c[2]==0x04)key_value=5;

if(c[2]==0x40)key_value=6;

if(c[3]==0x04)key_value=7;

if(c[3]==0x40)key_value=8;

if(c[0]==0x02)key_value=9;

if(c[0]==0x20)key_value=10;

if(c[1]==0x02)key_value=11;

if(c[1]==0x20)key_value=12;

if(c[2]==0x02)key_value=13;

if(c[2]==0x20)key_value=14;

if(c[3]==0x02)key_value=15;

if(c[3]==0x20)key_value=16;

return(key_value);

}

/*******************************************************************************************

函数功能:

芯片初始化

*******************************************************************************************/

voidinit_TM1638(void)

{

unsignedchari;

Write_COM(0x8a);//亮度

Write_COM(0x8a);//亮度

Write_COM(0x40);//写数据命令

STB=0;

TM1638_Write(0xc0);//写地址命令

for(i=0;i<16;i++)

TM1638_Write(0xff);

STB=1;

}

/*******************************************************************************************

函数功能:

显示按键值

*******************************************************************************************/

voidLED_display(unsignedcharddata0,unsignedcharddata1,unsignedcharddata2,unsignedcharddata3,

unsignedcharddata4,unsignedcharddata5,unsignedcharddata6,unsignedcharddata7)

{

unsignedcharwritedata0,writedata1,writedata2,writedata3,writedata4,writedata5,writedata6,writedata7;

unsignedchardata0,data1,data2,data3,data4,data5,data6,data7;

data0=ddata4;

data1=ddata5;

data2=ddata6;

data3=ddata7;

data4=ddata0;

data5=ddata1;

data6=ddata2;

data7=ddata3;

writedata0=(tab_key[data0]&0x01)+((tab_key[data1]&0x01)<<1)+((tab_key[data2]&0x01)<<2)+((tab_key[data3]&0x01)<<3)+((tab_key[data4]&0x01)<<4)+((tab_key[data5]&0x01)<<5)+((tab_key[data6]&0x01)<<6)+((tab_key[data7]&0x01)<<7);

writedata1=((tab_key[data0]&0x02)>>1)+((tab_key[data1]&0x02))+((tab_key[data2]&0x02)<<1)+((tab_key[data3]&0x02)<<2)+((tab_key[data4]&0x02)<<3)+((tab_key[data5]&0x02)<<4)+((tab_key[data6]&0x02)<<5)+((tab_key[data7]&0x02)<<6);

writedata2=((tab_key[data0]&0x04)>>2)+((tab_key[data1]&0x04)>>1)+((tab_key[data2]&0x04))+((tab_key[data3]&0x04)<<1)+((tab_key[data4]&0x04)<<2)+((tab_key[data5]&0x04)<<3)+((tab_key[data6]&0x04)<<4)+((tab_key[data7]&0x04)<<5);

writedata3=((tab_key[data0]&0x08)>>3)+((tab_key[data1]&0x08)>>2)+((tab_key[data2]&0x08)>>1)+((tab_key[data3]&0x08))+((tab_key[data4]&0x08)<<1)+((tab_key[data5]&0x08)<<2)+((tab_key[data6]&0x08)<<3)+((tab_key[data7]&0x08)<<4);

writedata4=((tab_key[data0]&0x10)>>4)+((tab_key[data1]&0x10)>>3)+((tab_key[data2]&0x10)>>2)+((tab_key[data3]&0x10)>>1)+((tab_key[data4]&0x10))+((tab_key[data5]&0x10)<<1)+((tab_key[data6]&0x10)<<2)+((tab_key[data7]&0x10)<<3);

writedata5=((tab_key[data0]&0x20)>>5)+((tab_key[data1]&0x20)>>4)+((tab_key[data2]&0x20)>>3)+((tab_key[data3]&0x20)>>2)+((tab_key[data4]&0x20)>>1)+((tab_key[data5]&0x20))+((tab_key[data6]&0x20)<<1)+((tab_key[data7]&0x20)<<2);

writedata6=((tab_key[data0]&0x40)>>6)+((tab_key[data1]&0x40)>>5)+((tab_key[data2]&0x40)>>4)+((tab_key[data3]&0x40)>>3)+((tab_key[data4]&0x40)>>2)+((tab_key[data5]&0x40)>>1)+((tab_key[data6]&0x40))+((tab_key[data7]&0x40)<<1);

writedata7=((tab_key[data0]&0x80)>>7)+((tab_key[data1]&0x80)>>6)+((tab_key[data2]&0x80)>>5)+((tab_key[data3]&0x80)>>4)+((tab_key[data4]&0x80)>>3)+((tab_key[data5]&0x80)>>2)+((tab_key[data6]&0x80)>>1)+((tab_key[data7]&0x80));

Write_COM(0x8a);//亮度

Write_COM(0x40);//写数据命令

STB=0;

TM1638_Write(0xc0);//写地址命令

TM1638_Write(writedata0);

TM1638_Write(0x80);

TM1638_Write(writedata1);

TM1638_Write(0x00);

TM1638_Write(writedata2);

TM1638_Write(0x00);

TM1638_Write(writedata3);

TM1638_Write(0x00);

TM1638_Write(writedata4);

TM1638_Write(0x00);

TM1638_Write(writedata5);

TM1638_Write(0x00);

TM1638_Write(writedata6);

TM1638_Write(0x00);

TM1638_Write(writedata7);

TM1638_Write(0x00);

STB=1;

}

 

2.基于键盘的时间设置模块

#ifndefJIANPAN_H

#defineJIANPAN_H

voidjianpan();

 

#endif

ucharflag_break;

ucharred_init,yellow_init,green_init;

ucharxiugai;

ucharb[]={0,0};

/*******************************************************************************************

函数功能:

将修改时间的十位存在b[0];个位存在b[1]

*******************************************************************************************/

voidfenwei(ucharxiugai_time)

{

b[0]=xiugai_time/10;

b[1]=xiugai_time%10;

}

/*******************************************************************************************

函数功能:

读按键,将修改的按键值存在init中

*******************************************************************************************/

ucharxiugai_time()

{

uchari=0;

ucharinit;

uchargewei,shiwei;

gewei=0;

shiwei=0;

init=0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2