感悟网 导航

通过89s51单片机实现交通灯

作者&投稿:卓壮 (若有异议请与网页底部的电邮联系)
用at89s51单片机,怎么做模拟交通灯,请给我一个详细设计的流程。~

遇到紧急情况可以控制。 这个怎么理解?怎么个控制法?是有紧急情况时全部红灯呢还是别的? 追问: 全红 灯亮,谢谢

满意请采纳

仿真实例可以参考,可以直接仿真效果,试试。

汇编版本
SECOND1 EQU 30H ;东西路口计时寄存器
SECOND2 EQU 31H ;南北路口计时寄存器
CARS EQU 32H ;车流量计数寄存器
DBUF EQU 40H ;显示码缓冲区1
TEMP EQU 44H ;显示码缓冲区2
FLAG EQU 45H ;路口状态标志
BUF EQU 46H

BEEPP BIT P2.0
LED_G1 BIT P2.1 ;东西路口绿灯
LED_Y1 BIT P2.2 ;东西路口黄灯
LED_R1 BIT P2.3 ;东西路口红灯
LED_G2 BIT P2.4 ;南北路口绿灯
LED_Y2 BIT P2.5 ;南北路口黄灯
LED_R2 BIT P2.6 ;南北路口红灯
BCD1 BIT P1.0
BCD2 BIT P1.1
BCD3 BIT P1.2
BCD4 BIT P1.3
BCD5 BIT P1.4
BCD6 BIT P1.5

ORG 0000H
LJMP START ;跳转到主函数
ORG 0003H
LJMP INT0_ISR ;跳到外部中断0处理函数
ORG 0013H
LJMP INT1_ISR ;跳到外部中断1处理函数
ORG 001BH
LJMP TIMER1 ;跳到定时器中断处理函数

ORG 0100H ;主函数的开始地址
START: MOV TMOD,#11H ;置T0为工作方式1
MOV TH0,#3CH ;置T0定时初值50ms
MOV TL0,#0B0H
MOV TH1,#3CH ;置T1定时初值50ms
MOV TL1,#0B0H
MOV CARS,#0
SETB TR0 ;启动T0
CLR A
MOV P1,A ;关闭不相关的LED
CLR TF0 ;关闭T0
SETB EA ;打开全局中断
SETB EX0 ;打开外部中断
SETB IT0 ;打开
SETB EX1 ;允许外部中断1
SETB IT1 ;下降沿中断
SETB ET1 ;允许定时器1中断
SETB BEEPP ;关闭蜂鸣器
;***************************************************
;-----------------
LOOP: MOV R2,#20 ;置1s计数初值,50ms*20=1s
MOV R3,#60 ;绿灯亮60s
MOV SECOND1,#60 ;东西路口计时显示初值60s
MOV SECOND2,#68 ;南北路口计时显示初值68s
LCALL STATE1 ;调用状态1

