← Embedded C 강의 목록으로
🔌
8051
8051 · 선수: 08강

09. 타이머0/1 과 정확한 지연

7편의 소프트웨어 지연은 부정확하고 그동안 CPU가 묶입니다. 정확한 시간은 하드웨어 타이머로 만듭니다 — CPU와 독립적으로 클럭을 세는 카운터죠. 8051의 Timer0/1을 16비트 모드(Mode1)로 설정해 정확한 지연을 만듭니다. 핵심은 TMOD로 모드 선택, TH/TL에 리로드 값(65536-카운트), TF(오버플로 플래그) 폴링입니다. 리로드 계산을 PC로 검증합니다.

타이머TMODTH/TL오버플로TF리로드
소요 시간
약 1.5시간
난이도
📊 초급
선수 조건
🎯 08강
결과물
Timer0/1을 Mode1으로 설정하고 리로드 값(65536-카운트)을 계산해 TF 폴링으로 정확한 지연을 만들 수 있습니다.

이 강의에서 배우는 것

  • 1소프트웨어 지연 대비 하드웨어 타이머의 장점을 설명한다
  • 2TMOD로 Timer0/1의 모드를 설정한다(Mode1=16비트)
  • 3원하는 지연에 맞는 리로드 값(TH/TL)을 계산한다
  • 4TR(시작)·TF(오버플로 플래그)로 폴링 지연을 구현한다
  • 516비트 한계를 넘는 긴 지연은 오버플로를 여러 번 세서 만든다

소개

타이머는 머신사이클마다 1씩 증가하는 카운터입니다. 표준 8051은 머신사이클 = 12클럭이라, 12MHz면 머신사이클이 1µs입니다. 16비트 카운터(TH:TL)가 0xFFFF에서 한 번 더 증가하면 0x0000으로 넘어가며 오버플로 플래그(TF)가 1이 됩니다.

핵심 개념

1) TMOD — 모드 레지스터

TMOD 하위 4비트는 Timer0, 상위 4비트는 Timer1. M1M0=01 이 Mode1(16비트). Timer0 Mode1 = TMOD=0x01, Timer1 Mode1 = TMOD=0x10. 다른 타이머 설정 보존: `TMOD &= 0xF0; TMOD |= 0x01;`.

2) 리로드 값 계산

c
/* 12MHz(1us/카운트)에서 50ms */
필요 카운트 = 50ms / 1us = 50000
리로드      = 65536 - 50000 = 15536 = 0x3CB0
TH0 = 0x3C;  TL0 = 0xB0;
/* 일반식: reload = 65536 - us, TH = reload>>8, TL = reload & 0xFF */

3) TCON — 시작과 플래그, 폴링 흐름

비트역할
TR0/TR11이면 타이머 동작(시작)
TF0/TF1오버플로 시 1 (소프트웨어가 클리어)
c
TMOD 설정 → TH/TL 리로드 → TF=0 → TR=1
 → while(TF==0) 대기 → TR=0 → TF=0(클리어)
ℹ️

폴링은 대기 중 CPU가 묶입니다. 대기 동안 다른 일을 하려면 타이머 인터럽트(10편)를 씁니다.

핵심 예제

c
#include <reg52.h>
sbit LED = P1 ^ 0;
static void delay_50ms(void) {
    TMOD &= 0xF0; TMOD |= 0x01;   /* Timer0 Mode1 */
    TH0 = 0x3C; TL0 = 0xB0;       /* 50ms @ 12MHz */
    TF0 = 0; TR0 = 1;             /* 시작 */
    while (TF0 == 0) { }          /* 오버플로까지 대기 */
    TR0 = 0; TF0 = 0;             /* 정지·클리어 */
}
void main(void){ while(1){ LED = (bit)!LED; delay_50ms(); } }

리로드 계산 검산: 1000µs→0xFC18, 5000µs→0xEC78, 50000µs→0x3CB0.

자주 하는 실수

Q. TMOD = 0x01 로 통째 대입했더니 Timer1 설정이 날아갔어요.

A. TMOD는 두 타이머를 함께 담습니다. 해당 타이머 비트만 바꾸세요: Timer0 은 `TMOD &= 0xF0; TMOD |= 0x01;`.

Q. 첫 지연은 되는데 그다음부터 즉시 통과해요.

A. TF 를 다시 클리어하지 않아서입니다. Mode1은 자동 리로드가 아니므로 매 지연마다 TH/TL을 다시 넣고 TF를 0으로 지워야 합니다.

Q. 1초처럼 긴 지연이 안 만들어져요.

A. 16비트(1µs 단위)는 한 번에 최대 ~65ms입니다. 더 길게는 짧은 오버플로(50ms)를 여러 번 세서 만듭니다(1초 = 50ms × 20).

정리

  • 하드웨어 타이머는 CPU와 독립적으로 정확한 시간을 만든다
  • TMOD로 모드 설정(Mode1=16비트), Timer0=하위 니블·Timer1=상위 니블
  • 리로드 = 65536 - 카운트, TH=상위·TL=하위
  • TR로 시작, TF 폴링으로 오버플로 시점을 잡고 매번 TF를 클리어한다
  • 긴 지연은 오버플로 횟수를 세서 만든다

과제

  1. 12MHz에서 10ms·100ms 지연의 리로드 값(TH/TL)을 손으로 계산하고 pc_test 로 검산
  2. 50ms 오버플로를 20번 세어 1초 지연을 만드는 함수 작성
  3. Timer1을 써서 같은 지연을 만들고 TMOD 상위 니블 설정을 확인
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드(과제·정답 포함)는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