用C语言编写的交通灯控制程序

用C语言编写的交通灯控制程序,第1张

我用的是ATMEGA16单片机编程的,也是AVR单片机
假设PA0接红灯,PA1接黄灯,PA2接绿灯。高电平亮。
我的延时函数是ms延时,比如delay(1000)表示延时1000毫秒
void main()
{
DDRA|=BIT(0)|BIT(1)|BIT(2);//设置PA0,PA1,PA2口为输出
while(1)
{
PORTA|=BIT(0);
PORTA&=~BIT(1);
PORTA&=~BIT(2);
delay(50000);
PORTA&=~BIT(0);
PORTA|=BIT(1);
PORTA&=~BIT(2);
delay(5000);
PORTA&=~BIT(0);
PORTA&=~BIT(1);
PORTA|=BIT(2);
delay(50000);
}
}

(东西方向绿灯与南北方向绿灯不能同时点亮,否则立即关闭信号灯系统)-不能这么设计,应该是1个方向变绿前只要判断另1个方向不是绿就可以,关闭系统是个错误的选择。
程序不是很复杂,自己做做吧,对你以后工作有帮助

用PLC实现智能交通控制
1 引言
据不完全统计,目前我国城市里的十字路口交通系统大都采用定时来控制(不排除繁忙路段或高峰时段用交警来取代交通灯的情况),这样必然产生如下弊端:当某条路段的车流量很大时却要等待红灯,而此时另一条是空道或车流量相对少得多的道却长时间亮的是绿灯,这种多等少的尴尬现象是未对实际情况进行实时监控所造成的,不仅让司机乘客怨声载道,而且对人力和物力资源也是一种浪费。
智能控制交通系统是目前研究的方向,也已经取得不少成果,在少数几个先进国家已采用智能方式来控制交通信号,其中主要运用GPS全球定位系统等。出于便捷和效果的综合考虑,我们可用如下方案来控制交通路况:制作传感器探测车辆数量来控制交通灯的时长。具体如下:在入路口的各个方向附近的地下按要求埋设感应线圈,当汽车经过时就会产生涡流损耗,环状绝缘电线的电感开始减少,即可检测出汽车的通过,并将这一信号转换为标准脉冲信号作为可编程控制器的控制输入,并用PLC计数,按一定控制规律自动调节红绿灯的时长。
比较传统的定时交通灯控制与智能交通灯控制,可知后者的最大优点在于减缓滞流现象,也不会出现空道占时的情形,提高了公路交通通行率,较全球定位系统而言成本更低。
2 车辆的存在与通过的检测
(1) 感应线圈(电感式传感器)
电感式传感器其主要部件是埋设在公路下十几厘米深处的环状绝缘电线(特别适合新铺道路,可用混凝土直接预埋,老路则需开挖再埋)。当有高频电流通过电感时,公路面上就会形成如图1(a)中虚线所形成的高频磁场。当汽车进入这一高频磁场区时,汽车就会产生涡流损耗,环状绝缘电线的电感开始减少。当汽车正好在该感应线圈的正上方时,该感应线圈的电感减到最小值。当汽车离开这高频磁场区时,该感应线圈电感逐渐复原到初始状态。由于电感变化该感应线圈中流动的高频电流的振幅(本论文所涉及的检测工作方式)和相位发生变化,因此,在环的始端连接上检测相位或振幅变化的检测器,就可得到汽车通过的电信号。若将环状绝缘电线作为振荡电路的一部分,则只要检测振荡频率的变化即可知道汽车的存在和通过。
电感式传感器的高频电流频率为60kHz,尺寸为 2×3m,电感约为100μH这种传感器可检测的电感变化率在03%以上[1,2]。
电感式传感器安装在公路下面,从交通安全和美观考虑, 它是理想的传感器。传感器最好选用防潮性能好的原材料。
(2) 电路
检测汽车存在的具体实现是在感应线圈的始端连接上检测电感电流变化的检测器, 并将之转化为标准脉冲电压输出。其具体电路图由三部分组成:信号源部分、检测部分、比较鉴别部分。原理框图如图2所示, 输出脉冲波形见图1(b)。
(3) 传感器的铺设
车辆计数是智能控制的关键,为防止车辆出现漏检的现象,环状绝缘电线在地下的铺设我们设采取在每个车行道上中的出口地(停车线处)以及在离出口地一定远的进口的地方各铺设一个相同的传感器,方案如图3(以典型的十子路口为例),同一股道上的两传感器相距的距离为该股道正常运行时所允许的最长停车车龙为好。
3 用PLC实现智能交通灯控制
31 控制系统的组成
车辆的流量记数、交通灯的时长控制可由可编程控制器(PLC)来实现。当然,也可选用其他种类的计算机作为控制器。本例选用PLC作为控制器件是因为可编程控制器核心是一台计算机,它是专为工业环境应用而设计制造的计算机。它具有高可靠性丰富的输入/输出接口,并且具有较强的驱动能力;它采用一类可编程的存储器,用于其内部存储程序,执行逻辑运算,顺序控制,定时,计数与算术 *** 作等面向用户的指令,并通过数字或模拟式输入/输出控制各种类型的机械或生产过程;它采用模块化结构,编程简单,安装简单,维修方便[3]。
利用PLC,可使上述描叙的各传感器以及各道口的信号灯与之直接相连,非常方便可靠。
本设计例中,PLC选用FX2N-64,其输入端接收来自各个路口的车辆探测器测得的输出标准电脉冲,输出接十字路口的红绿信号交通灯。信号灯的选择:在本例中选用红、黄、绿发光二极管作为信号灯(箭头方向型)。
32 车流量的计量
车流量的计量有多种方式:
(1) 每股行车道的车流量通过PLC分别统计。当车辆进入路口经过第一个传感器1(见图3)时,使统计数加1,经过第二个传感器2出路口时,使统计数减1,其差值为该股车道上车辆的滞留量(动态值),可以与其他道的值进行比较,据此作为调整红绿灯时长的依据。
(2) 先统计每股车道上车辆的滞留量,然后按大方向原则累加统计。如,将东西向的(见图3)左行、直行、右行道上的车辆的滞留量相加,再与其它的3个方向的车流量进行比较,据此作为调整红绿灯时长的依据。
(3) 统计每股车道上车辆的滞留量后按通行最大化原则(不影响行车安全的多道相向行驶)累加统计。如,东、西相向的2个左行、直行、右行道上的车辆的滞留量全部相加,再与南北向的总车流量进行比较,据此作为调整红绿灯时长的依据(下面的例子就是按此种方式)。
以上计算判别全部由PLC完成。可以把以上不同计量判别方式编成不同的子程序,方便调用。
33 程序流程图
本例就上述所描述的车流量统计方式,就图3中的十字路口给出一例PLC自动调整红绿灯时长的程序流程图如图5所示,其行车顺序与现实生活中执行的一样[4],只是时间长短不一样。
(1) 当各路口的车辆滞留量达一定值溢满时(相当于比较严重的堵车),红绿灯切换采用现有的常规定时控制方式;
(2) 当东、西向路口的车辆滞留量比南、北向路口的大时(反之亦然),该方向的通行时间=最小通行定时时间+自适应滞环比较增加的延时时间(是变化的),但不大于允许的最大通行时间。其中最小定时时间是为了避免红绿灯切换过快之弊;最大通行时间是为了保障公平性,不能让其它的车或行人过分久等。进一步的说明在后面的注释中。
(3) 自适应滞环比较(本例的核心控制规律)增加的时间的确定若东、西向车辆滞留量≥南、北向一个偏差量σ(如30辆车或其它值)时,先让东、西向的左转弯车左行15s(定时控制,值可改),再让直行车直行30s(直行时间的最小值,值可改)后再加一段延时保持,直至东、西向的车辆滞留量比南、北向的车辆滞留量还要少一个偏差量σ,才结束该方向的通行,切换到其它路上,否则一直延时继续通行下去,直至到达最大通行时间而强制切换。滞环特性如图6所示。实际应用时σ的值需整定,过小则导致红绿灯切换过频,过大又不能实现适时控制。
34 流程图注释
(1) 流程图中的15s、30s、75s等时间分别为交管部门定的车辆左转弯时间、直行最小时间、允许的最大通行时间;σ为车流量的偏差量。以上值及其4个路口车流量的满溢值均可在程序初始化中任意更改。
(2) 车辆左转弯是造成交通堵塞很重要的一个方面,应加以适当限制,故车辆左转弯始终采用最小定时控制,以减小系统的复杂程度,提高可靠性。
(3) 车辆通行的时间中包含绿、黄灯闪烁的时间,红、黄、绿各灯的切换与现用的方式相同,不再赘述。
(4) 人行道的红绿灯接线与现用的方式相同,其绿灯点亮的时刻与该方向车辆直行绿灯点亮的时刻同步一致,但要较车辆直行绿灯提前熄灭,采用定时控制,如绿灯定时亮18s。其目的是不让右转弯车辆过分受人行道灯的限制。若人车分流,右转弯车辆不受限制。较简单,流程图中略。
(5) 车流量的计量是不间断的,与控制呈并行关系,该系统属多任务处理,编程尤其应注意。
4 结束语
比较传统的定时交通灯控制与智能交通灯控制,可知后者的最大优点在于减缓滞流现象,也不会出现空道占时的情形,提高了公路交通通行率,较全球定位系统而言成本更低,特别适合繁忙的、未立交的交通路口,更适合于四个以上的路口,也可方便连网。
参考文献
[1] 黄继昌等 传感器工作原理及应用实例[M] 北京:人民邮电出版社,1998
[2 ]张万忠 可编程控制器应用技术[M] 北京:化学工业出版社,2001
[3] 英RJ索尔特 道路交通分析与设计[M] 张佐周等译 北京:中国建筑工业出版社,1982
不是很完整,您可以拿去做借鉴,
希望对您有帮助。

