Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

The PTD4, PTD5 terminals/pins of the microcontroller are connected with 2 leds,

ID: 3841305 • Letter: T

Question

The PTD4, PTD5 terminals/pins of the microcontroller are connected with 2 leds, one red and one green, respectively. Write a program to simulate the signals of a pedestrian traffic light. Specifically, the car lantern will light up for 10 seconds, then turn off and turn on the pedestrian traffic light for 7 seconds. This process is repeated constantly. Find a way to solve the problem without using three different subroutines delay in the program.

Assembly - Motorola MC68HC908GP32 microcontroller

Explanation / Answer

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

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote