通过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
这个我来帮帮你吧!!看到后赶紧回复
遇到紧急情况可以控制。 这个怎么理解?怎么个控制法?是有紧急情况时全部红灯呢还是别的? 追问: 全红 灯亮,谢谢
满意请采纳
仿真实例可以参考,可以直接仿真效果,试试。
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
这个我来帮帮你吧!!看到后赶紧回复