MCS51交通灯设计报告初稿改4.docx

上传人:b****8 文档编号:23628907 上传时间:2023-05-19 格式:DOCX 页数:43 大小:1.56MB
下载 相关 举报
MCS51交通灯设计报告初稿改4.docx_第1页
第1页 / 共43页
MCS51交通灯设计报告初稿改4.docx_第2页
第2页 / 共43页
MCS51交通灯设计报告初稿改4.docx_第3页
第3页 / 共43页
MCS51交通灯设计报告初稿改4.docx_第4页
第4页 / 共43页
MCS51交通灯设计报告初稿改4.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

MCS51交通灯设计报告初稿改4.docx

《MCS51交通灯设计报告初稿改4.docx》由会员分享,可在线阅读,更多相关《MCS51交通灯设计报告初稿改4.docx(43页珍藏版)》请在冰豆网上搜索。

MCS51交通灯设计报告初稿改4.docx

MCS51交通灯设计报告初稿改4

东南大学仪器科学与工程学院学院

课程设计报告

课程设计名称:

交通信号灯控制器设计

小组成员:

指导老师:

王澄非

报告日期:

2013/12/7

 

一、设计任务……………………………..…...........................3

二、总体方案………………………………………………….4

三、原理图和硬件电路设计……………………………….....6

四、软件&各模块功能实现……………………………….9

五、设计总结………………………………………………….18

六、参考文献………………………………………………….19

7、附件材料………………………………............................3

 

一、设计任务

1.1题目要求

利用51系列单片机、三原色发光二极管、八段数码管等器件,设计交通信号灯控制器,控制十字路口的交通秩序。

该交通信号灯控制器(开机默认状态下)控制功能如下:

(1)南北方向红灯亮,东西方向绿灯亮26s;

南北方向红灯亮,东西方向绿灯闪烁2s;

南北方向红灯亮,东西方向黄灯亮2s;

东西方向红灯亮,南北方向绿灯亮26s;

东西方向红灯亮,南北方向绿灯闪烁2s;

东西方向红灯亮,南北方向黄灯亮2s;

(2)每个方向用2个数码管显示对应亮灯到计时。

(3)每个方向用3个三色发光管显示对应颜色(红色、绿色和黄色)。

(4)设置倒计时时间。

为实现该功能,系统可以设置3个功能键,即:

S1—设置键、S2—数值增加、S3—数值减小。

通过对数字键操作,可以设定倒计时时间;通过S1的操作次序确定当前的显示和调整内容,由S2和S3进行调整。

S1可以有4种状态,对应调整内容见下表:

(红灯时间为绿灯时间、绿灯闪烁时间及黄灯时间之和)

S1的操作次序

调整内容

0

正常显示倒计时

1

绿灯时间调整

2

绿灯闪烁时间调整

3

黄灯时间调整

 

(5)倒计时时间也可通过串行通信接口来实现。

1.2设计任务分析

本项目主要实现交通灯的六种状态显示及三个控制按键功能。

六种状态红、黄、绿灯之间的交替关系如下表:

南北路(SN)

东西路(EW)

状态值

S1

红灯亮

30s倒计时

绿灯亮26s

26s倒计时

S2

红灯亮

绿灯闪烁2s

2s倒计时

S3

红灯亮

黄灯亮2s

2s倒计时

S4

绿灯亮26s

26s倒计时

红灯亮

30s倒计时

S5

绿灯闪烁2s

2s倒计时

红灯亮

S6

黄灯亮2s

2s倒计时

红灯亮

 

二、总体方案

2.1.设计流程图

2.2.方案选择

2.2.1MCS-51资源分配

总体设计可以分为MCU控制模块,数码管倒计时显示模块,LED交通灯模块和按键调整模块。

针对上述4个模块,合理分配I/O引脚资源,这样不仅能简化电路设计,节约资源,而且能缩短软件开发周期。

具体I/O引脚资源分配如下:

●数码管倒计时显示模块:

采用共阴极数码管显示倒计时,使用P0口作为七段数码管的段选信号控制端(使用74HC573进行数据锁存),选用P1^0~P1^2作为4个数码管的位选信号控制端(使用74HC138进行译码)。

●LED交通灯模块:

使用P2口作为LED灯的控制信号端。

