This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

pedestrian road crossing - c code

I am trying to program the 8051 for a "Pelican" type pedestrian road crossing. It should control the red, amber and green lights for the traffic, the red and green pedestrian lights, and the bleeper. I have written some code but unfortunately it does not work. Bits 0 to 5 of P1 are supposed to control the lights and the bleeper and bit 0 of P2 is supposed to control the pedestrian button. Any ideas where the problem is? Code size limit is 2K.
Thanks!
Marko

#include <reg51.h>

sbit red_traf=P1^0;
sbit amber_traf=P1^1;
sbit green_traf=P1^2;
sbit red_ped=P1^3;
sbit green_ped=P1^4;
sbit bleeper=P1^5;
sbit button=P2^0;
unsigned char count;

void delay_vshort()
                        {
                        unsigned int x;
                        for (x=0;x<65536;x++);
                        }

void delay_short()
                        {
                        unsigned int x;
                        for (x=0;x<131072;x++);
                        }

void delay_long()
                        {
                        unsigned int x;
                        for (x=0;x<1048576;x++);
                        }


main()
        {
        P2 = 0xff;
        s0:
        green_traf=1;
        red_ped=1;
        if (button==1) goto s1;
        else goto s0;

        s1:
        amber_traf=1;
        red_ped=1;
        delay_short();
        goto s2;

        s2:
        red_traf=1;
        green_ped=1;
        bleeper=1;
        delay_long();
        goto s3;

        s3:
        for (count=0;count<5;count++)
                {
                amber_traf = 1;
                green_ped = 1;
                delay_vshort();
                amber_traf = 0;
                green_ped = 0;
                delay_vshort();
                }
                goto s4;

        s4:
        amber_traf=1;
        red_ped=1;
        delay_short();
        goto s0;
        }

Parents
  • Now you are programming. You need a plan.
    One way to do this is to have a periodic "Event" either in an interupt if it is short. Else, the interupt sets a flag and the event is handled from a function call in main.

    Lets assume you set a flag every 100ms in an interupt.

    when this flag is seen in the main loop you can decrement all your timers by 1 tick.

    Example
    if(tickFlag)
    {
       tickFlag = 0;              // clear tick flag
       if(Counter1 > 0)Counter1--;// dec counter down to 0
    }
    

    Then assuming Counter1 was you timer lock out. You would ignore the button if the counter is not 0;

    This is one posible way. There are may ways to do this task.

Reply
  • Now you are programming. You need a plan.
    One way to do this is to have a periodic "Event" either in an interupt if it is short. Else, the interupt sets a flag and the event is handled from a function call in main.

    Lets assume you set a flag every 100ms in an interupt.

    when this flag is seen in the main loop you can decrement all your timers by 1 tick.

    Example
    if(tickFlag)
    {
       tickFlag = 0;              // clear tick flag
       if(Counter1 > 0)Counter1--;// dec counter down to 0
    }
    

    Then assuming Counter1 was you timer lock out. You would ignore the button if the counter is not 0;

    This is one posible way. There are may ways to do this task.

Children
No data