资源描述
- -
计算机控制系统课程设计
题目:
单片机交通信号灯控制系统设计
学 院:
信息科学与工程学院
专 业:
自动化
学 号:
学生:
指导教师:
日 期:
- word.zl
- -
单片机交通信号灯控制系统设计
一、设计目的与意义
1、通过用51单片机控制交通灯的课程设计,熟练51单片机的编程方法。
2、通过本课程的设计,进一步掌握I/O接口设计和常用程序设计技术,掌握单片机控制系统的设计的一般方法,能根据系统设计要求,完成应用系统的硬件和软件设计。
3、通过本课程设计将理论用于实践,提高动手能力。
二、设计容和要求
交通灯控制系统控制东西、南北两个方向信号灯,每个方向设置两组红绿灯,红灯制止通行,绿灯允许通行。每个方向的通行时间各由两位LED数码显示,通行时间可设置,绿灯向红灯转换前绿灯闪烁三次共3秒钟,红灯向绿灯过渡时不闪烁。
系统上电时的初始状态为东西、南北两个方向均为红灯,持续2秒后为东西方向绿灯,南北方向红灯,之后以定时方式控制两个方向的汽车轮流通行。
三、常见交通信号灯系统概述:
交通信号灯是交通信号中的重要组成局部,是道路交通的根本语言。交通信号灯由红灯〔表示制止通行〕、绿灯〔表示允许通行〕、黄灯〔表示警示〕组成。
绿灯信号是准许通行信号。按?交通平安法实施条例?规定:绿灯亮时,准许车辆、行人通行,但转弯的车辆不准阻碍被放行的直行车辆和行人通行。
红灯信号是绝对制止通行信号。红灯亮时,制止车辆通行。右转弯车辆在不阻碍被放行的车辆和行人通行的情况下,可以通行。红灯信号是带有强制意义的禁行信号,遇此信号时,被禁行车辆须停在停顿线以外,被禁行的行人须在人行道边等候放行;机动车等候放行时,不准熄火,不准开车门,各种车辆驾驶员不准离开车辆;自行车左转弯不准推车从路口外边绕行,直行不准用右转弯方法绕行。
黄灯亮时,已越过停顿线的车辆,可以继续通行。黄灯信号的含义介于绿灯信号和红灯信号之间,既有不准通行的一面,又有准许通行的一面。黄灯亮时,警告驾驶人和行人通行时间已经完毕,马上就要转换为红灯,应将车停在停顿线后面,行人也不要进入人行横道。但车辆如因距离过近不便停车而越过停顿线时,可以继续通行。已在人行横道的行人要视来车情况,或尽快通过,或原地不动,或退回原处。
本设计为了简便起见,将黄灯取消,使用红灯的闪烁代替。
四、系统硬件设计方案
主控芯片选择intel的8051单片机,此单片机有32个I/O口,2个定时器,5个中断源,4 KB 的片上ROM,128 Bytes 的片上 RAM。
使用4对红绿LED灯作为4个方向的信号灯,每个LED接一个1k的限流电阻,共阳极接法。通过单片机的P0口控制LED的状态。
使用4对8位的数码管作为时间显示设备,每个方向一对,可以显示0~99s的倒计时时间。使用单片机的P1口作为数码管的段码输出端,P2口作为数码管的位选端。整个数码管使用动态显示技术驱动。
为了实现时间的可控,使用拨码开关作为外部输入设备,调节时间,将拨码开关接到单片机的P3口,由于是8位,故可以选择2^8=256个状态,等待时间的围为0~99s,故使用拨码开关的调节围足够。
整个系统的电源使用线性电源LM7805,其驱动电流可达1A,为了减少电源输出的高频信号,可在其输出端并联几个电容。
五、原理图设计
1、 硬件设计框图:
2、 最小系统原理图:
51单片机的最小系统包括时钟电路和复位电路,如图:
3、 电源电路:
在LM7805的输出端并联10uf、0.1uf两个电容,大电容用来储能,小电容用来滤波。
4、 交通灯电路图:
每个方向有红灯、绿灯两个信号灯,信号灯为共阳极接法,每个灯接一个限流电阻,如图:
5、 倒计时显示电路:
每个方向有两个8位数码管,显示0~99s的计时时间,使能端使用单片机的单个IO口控制,如图:
6、 拨码开关电路:
将拨码开关的一端接到P3口,另一端接地,假设拨码开关翻开,会将单片机的IO口拉低,单片时机检测到这个状态。
7、 整个系统的电路图:
六、软件设计方案
1、 为了使倒计时更为准确,使用定时器作为倒计时的基准时间,系统使用12M的晶振,定时器设置为5ms中断一次。
2、 设置开机初始化状态,信号灯全部为红灯,等待2秒后,东西方向绿灯,南北方向红灯,然后开场正常工作。
3、 每个方向的通行时间各由两位LED数码显示,通行时间可设置,绿灯向红灯转换前绿灯闪烁三次共3秒钟,红灯向绿灯过渡时不闪烁。
4、 软件设计流程图:
七、程序及注释
#include<reg51.h>//头文件
#define TUBE_DATA P0//端口定义 段码输出端
#define LED P1//LED控制端
#define TUBE_ENABLE P2//位码输出端
#define BOMA P3//拨码输入端
#define ALL_OFF 0xff//运算定义
#define RED1_ON 0xfe
#define RED2_ON 0xfd
#define RED3_ON 0xfb
#define RED4_ON 0xf7
#define GREEN1_ON 0xef
#define GREEN2_ON 0xdf
#define GREEN3_ON 0xbf
#define GREEN4_ON 0x7f
char set_time=0; //设定时间
char run_time=0;//实际运行倒计时时间
bit LED_choose=0; //信号灯选择 0为南北向 1为东西向
int time_base=0;//时间基准计数器
code unsigned char LED_num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段码
//---------------------------------------
void sys_init(void) //系统初始化函数
{
TUBE_DATA=0xff; //端口初始化
TUBE_ENABLE=0xff;
LED=0xff;
BOMA=0xff;
TMOD=0x11; //定时器初始化
TH0=0x3c; //定时5ms
TL0=0xb0;
TR0=1; //定时器运行
ET0=1;
EA=1; //开中断
LED=ALL_OFF & RED1_ON & RED2_ON & RED3_ON & RED4_ON;
//信号灯初始状态
while(time_base<400); //等待2s,time_base一个单位代表5ms
time_base=0;
LED_choose=1; //信号灯选择
LED=ALL_OFF & RED1_ON & RED3_ON & GREEN2_ON & GREEN4_ON;
//东西向亮绿灯,南北向亮红灯
}
//---------------------------------------
void boma_scan(void) //拨码设定时间
{
set_time=BOMA; //拨码设定时间
if(set_time>99)
set_time=99; //设定上下限
else if(set_time<10)
set_time=10;
}
//---------------------------------------
void tube_display(void) //显示时间
{
static bit choose=0; //个位十位选择标志位
if(choose) //显示个位
{
TUBE_DATA=LED_num[run_time%10];
TUBE_ENABLE=0xaa;
}
else//显示十位
DATA=LED_num[run_time/10];
{
TUBE_DATA=LED_num[run_time/10];
TUBE_ENABLE=0x55;
}
choose=~choose;
}
//---------------------------------------
void main(void) //主函数
{
sys_init();//系统初始化
while(1)
{
boma_scan();//拨码扫描
}
}
//---------------------------------------
void PIT0(void) interrupt 1 //定时器0,信号灯控制、刷新时间
{
TH0=0x3c; //赋初值
TL0=0xb0;
time_base++;
if(time_base%200==0) //1s
{
run_time--;//倒计时减1s
if(time_base==1000)
time_base=0;
}
if(LED_choose) //信号灯显示
LED=ALL_OFF & RED1_ON & RED3_ON & GREEN2_ON & GREEN4_ON;
else
LED=ALL_OFF & RED2_ON & RED4_ON & GREEN1_ON & GREEN3_ON;
break;
if(run_time<3) //红灯闪烁
{
switch(run_time)
{
case 2: if(LED_choose)
LED=ALL_OFF & GREEN2_ON & GREEN4_ON;
else
LED=ALL_OFF & GREEN1_ON & GREEN3_ON;
break;
case 1: if(LED_choose)
LED=ALL_OFF & RED1_ON & RED3_ON & GREEN2_ON & GREEN4_ON;
else
LED=ALL_OFF & RED2_ON & RED4_ON & GREEN1_ON & GREEN3_ON;
break;
case 0: if(LED_choose)
LED=ALL_OFF & GREEN2_ON & GREEN4_ON;
else
LED=ALL_OFF & GREEN1_ON & GREEN3_ON;
run_time=set_time; //倒计时完毕,重新赋值
LED_choose=~LED_choose; //信号灯切换
break;
}
}
tube_display();//刷新时间显示
}
八、设计心得
通过本次课程设计,让我加深了对课本知识的理解和掌握,也让我对单片机与外部器件的接口技术有了更深的了解,使我得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。对于各种相关软件如DXP、KEIL的使用更加熟练,C语言的编程风格也有所改善。但是,这些也都仅仅是一个开端,在以后的日子里,我将争取继续努力学好这一实用的技能,为以后的工作打下坚实根底!
- word.zl
展开阅读全文