结合现有的硬件资源,采用贴片式发光二极管设计。

●按键调整模块:

由于只需3个按键,数目较少,拟采用独立按键进行设计。

独立按键相比矩阵键盘不仅结构简单,而且软件操作也较为简单。

●MCU控制模块:

结合题目要求,采用STC89C51单片机设计。

加上必要的晶振电路和复位电路,构成51单片机最小系统。

其中外围晶振采用11.05926MHZ。

(出于计算方便,在计算定时器T1初值时以12MHZ计算)

2.2.2软件设计

功能子函数

针对课程设计要求,对方案确定的4个模块和方案的不同功能,设计不同的功能子函数来实现。

●功能1:

每隔1s数码管显示数值减1:

利用定时器/计数器T0产生。

T0计数50000次,产生50ms定时。

溢出中断产生20次,即产生准确的50ms*20=1s的计时。

设置中断函数“timer0()interrupt1using1”来实现该功能。

●功能2:

数码管显示倒计时:

设置显示函数Display(uchara,ucharb)来对南北SN和东西EW方向的状态进行倒计时显示。

●功能3:

LED交通灯红黄绿灯亮灭和闪烁:

实现该功能,只需要在主函数进程中对P2口进行赋值即可,此处不设置单独的功能子函数。

●功能4:

按键调整功能:

采用P3口进行控制,利用查询方式进行按键处理。

通过子函数KEY()来实现。

功能1的实现

∙功能1:

每隔1s数码管显示数值减1:

利用定时器/计数器T0产生。

T0计数50000次,产生50ms定时。

溢出中断产生20次,即产生准确的50ms*20=1s的计时。

设置中断函数“timer0()interrupt1using1”来实现该功能。

∙说明:

在硬件电路中实际晶振值为11.05926MHz。

但为了计算方便,在定时器T0初值计算时采用12MHz计算。

∙timer0()interrupt1using1——中断函数定时器T0的对应中断函数为timer0,中断优先级为1。

∙中断函数不需声明,和普通函数不同

∙定时器T0计算

✓采用定时器T0作为计时,采用定时模式,工作在方式1,16位计数器-----TMOD=0x01

✓定时器T0定时时间50ms。

单片机晶振为12MHz,机器周期为1ms。

✓计数次数X==50000(次)

✓采用16位计数器,n=16,

✓初值TH0=0x3cH;TL0=0xb0H

●代码实现

/**********************T0中断服务程序*******************/

voidtimer0(void)interrupt1using1

{

staticucharcount;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

count++;

if(count==10)

{

if(Flag_SN_Green==1)//测试南北黄灯标志位

{SN_Green=~SN_Green;}

if(Flag_EW_Green==1)//测试东西黄灯标志位

{EW_Green=~EW_Green;}

}

if(count==20)

{

Time--;

if(Flag_SN_Green==1)//测试南北黄灯标志位

{SN_Green=~SN_Green;}

if(Flag_EW_Green==1)//测试东西黄灯标志位

{EW_Green=~EW_Green;}

count=0;

}

}

功能2的实现

(这部分我写在ppt里面啦,你把报告修改下吧)

功能3的实现

功能4的实现

2.3方案模块框图

原理框图

交通灯总体原理框图:

图1交通灯整体原理图

图2交通灯独立按键部分原理图

 

图3交通灯发光二极管部分原理图

 

图4交通灯数码显示管部分原理图

附:

七段共阴数码管的字形代码表如下表:

显示字形

g

f

e

d

c

b

a

段码

0

0

1

1

1

1

1

1

3fh

1

0

0

0

0

1

1

0

06h

2

1

0

1

1

0

1

1

5bh

3

1

0

0

1

1

1

1

4fh

4

1

1

0

0

1

1

0

66h

5

1

1

0

1

1

0

1

6dh

6

1

1

1

1

1

0

1

7dh

7

0

0

0

0

1

1

1

07h

8

1

1

1

1

1

1

1

7fh

9

1

0

0

1

1

1

1

6fh

A

1

1

1

0

1

1

1

77h

B

1

1

1

1

1

0

0

7ch

C

0

1

1

1

0

0

1

39h

D

1

1

1

1

1

1

0

5eh

E

1

1

1

1

0

0

1

79h

F

1

1

1

0

0

0

1

71h

