您好,欢迎来到微智科技网。
搜索
您的当前位置:首页交通灯十字路口控制器程序

交通灯十字路口控制器程序

来源:微智科技网
#include

#define uchar unsigned char #define uint unsigned int

uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40 };

//*************digit display port******* sbit led_w1=P1^1;

1 / 35

sbit led_w2=P1^0; sbit led_w3=P1^3; sbit led_w4=P1^2;

//*****define led port **********

sbit R1=P2^4; //east and west red led sbit Y1=P2^3; //east and west yellow led sbit G1=P2^2; //east and west green led sbit R2=P2^5; //south and north red led sbit Y2=P2^6; //south and north yellow led sbit G2=P2^7; //south and north green led

//*********define key**************

2 / 35

sbit k0=P3^0; //emergency

sbit k1=P3^1; //east and west pass sbit k2=P3^2; //south and north pass sbit k3=P3^3; //start and subtract 1 sbit k4=P3^4; //pause and add 1 sbit k5=P3^5; //set time

//*********define variable********* bit flag,flag_t;

uchar dx_time,nb_time;

uchar cnt,pass_time,cnt1,y_time;

uchar k0num,k1num,k2num,k3num,k4num,k5num;

3 / 35

//*********define key******** void delay(uint i) {

uint x,y;

for(x=i;x>0;x--)

for(y=110;y>0;y--); }

void timer0_init() {

TMOD=0x11;

TH0=(65536-50000)/256; TL0=(65536-50000)%256;

4 / 35

TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; ET0=1; ET1=1; }

void led_display(uchar dx,nb) {

uchar dx1,dx2,nb1,nb2; dx2=dx/10; dx1=dx%10; nb2=nb/10;

5 / 35

nb1=nb%10; if(dx>99) {

led_w1=1; led_w2=1; } else {

led_w1=0; P0=table[dx1]; delay(5); led_w1=1;

6 / 35

if(dx<10&&dx>0) led_w2=1; else {

led_w2=0; P0=table[dx2]; delay(5); led_w2=1; }

}

if(nb>99) {

7 / 35

led_w3=1; led_w4=1; } else {

led_w3=0;

P0=table[nb1]; delay(5); led_w3=3;

if(nb<10&&nb>0) led_w4=1; else {

8 / 35

led_w4=0;

P0=table[nb2]; delay(5); led_w4=4; } } }

//*************light work********** void circle_led() {

if(!flag) {

9 / 35

if(pass_time>5) {

led_display(pass_time-5,pass_time);

R1=1;Y1=1;G1=0; //east and west pass R2=0;Y2=1;G2=1; //south and north stop }

if(pass_time<=5&&pass_time>0) {

if(cnt>=10) led_display(pass_time,pass_time); else led_display(100,pass_time);

R1=1;G1=1; //east and west yellow led flash if(cnt>=10) Y1=0;

10 / 35

else Y1=1;

R2=0;Y2=1;G2=1; }

if(pass_time==0) {

pass_time=nb_time; flag=1; } } else {

if(pass_time>5)

/ 35

11

{

led_display(pass_time,pass_time-5);

R1=0;Y1=1;G1=1; //east and west stop R2=1;Y2=1;G2=0; //south and north pass }

if(pass_time<=5&&pass_time>0) {

if(cnt>=10) led_display(pass_time,pass_time); else led_display(pass_time,100); R1=0;Y1=1;G1=1;

R2=1;G2=1; //south and north yellow led flash if(cnt>=10) Y2=0;

12 / 35

else Y2=1; }

if(pass_time==0) {

pass_time=dx_time; flag=0; } } }

void emergency() //east and west,south and north stop {

13 / 35

led_display(0,0); R1=0;Y1=1;G1=1; R2=0;Y2=1;G2=1; }

void dx_pass() //east and west pass,south and north stop {

led_display(100,100);

if(y_time<=5&&y_time>0) {

TR1=1;

R1=0;Y1=1;G1=1;

R2=1;G2=1; //south and north yellow led flash

14 / 35

if(cnt1>=10) Y2=0; else Y2=1; }

if(y_time==0) {

TR1=0;

R1=1;Y1=1;G1=0; R2=0;Y2=1;G2=1; } }

void nb_pass() //south and north pass,east and west stop

15 / 35

