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 Reply
  • However I was using assembler(including LJMP command) and not c.

    The LJMP command is not the issue. It's the limitations of the compiler (regarding program size and location) that you may run into at some point.

    http://www.keil.com/demo/limits.asp

    Back to your program:

    1. You're writing delay routines in C. That is an absolute no-no. Don't. You will never get a specific delay this way. You may not get any delay at all, since the optimizer is free to completely remove these functions and any calls to them from the code, since they do not have side effects and do not return a value. For delays, use assembly or a timer.

    2. "I did run the program in Keil simulator, but what happens is that all bits of P1 and P2 are constantly high when they should be flashing according to the four states I have defined."

    You did read and internalize the specifics of the '51s ports ? Such as that there is a port state and a latch state, which may be different depending on the circuitry of the port (both internal and external) ?

    3.

    unsigned int x;
    for (x=0;x<65536;x++);
    

    You do realize that the '51 is not a 32 bit system, and that unsigned int is a 16 bit value (0...65535) ?

    None of your delay functions will ever return. They're endless loops !

    4. Please please get some sort of textbook on elementary, basic C programming. Experienced programmers may refuse to further look at your code when they see the first unnecessary goto (as a rule of thumb: use goto only to exit deeply-nested loops and in certain cases of error handling). Read up on the various types of control structures that C offers (for, while, do/while, switch/case) and use them.

Children
More questions in this forum