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
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.