(玩电子) 电子技术学习与研究
当前位置单片机教程网 >> MCU设计实例 >> 浏览文章

单片机交通灯设计

作者:佚名   来源:本站原创   点击数:x  更新时间2007年06月12日   字体

交通灯控制系统设计
摘要本系统由单片机系统键盘LED 显示交通灯演示系统组成系统包括人行道左转右转以及基本的交通灯的功能系统除基本交通灯功能外还具有倒计时时间设置紧急情况处理分时段调整信号灯的点亮时间以及根据具体情况手动控制等功能
关键词AT89S51交通规则
一 方案比较设计与论证
1 电源提供方案
为使模块稳定工作须有可靠电础我们考虑了两种电源方案

方案一采用独立的稳压电础此方案的优点是稳定可靠且有各种成熟电路可供选用缺点是各模块都采用独立电源会使系统复杂且可能影响电路电平
方案二采用单片机控制模块提供电础改方案的优点是系统简明扼要节约成本缺点是输出功率不高
综上所述我们选择第二种方案
2 显示界面方案
该系统要求完成倒计时状态灯等功能基于上述原因我们考虑了三种方案
方案一完全采用数码管显示这种方案只显示有限的符号和数码字苻无法胜任题目要求
方案二完全采用点阵式LED 显示这种方案实现复杂且须完成大量的软件工作但功能强大可方便的显示各种英文字符汉字图形等
方案三采用数码管与点阵LED 相结系方法因为设计既要求倒计时数字输出又要求有状态灯输出等为方便观看并考虑较实情况用数码管与LED灯分别显示时间与提示信息这种方案既满足系统功能要求又减少了系统实现的复杂度权衡利弊第三种方案可互补一二方案的优缺我们决定采用方案三以实现系统的显示功能
3 输入方案
题目要求系统能手动设灯亮时间紧急情况处理我们讨论了两种方案
方案一采用8155扩展I/O 口及键盘显示等该方案的优点是
使用灵活可编程并且有RAM,及计数器若用该方案可提供较多I/O 口,但操作起来稍显复杂
方案二 直接在IO口线上由习键开关因为设计本简和优化了电路所以剩余的口资源还比较多我们使用四个按键分别是K1K2K3K4
由于该系统杂交通灯及数码管的控制只用单片机本身的I/O 口就可实现且本身的计数器及RAM已经够用故选择方案二
二理论分析与计算
1交通灯显示时序的理论分析与计算
杂一个交通路口来说能在最短的时间内达到最大的车流量就算是达到了最佳的性能我们称在单位时间内多能达到的最大车流为车流量用公式车流量= 车流 / 时间 来表示

先设定一些标号如图21 所示

说明此图为直方图上边为北路口灯右边为东路口灯下边为南路口灯左边为西
路口灯
图22 所示为一种红绿灯规则的状态图分别设定为S1S2S3S4交通灯以这四
的状态为一个周期循分行见图23

请注意图21b和图21d它们在一个时间段中四个方向都可以通车这种状态能在
一定的时间内达到较大的车流量效率特别高
依据上述的车辆行驶的状态图可以列出各个路口灯的逻辑表由于相向的灯的状态图
是一样的所以只需写出相邻路口的灯的逻辑表根据图23 可以看出相邻路口的灯它
们的状态在相位上相差180㡣因此最终只需写出一组S1S2S3S4的逻辑状态表

如表21 所示

表中的代表是红灯亮也代表逻辑系0̡是代表绿灯亮也代表逻辑上
的1依上表就可以向相应的端口送逻辑值

2交通灯显示时间的理论分析与计算


东西和南北方向的放行时间的长短是依据路口的各个方向平时的车流量来设定并且
S1S2S3S4各个状态保持的时间之有严格的杂关系其公式如下所示
T-S1+T-S2=T-S3
T-S2=T-S4
T-S1=T-S3
我们可以依据上述的标准来改变车辆的放行时间按照一般的规则一个十字路口可分

为主干道和次干道主干道的放行时间大于次干道的放行时间我们设定值时也应源为参