{

led_display(100,100);

if(y_time<=5&&y_time>0) {

TR1=1;

R1=1;G1=1;

if(cnt1>=10) Y1=0; //east and west yellow led flash else Y1=1;

R2=0;Y2=1;G2=1; }

if(y_time==0) {

16 / 35

TR1=0;

R1=0;Y1=1;G1=1; R2=1;Y2=1;G2=0; } }

//***********keyboard scan************ void keyscan() {

if(!k5num) {

if(k0==0) //*******emergency*******

17 / 35

{

delay(10); if(k0==0) {

while(!k0); TR0=0; k0num=1; } }

if(!k1num&&!k0num) {

if(k1==0)

/ 35

18 { delay(10); if(k1==0) {

while(!k1); k1num=1; k2num=0;

y_time=5; TR0=0; TR1=1; }

}

}

//单方向通行时,黄灯闪烁时间19 / 35

if(!k2num&&!k0num) {

if(k2==0) {

delay(10); if(k2==0) {

while(!k2); k1num=0; k2num=1;

y_time=5; //单方向通行时,黄灯闪烁时间 TR0=0;

20 / 35

TR1=1; } } }

if(k3==0) {

delay(10); if(k3==0) {

while(!k3);

if(k1num||k2num) 回时,重新开始执行。

pass_time=dx_time; 21 / 35

//由东西或南北通行返 k0num=0; k1num=0; k2num=0; k4num=0; k5num=0; TR0=1; TR1=0; flag_t=0; } }

if(!k4&&!k0num) {

delay(10);

//pause 22 / 35

if(k4==0) {

while(!k4); TR0=0; k4num=1; } } }

if(k4num==1) {

if(k5==0) {

//暂停键按下时,才可以调整两个方向通行时间23 / 35

delay(10); if(k5==0) {

k5num++; while(!k5); switch(k5num) {

case 1: TR0=1;

flag_t=1; k5num=1; break; case 2:

//调整时间时,24 / 35

pass_time值不变。 k5num=2; break; case 3: TR0=0; k5num=0;

pass_time=dx_time; break; } } }

if(k5num!=0) {

if(k3==0)

//重新赋值25 / 35

{

delay(10); if(k3==0) {

while(!k3); switch(k5num) {

case 1:

dx_time--;

if(dx_time<10) dx_time=99; break; case 2:

nb_time--;

26 / 35

if(nb_time<10) nb_time=99; break; } }

}

if(k4==0) {

delay(10); if(k4==0) {

while(!k4); switch(k5num)

27 / 35

{ }

}

}

case 1:

dx_time++;

if(dx_time>=100) dx_time=10; break; case 2:

nb_time++;

if(nb_time>=100) nb_time=10; break;

28 / 35

} } }

void main() {

timer0_init(); dx_time=45; nb_time=30;

pass_time=dx_time; while(1) {

keyscan();

29 / 35

if(k0num) emergency(); else {

switch(k4num) {

case 0:

if(!k1num&&!k2num) circle_led(); else {

if(k1num) dx_pass(); if(k2num) nb_pass(); }

30 / 35

break; case 1:

switch(k5num) {

case 0:

if(!k1num&&!k2num) circle_led(); else {

if(k1num) dx_pass(); if(k2num) nb_pass(); }

break;

31 / 35

case 1:

R1=1;Y1=1;G1=1; //调整时间时,关闭所有灯 R2=1;Y2=1;G2=1; if(cnt<=10)

led_display(100,nb_time); else

led_display(dx_time,nb_time); break; case 2:

R1=1;Y1=1;G1=1; //调整时间时,关闭所有灯 R2=1;Y2=1;G2=1; if(cnt<=10)

led_display(dx_time,100);

32 / 35

else

led_display(dx_time,nb_time); break; }

break; } } } }

void timer0() interrupt 1 {

TH0=(65536-50000)/256;

33 / 35

TL0=(65536-50000)%256;

cnt++; if(cnt==20) {

cnt=0;

if(flag_t==0) pass_time--; } }

void timer1() interrupt 3 {

TH1=(65536-50000)/256;

//调整时间时,不执行此操作34 / 35

TL1=(65536-50000)%256; cnt1++; if(cnt1==20) {

cnt1=0;

y_time--; }

}

//单方向通行时,黄灯闪烁时间。35 / 35

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务