docs

a slatepencil documentail site

View on GitHub

Timer/Counter

timer/counter test

hardware

code

/************************
Timer/Counter

led1 will blink by T0
*************************/
#include <reg52.h>

sbit led = P1^0;

void timer0_init()
{
    TMOD = 0x01; // set TO mode to 1
    TH0 = 0x00; // init
    TL0 = 0x00;
    EA = 1;     // open general interrupt
    ET0 = 1;    // open timer T0 interrupt
    TR0 = 1;    // start T0
}

void main()
{
    led = 1;
    timer0_init();
    while(1);
}

void time0() interrupt 1
{
    TH0 = 0x00;
    TL0 = 0x00;
    led = ~ led;
}
/************************
Timer/Counter

led1 will blink at 500m/s by T0
*************************/
#include <reg52.h>

sbit led = P1^0;
int i = 0;

void timer1_init()
{
    TMOD = 0x10; // set TO mode to 1
    TH0 = 0x4C; // init
    TL0 = 0x00;
    EA = 1;     // open general interrupt
    ET1 = 1;    // open timer T0 interrupt
    TR1 = 1;    // start T0
}

void main()
{
    led = 1;
    timer1_init();
    while(1)
    {
        if (i == 10)
        {
            led = ~led;
            i = 0;
        }
    }
}

void time1() interrupt 3
{
    TH1 = 0x4c; // init as 50ms
    TL1 = 0x00;
    i++;
}
/************************
59:59 counter

oscillator: 11.059 2MHz

press K4, counter start/pause
press K5, counter reset & waiting start
during waiting, LED D1~D8 binlks, showing waiting
during counting, beeper beeps every 1 sec
first 2 digit showing minute, last 2 digit showing second
max 1 hour, then reset automatically
*************************/
#include <reg51.h>
#define uchar unsigned char
#define dula P0
#define wela P2 // P2.4~P2.7 pin are used

sbit k4 = P3 ^ 6;
sbit k5 = P3 ^ 7;
sbit beep = P2 ^ 3; // beeper

bit stop = 1;
unsigned char j, k, num0, num1, num2, num3, sec, min, count = 0;
unsigned char time_count;
unsigned char code postable[] = {0x8f, 0x4f, 0x2f, 0x1f};
// LED code table
unsigned char code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
// LED code table (with dot)
unsigned char code table1[] = {0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef};

void delay(unsigned char i)
{
    for (j = i; j > 0; j--)
        for (k = 125; k > 0; k--)
            ;
}

void display1(uchar pos, uchar digit) // display digit at position pos
{
    pos = pos - 1;
    wela |= 0xf0; // give P2.4~P2.7 pin 1
    if (pos == 2)
        P0 = table1[digit]; 
    else
        P0 = table[digit];
    wela = wela & postable[pos];
    delay(5);
}

void display(unsigned char a, unsigned char b, unsigned char c, unsigned char d) // display 4 digit per time
{
    display1(4, a);
    display1(3, b);
    display1(2, c);
    display1(1, d);
}

void start_timer()
{
    ET0 = 1; // open timer T0 interrupt
    EA = 1;  // open general interrupt
    TR0 = 1; // open timer
}

void stop_timer()
{
    ET0 = 0; // close Timer T0 interrupt
    EA = 0;  // close general interrupt
    TR0 = 0; // close T0
}

void main()
{
    TMOD = 0x01;                 // user Timer T0, mode 1
    TH0 = (65536 - 46080) / 256; // ocillator is 11.059 MHz, marked as 46080, the counter will send interrupt every 50000 us
    TL0 = (65536 - 46080) % 256; // 46080 = 50000 * 11.059 2/12
    while (1)
    {
        if (k4 == 0)
        {
            delay(10);
            if (k4 == 0)
            {
                while (k4 == 0)
                    ; // until relase
                {
                    if (stop)
                        start_timer();
                    else
                        stop_timer();
                    stop = ~stop;
                    beep = 1;
                    P1 = 0xff;
                }
            }
        }
        else if (k5 == 0)
        {
            delay(10);
            if (k5 == 0)
            {
                while (k5 == 0)
                    ;
                {
                    stop_timer(); // close timer
                    stop = 1;
                    beep = 1;
                    P1 = 0xff;
                    count = 0;
                    time_count = 0;
                    sec = 0; // reset counter
                    min = 0;
                }
            }
        }

        if (stop)
        {
            count++;
            if (count == 100)
            {
                P1 = ~P1;
                count = 0;
            }
        }
        else if (time_count == 20) // count 20 is 0.05s = 1s;
        {
            count = 0;
            time_count = 0;
            sec++;
            if (sec == 60)
            {
                sec = 0;
                min++;
            }
            if (min == 0)
            {
                min = 0;
            }
            beep = 0;
            delay(10);
            beep = 1;
        }
        num0 = sec % 10;
        num1 = sec / 10;
        num2 = min % 10;
        num3 = min / 10;
        display(num3, num2, num1, num0);
    }
}

void time0() interrupt 1
{
    TH0 = (65536 - 46080) / 256;
    TL0 = (65536 - 46080) % 256;
    time_count++;
}