三电路技设计文件
1灯控制电路设计
由于32个LED 来实现红绿灯状态若直接接在单片机的口线路口倒计时的显示就不
能实现所以本次设计中采用一种新型的电路如图31 所示

图中74LS04的作用是倒相和驱动它输出的电流大约48mA实际测试发现足月足要
求而且发光管也能达到足够的亮度
观察图可以看出两组发光管一组红一组绿由于反相器的作用其逻辑状态恰恰
相础
图中和电阻串联的二极管的作用是为了分压防止因上下两组发光管分压不同导致逻辑
的错误
共四组和上述相同的电路分别代表东西南北四个方向的红绿灯使用两片74LS04 作为
驱动
2倒计时显示电路设计
前面已经分析过相向的灯的状态和倒计时都是相同的所以为了节省采用两组四个数码管
作为倒计时的显示同时为了节省口资源采用串口显示的方式驱动数码管见图32 所

四程序设计思路与流程图
1主程序流程图
主程序中主要是一个死循环不停的循环四个状态如图41 所示

2按键子程序流程图
它包含倒计时调整和紧急状态两个状态
主程序中放了一个按键的判现令当有按键按下的时候程序就自动的跳转到按键子
程序处理当检测到K2键按下的时候就自动返回到主程序
当出现紧急的情况的时候按下K3或者K4 就切换到紧急状态当紧急事件处理完毕
的时候按下K2就可以返回正常状态

五测试数据及结果分析
1状态灯显示测试
当电路连接完毕后将写好的测试程序刷写到芯片内K1 和K2分别给端口送高电平和
低电平通电即可检测
2数码管的测试
将串口的和电路板系接口连接将写好的测试程序刷写到芯片内开电源即可测试
3整体电路测试
系统上电刷写好程序即可开始测试观测一个周期共计S1S4四个状态默认140
秒灯的显示状态是否正常同时观察倒计的计数是否正常
六总结
由于使用的是单片机作为核心的控制元件使得电路的可靠性比较高功能也比较强大
而且可以随时的更新系常进行不同状态的组合
但是在我们设计和调试的过程中也发现了一些问题譬如红灯和绿灯的切换还还迅
速红绿灯规则不效率还不是很高等等这需要在实践中进一步完善
参考文献
[1] 李朝青.单片机原理及接口技术修订版.本本航空教大学出版社1998
[2] 李广弟.单片机基础.本本航空教大学出版社1992
[3] 何立民.单片机应用技术大全.本本航空教大学出版社 1994
[4] 张毅刚. 单片机原理及接口技术.哈尔滨哈尔滨工业大学出版社1990
[5] 谭浩强.单片机课程设计. 本清华大学出版社1989
Abstract
This system is made up of single-chip microcomputer ,keyboard,lcd displaying module
and Traffic lights system.The system includes pavement,left truning,right truning,and the basic
traffic lights function.Excepting the basic traffic lights function,italso includes couting,time
installing,emergency disposaling,speech cluing,lcd information displaying,adjusting the lighting
time of lights based on different time and controlling with hand in accordance with circumstances
and so on.

附录 系统总体电路图

1.满足南北向红绿灯亮东西向红灯亮占25秒南北向黄灯亮东西向红灯亮占5秒南北向红灯亮东西向绿灯亮占25秒南北向红灯亮东西向黄灯亮占5秒如此循环周而词 2.十字路口要有数字显示提示行人把握时间当某方向绿灯亮时置显示器为24然后以每秒减1计数方式工作直到减为0绿灯灭黄灯亮黄灯灭红灯亮时再次置显示器为29并开技计数直到为0十字路口红绿灯交换完成一次工作循环
3.可手动调整和自动调整夜间为黄灯闪耀

下面是一个单片机交通灯程序

/*
******************************************************************************************
* *
* Keil C 89S51 交通信号控制程序 *
* (C) 版权所有 Dai_Weis@hotmail.com *
* *
******************************************************************************************

*/
#include "reg51.h"

#define UINT unsigned int
#define ULONG unsigned long
#define UCHAR unsigned char

