Timer/Counter
timer/counter test
hardware
- STC89C52RC
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++;
}