Featured

Heart Beat Sensor

Heart Beat Sensor

Heartbeat SensorUse our Heartbeat sensor to measure the Heart Rate or pulse rate of a person. H..

Rs.1,200.00

PLC 1672 Power Line Modem

PLC 1672 Power Line Modem

PLC 1672 Power Line Communication ModemPower line Modem is a communication module which sends data o..

Rs.2,500.00

TRAFFIC LIGHT CONTROLLER




Traffic Lights usually contain three lamps: red, amber and green. Here is a small project wherein you can control the Traffic Light of a four way intersection using a single controller. Consider four roads ROAD A, B, C and D and their corresponding signals red, amber and green each represented by a LED. So in all there are 12 LED’s each of which is connected to a controller pin.

 

In this code the duration of all green signals are the same and the duration of all amber signals are same. This duration is defined by DURATION_GREEN which is 10 seconds and DURATION_AMBER which is 2 seconds.

For generating delay we will be using Timer 0 in 16 bit INTERRUPT mode to generate One second delay. We load TH0 & TL0 with a specific value & on every clock cycle TH0 & TL0 increments by 1 and when the TIMER overflows from FFFF to 0000 a Timer0 overflow flag is set & interrupt is generated.  The maximum delay that can be generated using TIMER 0 in any mode is 65535 clock cycles & since we are using 12MHz crystal the maximum delay is 65.535ms. But we require 1second delay. So we generate 50ms delay using TIMER 0 & when 20 such delays have been generated we come to know that one second has elapsed. So basically 0.05ms X 20 =1 second. So we use a RAM location “multiplier” load it with 20 and whenever the timer overflows the ram location multiplier isdecremented by one. Thus when multiplier becomes zero we come to know that one second has elapsed.

Another RAM location “current_signal_duration” is used it contains the total number of seconds for which the current signal has to be turned ON. This RAM location is decremented every time  one second has elapsed so when current_signal_duration becomes zero we come to know that it’s time to Turn OFF the current signal and move to the next signal.

 

//Define the Port PINS


a_red                                    bit           p0.0

a_amber                              bit           p0.1

a_green                               bit           p0.2

b_red                                    bit           p0.3

b_amber                             bit           p0.4

b_green                              bit           p0.5

c_red                                   bit           p0.6

c_amber                              bit           p0.7

c_green                               bit           p2.7

d_red                                  bit           p2.6

d_amber                             bit           p2.5

d_green                              bit           p2.4

 

//Define RAM Locations


multiplier                                       equ                        30h

current_signal_duration               equ                        31h

//DEFINE BIT ADDRESS

signal_f                                          bit                   00h               ;if 1 then switch to next signal

//DEFINE Constants

MULTIPLIER_DEFAULT                   DATA     20

DURATION_GREEN                        DATA     10

DURATION_AMBER                       DATA     2

//TIMER SUBROUTINES

timer:

push acc

push b

push psw

push dph

push dpl

clr TF0

mov th0,#3ch

mov tl0,#0B0h

call check_timer

pop dpl

pop dph

pop psw

pop b

pop acc

reti

 

check_timer:


djnz multiplier,r1_check_timer

mov multiplier,#MULTIPLIER_DEFAULT            ;One second ended reload value

djnz current_signal_duration,r1_check_timer

setb signal_f                                              ;signal duration ended move to nxt signal

r1_check_timer:

ret

 

//MAIN Program


org 0000h

jmp main

org 000bh

jmp timer

org 0030h

 

main:


mov multiplier,#MULTIPLIER_DEFAULT

setb EA                                                 ;Enable Interrupt

setb ET0                                               ;Enable timer 0 Interrupt

clr signal_f

mov th0,#3ch

mov tl0,#0B0h

setb tcon.4                         ;start timer

 

loop:

mov current_signal_duration,#DURATION_GREEN

clr a_green

setb a_amber

setb a_red

setb b_green

setb b_amber

clr b_red

setb c_green

setb c_amber

clr c_red

setb d_green

setb d_amber

clr d_red

 

jnb signal_f,$

clr signal_f

mov current_signal_duration,#DURATION_AMBER

setb a_green

clr a_amber

jnb signal_f,$

clr signal_f

mov current_signal_duration,#DURATION_GREEN

setb a_amber

clr a_red

clr b_green

jnb signal_f,$

clr signal_f

mov current_signal_duration,#DURATION_AMBER

setb b_green

clr b_amber

jnb signal_f,$

clr signal_f

 

mov current_signal_duration,#DURATION_GREEN

setb b_amber

clr b_red

clr c_green

jnb signal_f,$

clr signal_f

mov current_signal_duration,#DURATION_AMBER

setb c_green

clr c_amber

jnb signal_f,$

clr signal_f

mov current_signal_duration,#DURATION_GREEN

setb c_amber

clr c_red

clr d_green

jnb signal_f,$

clr signal_f

 

mov current_signal_duration,#DURATION_AMBER

setb d_green

clr d_amber

jnb signal_f,$

clr signal_f

ajmp loop

$include(timer.inc)

End

For learning how to interface LED to 8051 microcontroller please click here

Written by Administrator

Administrator

Administrator