/*
信号灯变量
南北方向绿灯
sbit n_bike_g = P1^0; //自行车
sbit n_right_g = P1^1; //右转
sbit n_up_g = P1^2; //直行
sbit n_left_g = P1^3; //左转 调头

南北方向红灯
sbit n_bike_r = P1^4; //自行车
sbit n_right_r = P1^5; //右转
sbit n_up_r = P1^6; //直行
sbit n_left_r = P1^7; //左转 调头

南北方向黄灯
sbit n_bike_y = P3^0; //自行车
sbit n_right_y = P3^1; //右转
sbit n_up_y = P3^2; //直行
sbit n_left_y = P3^3; //左转 调头


东西方向绿灯
sbit e_bike_g = P2^0; //自行车
sbit e_right_g = P2^1; //右转
sbit e_up_g = P2^2; //直行

东西方向红灯
sbit e_bike_r = P2^4; //自行车
sbit e_right_r = P2^5; //右转
sbit e_up_r = P2^6; //直行

东西方向黄灯
sbit e_bike_y = P3^4; //自行车
sbit e_right_y = P3^5; //右转
sbit e_up_y = P3^6; //直行
*/

//延时
void delay(UINT t, UINT s)
{
while (t)
{
UINT i;
for (i = 0; i < s; i++)
{
}
t --;
}
}

//信号灯状态
void time_x(UCHAR P_P1, UCHAR P_P2, UCHAR P_P3)
{
P1 = P_P1;
P2 = P_P2;
P3 = P_P3;
delay(150, 65535);
}

void time_s(UCHAR P_P1, UCHAR P_P2, UCHAR P_P3, UCHAR P_P11, UCHAR P_P22)
{
UINT i;
for (i = 0; i < 3; i ++)
{
P1 = P_P1;
P2 = P_P2;
delay(5, 65535);
P1 = P_P11;
P2 = P_P22;
delay(5, 65535);
}
P1 = P_P1;
P2 = P_P2;
P3 = P_P3;
delay(10, 65535);
}

//主程序
void main()
{
P1 = P2 = P3 = 0x0;
while (1)
{
time_x(0xA5, 0x38, 0x0);

time_s(0xA4, 0x38, 0x1, 0xA5, 0x38);

time_x(0x96, 0x52, 0x0);

time_s(0x92, 0x52, 0x4, 0x96, 0x52);

time_x(0x5A, 0x52, 0x0);

time_s(0x50, 0x50, 0x2A, 0x5A, 0x52);

time_x(0xF0, 0x25, 0x0);

time_s(0xF0, 0x24, 0x20, 0xF0, 0x25);

time_x(0xD2, 0x16, 0x0);

time_s(0xD0, 0x10, 0x62, 0xD2, 0x16);

}
}
给你一个定时控制的信号系常我只做的简单的测试至于延时我用的软件你约合办法^_^

 

Dai_Weis 于 2005-5-4 13:43:23

重新给你说明
/*
***********************************************************************************
* *
* Keil C AT89S51 交通信号控制程序 *
* (C) 版权所有 Dai_Weis@hotmail.com *
* *
***********************************************************************************
开发说明
固定时间信号变换南北设置调头左传直小右转自行车
东西设置左传直小右转自行车
时序状态
红 绿 红 绿
序号 左 前 右 自 左 前 右 自 前 右 自 前 右 自
1 1 0 1 0 0 1 0 1 1 1 1 0 0 0
2 1 0 0 1 0 1 1 0 1 0 1 0 1 0
3 0 1 0 1 1 0 1 0 1 0 1 0 1 0
4 1 1 1 1 0 0 0 0 0 1 0 1 0 1
5 1 1 0 1 0 0 1 0 0 0 1 1 1 0
*/
另外修正个错误
while (1)
{
time_x(0xA5, 0x70, 0x0);

time_s(0xA4, 0x70, 0x1, 0xA5, 0x70);

发表评论告诉好友收藏此文关闭窗口

文章评论

相关文章

ձһhƬձƵ ձƵɫwww ձƵ:ɫ