四、软件&各模块功能实现

对于硬件部分有了清晰模块分化之后,主要的设计任务就集中于软件部分,亦即STC89C51单片机的程序编写。

主程序框图外部中断子程序框图

程序清单

考虑代码的易读性,程序采用C语言编写,各模块代码如下所示:

#include

#defineucharunsignedchar

#defineuintunsignedint

/**************定义控制位***********************/

sbitSN_Red=P2^0;//SN红灯

sbitSN_Yellow=P2^1;//SN黄灯

sbitSN_Green=P2^2;//绿灯

sbitEW_Red=P2^3;//EW红灯

sbitEW_Yellow=P2^4;//EW黄灯

sbitEW_Green=P2^5;//EW绿灯

sbitK1=P3^0;

sbitK2=P3^1;

sbitK3=P3^2;

bitFlag_SN_Green;//SN黄灯标志位

bitFlag_EW_Green;//EW黄灯标志位

charTime;

charTime_Green=26;//东西方向倒计时单元

charTime_Yellow=2;//东西方向倒计时单元

charTime_Green1=2;//南北方向倒计时单元

ucharflag=0;

ucharcodetable[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//1~~~~9段选码

/**********************延时子程序******************************/

voidDelay(uchara)

{

uchari;

i=a;

while(i--){;}

}

/**********************外部0中断服务程序**********************/

voidKEY(void)

{

if(K1==0)//显示模式

{

flag++;

if(flag>=4)

flag=0;

while(K1==0);

}

if(K2==0)//显示模式

{

if(flag==1)

{

Time_Green++;

}

if(flag==2)

{

Time_Green1++;

}

if(flag==3)

{

Time_Yellow++;

}

while(K2==0);

}

if(K3==0)//显示模式

{

if(flag==1)

{

Time_Green--;

if(Time_Green<=1)

Time_Green=1;

}

if(flag==2)

{

Time_Green1--;

if(Time_Green1<=1)

Time_Green=1;

}

if(flag==3)

{

Time_Yellow--;

if(Time_Yellow<=1)

Time_Yellow=1;

}

while(K3==0);

}

}

/*****************显示子函数**********************/

voidDisplay1(chara,charb)//模式1显示

{

//P1=0;

P0=table[a/10];

P1=0;

Delay

(2);P1=7;

P0=table[a%10];

P1=1;

Delay

(2);P1=7;

P0=table[b/10];

P1=2;

Delay

(2);P1=7;

P0=table[b%10];

P1=3;

Delay

(2);P1=7;

KEY();

}

/**********************T0中断服务程序***********************/

voidtimer0(void)interrupt1using1

{

staticucharcount;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

count++;

if(count==10)

{

if(Flag_SN_Green==1)//测试南北黄灯标志位

{SN_Green=~SN_Green;}

if(Flag_EW_Green==1)//测试东西黄灯标志位

{EW_Green=~EW_Green;}

}

if(count==20)

{

Time--;

if(Flag_SN_Green==1)//测试南北黄灯标志位

{SN_Green=~SN_Green;}

if(Flag_EW_Green==1)//测试东西黄灯标志位

{EW_Green=~EW_Green;}

count=0;

}

}

/********************************主程序开始*********************************************/

voidmain(void)

{

TMOD=0x01;//定时器工作于方式1

TH0=(65536-50000)/256;//定时器赋初值

TL0=(65536-50000)%256;

EA=1;//CPU开中断总允许

ET0=1;//开定时中断

TR0=1;//启动定时

while

(1)

{

/*******S0状态**********/

SN_Red=0;//南北方向红灯亮东西方向绿灯亮26s

SN_Green=1;

SN_Yellow=1;

Flag_SN_Green=0;//EW关绿灯显示信号

EW_Red=1;

EW_Green=0;

EW_Yellow=1;

Flag_EW_Green=0;//EW关绿灯显示信号

Time=Time_Green+Time_Yellow+Time_Green1;//红灯时间

while(Time>(Time_Yellow+Time_Green1))

{

Display1(Time,(Time-(Time_Yellow+Time_Green1)));

if(flag>0){break;}

}

/*******S1状态**********/

SN_Red=0;//南北方向红灯亮东西方向绿灯闪烁2s

SN_Green=1;

SN_Yellow=1;

Flag_SN_Green=0;//EW关绿灯显示信号

EW_Red=1;//

EW_Green=0;

EW_Yellow=1;

Flag_EW_Green=1;//EW开绿灯显示信号

Time=Time_Green1+Time_Yellow;

while(Time>(Time_Yellow))

{

Display1(Time,(Time-Time_Yellow));

if(flag>0){break;}

}

Flag_EW_Green=0;

/*******S2状态**********/

SN_Red=0;//南北方向红灯亮东西方向黄灯2s

SN_Green=1;

SN_Yellow=1;

Flag_SN_Green=0;//EW关绿灯显示信号

EW_Red=1;//

EW_Green=1;

EW_Yellow=0;

Flag_EW_Green=0;//EW关绿灯显示信号

Time=Time_Yellow;//黄灯时间

while(Time>0)

{

Display1(Time,Time);

if(flag>0){break;}

}

//**********换向了////////

/*******S3状态**********/

SN_Red=1;//东西方向红灯亮南北方向绿灯亮26s

SN_Green=0;

SN_Yellow=1;

Flag_SN_Green=0;//EW关绿灯显示信号

EW_Red=0;//

EW_Green=1;

EW_Yellow=1;

Flag_EW_Green=0;//EW关绿灯显示信号

Time=Time_Green+Time_Yellow+Time_Green1;//红灯时间

while(Time>(Time_Yellow+Time_Green1))

{

Display1((Time-(Time_Yellow+Time_Green1)),Time);

if(flag>0){break;}

}

/*******S4状态**********/

SN_Red=1;//东西方向红灯亮南北方向绿灯闪烁2s

SN_Green=1;

SN_Yellow=1;

Flag_SN_Green=1;//EW关绿灯显示信号

EW_Red=0;

EW_Green=1;

EW_Yellow=1;

Flag_SN_Green=1;//SN开绿灯显示信号

Time=Time_Green1+Time_Yellow;//

while(Time>Time_Yellow)

{

Display1(Time-Time_Yellow,Time);

if(flag>0){break;}

}

Flag_EW_Green=0;

/*******S5状态**********/

SN_Red=1;//东西方向红灯亮南北方向黄灯2s

SN_Green=1;

SN_Yellow=0;

Flag_SN_Green=0;//EW关绿灯显示信号

EW_Red=0;

EW_Green=1;

EW_Yellow=1;

Flag_EW_Green=0;//EW关绿灯显示信号

Time=Time_Yellow;//黄灯时间

while(Time>0)

{

Display1(Time,Time);

if(flag>0){break;}

}

while(flag==1)//绿灯时间设置

{

SN_Red=0;//

SN_Green=1;

SN_Yellow=1;

Flag_SN_Green=0;

EW_Red=0;//

EW_Green=1;

EW_Yellow=1;

Flag_EW_Green=0;

Time=Time_Green;//绿灯时间

Display1(Time,Time);

}

while(flag==2)//绿灯闪烁时间设置

{SN_Red=1;//

SN_Green=0;

SN_Yellow=1;

Flag_SN_Green=0;

EW_Red=1;//

EW_Green=0;

EW_Yellow=1;

Flag_EW_Green=0;

Time=Time_Green1;//绿灯闪烁时间

Display1(Time,Time);

SN_Red=1;//

}

while(flag==3)//黄灯时间设置

{

SN_Green=1;

SN_Yellow=0;

Flag_SN_Green=0;

EW_Red=1;//

EW_Green=1;

EW_Yellow=0;

Flag_EW_Green=0;

Time=Time_Yellow;//黄灯时间

Display1(Time,Time);

}

}

}

系统仿真调试结果

初始状态SN红灯30s倒计时,EW绿灯26s倒计时仿真效果

EW绿灯2s闪烁仿真效果

EW黄灯警告2s仿真效果

五、设计总结

5.1方案特色

按键抖动消除

代码实现

课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。

因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。

回顾起此次单片机课程设计,我仍感慨颇多,从选题到定稿,从理论到实践,这不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机C语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。

同时,对给过我们帮助的同学和老师表示忠心的感谢!

六、参考文献

[1]《单片机微型计算机及其应用》(第4版)孙育才东南大学出版社2008

[2]单片机原理及接口技术(第3版),李朝青,北

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

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1