单片机实训--交通灯

  • 格式:doc
  • 大小:253.00 KB
  • 文档页数:17

1 桂林电子科技大学信息科技学院

《单片机交通灯》实训报告

学 号 0951100231

姓 名 贾小丹

指导教师:韩剑 易艺 李德明

2011 年 09 月 22 日

2 交通灯控制系统

一、 任务

利用AT89S52单片机控制各个路口红绿灯及时间显示,设计一个交通灯控制系统。

二、 基本原理

利用51单片机控制各个路口红绿灯及时间显示。

模拟交通灯示意图:

东南西北次 干 道主干道

设计的重点:

1、各个路口红绿灯亮灭的规则,暂不考虑左转方向;

2、倒计时的实现,利用单片机的定时器进行计数得到秒信号;

3、时间显示:东西南北四个方向的时间一致,当东西方向为60秒绿灯通行时间,同时南北方向为60秒红灯禁止时间,因此硬件连接时可考虑东西南北方向可采用同一接法;最后相当于2个数码管动态显示,具体见参考电路框图。

4、按键设置(扩展要求):设置键按一次,设置主干道通信时间(即次干道禁止时间),按第二次,设置主干道禁止时间(即次干道通信时间),按第三次,可作为紧急通信键。设置时间需要确定,可通过确定键实现,也可通过延时确定,如10秒。当然也可根据需要增加相应的按键。

参考电路框图

机 12只

发光

二极

(红、

黄、绿)

按键(设置、+、-、确定) 2位一体

共阴数码 3

三、性能指标要求

1、各方向的红、绿色信号灯能按照设定规则运行;

2、绿灯亮之前,黄灯闪烁5次;

3、红灯和绿灯倒计时间能够正确显示;

4、两干道的车辆不会会车冲突。

5、可以扩展其他功能(如按键设置时间,按键模拟警车。

四 方案论证

一、 方案比较论证

方案一:纯数字电路方式

用数电器件设计:时钟分频模块,交通灯亮灭控制模块,交通灯显示模块,倒计时计数模块,倒计时显示模块,实现交通灯的控制和显示功能。优点是不需要软件编程控制,缺点是硬件规模庞大且不能实现延时可调。

方案二:FPGA/CPLD方式

FPGA/CPLD除了完成交通灯控制、存储和显示功能外,还可进行人机交互,实现定时器延时可调。这种方案系统结构紧凑,但调试过程繁琐。

方案三:单片机方式

利用单片机控制相应并口,模拟交通灯显示,利用其并口P2口实现数码管显示。利用外部中断功能,完成交通灯主干次道通行时间任意可调。此方案占用硬件资源少、功能齐全、调试过程简单。

本设计采用方案三。

二、 原理图,

交通灯原理图为下图所示:

部分原理图分析: 4

东西、南北方向的数码管对角线放置,发光二极管连一个1K的电阻,

防止灯烧。

这里的按键是实现复位清零的功能。 5

这里的按键 P3.4按一下,进入倒计时时间设置,P3.5是实现显示时间减一功能,P3.6实现显示时间加一功能,P3.7实现确认功能。

交通灯

6

五、 交通灯C语言程序为:

#include

/*-----------------------------//【贾小丹 (AdvancyYP)@制作】//-----------------------------*/

/*

名称 : 交通灯

单片机型号 :51系列单片机

晶振 : 12MHz

*/

/*-----------------------------//【贾小丹 (AdvancyYP)@制作】//-----------------------------*/

/*定义名称*/

#define unint unsigned int

#define unchar unsigned char

/*定义管脚*/

#define SMG_SEG P1 //定义数码管段选口为:P0

#define SMG_BIT P2 //定义数码管位选口为:P2

#define LIGHT P0 //定义红绿灯口为:P1

#define KEY P3 //定义按键口为:P3

sbit BEEP = P2^7; //定义蜂鸣器管脚为P3.7

/*定义行为*/

#define LIGHT_RED (LIGHT = 0xDE)//红灯亮起//

#define LIGHT_YELLOW (LIGHT = 0xED)//黄灯亮起//

#define LIGHT_GREEN (LIGHT = 0xF3)//绿灯亮起//

#define LIGHT_OFF (LIGHT = 0xFF)//全部熄灭

#define KEY1 0xEF//KEY1按下

#define KEY2 0xDF//KEY2按下

#define KEY3 0xBF//KEY3按下

#define KEY4 0x7F//KEY4按下

/*定义数码管编码*/

//数码管段码////(共阳)

unchar code SMG_SEG_CODE[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,

0x7F, 0x6F};//数码管段码

//数码管位码////(共阴)

unchar code SMG_BIT_CODE[]={0xFD, 0xFE};//数码管位码

/*定义时间变量*/

unchar th, tl;//定时计数器初值变量

unchar t_10ms, stop_time, run_time, set_stop_time, set_run_time;//时间变 7 量

/*定义模式、状态标识符*/

unchar now_mode;//定义当前模式标识符

//(注:0.系统运行模式 1.系统设置主干道通行时间 2.系统设置主干道禁止时间

3.系统设置主干道紧急通行)

unchar stop_run;//定义:禁止通行标识符

//(注:0.禁止 非0.通行)

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

//函数声明//

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

void _1ms();//1ms延时函数

void _Nms(unsigned int N);//N*1ms延时函数

void T0_INITIAL(void);//定时计数器T0初始化

void SMG(unchar x_seg, unchar x_bit);//数码管函数

void DISPLAY_TIME(unchar t);//显示时间函数

void MODE(void);//模式函数

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

//时间函数//

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

void _1ms()//1ms延时函数

{

unsigned char a,b,c;

for(c=1;c>0;c--)

for(b=142;b>0;b--)

for(a=2;a>0;a--);

}

void _Nms(unsigned int N)//N*1ms延时函数

{

while(N)

{

_1ms();

N--;

}

}

/********************************************************************** 8 *******************/

//定时计数器T0初始化//

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

void T0_INITIAL(void)

{

EA=0;//总中断关闭

ET0=0;//定时器0关闭

TR0=0;//关闭TR0

TMOD = 0x01;//设置定时器工作方式为16位定时器自动重装(方式1)

th=(65536-10000)/256;//定时计数器初值计算(定时10ms)

tl=(65536-10000)%256;//定时计数器初值计算(定时10ms)

TH0=th;//定时器0附初始值(定时10ms)

TL0=tl;//定时器0附初始值(定时10ms)

stop_time = set_stop_time;//获取设定好的禁止时间

run_time = set_run_time;//获取设定好的通行时间

t_10ms=0;//初始化10ms定时计数变量

TR0=1;//开启TR0

ET0=1;//定时器0开启

EA=1;//总中断开启

}

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

//定时计数器T0中断//

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

void T0_INTERRUPT(void) interrupt 1 using 1

{

if(stop_run==0)//如果当前状态为:禁止

{

t_10ms++;//10ms变量自增

if(t_10ms==100)//如果定时计数到1s

{

t_10ms=0;//10ms定时计数变量清0

stop_time--;//禁止时间自减

if(stop_time==0)//禁止时间等于0时

{

run_time = set_run_time;//获取设定好的通行时间