采用51单片机作为系统的MCU,基本完成控制两组交通指示灯交替亮
每个街口有左拐、直行及行人三种指示灯。直行灯每个灯有红、黄、绿三种颜色。自行车与汽车共用左拐和直行灯。
首先东西向直行绿灯和行人灯亮1分钟,左转灯亮30秒,黄灯亮5秒(同时南北向红灯亮95秒),然后东西向红灯亮95秒钟(同时首先南北向直行绿灯和行人灯亮1分钟,左转灯亮30秒,黄灯亮5秒),然后东西向的绿灯亮,依次类推。
每次绿灯亮的时候,对应的行人灯亮。
60S/30S/5S/60S/30S/5S
东西道
绿和行人/左转/黄/红/红/红
南北道
红/红/红/绿和行人/左转/黄
行人灯亮的时候有声音提示盲人能通过。
突发交通事故的时候能够紧急全红灯。
在有重要人物通过的时候能手动改为绿灯。
ORG 0000H ;主程序的入口地址
LJMP MAIN ;跳转到主程序的开始处
ORG 0003H ;外部中断0的中断程序入口地址
ORG 000BH ;定时器0的中断程序入口地址
LJMP T0_INT ;跳转到中断服务程序处
ORG 0013H ;外部中断1的中断程序入口地址
MAIN : MOV SP,#50H
MOV IE,#8EH ;CPU开中断,允许T0中断,T1中断和外部中断1中断
MOV TMOD,#51H ;设置T1为计数方式,T0为定时方式,且都工作于模式1
MOV TH1,#00H ;T1计数器清零
MOV TL1,#00H
SETB TR1 ;启动T1计时器
SETB EX1 ;允许INT1中断
SETB IT1 ;选择边沿触发方式
MOV DPTR ,#0003H
MOV A, #80H ;给8255赋初值,8255工作于方式0
MOVX @DPTR, A
AGAIN: JB P31,N0 ;判断是否要设定东西方向红绿灯时间的初值,若P31为1 则跳转
MOV A,P1
JB P17,RED ;判断P17是否为1,若为1则设定红灯时间,否则设定绿灯时间
MOV R0,#00H ;R0清零
MOV R0,A ;存入东西方向绿灯初始时间
MOV R3,A
LCALL DISP1
LCALL DELAY
AJMP AGAIN
RED: MOV A,P1
ANL A,#7FH ;P17置0
MOV R7,#00H ;R7清零
MOV R7,A ;存入东西方向红灯初始时间
MOV R3,A
LCALL DISP1
LCALL DELAY
AJMP AGAIN
;----------------------------------
N0: SETB TR0 ;启动T0计时器
MOV 76H,R7 ;红灯时间存入76H
N00: MOV A,76H ;东西方向禁止,南北方向通行
MOV R3,A
MOV DPTR,#0000H ;置8255A口,东西方向红灯亮,南北方向绿灯亮
MOV A,#0DDH
MOVX @DPTR, A
N01: JB P20,B0
N02: SETB P30
CJNE R3,#00H,N01 ;比较R3中的值是否为0,不为0转到当前指令处执行
;------黄灯闪烁5秒程序------
N1: SETB P30
MOV R3,#05H
MOV DPTR,#0000H ;置8255A口,东西,南北方向黄灯亮
MOV A,#0D4H
MOVX @DPTR,A
N11: MOV R4,#00H
N12: CJNE R4,#7DH,$ ;黄灯持续亮05秒
N13: MOV DPTR,#0000H ; 置8255A口,南北方向黄灯灭
MOV A,#0DDH
MOVX @DPTR,A
N14: MOV R4,#00H
CJNE R4,#7DH,$ ;黄灯持续灭05秒
CJNE R3,#00H,N1 ;闪烁时间达5秒则退出
;-----------------------------------
N2: MOV R7,#00H
MOV A,R0 ;东西通行,南北禁止
MOV R3,A
MOV DPTR,#0000H ; 置8255A口,东西方向绿灯亮,南北方向红灯亮
MOV A,#0EBH
MOVX @DPTR,A
N21: JB P20,T03
N22: CJNE R3,#00H,N21
;------黄灯闪烁5秒程序------
N3: MOV R3,#05H
MOV DPTR,#0000H ;置8255A口,东西,南北方向黄灯亮
MOV A,#0E2H
MOVX @DPTR,A
N31: MOV R4,#00H
CJNE R4,#7DH,$ ;黄灯持续亮05秒
N32: MOV DPTR,#0000H ; 置8255A口,南北方向黄灯灭
MOV A,#0EBH
MOVX @DPTR,A
N33: MOV R4,#00H
CJNE R4,#7DH,$ ;黄灯持续灭05秒
CJNE R3,#00H,N3 ;闪烁时间达5秒则退出
SJMP N00
;------闯红灯报警程序------
B0: MOV R2,#03H ;报警持续时间3秒
B01: MOV A,R3
JZ N1 ;若倒计时完毕,不再报警
CLR P30 ;报警
CJNE R2,#00H,B01 ;判断3秒是否结束
SJMP N02
;------1秒延时子程序-------
N7: RETI
T0_INT:MOV TL0,#9AH ;给定时器T0送定时10ms的初值
MOV TH0,#0F1H
INC R4
INC R5
CJNE R5,#0FAH,T01 ;判断延时是否够一秒,不够则调用显示子程序
MOV R5,#00H ;R5清零
DEC R3 ;倒计时初值减一
DEC R2 ;报警初值减一
T01: ACALL DISP ;调用显示子程序
RETI ;中断返回
;------显示子程序------
DISP: JNB P24,T02
DISP1: MOV B,#0AH
MOV A,R3 ;R3中值二转十显示转换
DIV AB
MOV 79H,A
MOV 7AH,B
DIS: MOV A,79H ;显示十位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0F7H
MOVX @DPTR,A
LCALL DELAY
DS2: MOV A,7AH ;显示个位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0FBH
MOVX @DPTR,A
RET
;------东西方向车流量检测程序------
T03: MOV A,R3
SUBB A,#00H ;若绿灯倒计时完毕,不再检测车流量
JZ N3
JB P20,T03
INC R7
CJNE R7,#64H,E1
MOV R7,#00H ;中断到100次则清零
E1: SJMP N22
;------东西方向车流量显示程序------
T02: MOV B,#0AH
MOV A,R7 ;R7中值二转十显示转换
DIV AB
MOV 79H,A
MOV 7AH,B
DIS3: MOV A,79H ;显示十位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0F7H
MOVX @DPTR,A
LCALL DELAY
DS4: MOV A,7AH ;显示个位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0FBH
MOVX @DPTR,A
LJMP N7
;------延时4MS子程序----------
DELAY: MOV R1,#0AH
LOOP: MOV R6,#64H
NOP
LOOP1: DJNZ R6,LOOP1
DJNZ R1,LOOP
RET
;------字符表------
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END