MOV FLAG,#1
MOV CARS,#0
WAIT1: LCALL DISPLAY ;东西方向绿灯
JNB TF0,WAIT1 ;查询50ms到否
CLR TF0
MOV TH0,#3CH ;恢复T0定时初值50ms
MOV TL0,#0B0H
DJNZ R2,WAIT1 ;判断1s到否?未到继续状态1
MOV R2,#20 ;置50ms计数初值
DEC SECOND1 ;东西路口显示时间减1s
DEC SECOND2 ;南北路口显示时间减1s
MOV A,CARS
CJNE A,#100,LOOP1 ;判断车流量是否到达100辆
MOV CARS,#0 ;车流量计数器清零
MOV A,SECOND1 ;增加55s延时
ADD A,#55
MOV SECOND1,A
MOV A,SECOND2 ;增加55s延时
ADD A,#55
MOV SECOND2,A
MOV A,R3 ;增加55s延时
ADD A,#55
MOV R3,A
LOOP1: DJNZ R3,WAIT1
;*******************************************
MOV R2,#5 ;置50ms计数初值 50*4=200
MOV R3,#3 ;绿灯闪3s
MOV R4,#4 ;闪烁间隔200ms
MOV SECOND1,#8 ;东西路口计时显示初值8s
MOV SECOND2,#8 ;南北路口计时显示初值8s
MOV FLAG,#2
WAIT2: LCALL DISPLAY
LCALL STATE2 ;调用状态2
JNB TF0,WAIT2 ;查询50ms到否
CLR TF0
MOV TH0,#3CH ;恢复T0定时初值50ms
MOV TL0,#0B0H
DJNZ R4,WAIT2 ;判断200ms到否?未到继续状态2
CPL LED_G1 ;东西绿灯闪
MOV R4,#4 ;闪烁间隔200ms
DJNZ R2,WAIT2 ;判1s到否?未到继续状态2
MOV R2,#5 ;置50ms计数初值
DEC SECOND1 ;东西路口显示时间减1s
DEC SECOND2 ;南北路口显示时间减1s
DJNZ R3,WAIT2 ;状态2维持3s
;****************************************
MOV R2,#20 ;置50ms计数初值
MOV R3,#5 ;黄灯闪2s
MOV SECOND1,#5 ;东西路口计时显示初值5s
MOV SECOND2,#5 ;南北路口计时显示初值5s
MOV FLAG,#3
WAIT3: LCALL DISPLAY
LCALL STATE3 ;调用状态3
JNB TF0,WAIT3 ;查询100ms到否
CLR TF0
MOV TH0,#3CH ;恢复T0定时初值100ms
MOV TL0,#0B0H
DJNZ R2,WAIT3 ;判断1s到否?未到继续状态3
MOV R2,#20 ;置100ms计数初值
DEC SECOND1 ;东西路口显示时间减1s
DEC SECOND2 ;南北路口显示时间减1s
DJNZ R3,WAIT3 ;状态3维持2s
;*******************************************
MOV R2,#20 ;置50ms计数初值
MOV R3,#60 ;红灯闪60s
MOV SECOND1,#68 ;东西路口计时显示初值68s
MOV SECOND2,#60 ;南北路口计时显示初值60s
MOV FLAG,#4
MOV CARS,#0
WAIT4: LCALL DISPLAY ;南北方向绿灯
LCALL STATE4 ;调用状态4
JNB TF0,WAIT4 ;查询100ms到否
CLR TF0
MOV TH0,#3CH ;恢复T0定时初值100ms
MOV TL0,#0B0H
DJNZ R2,WAIT4 ;判断1s到否?未到继续状态4
MOV R2,#20 ;置100ms计数初值
DEC SECOND1 ;东西路口显示时间减1s
DEC SECOND2 ;南北路口显示时间减1s
MOV A,CARS
CJNE A,#100,LOOP2 ;判断车流量是否到达100辆
MOV CARS,#0
MOV A,SECOND1 ;增加55s延时
ADD A,#55
MOV SECOND1,A
MOV A,SECOND2 ;增加55s延时
ADD A,#55
MOV SECOND2,A
MOV A,R3 ;增加55s延时
ADD A,#55
MOV R3,A
LOOP2: DJNZ R3,WAIT4
;*******************************************
MOV R2,#5 ;置50ms计数初值
MOV R4,#4 ;红灯闪20ms
MOV R3,#3 ;绿灯闪3s
MOV SECOND1,#8 ;东西路口计时显示初值8s
MOV SECOND2,#8 ;南北路口计时显示初值8s
MOV FLAG,#5;
WAIT5: LCALL DISPLAY
LCALL STATE5 ;调用状态5
JNB TF0,WAIT5 ;查询100ms到否
CLR TF0
MOV TH0,#3CH ;恢复T0定时初值100ms
DJNZ R3,WAIT5 ;状态5维持5s
;****************************************
MOV R2,#20 ;置50ms计数初值
MOV R3,#5 ;黄灯闪5s
MOV SECOND1,#5 ;东西路口计时显示初值5s
MOV SECOND2,#5 ;南北路口计时显示初值5s
MOV FLAG,#6
WAIT6: LCALL DISPLAY
LCALL STATE6 ;调用状态6
JNB TF0,WAIT6 ;查询100ms到否
CLR TF0
MOV TH0,#3CH ;恢复T0定时初值100ms
MOV TL0,#0B0H
DJNZ R2,WAIT6 ;判断1s到否?未到继续状态6
MOV R2,#20 ;置100ms计数初值
DEC SECOND1 ;东西路口显示时间减1s
DEC SECOND2 ;南北路口显示时间减1s
DJNZ R3,WAIT6 ;状态6维持5s
LJMP LOOP ;大循环
;**********************************************
STATE1: ;状态1
SETB LED_G1 ;东西路口绿灯亮
CLR LED_Y1
CLR LED_R1
CLR LED_G2
CLR LED_Y2
SETB LED_R2 ;南北路口红灯亮
RET
STATE2: ;状态2
CLR LED_Y1
CLR LED_R1
CLR LED_G2
CLR LED_Y2
SETB LED_R2 ;南北路口红灯亮
RET
STATE3: ;状态3
CLR LED_G1
CLR LED_R1
CLR LED_G2
CLR LED_Y2
SETB LED_R2 ;南北路口红灯亮
SETB LED_Y1 ;东西路口黄灯亮
RET
STATE4: ;状态4
CLR LED_G1
CLR LED_Y1
SETB LED_R1 ;东西路口红灯亮
SETB LED_G2 ;南北路口绿灯亮
CLR LED_Y2
CLR LED_R2
RET
STATE5: ;状态5
CLR LED_G1
CLR LED_Y1
SETB LED_R1 ;东西路口红灯亮
CLR LED_Y2
CLR LED_R2
RET
STATE6: ;状态6
CLR LED_G1
CLR LED_Y1
SETB LED_R1 ;东西路口红灯亮
CLR LED_G2
CLR LED_R2
SETB LED_Y2 ;南北路口黄灯亮
RET
DISPLAY: ;数码显示
MOV DPTR,#LEDMAP ;数据指针指向LEDMAP
MOV A,SECOND1 ;显示数据移到A累加器
MOV B,#10 ;10移到B累加器
DIV AB ;A除以B
MOVC A,@A+DPTR ;将相应显示自己移到A
MOV P0,A ;显示十位
CLR BCD1 ;
ACALL DELAY
SETB BCD1
MOV A,B
MOVC A,@A+DPTR ;显示个位
MOV P0,A
CLR BCD2
ACALL DELAY
SETB BCD2

