第一篇:基于单片机的交通灯控制系统设计
基于单片机的交通灯控制系统设计
摘要:十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的自动指挥系统。交通信号灯控制方式很多。本系统采用MSC-51系列单片机ATSC51和可编程并行I/O接口芯片8255A为中心器件来设计交通灯控制嚣,实现了能根据实际车流量通过8051芯片的P1口设置红、绿灯燃亮时间的功能;红绿灯循环点亮。倒计时剩5秒时黄灯闪烁警示;车辆闯红灯报警;绿灯时间可检测车流量并可通过双位数码管显示。本系统实用性强、操作简单、扩展功能强。
关键词:单片机;交通灯
单片机技术的发展对社会进步产生了巨大的影响。今天,单片机及其应用技术的发展速度、深度及其广度,在国防、科学研究、政治经济、教育文化等方面几乎无所不及。将之用于交通灯控制系统设计,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
1、单片机涵义
一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入,输出设备(例如:串行口、并行输出口等)。在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就际=缸单片(单芯片)机,单片机即微控制器(Microniroller μC)有一些单片机中除了上述部份外,还集成了其它部份如AID,DIA,定时计数器,RTC,各种串行接口等。
2、MSC-51芯片简介
2.1 MSC-51结构
8051是MCS-51系列单片机的典型产品,8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时,计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。
2.2 8255芯片简介
8255可编程并行接口芯片有三个输入输出端口,即A口、B口和c口,对应于引脚PAT—PA0、PB7-PB0和PC7-PC0。其内部还有一个控制寄存器,即控制口。通常A口、B口作为输入输出的数据端口。c口作为控制或状态信息的端口,它在方式字的控制下,可以分成4位的端口,每个端口包含一个4位锁存器。它们分别与端口A/B配合使用,可以用作控制信号输出或作为状态信号输入。
8255有两种控制命令字;一个是方式选择控制字;另一个是c口按位置位/复位控制字。
2.3 74LS373简介
SN74LS373。SN74LS374常用的8d锁存器。常用作地址锁存和I/0输出,可以用74he373代换,74H373是高速CMOS器件,功能与74LS373相同,两者可以互换。74LS373内有8个相同的D型(三态同相)锁存器,由两个控制端(11脚c或EN;1脚OUT、CONT、OE)控制。当OE接地时,若G为高电平,741Ls373接收由PPU输出的地址信号;如果G为低电平,则将地址信号锁存。
3、系统硬件
3.1 交通管理的方案论证 东西、南北两干道交于一个十字路口,各干道有一组红、黄、绿三色的指示灯,指挥车辆和行人安全通行。红灯亮禁止通行。绿灯亮允许通行。黄灯亮提示人们注意红、绿灯的状态即将切换,且黄灯燃亮时间为东西、南北两千道的公共停车时问。设东西道比南北道的车流量。
3.2 系统硬件设计
选用设备8031单片机一片选用设备:8031弹片机一片,8255并行通用接口芯片一片,74LS07两片,MAX692‘看门狗’一片,共阴极的七段数码管两个双向晶闸管若干,7805三端稳压电源一个,红、黄、绿交通灯各两个。开关键盘、连线若干。
4、控制器的软件设计
4.1 每秒钟的设定
延时方法可以有两种:一种是利用NCS-51内部定时器才生溢出中断来确定1秒的时间,另一种是采用软延时的方法。
4.2 计数器硬件延时
4.2.1 初值计算
定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL中的。他是以加法记数的,并能从全1到全0时自动产生溢出中断请求。因此,我们可以把计数器记满为零所需的计数值设定为c和计数初值设定为TC。
4.2.2 1秒的方法
我们采用在主程序中设定一个初值为20的软件计数器和使TO定时5O毫秒,这样每当TO到50毫秒时cPu就响应它的溢出中断请求,进入他的中断服务子程序。在中断服务子程序中,cPu先使软件计数器减1,然后判断它是否为零。为零表示1秒已到可以返回到输出时间显示程序。
4.3 计数器软件延时
MCS-51的工作频率为2-12MHZ,我们选用的8031单片机的工作频率为6MHZ。机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12*(1/6M)=2us。我们可以知道具体每条指令的周期数,这样我们就可以通过指令的执行条数来确定1秒的时间。
4.4 时间及信号灯的显示
4.4.1 8051并行口的扩展
8051虽然有4个8位I/0端口,但真正能提供借用的只有Pl口。因为P2和P0口通常用于传送外部传送地址和数据,P3口也有它的第二功能。因此,8031通常需要扩展。由于我们用外部输入设定红绿灯倒计时初值、数码管的输出显示、红绿黄信号灯的显示都要用到一个I/0端口,显然8031的端口是不够,需要扩展。
扩展的方法有两种:(1)借用外部RAM地址来扩展I/0端口;(2)采用I/0接口新片来扩充。我们用8255并行接口信片来扩展I/0端口。
4.4.2 8255与8051的连接
用8051的PO口的pO.7连接8255的片选信号,我们用8031的地址采用全译码方式,当pO.7:0时片选有效,其他无效,pO.1用于选择8255端口。
5、结 论
本系统就是充分利用了8051和8255芯片的I/O引脚。系统统采用MSC-51系列单片机Intel8051和可编程并行I/0接口芯片8255A为中心器件来设计交通灯控制器,实现了能根据实际车流量通过8031芯片的Pl口设置红、绿灯燃亮时间的功能;红绿灯循环点亮,倒计时剩5秒时黄灯闪烁警示(交通灯信号通过PA口输出,显示时间直接通过8255的PC口输出至双位数码管);车辆闯红灯报警;绿灯时间可检测车流量并可通过双位数码管显示。
参考文献:
[1]张毅刚,新编MCS-51单片机应用系统设计[M]哈尔滨:哈尔滨工业大学出版社,2006
[2]王义军,单片机原理及应用习题与实验指导书[M],北京:中国电力出版社,2006
[3]陈明荧8051单片机课程设计实训教材[M],北京:清华大学出版社。2004
第二篇:单片机:交通灯控制系统设计
交通灯控制系统设计
摘要:本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。系统包括人行道、左转、右转、以及基本的交通灯的功能。系统除基本交通灯功能外,还具有倒计时、时间设置、紧急情况处理、分时段调整信号灯的点亮时间以及根据具体情况手动控制等功能。关键词:AT89S51,交通规则
一、方案比较、设计与论证 1 电源提供方案
为使模块稳定工作,须有可靠电源。我们考虑了两种电源方案
方案一:采用独立的稳压电源。此方案的优点是稳定可靠,且有各种成熟电路可供选用;缺点是各模块都采用独立电源,会使系统复杂,且可能影响电路电平。方案二:采用单片机控制模块提供电源。改方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。综上所述,我们选择第二种方案。2 显示界面方案
该系统要求完成倒计时、状态灯等功能。基于上述原因,我们考虑了三种方案: 方案一:完全采用数码管显示。这种方案只显示有限的符号和数码字苻,无法胜任题目要求。
方案二:完全采用点阵式LED 显示。这种方案实现复杂,且须完成大量的软件工作;但功能强大,可方便的显示各种英文字符,汉字,图形等。
方案三:采用数码管与点阵LED 相结合的方法因为设计既要求倒计时数字输出,又要求有状态灯输出等,为方便观看并考虑到现实情况,用数码管与LED灯分别显示时间与提示信息。这种方案既满足系统功能要求,又减少了系统实现的复杂度。权衡利弊,第三种方案可互补一二方案的优缺,我们决定采用方案三以实现系统的显示功能。3 输入方案:
题目要求系统能手动设灯亮时间、紧急情况处理,我们讨论了两种方案: 方案一:采用8155扩展I/O 口及键盘,显示等。该方案的优点是:
使用灵活可编程,并且有RAM,及计数器。若用该方案,可提供较多I/O 口,但操作起来稍显复杂。
方案二: 直接在IO口线上接上按键开关。因为设计时精简和优化了电路,所以剩余的口资源还比较多,我们使用四个按键,分别是K1、K2、K3、K4。由于该系统对于交通灯及数码管的控制,只用单片机本身的I/O 口就可实现,且本身的计数器及RAM已经够用,故选择方案二。
二、理论分析与计算
1.交通灯显示时序的理论分析与计算
对于一个交通路口来说,能在最短的时间内达到最大的车流量,就算是达到了最佳的性能,我们称在单位时间内多能达到的最大车流为车流量,用公式:车流量= 车流 / 时间 来表示。
先设定一些标号如图2-1 所示。
说明:此图为直方图,上边为北路口灯,右边为东路口灯,下边为南路口灯,左边为西 路口灯。
图2-2 所示为一种红绿灯规则的状态图,分别设定为S1、S2、S3、S4,交通灯以这四 的状态为一个周期,循环执行(见图2-3)。
请注意图2-1b和图2-1d,它们在一个时间段中四个方向都可以通车,这种状态能在
一定的时间内达到较大的车流量,效率特别高。
依据上述的车辆行驶的状态图,可以列出各个路口灯的逻辑表,由于相向的灯的状态图
是一样的,所以只需写出相邻路口的灯的逻辑表;根据图2-3 可以看出,相邻路口的灯它
们的状态在相位上相差180°。因此最终只需写出一组S1、S2、S3、S4的逻辑状态表。
如表2-1 所示。
表中的“×”代表是红灯亮(也代表逻辑上的0),“√”是代表绿灯亮(也代表逻辑上 的1),依上表,就可以向相应的端口送逻辑值。2.交通灯显示时间的理论分析与计算
东西和南北方向的放行时间的长短是依据路口的各个方向平时的车流量来设定,并且
S1、S2、S3、S4各个状态保持的时间之有严格的对应关系,其公式如下所示。T-S1+T-S2=T-S3 T-S2=T-S4 T-S1=T-S3 我们可以依据上述的标准来改变车辆的放行时间。按照一般的规则,一个十字路口可分
为主干道和次干道,主干道的放行时间大于次干道的放行时间,我们设定值时也应以此为参 考。
三、电路图及设计文件 1.灯控制电路设计
由于32个LED 来实现红绿灯状态,若直接接在单片机的口线,路口倒计时的显示就不
能实现,所以本次设计中采用一种新型的电路如图3-1 所示。
图中74LS04的作用是倒相和驱动,它输出的电流大约48mA,实际测试发现足以满足要
求,而且发光管也能达到足够的亮度。
观察图可以看出:两组发光管(一组红、一组绿)由于反相器的作用,其逻辑状态恰恰 相反。
图中和电阻串联的二极管的作用是为了分压,防止因上下两组发光管分压不同导致逻辑 的错误。
共四组和上述相同的电路分别代表东西南北四个方向的红绿灯,使用两片74LS04 作为 驱动。
2.倒计时显示电路设计
前面已经分析过相向的灯的状态和倒计时都是相同的,所以为了节省,采用两组四个数码管
作为倒计时的显示;同时为了节省口资源,采用串口显示的方式驱动数码管。见图3-2 所 示。
四、程序设计思路与流程图 1.主程序流程图
主程序中主要是一个死循环,不停的循环四个状态,如图4-1 所示。
2.按键子程序流程图
它包含倒计时调整和紧急状态两个状态。
主程序中放了一个按键的判断指令,当有按键按下的时候,程序就自动的跳转到按键子
程序处理。当检测到K2键按下的时候就自动返回到主程序。当出现紧急的情况的时候,按下K3或者K4 就切换到紧急状态,当紧急事件处理完毕 的时候,按下K2,就可以返回正常状态。
五、测试、数据及结果分析 1.状态灯显示测试
当电路连接完毕后,将写好的测试程序刷写到芯片内,K1 和K2分别给端口送高电平和
低电平,通电即可检测。2.数码管的测试
将串口的和电路板上的接口连接,将写好的测试程序刷写到芯片内,开电源即可测试。
3.整体电路测试
系统上电,刷写好程序即可开始测试,观测一个周期(共计S1~S4四个状态,默认140 秒)灯的显示状态是否正常,同时观察倒计的计数是否正常。
六、总结
由于使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。
但是在我们设计和调试的过程中,也发现了一些问题,譬如红灯和绿灯的切换还不够迅
速,红绿灯规则不效率还不是很高等等,这需要在实践中进一步完善。附录 系统总体电路图
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 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);
材料: 1、89S51 11.0592M 晶振
1K电阻、10UF电容
12个灯,红、黄、绿各四个,12个1K电阻
,十字路口嘛。蜂鸣器一个。
按键一个,按键复位
采用AT89s51型号的单片机,由于交通十字路口的对称性,所以一个引脚可以同时控制两个灯,将发光二极管分别接到P1各个引脚,在其中加入一个时振荡当电路,来控制时间,在P3.0引脚接入蜂鸣器只黄灯亮的时候发出声响,这里我们让每次黄灯亮的时候发出六声响,通过C程序的控制就可以实现,每次循环是10秒。2、9cm*15cm万用板 1片 单片机及IC座 1套 12M晶振 1只 22P电容 2只 10uF电容 1只 10K电阻 1只 1K排阻 1只 两位一体数码管 2只 DC座 1只 自锁开关 1只
发光二极管红绿黄
各4只 按键 7只 USB电源线 1条 导线
若干
1、基于51系列单片机(型号:STC89C52、AT89C51/C52、AT89S51/S52,随机选择,如有特
殊要求请与店主讨论)设计实现。(以上几种单片机全部为51系列单片机,除了名字不一样外,功能及应用完全一样,互相
兼容)
2、两个两位一体数码管显示东西、南北方向时间。
3、四方向各有红绿黄三颗灯。
4、七个按键操作,分别是:禁止通行、东西通行、南北通行、时间加、时间减、切换方向、确认。
第三篇:基于单片机的交通灯控制系统设计
P10P11P12P13设置键加键减键模式键P00P01P02P03P04P05P06U18765P134P123P112P101P1.7P1.6P1.5P1.4P1.3P1.2P1.1/T2EXP1.0/T2P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXDP2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8P0.7/AD7P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD0******23222***373839P37P36P35P34P22P23P24D7D4P27P26P25P24P23P22P21P20P07P06P05P04P03P02P01P0098765432110KP27LED-REDD92H1HD1D6P25LED-YELLOWD11P26LED-YELLOWLED-GREENLED-REDC31uF313029EAALEPSEND12P26R0100RP1P25LED-GREENLED-GREENC120PF9RSTD5P00P01P02P03P04P05P06LED-YELLOWD3P27LED-REDX1C220PF12M19LED-REDLED-GREENLED-YELLOWP24P23P22XTAL1AT89C51Q1PNPQ2PNPQ3PNPQ4PNPP34P35657U2SCKSDAWP24C02CA0A1A2123R151R1HR251R2HR351R3HR451R4HP36P37P21P00P01P02P03P04P05P0651R51R51R51R2H1HR19R20R21P20R223H4HXTAL2P00P01P02P03P04P05P0618D2D10D83H4H
#include
//调用单片机头文件
#define uchar unsigned char
//宏定义“uchar”代替“unsigned char”。#define uint unsigned int
//宏定义“uint”用来定义无符号整型数。
//数码管段选定义 0
7
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, //
A B C
D
E
F 不显示
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};//断码
uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};uchar smg_i = 4;
//显示数码管的个位数
//数码管位选定义
sbit smg_we1 = P2^0;
//数码管位选定义 sbit smg_we2 = P2^1;sbit smg_we3 = P3^6;sbit smg_we4 = P3^7;
char dx_s = 0;//东西
南北 倒计时变量 sbit dx_red
= P2^4;
//东西红灯 sbit dx_green = P2^3;//东西绿灯 sbit dx_yellow = P2^2;//东西黄灯
sbit nb_red
= P2^7;//南北红灯 sbit nb_green = P2^6;//南北绿灯 sbit nb_yellow = P2^5;//南北黄灯
sbit scl=P3^4;//写24C02时钟
sbit sda=P3^5;//写24C02数据
uchar flag_jtd_mode;//交通灯的模式 根据时间
bit flag_1s = 0;bit flag_500ms;bit flag_dx_nb;uchar flag_5m_value;uchar i;//东西南北模式
uchar flag_alarm;//模式
uchar dx_time = 30,nb_time = 20;
//东西、南北的时间 uchar flag_jdgz;
//交通管制
//---延时函数---// void delay(){;;}
void start()//起始信号 { sda=1;delay();scl=1;delay();sda=0;delay();}
void stop()//停止信号 { sda=0;delay();scl=1;delay();sda=1;delay();}
void respons()//应答信号 { uchar i;scl=1;delay();while((sda==1)&&(i<250))i++;scl=0;delay();}
void init()//初始状态,24C02的数据和时钟线都拉高 { sda=1;delay();scl=1;delay();}
void writebyte(uchar date)//写24C02 { uchar i,temp;temp=date;for(i=0;i<8;i++){
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();} scl=0;delay();sda=1;delay();} uchar readbyte()//读24C02 { uchar i,k;scl=0;delay();sda=1;delay();
for(i=0;i<8;i++){
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();} return k;}
void writeadd(uchar address,uchar date)//写24C02 {
start();//起始信号
writebyte(0xa0);//写入器件地址写 respons();
writebyte(address);//写入存储单元地址 respons();
writebyte(date);//写入数据 respons();
stop();//停止信号 }
uchar readadd(uchar address)//读24C02 { uchar date;
start();//起始信号
writebyte(0xa0);//写入器件地址写
respons();
writebyte(address);//写入读单元地址
respons();
}
start();//起始信号
writebyte(0xa1);//读命令 respons();date=readbyte();//读数据 stop();//停止信号 return date;/***********************数码位选函数*****************************/ void smg_we_switch(uchar i){ switch(i){
case 0: smg_we1 = 0;smg_we2 = 1;smg_we3 = 1;smg_we4 = 1;break;
case 1: smg_we1 = 1;smg_we2 = 0;smg_we3 = 1;smg_we4 = 1;break;
case 2: smg_we1 = 1;smg_we2 = 1;smg_we3 = 0;smg_we4 = 1;break;
case 3: smg_we1 = 1;smg_we2 = 1;smg_we3 = 1;smg_we4 = 0;break;} }
/******************************************************************** * 名称 : delay_1ms()* 功能 : 延时1ms函数 * 输入 : q * 输出 : 无
***********************************************************************/ void delay_1ms(uint q){ uint i,j;for(i=0;i for(j=0;j<110;j++);} /******************************************************************** * 名称 : display()* 功能 : 数码管显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void display(){ uchar i;for(i=0;i P0 = 0xff; //消隐 smg_we_switch(i); //位选 P0 = dis_smg[i]; //段选 delay_1ms(3);} } /*********************定时器0、定时器1初始化******************/ void time0_init() { EA = 1; //开总中断 TMOD = 0X11;//定时器0、定时器1工作方式1 ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时 } /*********************交通灯处理函数*********************************/ void jiaotongdeng_dis(){ char dx,nb; if(flag_dx_nb == 0){ dx=dx_s;nb=dx_s-5;if(nb<=0)nb=dx_s;} if(flag_dx_nb == 1){ dx=dx_s-5;nb=dx_s;if(dx<=0)dx=dx_s;} if(flag_1s == 1){ dx_s--;flag_1s = 0; if(dx_s == 0){ if(flag_dx_nb == 1) dx_s = nb_time; //南北时间 else dx_s = dx_time; //东西时间 flag_dx_nb = ~flag_dx_nb; } } dis_smg[0] = smg_du[dx % 10];dis_smg[1] = smg_du[dx / 10];dis_smg[2] = smg_du[nb % 10];dis_smg[3] = smg_du[nb / 10]; /***********************南北时间*********************************/ if(flag_dx_nb == 0) { if(dx_s > 5) { dx_red = 1;//灭 dx_green = 0;//亮 dx_yellow = 1;//灭 nb_red = 0;//亮 nb_green = 1;//灭 nb_yellow = 1;//灭 flag_5m_value = 0; }else if(dx_s <= 5) //当小于5秒时 黄灯要闪了 { dx_red = 1; //灭 } } dx_green = 1; //灭 nb_red = 0; //亮 nb_green = 1; //灭 nb_yellow = 1; //灭 if(flag_500ms == 0){ dx_yellow = 0;//亮 } else { } dx_yellow = 1;//灭 /***********************东西时间*********************************/ if(flag_dx_nb == 1) { if(dx_s > 5) { dx_red = 0; //亮 dx_green = 1; //灭 dx_yellow = 1; //灭 nb_red = 1; //灭 nb_green = 0; //亮 nb_yellow = 1; //灭 flag_5m_value = 0; }else if(dx_s <= 5) //当小于5秒时 黄灯要闪了 { dx_red = 0; //灭 dx_green = 1; //灭 dx_yellow = 1; //灭 nb_red = 1; //灭 nb_green = 1; //灭 if(flag_500ms == 0) //黄灯闪烁 { } } } nb_yellow = 0;//亮 } else { nb_yellow = 1;//灭 } /********************独立按键程序*****************/ uchar key_can;//按键值 void key()//独立按键程序 { static uchar key_new;key_can = 20; //按键值还原 P1 |= 0x1f; if((P1 & 0x1f)!= 0x1f)//按键按下 { delay_1ms(1); //按键消抖动 if(((P1 & 0x1f)!= 0x1f)&&(key_new == 1)) { key_new = 0;switch(P1 & 0x1f){ //确认是按键按下 case 0x1e: key_can = 1;break;//得到按键值 case 0x1d: key_can = 2;break;//得到按键值 case 0x1b: key_can = 3;break;//得到按键值 case 0x17: key_can = 4;break;//得到按键值 } } } else key_new = 1;} uchar menu_1,flag_s; /********************设置函数*****************/ void key_with(){ if(key_can == 4) //交通管制按键 { flag_jdgz ++; if(flag_jdgz > 5) flag_jdgz = 0; if(flag_jdgz == 1)// 全部亮红灯 { dx_red = 0;//亮 dx_green = 1;//灭 dx_yellow = 1;//灭 } nb_red = 0;//亮 nb_green = 1;//灭 nb_yellow = 1;//灭 if(flag_jdgz == 2)// 东西红灯 南北绿灯 { dx_red = 0;//亮 dx_green = 1;//灭 dx_yellow = 1;//灭 nb_red = 1;//灭 nb_green = 0;//亮 nb_yellow = 1;//灭 } if(flag_jdgz == 3)// 南北红灯 { dx_red = 1;//灭 dx_green = 0;//亮 dx_yellow = 1;//灭 nb_red = 0;//亮 nb_green = 1;//灭 nb_yellow = 1;//灭 } if(flag_jdgz == 4)// 南北绿灯 { dx_red = 1;//灭 dx_green = 0;//亮 dx_yellow = 1;//灭 nb_red = 1;//灭 nb_green = 0;//亮 nb_yellow = 1;//灭 } if(flag_jdgz == 5)// 南北黄灯 { dx_red = 1;//灭 dx_green = 1;//灭 dx_yellow = 0;//亮 nb_red = 1;//灭 nb_green = 1;//灭 nb_yellow = 0;//亮 } } if(key_can == 1) //设置键 { menu_1 ++; 东西绿灯 东西绿灯 东西黄灯 if(menu_1 >= 3){ menu_1 = 0;} } if(menu_1 == 1) //设置东西的时间 { if(key_can == 2){ dx_time ++;//加1 if(dx_time > 99) dx_time = 99;} if(key_can == 3){ dx_time--;//减1 if(dx_time <= 10) dx_time = 10;} dis_smg[0] = smg_du[10];//显示为A dis_smg[1] = smg_du[10];//显示为A dis_smg[2] = smg_du[dx_time % 10];dis_smg[3] = smg_du[dx_time / 10]; writeadd(4,dx_time);//保存数据 } if(menu_1 == 2) //设置南北的时间 { if(key_can == 2){ nb_time ++;//加1 if(nb_time > 99) nb_time = 99;} if(key_can == 3){ nb_time--;//减1 //显示东西设置的时候 if(nb_time <= 10) nb_time = 10;} dis_smg[0] = smg_du[11];//显示为B dis_smg[1] = smg_du[11];//显示为B dis_smg[2] = smg_du[nb_time % 10];dis_smg[3] = smg_du[nb_time / 10]; //显示东西设置的时候 writeadd(2,nb_time);//保存数据 } } /******************************************************************** * 名称 : main()* 功能 : 实现灯的闪烁 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void main(){ time0_init(); init();//24C02初始化 nb_time=readadd(2);//读取地址2处一个字节给 dx_time=readadd(4);//读取地址4处一个字节给 if(nb_time>99)nb_time=20; if(dx_time>99)dx_time=30; dx_s = nb_time; //东西时间 while(1){ key(); if(key_can < 20) key_with(); if((menu_1 == 0)&&(flag_jdgz == 0)) } } jiaotongdeng_dis();display();/*********************定时器0中断服务程序************************/ void time0_int()interrupt 1 { } static uchar value; //定时10ms中断一次 TH0 = 0x3c;TL0 = 0xb0; //50ms value ++;flag_5m_value++;if(flag_5m_value % 10 == 0)flag_500ms = ~flag_500ms;if(value >= 20){ value = 0;flag_1s = 1;} 单片机原理及系统课程设计报告 基于单片机的交通灯控制系统 引言 单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域具有广泛的应用。本文设计了基于单片机的交通灯控制系统以AT89C51单片机为核心芯片,通过控制三色LED灯的亮灭来控制各车道的通行。设计方案及原理 本系统由AT89C51单片机、红、黄、绿LED交通信号灯、共阴极数码管、紧急通车开关等模块组成该电路具有设计简单,显示亮度高,能耗小,可靠性高灯特点。其总体设计框图如图1所示。 复位电路七段数码管倒计时显示电路AT89C51晶振电路A、B车道LED显示电路按键电路 图1 系统总体设计方框图 2.1 系统设计 交通灯控制系统主要控制A,B两车道的交通,以AT89C51单片机为核心芯片,通过控制三色LED灯的亮灭来控制各车道的通行;另外通过3个按键来模拟各车道有无车辆的情况和有紧急车辆的情况。根据设计要求,制定总体设计思想如下: (1)用AT89C51单片机控制交通灯电路,晶振采用12MHz。(2)用发光二极管模拟交通信号灯,用按键开关模拟车辆检测信号。 (3)有紧急车辆通过时,按下K3开关使A、B车道均为红灯,禁行20s。此时, 交通灯控制系统设计 摘要:本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。系统包括人行道、左转、右转、以及基本的交通灯的功能。系统除基本交通灯功能外,还具有倒计时、时间设置、紧急情况处理、分时段调整信号灯的点亮时间以及根据具体情况手动控制等功能。关键词:AT89S51,交通规则 一、方案比较、设计与论证 1 电源提供方案 为使模块稳定工作,须有可靠电源。我们考虑了两种电源方案 方案一:采用独立的稳压电源。此方案的优点是稳定可靠,且有各种成熟电路可供选用;缺点是各模块都采用独立电源,会使系统复杂,且可能影响电路电平。 方案二:采用单片机控制模块提供电源。改方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。综上所述,我们选择第二种方案。2 显示界面方案 该系统要求完成倒计时、状态灯等功能。基于上述原因,我们考虑了三种方案: 方案一:完全采用数码管显示。这种方案只显示有限的符号和数码字苻,无法胜任题目要求。 方案二:完全采用点阵式LED 显示。这种方案实现复杂,且须完成大量的软件工作;但功能强大,可方便的显示各种英文字符,汉字,图形等。 方案三:采用数码管与点阵LED 相结合的方法因为设计既要求倒计时数字输出,又要求有状态灯输出等,为方便观看并考虑到现实情况,用数码管与LED灯分别显示时间与提示信息。这种方案既满足系统功能要求,又减少了系统实现的复杂度。权衡利弊,第三种方案可互补一二方案的优缺,我们决定采用方案三以实现系统的显示功能。3 输入方案: 题目要求系统能手动设灯亮时间、紧急情况处理,我们讨论了两种方案: 方案一:采用8155扩展I/O 口及键盘,显示等。该方案的优点是: 使用灵活可编程,并且有RAM,及计数器。若用该方案,可提供较多I/O 口,但操作起来稍显复杂。 方案二: 直接在IO口线上接上按键开关。因为设计时精简和优化了电路,所以剩余的口资源还比较多,我们使用四个按键,分别是K1、K2、K3、K4。 由于该系统对于交通灯及数码管的控制,只用单片机本身的I/O 口就可实现,且本身的计数器及RAM已经够用,故选择方案二。 二、理论分析与计算 1.交通灯显示时序的理论分析与计算 对于一个交通路口来说,能在最短的时间内达到最大的车流量,就算是达到了最佳的性能,我们称在单位时间内多能达到的最大车流为车流量,用公式:车流量= 车流 / 时间 来表示。 先设定一些标号如图2-1 所示。 说明:此图为直方图,上边为北路口灯,右边为东路口灯,下边为南路口灯,左边为西 路口灯。 图2-2 所示为一种红绿灯规则的状态图,分别设定为S1、S2、S3、S4,交通灯以这四 的状态为一个周期,循环执行(见图2-3)。 请注意图2-1b和图2-1d,它们在一个时间段中四个方向都可以通车,这种状态能在 一定的时间内达到较大的车流量,效率特别高。 依据上述的车辆行驶的状态图,可以列出各个路口灯的逻辑表,由于相向的灯的状态图 是一样的,所以只需写出相邻路口的灯的逻辑表;根据图2-3 可以看出,相邻路口的灯它 们的状态在相位上相差180°。因此最终只需写出一组S1、S2、S3、S4的逻辑状态表。 如表2-1 所示。 表中的“×”代表是红灯亮(也代表逻辑上的0),“√”是代表绿灯亮(也代表逻辑上 的1),依上表,就可以向相应的端口送逻辑值。2.交通灯显示时间的理论分析与计算 东西和南北方向的放行时间的长短是依据路口的各个方向平时的车流量来设定,并且 S1、S2、S3、S4各个状态保持的时间之有严格的对应关系,其公式如下所示。T-S1+T-S2=T-S3 T-S2=T-S4 T-S1=T-S3 我们可以依据上述的标准来改变车辆的放行时间。按照一般的规则,一个十字路口可分 为主干道和次干道,主干道的放行时间大于次干道的放行时间,我们设定值时也应以此为参 考。 三、电路图及设计文件 1.灯控制电路设计 由于32个LED 来实现红绿灯状态,若直接接在单片机的口线,路口倒计时的显示就不 能实现,所以本次设计中采用一种新型的电路如图3-1 所示。 图中74LS04的作用是倒相和驱动,它输出的电流大约48mA,实际测试发现足以满足要 求,而且发光管也能达到足够的亮度。 观察图可以看出:两组发光管(一组红、一组绿)由于反相器的作用,其逻辑状态恰恰 相反。 图中和电阻串联的二极管的作用是为了分压,防止因上下两组发光管分压不同导致逻辑 的错误。 共四组和上述相同的电路分别代表东西南北四个方向的红绿灯,使用两片74LS04 作为 驱动。 2.倒计时显示电路设计 前面已经分析过相向的灯的状态和倒计时都是相同的,所以为了节省,采用两组四个数码管 作为倒计时的显示;同时为了节省口资源,采用串口显示的方式驱动数码管。见图3-2 所 示。 四、程序设计思路与流程图 1.主程序流程图 主程序中主要是一个死循环,不停的循环四个状态,如图4-1 所示。 2.按键子程序流程图 它包含倒计时调整和紧急状态两个状态。 主程序中放了一个按键的判断指令,当有按键按下的时候,程序就自动的跳转到按键子 程序处理。当检测到K2键按下的时候就自动返回到主程序。 当出现紧急的情况的时候,按下K3或者K4 就切换到紧急状态,当紧急事件处理完毕 的时候,按下K2,就可以返回正常状态。 五、测试、数据及结果分析 1.状态灯显示测试 当电路连接完毕后,将写好的测试程序刷写到芯片内,K1 和K2分别给端口送高电平和 低电平,通电即可检测。2.数码管的测试 将串口的和电路板上的接口连接,将写好的测试程序刷写到芯片内,开电源即可测试。3.整体电路测试 系统上电,刷写好程序即可开始测试,观测一个周期(共计S1~S4四个状态,默认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.附录 系统总体电路图第四篇:基于单片机的交通灯控制系统
第五篇:基于AT89S51单片机多功能交通灯控制系统设计下载