ORG 1000H
L:JNB P30,LP3
JNB P31,LP2 ;判断p31,p30口
;如果P30为1的话,正常运行交通灯
;如果P31为1的话,正常运行交通灯
;如果P31为0的话,依次点亮灯
;如果P30为0的话,停止交通灯,只有黄灯闪烁
;正常运行交通灯
LP1:
MOV P1,#61H
CLR P32
CLR P33
CLR P34
SETB P35 ;1,3 路口红灯亮,2,4 路口绿灯亮
LCALL DELAY1
MOV B,#04H ;设置循环次数为4次
M:MOV P1,#51H
CLR P35
SETB P34 ;1,3路口红灯亮,2,4路口黄灯亮
LCALL DELAY2
MOV P1,#41H
CLR P34 ;1,3路口红灯亮,2,4路口黄灯灭
LCALL DELAY2
DJNZ B,M
MOV P1,#0CH
SETB P32
SETB P33 ;1,3路口绿灯亮,2,4路口红灯亮
LCALL DELAY1
MOV B,#04H
N:MOV P1,#8AH
CLR P32 ;1,3路口黄灯亮,2,4路口红灯亮
LCALL DELAY2
MOV P1,#08H ;1,3路口黄灯灭,2,4路口红灯亮
LCALL DELAY2
DJNZ B,N
AJMP L
;黄灯闪
LP3: CLR P17
CLR P32
CLR P33
CLR P35
MOV P1,#92H
SETB P34 ;黄灯亮,其他的灯灭
LCALL DELAY2
MOV P1,#00H
CLR P34 ;所有的黄灯灭
LCALL DELAY2
AJMP L
;循环亮
LP2: CLR P32
CLR P33
CLR P34
CLR P35
MOV A,#01H ;赋初值
MOV R0,#08 ;循环变量,循环7次,控制7个灯
LOOP: MOV P1,A ;点亮第一个灯
LCALL DELAY2 ;延迟
RL A ;A的值加1,循环左移
DJNZ R0,LOOP ;RO的值减1不等于1则执行LOOP标号
SETB P32 ;P32灯亮
LCALL DELAY2 ;延迟
CLR P32 ;P32灯灭
SETB P33 ;下一个灯P33亮
LCALL DELAY2 ;延迟
CLR P33 ;P33灯灭
SETB P34 ;下一个灯P33亮
LCALL DELAY2 ;延迟
CLR P34 ;P34灯灭
SETB P35 ;P35灯亮
LCALL DELAY2 ;延迟
AJMP L
;延迟1
DELAY1 :
MOV R3,#200
DEL1: MOV R4,#250
DEL2: MOV R5,#50
DEL3: NOP ;空 *** 作
DJNZ R5,DEL3
DJNZ R4,DEL2
DJNZ R3,DEL1 ;延长5秒
RET
;延迟2
DELAY2 :
DEL4: MOV R3,#200
DEL5: MOV R4,#200
DEL6: NOP
DJNZ R4,DEL6
DJNZ R3,DEL5 ;延迟008秒
RET
END