MOV A,SECOND2
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P0,A
CLR BCD3
ACALL DELAY
SETB BCD3
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR BCD4
ACALL DELAY
SETB BCD4

MOV A,CARS ;车流量计数显示
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P0,A
CLR BCD5
ACALL DELAY
SETB BCD5
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR BCD6
ACALL DELAY
SETB BCD6
RET

;-----------------
DELAY: MOV R7,#40 ;延时子程序
D1: MOV R6,#20
D2: DJNZ R6,D2
DJNZ R7,D1
RET

;-----------------
KEYDELAY:
MOV R7,#200 ;延时子程序
D3: MOV R6,#100
D4: DJNZ R6,D2
DJNZ R7,D1
RET

;-----------------
BEEP:
SETB TR1 ;打开定时器1
CLR BEEPP ;打开蜂鸣器
RET

;-----------------
INT0_ISR:
LCALL KEYDELAY ;调用按键延时,去抖动
MOV A,FLAG ;检测当前状态
CJNE A,#1,WARM0 ;如果东西方向不是绿灯,打开蜂鸣器
INC CARS ;车流量计数加1
JMP OUT0
WARM0: CALL BEEP
OUT0:
RETI

;-----------------
INT1_ISR:
LCALL KEYDELAY ;调用按键延时,去抖动
MOV A,FLAG ;检测当前状态
WARM1: CALL BEEP
OUT1:
RETI

;-----------------
TIMER1: ;蜂鸣器响3s
;关闭定时器1
MOV TH1,#3CH ;置T1定时初值50ms
MOV TL1,#0B0H
INC BUF ;计数器加1
SETB TR1 ;打开定时器1
MOV A,BUF
CJNE A,#60,OUT2 ;计数器数值到60,则关闭蜂鸣器
SETB BEEPP
CLR TR1 ;关闭定时器1
MOV BUF,#0 ;计数器清零
OUT2: RETI
;-----------------
LEDMAP: ;共阳数码管显示
DB 0C0h,0F9h,0A4h,0B0h,99h,92h,82h,0F8h,80h,90h,0BFh
END

1,用单片机控制红绿灯,51单片机输出口只能提供几十毫安的电流,不能直接驱动红绿灯,,所以需要将单片机的I/O信号进行放大,,
2放大器可以用大功率可控硅,或晶体管,,也可以用继电器。由具体情况而定。
3,编程序先要确定程序的走向和逻辑关系,可以用流程图,状态表,来分析,,
4,确定程序的各种变量,和输入输出端口。。
-------------------------------------------------------
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int

uint k;
sbit east_red=P1^0;
sbit east_green=P1^1;
sbit east_yellow=P1^2;
//--上面是东西向红,绿,黄灯,依次对应,P1.0,P1.1,P1.2//
sbit south_red=P1^3;
sbit south_green=P1^4;
sbit south_yellow=P1^5;
//--上面是南北向红,绿,黄灯,依次对应,P1.3,P1.4,P1.5//
dealy(k)
{uint i;uint h;h=k*100000;for(i=0;i<h;i++);}//计时器子程序//
main()
{uchar a=0;
east_red=south_green=0;dealy(150);
east_green=south_red=1;
//东西红灯亮南北绿灯亮15s//
south_green=1;
while(a<5)
{south_yellow=0;dealy(5);
south_yellow=1;dealy(5);a++;}//南北黄灯显5S//
south_red=east_green=0;
south_green=east_red=1;
dealy(150);//南北绿灯亮,东西红灯亮15S//
east_green=1;
a=0;
while(a<5)
{east_yellow=0;dealy(5);
east_yellow=1;dealy(5);a++;}//东西黄灯显5S//
while(1);
}

把邮箱给我,我来给你做一个。或者你看看
http://www.zsmcu.net/?fromuid=7414这个网站,里面有很多高手

看看我做的,我发给你程序!
http://v.youku.com/v_show/id_XMjIxNzMzMzE2.html

这个我来帮帮你吧!!看到后赶紧回复

《求高手英译汉》
答:easy to use and flexible, high reliability. The subject of using 89S51 microcontroller series to achieve the intersection traffic signal control, display time directly through the 8255's PA, PB port output, traffic signal output through the PC port. With red, green and yellow traffic...

   

返回顶部
本页内容来自于网友发表,若有相关事宜请照下面的电邮联系
感悟网