ORG  0000H

LJMP START

ORG  0003H    ;INT 0 中断入口地址

LJMP INT0

ORG  0040H

START:

MOV SP,#60H

SETB EX0      ;INT 0 中断有效

SETB IT0

SETB EA

LCALL STATUS0 ;初始状态(都是红灯)

CIRCLE:

LCALL STATUS1 ;南北绿灯,东西红灯

LCALL STATUS2 ;南北绿灯闪转黄灯,东西红灯

LCALL STATUS3 ;南北红灯,东西绿灯

LCALL STATUS4 ;南北红灯,东西绿灯闪转黄灯

LJMP CIRCLE

INT0:

PUSH PSW      ;保护现场

PUSH 2

PUSH ACC

MOV DPTR,#8300H

MOV A,#0FH    ;南北,东西都亮红灯

MOVX @DPTR,A

MOV R2,#100   ;延时10秒

LCALL DELAY

POP ACC       ;恢复现场

MOVX @DPTR,A

POP 2

POP PSW

RETI

STATUS0:              ;南北红灯,东西红灯

MOV DPTR,#8300H

MOV A,#0FH

MOVX @DPTR,A

MOV R2,#10    ;延时1秒

LCALL DELAY

RET

STATUS1:              ;南北绿灯,东西红灯

MOV DPTR,#8300H

MOV A,#96H    ;南北绿灯,东西红灯

MOVX @DPTR,A

MOV R2,#200   ;延时20秒

LCALL DELAY

RET

STATUS2:              ;南北绿灯闪转黄灯,东西红灯

MOV DPTR,#8300H

MOV R3,#03H   ;绿灯闪3次

FLASH:

MOV A,#9FH

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

MOV A,#96H

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

DJNZ R3,FLASH

MOV A,#06H    ;南北黄灯,东西红灯

MOVX @DPTR,A

MOV R2,#10    ;延时1秒

LCALL DELAY

RET

STATUS3:              ;南北红灯,东西绿灯

MOV DPTR,#8300H

MOV A,#69H

MOVX @DPTR,A

MOV R2,#200   ;延时20秒

LCALL DELAY

RET

STATUS4:              ;南北红灯,东西绿灯闪转黄灯

MOV DPTR,#8300H

MOV R3,#03H   ;绿灯闪3次

FLASH1:

MOV A,#6FH

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

MOV A,#69H

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

DJNZ R3,FLASH1

MOV A,#09H   ;南北红灯,东西黄灯

MOVX @DPTR,A

MOV R2,#10   ;延时1秒

LCALL DELAY

NOP

RET

DELAY:                ;延时子程序

PUSH 2

PUSH 1

PUSH 0

DELAY1:

MOV 1,#00H

DELAY2:

MOV 0,#0B2H

DJNZ 0,$

DJNZ 1,DELAY2 ;延时 100 mS

DJNZ 2,DELAY1

POP 0

POP 1

POP 2

RET

END

这是我们的实验,程序肯定没问题。至于ULN2803,只是一个增大电流,电压的芯片,因为51单片机本身的电流太小。你改一下就好。至于其他不明白的地方,可以交流。QQ375778861

unsigned char counter;
sbit red_nb=P2^0;

void main()
{
TMOD=
TH0
TL0
ET0
TR0
while(1) //根据楼主所给,有4种状态
{
state1;
state2;
state3;
state4;
}
}
void timer0() interrupt 1 //定时器0
{
TH0=0x3c;
TL0=0xb0;
counter++;
}
void state1() //控制南北红灯亮,东西绿灯亮,30s
{
unsigned char temp = 30;
red_nb=1;

green_dx=1;
while(1)
{
if( counter>19){counter=0;temp--} //每次counter=20,即1s,temp自减
if(temp) break; //当temp为0时,即30秒,退出状态1,进入状态2
}
}
没经过测试,完全是5分诱惑不大。。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/10481483.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存